aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/area/Trait.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/apache/fop/area/Trait.java')
-rw-r--r--src/java/org/apache/fop/area/Trait.java121
1 files changed, 97 insertions, 24 deletions
diff --git a/src/java/org/apache/fop/area/Trait.java b/src/java/org/apache/fop/area/Trait.java
index 0dd1c5681..a58d527a9 100644
--- a/src/java/org/apache/fop/area/Trait.java
+++ b/src/java/org/apache/fop/area/Trait.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -202,6 +202,9 @@ public class Trait implements Serializable {
public static final Integer LINETHROUGH_COLOR = new Integer(36);
private static final Map TRAIT_INFO = new HashMap();
+
+ /** The list of simple traits in order to avoid iterators */
+ public static final Object[] TRAIT_LIST;
private static class TraitInfo {
private String name;
@@ -232,19 +235,19 @@ public class Trait implements Serializable {
new TraitInfo("font", FontTriplet.class));
TRAIT_INFO.put(FONT_SIZE,
new TraitInfo("font-size", Integer.class));
- TRAIT_INFO.put(COLOR, new TraitInfo("color", String.class));
+ TRAIT_INFO.put(COLOR, new TraitInfo("color", Color.class));
TRAIT_INFO.put(PROD_ID, new TraitInfo("prod-id", String.class));
TRAIT_INFO.put(BACKGROUND,
new TraitInfo("background", Background.class));
TRAIT_INFO.put(UNDERLINE,
new TraitInfo("underline-score", Boolean.class));
- TRAIT_INFO.put(UNDERLINE_COLOR, new TraitInfo("underline-score-color", String.class));
+ TRAIT_INFO.put(UNDERLINE_COLOR, new TraitInfo("underline-score-color", Color.class));
TRAIT_INFO.put(OVERLINE,
new TraitInfo("overline-score", Boolean.class));
- TRAIT_INFO.put(OVERLINE_COLOR, new TraitInfo("overline-score-color", String.class));
+ TRAIT_INFO.put(OVERLINE_COLOR, new TraitInfo("overline-score-color", Color.class));
TRAIT_INFO.put(LINETHROUGH,
new TraitInfo("through-score", Boolean.class));
- TRAIT_INFO.put(LINETHROUGH_COLOR, new TraitInfo("through-score-color", String.class));
+ TRAIT_INFO.put(LINETHROUGH_COLOR, new TraitInfo("through-score-color", Color.class));
TRAIT_INFO.put(BLINK,
new TraitInfo("blink", Boolean.class));
TRAIT_INFO.put(OFFSET, new TraitInfo("offset", Integer.class));
@@ -285,6 +288,8 @@ public class Trait implements Serializable {
new TraitInfo("is-reference-area", Boolean.class));
TRAIT_INFO.put(IS_VIEWPORT_AREA,
new TraitInfo("is-viewport-area", Boolean.class));
+
+ TRAIT_LIST = TRAIT_INFO.keySet().toArray();
}
/**
@@ -326,7 +331,7 @@ public class Trait implements Serializable {
* @param oTraitCode the trait code to lookup
* @return the class type for the trait
*/
- private static Class getTraitClass(Object oTraitCode) {
+ public static Class getTraitClass(Object oTraitCode) {
TraitInfo ti = (TraitInfo) TRAIT_INFO.get(oTraitCode);
return (ti != null ? ti.getClazz() : null);
}
@@ -496,6 +501,51 @@ public class Trait implements Serializable {
}
}
+ /** @see java.lang.Object#hashCode() */
+ public int hashCode() {
+ return toString().hashCode();
+ }
+
+ /** @see java.lang.Object#equals(java.lang.Object) */
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ } else if (obj == this) {
+ return true;
+ } else {
+ if (obj instanceof ColorType) {
+ ColorType other = (ColorType)obj;
+ return getRed() == other.getRed()
+ && getGreen() == other.getGreen()
+ && getBlue() == other.getBlue()
+ && getAlpha() == other.getAlpha();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns a Color represtation of a string of the format "#RRGGBB".
+ * @param s the string
+ * @return the Color value
+ */
+ public static Color valueOf(String s) {
+ if (s == null) {
+ return null;
+ }
+ if (!s.startsWith("#")) {
+ throw new IllegalArgumentException("Color must start with '#'");
+ }
+ int r = Integer.parseInt(s.substring(1, 3), 16);
+ int g = Integer.parseInt(s.substring(3, 5), 16);
+ int b = Integer.parseInt(s.substring(5, 7), 16);
+ int a = 255;
+ if (s.length() > 7) {
+ a = Integer.parseInt(s.substring(7, 9), 16);
+ }
+ return new Color(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f);
+ }
+
/** @see java.lang.Object#toString() */
public String toString() {
StringBuffer sbuf = new StringBuffer(8);
@@ -515,6 +565,13 @@ public class Trait implements Serializable {
sbuf.append('0');
}
sbuf.append(s);
+ if (alpha != 1) {
+ s = Integer.toHexString((int)(alpha * 255.0));
+ if (s.length() == 1) {
+ sbuf.append('0');
+ }
+ sbuf.append(s);
+ }
return sbuf.toString();
}
@@ -617,6 +674,14 @@ public class Trait implements Serializable {
}
/**
+ * Sets the image repetition behaviour for images.
+ * @param repeat The image repetition behaviour to set
+ */
+ public void setRepeat(String repeat) {
+ setRepeat(getConstantForRepeat(repeat));
+ }
+
+ /**
* Sets the URL to the background image.
* @param url The URL to set
*/
@@ -640,7 +705,31 @@ public class Trait implements Serializable {
this.vertical = vertical;
}
- /**
+ private String getRepeatString() {
+ switch (getRepeat()) {
+ case Constants.EN_REPEAT: return "repeat";
+ case Constants.EN_REPEATX: return "repeat-x";
+ case Constants.EN_REPEATY: return "repeat-y";
+ case Constants.EN_NOREPEAT: return "no-repeat";
+ default: throw new IllegalStateException("Illegal repeat style: " + getRepeat());
+ }
+ }
+
+ private static int getConstantForRepeat(String repeat) {
+ if ("repeat".equalsIgnoreCase(repeat)) {
+ return Constants.EN_REPEAT;
+ } else if ("repeat-x".equalsIgnoreCase(repeat)) {
+ return Constants.EN_REPEATX;
+ } else if ("repeat-y".equalsIgnoreCase(repeat)) {
+ return Constants.EN_REPEATY;
+ } else if ("no-repeat".equalsIgnoreCase(repeat)) {
+ return Constants.EN_NOREPEAT;
+ } else {
+ throw new IllegalStateException("Illegal repeat style: " + repeat);
+ }
+ }
+
+ /**
* Return the string for debugging.
* @see java.lang.Object#toString()
*/
@@ -649,23 +738,7 @@ public class Trait implements Serializable {
sb.append("color=").append(color);
if (url != null) {
sb.append(",url=").append(url);
- sb.append(",repeat=");
- switch (repeat) {
- case Constants.EN_REPEAT:
- sb.append("repeat");
- break;
- case Constants.EN_REPEATX:
- sb.append("repeat-x");
- break;
- case Constants.EN_REPEATY:
- sb.append("repeat-y");
- break;
- case Constants.EN_NOREPEAT:
- sb.append("no-repeat");
- break;
- default:
- sb.append("ILLEGAL!");
- }
+ sb.append(",repeat=").append(getRepeatString());
sb.append(",horiz=").append(horiz);
sb.append(",vertical=").append(vertical);
}
>type="text/css" href="../wiki_syntax_detailed.css" /> </head> <body> <h1><a name="1" class="wiki-page"></a>Wiki formatting</h1> <ul class='toc'> <li><a href='#2'>Links</a></li> <ul> <li><a href='#3'>Redmine links</a></li> <li><a href='#4'>External links</a></li> </ul> <li><a href='#5'>Text formatting</a></li> <ul> <li><a href='#6'>Font style</a></li> <li><a href='#7'>Inline images</a></li> <li><a href='#8'>Headings</a></li> <li><a href='#9'>Paragraphs</a></li> <li><a href='#10'>Blockquotes</a></li> <li><a href='#11'>Table of content</a></li> <li><a href='#14'>Horizontal Rule</a></li> </ul> <li><a href='#12'>Macros</a></li> <li><a href='#13'>Code highlighting</a></li> </ul> <h2><a name="2" class="wiki-page"></a>Links</h2> <h3><a name="3" class="wiki-page"></a>Redmine links</h3> <p>Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.</p> <ul> <li>Link to an issue: <strong>#124</strong> (displays <del><a href="#" class="issue" title="bulk edit doesn't change the category or fixed version properties (Closed)">#124</a></del>, link is striked-through if the issue is closed)</li> <li>Link to an issue including tracker name and subject: <strong>##124</strong> (displays <a href="#" class="issue" title="bulk edit doesn't change the category or fixed version properties (New)">Bug #124</a>: bulk edit doesn't change the category or fixed version properties)</li> <li>Link to an issue note: <strong>#124-6</strong>, or <strong>#124#note-6</strong></li> <li>Link to an issue note within the same issue: <strong>#note-6</strong></li> </ul> <p>Wiki links:</p> <ul> <li><strong>[[Guide]]</strong> displays a link to the page named 'Guide': <a href="#" class="wiki-page">Guide</a></li> <li><strong>[[Guide#further-reading]]</strong> takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: <a href="#" class="wiki-page">Guide</a></li> <li><strong>[[#further-reading]]</strong> link to the anchor "further-reading" of the current page: <a href="#" class="wiki-page">#further-reading</a></li> <li><strong>[[Guide|User manual]]</strong> displays a link to the same page but with a different text: <a href="#" class="wiki-page">User manual</a></li> </ul> <p>You can also link to pages of an other project wiki:</p> <ul> <li><strong>[[sandbox:some page]]</strong> displays a link to the page named 'Some page' of the Sandbox wiki</li> <li><strong>[[sandbox:]]</strong> displays a link to the Sandbox wiki main page</li> </ul> <p>Wiki links are displayed in red if the page doesn't exist yet, eg: <a href="#" class="wiki-page new">Nonexistent page</a>.</p> <p>Links to other resources:</p> <ul> <li>Documents: <ul> <li><strong>document#17</strong> (link to document with id 17)</li> <li><strong>document:Greetings</strong> (link to the document with title "Greetings")</li> <li><strong>document:"Some document"</strong> (double quotes can be used when document title contains spaces)</li> <li><strong>sandbox:document:"Some document"</strong> (link to a document with title "Some document" in other project "sandbox")</li> </ul></li> </ul> <ul> <li>Versions: <ul> <li><strong>version#3</strong> (link to version with id 3)</li> <li><strong>version:1.0.0</strong> (link to version named "1.0.0")</li> <li><strong>version:"1.0 beta 2"</strong></li> <li><strong>sandbox:version:1.0.0</strong> (link to version "1.0.0" in the project "sandbox")</li> </ul></li> </ul> <ul> <li>Attachments: <ul> <li><strong>attachment:file.zip</strong> (link to the attachment of the current object named file.zip)</li> <li>For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)</li> </ul></li> </ul> <ul> <li>Changesets: <ul> <li><strong>r758</strong> (link to a changeset)</li> <li><strong>commit:c6f4d0fd</strong> (link to a changeset with a non-numeric hash)</li> <li><strong>svn1|r758</strong> (link to a changeset of a specific repository, for projects with multiple repositories)</li> <li><strong>commit:hg|c6f4d0fd</strong> (link to a changeset with a non-numeric hash of a specific repository)</li> <li><strong>sandbox:r758</strong> (link to a changeset of another project)</li> <li><strong>sandbox:commit:c6f4d0fd</strong> (link to a changeset with a non-numeric hash of another project)</li> </ul></li> </ul> <ul> <li>Repository files: <ul> <li><strong>source:some/file</strong> (link to the file located at /some/file in the project's repository)</li> <li><strong>source:some/file@52</strong> (link to the file's revision 52)</li> <li><strong>source:some/file#L120</strong> (link to line 120 of the file)</li> <li><strong>source:some/file@52#L120</strong> (link to line 120 of the file's revision 52)</li> <li><strong>source:"some file@52#L120"</strong> (use double quotes when the URL contains spaces</li> <li><strong>export:some/file</strong> (force the download of the file)</li> <li><strong>source:svn1|some/file</strong> (link to a file of a specific repository, for projects with multiple repositories)</li> <li><strong>sandbox:source:some/file</strong> (link to the file located at /some/file in the repository of the project "sandbox")</li> <li><strong>sandbox:export:some/file</strong> (force the download of the file)</li> </ul></li> </ul> <ul> <li>Forums: <ul> <li><strong>forum#1</strong> (link to forum with id 1</li> <li><strong>forum:Support</strong> (link to forum named Support)</li> <li><strong>forum:"Technical Support"</strong> (use double quotes if forum name contains spaces)</li> </ul></li> </ul> <ul> <li>Forum messages: <ul> <li><strong>message#1218</strong> (link to message with id 1218)</li> </ul></li> </ul> <ul> <li>Projects: <ul> <li><strong>project#3</strong> (link to project with id 3)</li> <li><strong>project:some-project</strong> (link to project with name or slug of "some-project")</li> <li><strong>project:"Some Project"</strong> (use double quotes for project name containing spaces)</li> </ul></li> </ul> <ul> <li>News: <ul> <li><strong>news#2</strong> (link to news item with id 2)</li> <li><strong>news:Greetings</strong> (link to news item named "Greetings")</li> <li><strong>news:"First Release"</strong> (use double quotes if news item name contains spaces)</li> </ul></li> </ul> <ul> <li>Users: <ul> <li><strong>user#2</strong> (link to user with id 2)</li> <li><strong>user:jsmith</strong> (Link to user with login jsmith)</li> <li><strong>@jsmith</strong> (Link to user with login jsmith)</li> </ul> </li> </ul> <p>Escaping:</p> <ul> <li>You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !</li> </ul> <h3><a name="4" class="wiki-page"></a>External links</h3> <p>URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:</p> <pre> http://www.redmine.org, someone@foo.bar </pre> <p>displays: <a class="external" href="http://www.redmine.org">http://www.redmine.org</a>, <a href="mailto:someone@foo.bar" class="email">someone@foo.bar</a></p> <p>If you want to display a specific text instead of the URL, you can use the standard textile syntax:</p> <pre> "Redmine web site":http://www.redmine.org </pre> <p>displays: <a href="http://www.redmine.org" class="external">Redmine web site</a></p> <h2><a name="5" class="wiki-page"></a>Text formatting</h2> <p>For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See <a class="external" href="http://en.wikipedia.org/wiki/Textile_%28markup_language%29">http://en.wikipedia.org/wiki/Textile_(markup_language)</a> for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.</p> <h3><a name="6" class="wiki-page"></a>Font style</h3> <pre> * *bold* * _italic_ * _*bold italic*_ * +underline+ * -strike-through- </pre> <p>Display:</p> <ul> <li><strong>bold</strong></li> <li><em>italic</em></li> <li><em><strong>bold italic</strong></em></li> <li><ins>underline</ins></li> <li><del>strike-through</del></li> </ul> <h3><a name="7" class="wiki-page"></a>Inline images</h3> <ul> <li><strong>!image_url!</strong> displays an image located at image_url (textile syntax)</li> <li><strong>!&gt;image_url!</strong> right floating image</li> <li>If you have an image attached to your wiki page, it can be displayed inline using its filename: <strong>!attached_image.png!</strong></li> <li>Images in your computer's clipboard can be pasted directly using Ctrl-v or Command-v.</li> <li>Image files can be dragged onto the text area in order to be uploaded and embedded.</li> </ul> <h3><a name="8" class="wiki-page"></a>Headings</h3> <pre> h1. Heading h2. Subheading h3. Subsubheading </pre> <p>Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.</p> <h3><a name="9" class="wiki-page"></a>Paragraphs</h3> <pre> p&gt;. right aligned p=. centered </pre> <p style="text-align:center;">This is a centered paragraph.</p> <h3><a name="10" class="wiki-page"></a>Blockquotes</h3> <p>Start the paragraph with <strong>bq.</strong></p> <pre> bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern. To go live, all you need to add is a database and a web server. </pre> <p>Display:</p> <blockquote> <p>Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.<br />To go live, all you need to add is a database and a web server.</p> </blockquote> <h3><a name="11" class="wiki-page"></a>Table of content</h3> <pre> {{toc}} =&gt; left aligned toc {{&gt;toc}} =&gt; right aligned toc </pre> <h3><a name="14" class="wiki-page"></a>Horizontal Rule</h3> <pre> --- </pre> <h2><a name="12" class="wiki-page"></a>Macros</h2> <p>Redmine has the following builtin macros:</p> <p> <dl> <dt><code>hello_world</code></dt> <dd><p>Sample macro.</p></dd> <dt><code>macro_list</code></dt> <dd><p>Displays a list of all available macros, including description if available.</p></dd> <dt><code>child_pages</code></dt> <dd><p>Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:</p> <pre><code>{{child_pages}} -- can be used from a wiki page only {{child_pages(depth=2)}} -- display 2 levels nesting only</code></pre></dd> <dt><code>include</code></dt> <dd><p>Include a wiki page. Example:</p> <pre><code>{{include(Foo)}}</code></pre> <p>or to include a page of a specific project wiki:</p> <pre><code>{{include(projectname:Foo)}}</code></pre></dd> <dt><code>collapse</code></dt> <dd><p>Inserts of collapsed block of text. Example:</p> <pre><code>{{collapse(View details...) This is a block of text that is collapsed by default. It can be expanded by clicking a link. }}</code></pre></dd> <dt><code>thumbnail</code></dt> <dd><p>Displays a clickable thumbnail of an attached image. Examples:</p> <pre>{{thumbnail(image.png)}} {{thumbnail(image.png, size=300, title=Thumbnail)}}</pre></dd> <dt><code>issue</code></dt> <dd><p>Inserts a link to an issue with flexible text. Examples:</p> <pre>{{issue(123)}} -- Issue #123: Enhance macro capabilities {{issue(123, project=true)}} -- Andromeda - Issue #123:Enhance macro capabilities {{issue(123, tracker=false)}} -- #123: Enhance macro capabilities {{issue(123, subject=false, project=true)}} -- Andromeda - Issue #123</pre></dd> </dl> </p> <h2><a name="13" class="wiki-page"></a>Code highlighting</h2> <p>Default code highlightment relies on <a href="http://rouge.jneen.net/" class="external">Rouge</a>, a syntax highlighting library written in pure Ruby. It supports many commonly used languages such as <strong>c</strong>, <strong>cpp</strong> (c++), <strong>csharp</strong> (c#, cs), <strong>css</strong>, <strong>diff</strong> (patch, udiff), <strong>go</strong> (golang), <strong>groovy</strong>, <strong>html</strong>, <strong>java</strong>, <strong>javascript</strong> (js), <strong>kotlin</strong>, <strong>objective_c</strong> (objc), <strong>perl</strong> (pl), <strong>php</strong>, <strong>python</strong> (py), <strong>r</strong>, <strong>ruby</strong> (rb), <strong>sass</strong>, <strong>scala</strong>, <strong>shell</strong> (bash, zsh, ksh, sh), <strong>sql</strong>, <strong>swift</strong>, <strong>xml</strong> and <strong>yaml</strong> (yml) languages, where the names inside parentheses are aliases. Please refer to <a href="https://www.redmine.org/projects/redmine/wiki/RedmineCodeHighlightingLanguages" class="external">https://www.redmine.org/projects/redmine/wiki/RedmineCodeHighlightingLanguages</a> for the full list of supported languages.</p> <p>You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):</p> <pre> &lt;pre&gt;&lt;code class="ruby"&gt; Place your code here. &lt;/code&gt;&lt;/pre&gt; </pre> <p>Example:</p> <pre><code class="ruby syntaxhl"><span class="c1"># The Greeter class</span> <span class="k">class</span> <span class="nc">Greeter</span> <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span> <span class="vi">@name</span> <span class="o">=</span> <span class="nb">name</span><span class="p">.</span><span class="nf">capitalize</span> <span class="k">end</span> <span class="k">def</span> <span class="nf">salute</span> <span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">!"</span> <span class="k">end</span> <span class="k">end</span> </code></pre> </body> </html>