git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193837 13f79535-47bb-0310-9956-ffa450edef68tags/pre-columns
<fo:layout-master-set> | <fo:layout-master-set> | ||||
<!-- layout for the first page --> | |||||
<!-- page layout --> | |||||
<fo:simple-page-master master-name="first" | <fo:simple-page-master master-name="first" | ||||
page-height="29.7cm" | page-height="29.7cm" | ||||
page-width="21cm" | page-width="21cm" | ||||
margin-top="1cm" | |||||
margin-top="2.5cm" | |||||
margin-bottom="2cm" | margin-bottom="2cm" | ||||
margin-left="2.5cm" | margin-left="2.5cm" | ||||
margin-right="2.5cm"> | margin-right="2.5cm"> | ||||
<fo:region-body margin-top="3cm"/> | |||||
<fo:region-before extent="3cm"/> | |||||
<fo:region-after extent="1.5cm"/> | |||||
<fo:region-body/> | |||||
</fo:simple-page-master> | </fo:simple-page-master> | ||||
<fo:page-sequence-master master-name="basicPSM" > | |||||
<fo:repeatable-page-master-alternatives> | |||||
<fo:conditional-page-master-reference master-name="first" | |||||
page-position="first" /> | |||||
</fo:repeatable-page-master-alternatives> | |||||
</fo:page-sequence-master> | |||||
</fo:layout-master-set> | </fo:layout-master-set> | ||||
<!-- end: defines page layout --> | <!-- end: defines page layout --> | ||||
<!-- actual layout --> | <!-- actual layout --> | ||||
<fo:page-sequence master-name="basicPSM"> | |||||
<fo:page-sequence master-name="first"> | |||||
<fo:flow flow-name="xsl-region-body"> | <fo:flow flow-name="xsl-region-body"> | ||||
<!-- Normal text --> | <!-- Normal text --> | ||||
<fo:block font-size="16pt" | |||||
font-family="sans-serif" | |||||
line-height="15pt" | |||||
space-after.optimum="3pt" | |||||
text-align="start"> | |||||
Leader examples | |||||
</fo:block> | |||||
<fo:block font-size="12pt" | |||||
font-family="sans-serif" | |||||
line-height="15pt" | |||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | |||||
text-align="start"> | |||||
leader with leader-pattern="space" | |||||
</fo:block> | |||||
<!-- Inserts a leader (space) --> | |||||
<fo:block text-align="start">Entry 1 | |||||
<fo:leader leader-pattern="space" | |||||
leader-length.maximum="6cm"/>p. 12 | |||||
</fo:block> | |||||
<!-- Inserts a leader (space) --> | |||||
<fo:block text-align="start">Entry 2 | |||||
<fo:leader leader-pattern="space" | |||||
leader-length.maximum="6cm"/>p. 24 | |||||
</fo:block> | |||||
<!-- Inserts a leader (space) --> | |||||
<fo:block text-align="start">Left side | |||||
<fo:leader leader-pattern="space" | |||||
leader-length.maximum="5.5cm"/>middle | |||||
<fo:leader leader-pattern="space" | |||||
leader-length.maximum="5.5cm"/>right side | |||||
</fo:block> | |||||
<fo:block font-size="12pt" | |||||
font-family="sans-serif" | |||||
line-height="15pt" | |||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | |||||
text-align="start"> | |||||
Using fo:leader with leader-pattern="dots" | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 1 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-length.maximum="6cm"/>p. 12 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 2 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-length.maximum="6cm"/>p. 24 | |||||
</fo:block> | |||||
<fo:block font-size="12pt" | |||||
font-family="sans-serif" | |||||
line-height="15pt" | |||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | |||||
text-align="start"> | |||||
Using fo:leader with leader-pattern="dots" and leader-pattern-width="5pt" and "8pt" | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 1 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-length.maximum="6cm"/>p. 12 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 2 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-length.maximum="6cm"/>p. 24 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 1 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm"/>p. 12 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 2 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm"/>p. 24 | |||||
</fo:block> | |||||
<fo:block font-size="12pt" | |||||
font-family="sans-serif" | |||||
line-height="15pt" | |||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | |||||
text-align="start"> | |||||
Using fo:leader with leader-pattern="dots" in a list | |||||
</fo:block> | |||||
<fo:block text-align="start" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt"> | |||||
Using fo:leader with leader-pattern="dots", leader-pattern-width="5pt" and "8pt", leader-alignment="reference-area" | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 1 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="6cm"/>p. 12 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 2 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="6cm"/>p. 24 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 3 is longer | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="6cm"/>p. 36 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 4 is even longer | |||||
<fo:leader leader-pattern="dots" | |||||
leader-alignment="reference-area" | |||||
leader-pattern-width="5pt" | |||||
leader-length.maximum="6cm"/>p. 48 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">1 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm" | |||||
leader-alignment="reference-area"/>p. 12 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 2 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm" | |||||
leader-alignment="reference-area"/>p. 24 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 3 is longer | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm" | |||||
leader-alignment="reference-area"/>p. 36 | |||||
</fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 4 is even longer | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm" | |||||
leader-alignment="reference-area"/>p. 48 | |||||
</fo:block> | |||||
<!-- list start --> | |||||
<!-- use provisional-distance-between-starts to define | |||||
the distance between the start of the label and the item text | |||||
use provisional-label-separation to define the distance between | |||||
the end of the item label and the start of item text | |||||
--> | |||||
<fo:list-block provisional-distance-between-starts="0.3cm" | |||||
provisional-label-separation="0.15cm"> | |||||
<!-- list item --> | |||||
<fo:list-item> | |||||
<!-- insert a bullet --> | |||||
<fo:list-item-label> | |||||
<fo:block><fo:inline font-size="10pt" font-family="Symbol">·</fo:inline></fo:block> | |||||
</fo:list-item-label> | |||||
<!-- list text --> | |||||
<fo:list-item-body> | |||||
<fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 1 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-length.maximum="6cm"/>p. 12 | |||||
</fo:block> | |||||
</fo:block> | |||||
</fo:list-item-body> | |||||
</fo:list-item> | |||||
<!-- list item --> | |||||
<fo:list-item> | |||||
<!-- insert a bullet --> | |||||
<fo:list-item-label> | |||||
<fo:block><fo:inline font-size="10pt" font-family="Symbol">·</fo:inline></fo:block> | |||||
</fo:list-item-label> | |||||
<!-- list text --> | |||||
<fo:list-item-body> | |||||
<fo:block> | |||||
<!-- Inserts a leader (dots) --> | |||||
<fo:block text-align="start">Entry 2 | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-length.maximum="6cm"/>p. 24 | |||||
</fo:block> | |||||
</fo:block> | |||||
</fo:list-item-body> | |||||
</fo:list-item> | |||||
</fo:list-block> | |||||
<!-- list end --> | |||||
<fo:block font-size="12pt" | <fo:block font-size="12pt" | ||||
font-family="sans-serif" | font-family="sans-serif" | ||||
line-height="15pt" | line-height="15pt" | ||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | space-after.optimum="3pt" | ||||
text-align="start"> | text-align="start"> | ||||
This document has been reviewed by W3C Members and other interested parties and has been endorsed by the Director as a | |||||
W3C Recommendation. It is a stable document and may be used as reference material or cited as a normative reference from | |||||
another document. W3C's role in making the Recommendation is to draw attention to the specification and to promote its | |||||
widespread deployment. - Here comes a line (thickness: 3pt). | |||||
Using fo:leader with leader-pattern="dots" in a table | |||||
</fo:block> | |||||
<!-- table start --> | |||||
<fo:table> | |||||
<fo:table-column column-width="20mm"/> | |||||
<fo:table-column column-width="60mm"/> | |||||
<fo:table-column column-width="50mm"/> | |||||
<fo:table-body> | |||||
<fo:table-row> | |||||
<fo:table-cell ><fo:block>Entry 1</fo:block></fo:table-cell> | |||||
<fo:table-cell > | |||||
<fo:block text-align="start"> | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm"/> | |||||
</fo:block> | |||||
</fo:table-cell> | |||||
<fo:table-cell ><fo:block>p. 12</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row> | |||||
<fo:table-cell ><fo:block>Entry 2 </fo:block></fo:table-cell> | |||||
<fo:table-cell > | |||||
<fo:block text-align="start"> | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm"/> | |||||
</fo:block> | |||||
</fo:table-cell> | |||||
<fo:table-cell ><fo:block>p. 24</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row> | |||||
<fo:table-cell ><fo:block>Entry 3 </fo:block></fo:table-cell> | |||||
<fo:table-cell > | |||||
<fo:block text-align="start"> | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.maximum="6cm"/> | |||||
</fo:block> | |||||
</fo:table-cell> | |||||
<fo:table-cell ><fo:block>p. 36</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
</fo:table-body> | |||||
</fo:table> | |||||
<!-- table end --> | |||||
<fo:block font-size="12pt" | |||||
font-family="sans-serif" | |||||
line-height="15pt" | |||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | |||||
text-align="start"> | |||||
Leader with leader-pattern="rule" | |||||
</fo:block> | </fo:block> | ||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | <!-- Inserts a leader (rule). Because leader is an inline fo you have | ||||
to wrap it into a block element --> | to wrap it into a block element --> | ||||
<fo:block text-align="center"> | |||||
<fo:block text-align="start">text before the rule (start) | |||||
<fo:leader leader-pattern="rule" | <fo:leader leader-pattern="rule" | ||||
rule-thickness="3.0pt" | |||||
rule-thickness="3.0pt" | |||||
leader-length="6cm" | |||||
space-before.optimum="12pt" | space-before.optimum="12pt" | ||||
space-after.optimum="12pt" | space-after.optimum="12pt" | ||||
start-indent="1.5cm" | start-indent="1.5cm" | ||||
end-indent="2cm"/> | |||||
end-indent="2cm" | |||||
background-color="blue" | |||||
color="yellow"/> | |||||
text after the rule | |||||
</fo:block> | |||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="center">text before the rule (center) | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="3.0pt" | |||||
leader-length="6cm" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt" | |||||
start-indent="1.5cm" | |||||
end-indent="2cm" | |||||
background-color="blue" | |||||
color="yellow"/> | |||||
text after the rule | |||||
</fo:block> | |||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="end">text before the rule (end) | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="3.0pt" | |||||
leader-length="6cm" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt" | |||||
start-indent="1.5cm" | |||||
end-indent="2cm" | |||||
background-color="blue" | |||||
color="yellow"/> | |||||
text after the rule | |||||
</fo:block> | |||||
<fo:block font-size="12pt" | |||||
font-family="sans-serif" | |||||
line-height="15pt" | |||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | |||||
text-align="start"> | |||||
Here are 3 fo:leader with the property rule and no text | |||||
</fo:block> | |||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="start" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt"> | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="3.0pt" | |||||
leader-length="6cm"/> | |||||
</fo:block> | |||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="center" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt"> | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="3.0pt" | |||||
leader-length="6cm"/> | |||||
</fo:block> | |||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="end" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt"> | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="3.0pt" | |||||
leader-length="6cm"/> | |||||
</fo:block> | </fo:block> | ||||
<!-- Normal text --> | <!-- Normal text --> | ||||
<fo:block font-size="12pt" | <fo:block font-size="12pt" | ||||
font-family="sans-serif" | font-family="sans-serif" | ||||
line-height="15pt" | line-height="15pt" | ||||
space-before.optimum="5pt" | |||||
space-after.optimum="3pt" | space-after.optimum="3pt" | ||||
text-align="start"> | text-align="start"> | ||||
This document specifies a syntax created by subsetting an existing, widely used international text processing standard | |||||
(Standard Generalized Markup Language, ISO 8879:1986(E) as amended and corrected) for use on the World Wide Web. It | |||||
is a product of the W3C XML Activity, details of which can be found at http://www.w3.org/XML. A list of current W3C | |||||
Recommendations and other technical documents can be found at http://www.w3.org/TR. - Here comes a line (thickness: 1pt (default)) | |||||
Here are 4 fo:leader with increasing rule-thickness (1pt, 2pt, 3pt, 4pt) | |||||
</fo:block> | </fo:block> | ||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | <!-- Inserts a leader (rule). Because leader is an inline fo you have | ||||
to wrap it into a block element --> | to wrap it into a block element --> | ||||
<fo:block text-align="start"> | |||||
<fo:block text-align="center" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt"> | |||||
<fo:leader leader-pattern="rule" | <fo:leader leader-pattern="rule" | ||||
rule-thickness="1.0pt" | |||||
leader-length.maximum="6cm"/> | |||||
</fo:block> | |||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="center" | |||||
space-before.optimum="12pt" | space-before.optimum="12pt" | ||||
space-after.optimum="12pt" | |||||
start-indent="1.5cm" | |||||
end-indent="2cm"/> | |||||
space-after.optimum="12pt"> | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="2.0pt" | |||||
leader-length.maximum="6cm"/> | |||||
</fo:block> | </fo:block> | ||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="center" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt"> | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="3.0pt" | |||||
leader-length.maximum="6cm"/> | |||||
</fo:block> | |||||
<!-- Inserts a leader (rule). Because leader is an inline fo you have | |||||
to wrap it into a block element --> | |||||
<fo:block text-align="center" | |||||
space-before.optimum="12pt" | |||||
space-after.optimum="12pt"> | |||||
<fo:leader leader-pattern="rule" | |||||
rule-thickness="4.0pt" | |||||
leader-length.maximum="6cm"/> | |||||
</fo:block> | |||||
<fo:block text-align="center" | |||||
font-size="16pt" | |||||
space-before.optimum="16pt" | |||||
space-after.optimum="12pt"> | |||||
Using leader in combination with justified text | |||||
</fo:block> | |||||
<fo:block text-align="justify">Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here comes the leader (dots width 8pt): | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-length.minimum="2cm" | |||||
leader-length.maximum="5cm"/>Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here is some longer text. Here is some longer text. | |||||
</fo:block> | |||||
<fo:block text-align="justify">Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here comes the leader (dots width 5pt): | |||||
<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="5pt" | |||||
leader-length.minimum="2cm" | |||||
leader-length.maximum="5cm"/>Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here is some longer text. Here is some longer text. | |||||
</fo:block> | |||||
<fo:block text-align="justify">Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here comes the leader (dots): | |||||
<fo:leader leader-pattern="dots" | |||||
leader-length.minimum="2cm" | |||||
leader-length.maximum="5cm"/>Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here is some longer text. Here is some longer text. | |||||
</fo:block> | |||||
<fo:block text-align="justify">Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here comes the leader (rule): | |||||
<fo:leader leader-pattern="rule" | |||||
leader-length.minimum="2cm" | |||||
leader-length.maximum="5cm"/>Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here is some longer text. Here is some longer text. | |||||
</fo:block> | |||||
<fo:block text-align="justify">Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here comes the leader (space): | |||||
<fo:leader leader-pattern="space" | |||||
leader-length.minimum="2cm" | |||||
leader-length.maximum="5cm"/>Here is some longer text. Here is some longer text. | |||||
Here is some longer text. Here is some longer text. Here is some longer text. | |||||
</fo:block> | |||||
<fo:block text-align="center" | |||||
font-size="16pt" | |||||
space-before.optimum="16pt" | |||||
space-after.optimum="12pt"> | |||||
Table of Content | |||||
</fo:block> | |||||
<fo:block text-align="start" | |||||
font-size="10pt" | |||||
space-after.optimum="12pt"> | |||||
shows the use of leader properties in combination to build a table of content. | |||||
Following values are used for the leader: | |||||
leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm" | |||||
</fo:block> | |||||
<!-- Here starts the table --> | |||||
<fo:table> | |||||
<fo:table-column column-width="1cm"/> | |||||
<fo:table-column column-width="14.2cm"/> | |||||
<fo:table-column column-width="0.3cm"/> | |||||
<fo:table-body font-size="10pt" font-family="sans-serif"> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell><fo:block text-align="end">A) </fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="start">What is FOP?<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="end">1</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell><fo:block text-align="end">B) </fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="start">Downloading FOP<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="end">2</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell><fo:block text-align="end" >C) </fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="start">Running FOP<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="end">3</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell><fo:block text-align="end">D) </fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="start">Embedding FOP<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="end">4</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell><fo:block text-align="end">E) </fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="start">What is Implemented?<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell><fo:block text-align="end">5</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
</fo:table-body> | |||||
</fo:table> | |||||
<fo:block text-align="center" | |||||
font-size="16pt" | |||||
space-before.optimum="16pt" | |||||
space-after.optimum="12pt"> | |||||
Table of Content 2 | |||||
</fo:block> | |||||
<fo:block text-align="start" | |||||
font-size="10pt" | |||||
space-after.optimum="12pt"> | |||||
shows the use of leader-length.minimum in the middle column. Values are increased from 0cm (default) | |||||
to 0.5 and then to 1cm | |||||
</fo:block> | |||||
<!-- Here starts the table --> | |||||
<fo:table> | |||||
<fo:table-column column-width="1cm"/> | |||||
<fo:table-column column-width="7cm"/> | |||||
<fo:table-column column-width="2cm"/> | |||||
<fo:table-body font-size="10pt" font-family="sans-serif"> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="end">A)</fo:block></fo:table-cell> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="start">What is FOP doing here in the middle?<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.optimum="5cm" | |||||
leader-length.maximum="7cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="end">1</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="end">A)</fo:block></fo:table-cell> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="start">What is FOP doing here in the middle?<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.minimum="0.5cm" | |||||
leader-length.optimum="5cm" | |||||
leader-length.maximum="7cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="end">1</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
<fo:table-row line-height="12pt"> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="end">A)</fo:block></fo:table-cell> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="start">What is FOP doing here in the middle?<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.minimum="1cm" | |||||
leader-length.optimum="5cm" | |||||
leader-length.maximum="7cm"/></fo:block></fo:table-cell> | |||||
<fo:table-cell border-width="0.5mm"><fo:block text-align="end">1</fo:block></fo:table-cell> | |||||
</fo:table-row> | |||||
</fo:table-body> | |||||
</fo:table> | |||||
<fo:block text-align="center" | |||||
font-size="16pt" | |||||
space-before.optimum="16pt" | |||||
space-after.optimum="12pt"> | |||||
The text/leader combination from table 1 without the table | |||||
</fo:block> | |||||
<fo:block text-align="start">What is FOP?<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block> | |||||
<fo:block text-align="start">Downloading FOP<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block> | |||||
<fo:block text-align="start">Running FOP<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block> | |||||
<fo:block text-align="start">Embedding FOP<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block> | |||||
<fo:block text-align="start">What is Implemented?<fo:leader leader-pattern="dots" | |||||
leader-pattern-width="8pt" | |||||
leader-alignment="reference-area" | |||||
leader-length.maximum="14cm"/></fo:block> | |||||
</fo:flow> | </fo:flow> | ||||
</fo:page-sequence> | </fo:page-sequence> | ||||
</fo:root> | </fo:root> |
<datatype>Length</datatype> | <datatype>Length</datatype> | ||||
</subproperty> | </subproperty> | ||||
</compound> | </compound> | ||||
<!-- <percent-ok base="CONTAINING-BOX"></percent-ok> | |||||
<datatype-conversion type="Length" varname="lenval"> | |||||
new LengthRange(lenval)</datatype-conversion> --> | |||||
</property> | </property> | ||||
<property> | |||||
<name>leader-pattern-width</name> | |||||
<class-name>LeaderPatternWidth</class-name> | |||||
<inherited>true</inherited> | |||||
<datatype>Length</datatype> | |||||
<default contextdep="true">use-font-metrics</default> | |||||
<keyword-equiv match="use-font-metrics" eval="true">0pt</keyword-equiv> | |||||
<percent-ok base="CONTAINING-BOX"/> | |||||
</property> | |||||
<property> | |||||
<name>leader-alignment</name> | |||||
<inherited>true</inherited> | |||||
<datatype>Enum</datatype> | |||||
<enumeration> | |||||
<value const="NONE">none</value> | |||||
<value const="REFERENCE_AREA">reference-area</value> | |||||
<value const="PAGE">page</value> | |||||
</enumeration> | |||||
<default>none</default> | |||||
</property> | |||||
<property> | <property> | ||||
<name>scaling</name> | <name>scaling</name> | ||||
<inherited>true</inherited> | <inherited>true</inherited> |
import org.apache.fop.datatypes.*; | import org.apache.fop.datatypes.*; | ||||
import org.apache.fop.layout.Area; | import org.apache.fop.layout.Area; | ||||
import org.apache.fop.layout.BlockArea; | import org.apache.fop.layout.BlockArea; | ||||
import org.apache.fop.layout.RuleArea; | |||||
import org.apache.fop.layout.LeaderArea; | |||||
import org.apache.fop.layout.FontState; | import org.apache.fop.layout.FontState; | ||||
import org.apache.fop.apps.FOPException; | import org.apache.fop.apps.FOPException; | ||||
import org.apache.fop.messaging.MessageHandler; | import org.apache.fop.messaging.MessageHandler; | ||||
/** | /** | ||||
* This is just a basic implementation mostly based on the code of display-rule | |||||
* It only supports the property leader-pattern="rule", nothing else, not even | |||||
* leader-pattern="space" | |||||
* | |||||
* Implements fo:leader; main property of leader leader-pattern. | |||||
* The following patterns are treated: rule, space, dots. | |||||
* The pattern use-content is ignored, i.e. it still must be implemented. | |||||
*/ | */ | ||||
public class Leader extends FObj { | |||||
public class Leader extends FObjMixed { | |||||
public static class Maker extends FObj.Maker { | |||||
public FObj make(FObj parent, PropertyList propertyList) | |||||
throws FOPException { | |||||
return new Leader(parent, propertyList); | |||||
} | |||||
} | |||||
public static FObj.Maker maker() { | |||||
return new Leader.Maker(); | |||||
} | |||||
public Leader(FObj parent, PropertyList propertyList) { | |||||
super(parent, propertyList); | |||||
this.name = "fo:leader"; | |||||
} | |||||
public Status layout(Area area) throws FOPException { | |||||
String fontFamily = this.properties.get("font-family").getString(); | |||||
String fontStyle = this.properties.get("font-style").getString(); | |||||
String fontWeight = this.properties.get("font-weight").getString(); | |||||
int fontSize = this.properties.get("font-size").getLength().mvalue(); | |||||
FontState fs = new FontState(area.getFontInfo(), fontFamily, | |||||
fontStyle, fontWeight, fontSize); | |||||
int align = this.properties.get("text-align").getEnum(); | |||||
int startIndent = | |||||
this.properties.get("start-indent").getLength().mvalue(); | |||||
int endIndent = | |||||
this.properties.get("end-indent").getLength().mvalue(); | |||||
int spaceBefore = | |||||
this.properties.get("space-before.optimum").getLength().mvalue(); | |||||
int spaceAfter = | |||||
this.properties.get("space-after.optimum").getLength().mvalue(); | |||||
int ruleThickness = | |||||
this.properties.get("rule-thickness").getLength().mvalue(); | |||||
int ruleLength = this.properties.get("leader-length").getLength().mvalue(); | |||||
int leaderPattern = this.properties.get("leader-pattern").getEnum(); | |||||
ColorType c = this.properties.get("color").getColorType(); | |||||
float red = c.red(); | |||||
float green = c.green(); | |||||
float blue = c.blue(); | |||||
if (area instanceof BlockArea) { | |||||
area.end(); | |||||
} | |||||
if (spaceBefore != 0) { | |||||
area.addDisplaySpace(spaceBefore); | |||||
public static class Maker extends FObj.Maker { | |||||
public FObj make(FObj parent, | |||||
PropertyList propertyList) throws FOPException { | |||||
return new Leader(parent, propertyList); | |||||
} | |||||
} | } | ||||
if (this.isInLabel) { | |||||
startIndent += bodyIndent; | |||||
endIndent += (area.getAllocationWidth() - | |||||
distanceBetweenStarts - startIndent) + | |||||
labelSeparation; | |||||
public static FObj.Maker maker() { | |||||
return new Leader.Maker(); | |||||
} | } | ||||
if (this.isInListBody) { | |||||
startIndent += bodyIndent + distanceBetweenStarts; | |||||
public Leader(FObj parent, PropertyList propertyList) { | |||||
super(parent, propertyList); | |||||
this.name = "fo:leader"; | |||||
} | } | ||||
if (this.isInTableCell) { | |||||
startIndent += forcedStartOffset; | |||||
endIndent += area.getAllocationWidth() - forcedWidth - | |||||
forcedStartOffset; | |||||
public Status layout(Area area) throws FOPException { | |||||
BlockArea blockArea; | |||||
//restriction in this version | |||||
if (!(area instanceof BlockArea)) { | |||||
MessageHandler.errorln("WARNING: in this version of Fop fo:leader must be a direct child of fo:block "); | |||||
return new Status(Status.OK); | |||||
} else { | |||||
blockArea = (BlockArea) area; | |||||
} | |||||
//retrieving font property information for fo:leader | |||||
String fontFamily = this.properties.get("font-family").getString(); | |||||
String fontStyle = this.properties.get("font-style").getString(); | |||||
String fontWeight = this.properties.get("font-weight").getString(); | |||||
int fontSize = | |||||
this.properties.get("font-size").getLength().mvalue(); | |||||
//wrapping it up into Fontstate | |||||
FontState fontstate = new FontState(area.getFontInfo(), fontFamily, | |||||
fontStyle, fontWeight, fontSize); | |||||
//color properties | |||||
ColorType c = this.properties.get("color").getColorType(); | |||||
float red = c.red(); | |||||
float green = c.green(); | |||||
float blue = c.blue(); | |||||
//fo:leader specific properties | |||||
//determines the pattern of leader; allowed values: space, rule,dots, use-content | |||||
int leaderPattern = this.properties.get("leader-pattern").getEnum(); | |||||
//length of the leader | |||||
int leaderLengthOptimum = this.properties.get( | |||||
"leader-length.optimum").getLength().mvalue(); | |||||
int leaderLengthMinimum = this.properties.get( | |||||
"leader-length.minimum").getLength().mvalue(); | |||||
//brute force method to set default, because default values cannot be set | |||||
//in the properties classes for all subtypes | |||||
if (leaderLengthMinimum == 12000) { | |||||
leaderLengthMinimum = 0; | |||||
} | |||||
int leaderLengthMaximum = this.properties.get( | |||||
"leader-length.maximum").getLength().mvalue(); | |||||
//here too | |||||
if (leaderLengthMaximum == 12000) { | |||||
leaderLengthMaximum = 24000; | |||||
} | |||||
//the following properties only apply for leader-pattern = "rule" | |||||
int ruleThickness = this.properties.get( | |||||
"rule-thickness").getLength().mvalue(); | |||||
int ruleStyle = this.properties.get("rule-style").getEnum(); | |||||
// if leaderPatternWidth = 0 = default = use-font-metric | |||||
int leaderPatternWidth = this.properties.get( | |||||
"leader-pattern-width").getLength().mvalue(); | |||||
int leaderAlignment = | |||||
this.properties.get("leader-alignment").getEnum(); | |||||
// initialize id | |||||
String id = this.properties.get("id").getString(); | |||||
blockArea.getIDReferences().initializeID(id, blockArea); | |||||
//adds leader to blockarea, there the leaderArea is generated | |||||
int succeeded = blockArea.addLeader(fontstate, red, green, blue, | |||||
leaderPattern, leaderLengthMinimum, | |||||
leaderLengthOptimum, leaderLengthMaximum, | |||||
ruleThickness, ruleStyle, leaderPatternWidth, | |||||
leaderAlignment); | |||||
if (succeeded == 1) { | |||||
return new Status(Status.OK); | |||||
} else { | |||||
//not sure that this is the correct Status here | |||||
return new Status(Status.AREA_FULL_SOME); | |||||
} | |||||
} | } | ||||
// initialize id | |||||
String id = this.properties.get("id").getString(); | |||||
area.getIDReferences().initializeID(id,area); | |||||
switch (leaderPattern) { | |||||
case LeaderPattern.SPACE: | |||||
ruleThickness = 0; | |||||
MessageHandler.errorln("leader-pattern=\"space\" not supported by this version of Fop"); | |||||
break; | |||||
case LeaderPattern.RULE: | |||||
break; | |||||
case LeaderPattern.DOTS: | |||||
MessageHandler.errorln("leader-pattern=\"dots\" not supported by this version of Fop"); | |||||
break; | |||||
case LeaderPattern.USECONTENT: | |||||
MessageHandler.errorln("leader-pattern=\"use-content\" not supported by this version of Fop"); | |||||
break; | |||||
} | |||||
RuleArea ruleArea = new RuleArea(fs, | |||||
area.getAllocationWidth(), | |||||
area.spaceLeft(), | |||||
startIndent, endIndent, | |||||
align, ruleThickness, | |||||
ruleLength, red, green, | |||||
blue); | |||||
area.addChild(ruleArea); | |||||
area.increaseHeight(ruleArea.getHeight()); | |||||
if (spaceAfter != 0) { | |||||
area.addDisplaySpace(spaceAfter); | |||||
} | |||||
/* //should only be necessary for use-content | |||||
protected void addCharacters(char data[], int start, int length) { | |||||
FOText textNode = new FOText(data,start,length, this); | |||||
children.addElement(textNode); | |||||
} | |||||
*/ | |||||
if (area instanceof BlockArea) { | |||||
area.start(); | |||||
} | |||||
return new Status(Status.OK); | |||||
} | |||||
} | } |
// Java | // Java | ||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
import org.apache.fop.messaging.MessageHandler; | |||||
public class BlockArea extends Area { | public class BlockArea extends Area { | ||||
return -1; | return -1; | ||||
} | } | ||||
/** | |||||
* adds a leader to current line area of containing block area | |||||
* the actual leader area is created in the line area | |||||
* | |||||
* @return int +1 for success and -1 for none | |||||
*/ | |||||
public int addLeader(FontState fontState, float red, float green, | |||||
float blue, int leaderPattern, int leaderLengthMinimum, | |||||
int leaderLengthOptimum, int leaderLengthMaximum, | |||||
int ruleThickness, int ruleStyle, int leaderPatternWidth, | |||||
int leaderAlignment) { | |||||
//this should start a new page | |||||
if (currentHeight + currentLineArea.getHeight() > maxHeight) { | |||||
return -1; | |||||
} | |||||
this.currentLineArea.changeFont(fontState); | |||||
this.currentLineArea.changeColor(red, green, blue); | |||||
//check whether leader fits into the (rest of the) line | |||||
//if leader is longer then create a new LineArea and put leader there | |||||
if (leaderLengthMinimum <= (this.getContentWidth() - | |||||
this.currentLineArea.finalWidth - | |||||
this.currentLineArea.pendingWidth)) { | |||||
this.currentLineArea.addLeader(leaderPattern, | |||||
leaderLengthMinimum, leaderLengthOptimum, | |||||
leaderLengthMaximum, ruleStyle, ruleThickness, | |||||
leaderPatternWidth, leaderAlignment); | |||||
} else { | |||||
//finish current line area and put it into children vector | |||||
this.currentLineArea.align(this.align); | |||||
this.addLineArea(this.currentLineArea); | |||||
//create new line area | |||||
this.currentLineArea = | |||||
new LineArea(fontState, lineHeight, halfLeading, | |||||
allocationWidth, startIndent, endIndent, | |||||
currentLineArea); | |||||
this.currentLineArea.changeFont(fontState); | |||||
this.currentLineArea.changeColor(red, green, blue); | |||||
if (currentHeight + currentLineArea.getHeight() > | |||||
this.maxHeight) { | |||||
return -1; | |||||
} | |||||
//check whether leader fits into LineArea at all, otherwise | |||||
//clip it (should honor the clip option of containing area) | |||||
if (leaderLengthMinimum <= | |||||
this.currentLineArea.getContentWidth()) { | |||||
this.currentLineArea.addLeader(leaderPattern, | |||||
leaderLengthMinimum, leaderLengthOptimum, | |||||
leaderLengthMaximum, ruleStyle, ruleThickness, | |||||
leaderPatternWidth, leaderAlignment); | |||||
} else { | |||||
MessageHandler.errorln("Leader doesn't fit into line, it will be clipped to fit."); | |||||
this.currentLineArea.addLeader(leaderPattern, | |||||
this.currentLineArea.getContentWidth() - | |||||
this.currentLineArea.finalWidth - | |||||
this.currentLineArea.pendingWidth, | |||||
leaderLengthOptimum, leaderLengthMaximum, | |||||
ruleStyle, ruleThickness, leaderPatternWidth, | |||||
leaderAlignment); | |||||
} | |||||
} | |||||
this.hasLines = true; | |||||
return 1; | |||||
} | |||||
public void end() { | public void end() { | ||||
if (this.hasLines) { | if (this.hasLines) { | ||||
this.currentLineArea.addPending(); | this.currentLineArea.addPending(); |
public class InlineSpace extends Space { | public class InlineSpace extends Space { | ||||
private int size; // in millipoints | private int size; // in millipoints | ||||
private boolean resizeable = true; //to disallow size changes during justification of a line | |||||
public InlineSpace(int amount) { | public InlineSpace(int amount) { | ||||
this.size = amount; | this.size = amount; | ||||
} | } | ||||
public InlineSpace(int amount, boolean resizeable) { | |||||
this.resizeable = resizeable; | |||||
this.size = amount; | |||||
} | |||||
public int getSize() { | public int getSize() { | ||||
return size; | return size; | ||||
} | } | ||||
this.size = amount; | this.size = amount; | ||||
} | } | ||||
public boolean getResizeable() { | |||||
return resizeable; | |||||
} | |||||
public void setResizeable(boolean resizeable) { | |||||
this.resizeable = resizeable; | |||||
} | |||||
public void render(Renderer renderer) { | public void render(Renderer renderer) { | ||||
renderer.renderInlineSpace(this); | renderer.renderInlineSpace(this); | ||||
} | } |
/*-- $Id$ -- | |||||
/*-- $Id$ -- | |||||
============================================================================ | ============================================================================ | ||||
The Apache Software License, Version 1.1 | The Apache Software License, Version 1.1 | ||||
============================================================================ | ============================================================================ | ||||
Copyright (C) 1999 The Apache Software Foundation. All rights reserved. | Copyright (C) 1999 The Apache Software Foundation. All rights reserved. | ||||
Redistribution and use in source and binary forms, with or without modifica- | Redistribution and use in source and binary forms, with or without modifica- | ||||
tion, are permitted provided that the following conditions are met: | tion, are permitted provided that the following conditions are met: | ||||
1. Redistributions of source code must retain the above copyright notice, | 1. Redistributions of source code must retain the above copyright notice, | ||||
this list of conditions and the following disclaimer. | this list of conditions and the following disclaimer. | ||||
2. Redistributions in binary form must reproduce the above copyright notice, | 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
this list of conditions and the following disclaimer in the documentation | this list of conditions and the following disclaimer in the documentation | ||||
and/or other materials provided with the distribution. | and/or other materials provided with the distribution. | ||||
3. The end-user documentation included with the redistribution, if any, must | 3. The end-user documentation included with the redistribution, if any, must | ||||
include the following acknowledgment: "This product includes software | include the following acknowledgment: "This product includes software | ||||
developed by the Apache Software Foundation (http://www.apache.org/)." | developed by the Apache Software Foundation (http://www.apache.org/)." | ||||
Alternately, this acknowledgment may appear in the software itself, if | Alternately, this acknowledgment may appear in the software itself, if | ||||
and wherever such third-party acknowledgments normally appear. | and wherever such third-party acknowledgments normally appear. | ||||
4. The names "Fop" and "Apache Software Foundation" must not be used to | 4. The names "Fop" and "Apache Software Foundation" must not be used to | ||||
endorse or promote products derived from this software without prior | endorse or promote products derived from this software without prior | ||||
written permission. For written permission, please contact | written permission. For written permission, please contact | ||||
apache@apache.org. | apache@apache.org. | ||||
5. Products derived from this software may not be called "Apache", nor may | 5. Products derived from this software may not be called "Apache", nor may | ||||
"Apache" appear in their name, without prior written permission of the | "Apache" appear in their name, without prior written permission of the | ||||
Apache Software Foundation. | Apache Software Foundation. | ||||
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, | ||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
This software consists of voluntary contributions made by many individuals | This software consists of voluntary contributions made by many individuals | ||||
on behalf of the Apache Software Foundation and was originally created by | on behalf of the Apache Software Foundation and was originally created by | ||||
James Tauber <jtauber@jtauber.com>. For more information on the Apache | |||||
James Tauber <jtauber@jtauber.com>. For more information on the Apache | |||||
Software Foundation, please see <http://www.apache.org/>. | Software Foundation, please see <http://www.apache.org/>. | ||||
*/ | */ | ||||
package org.apache.fop.layout; | package org.apache.fop.layout; | ||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
public class RuleArea extends Area { | |||||
int align; // text-align | |||||
int length; // length in millipoints | |||||
int ruleThickness; | |||||
int startIndent; | |||||
int endIndent; | |||||
float red, green, blue; | |||||
public RuleArea(FontState fontState, int allocationWidth, int maxHeight, int startIndent, int endIndent, int align, int ruleThickness, int length, float red, float green, float blue) { | |||||
super(fontState,allocationWidth,maxHeight); | |||||
this.contentRectangleWidth = allocationWidth - startIndent - endIndent; | |||||
this.align = align; | |||||
this.startIndent = startIndent; | |||||
this.endIndent = endIndent; | |||||
this.ruleThickness = ruleThickness; | |||||
this.length = length; | |||||
this.currentHeight = maxHeight; | |||||
this.red = red; | |||||
this.green = green; | |||||
this.blue = blue; | |||||
} | |||||
public class LeaderArea extends InlineArea { | |||||
int ruleThickness; | |||||
int leaderLengthOptimum; | |||||
int leaderPattern; | |||||
int ruleStyle; | |||||
float red, green, blue; | |||||
public LeaderArea(FontState fontState, float red, float green, | |||||
float blue, String text, int leaderLengthOptimum, | |||||
int leaderPattern, int ruleThickness, int ruleStyle) { | |||||
super(fontState, red, green, blue, text, leaderLengthOptimum); | |||||
this.ruleThickness = ruleThickness; | |||||
this.leaderPattern = leaderPattern; | |||||
this.leaderLengthOptimum = leaderLengthOptimum; | |||||
this.ruleStyle = ruleStyle; | |||||
} | |||||
public void render(Renderer renderer) { | public void render(Renderer renderer) { | ||||
renderer.renderRuleArea(this); | |||||
renderer.renderLeaderArea(this); | |||||
} | |||||
public int getRuleThickness() { | |||||
return this.ruleThickness; | |||||
} | |||||
public int getRuleStyle() { | |||||
return this.ruleStyle; | |||||
} | } | ||||
public float getBlue() { | |||||
return this.blue; | |||||
} | |||||
public int getEndIndent() { | |||||
return endIndent; | |||||
} | |||||
public float getGreen() { | |||||
return this.green; | |||||
} | |||||
public int getHeight() { | |||||
return this.ruleThickness; | |||||
} | |||||
public float getRed() { | |||||
return this.red; | |||||
} | |||||
public int getRuleThickness() { | |||||
return this.ruleThickness; | |||||
} | |||||
public int getStartIndent() { | |||||
return startIndent; | |||||
} | |||||
public int getLeaderPattern() { | |||||
return this.leaderPattern; | |||||
} | |||||
public int getLeaderLength() { | |||||
return this.contentRectangleWidth; | |||||
} | |||||
} | } |
import org.apache.fop.render.Renderer; | import org.apache.fop.render.Renderer; | ||||
import org.apache.fop.messaging.MessageHandler; | import org.apache.fop.messaging.MessageHandler; | ||||
import org.apache.fop.layout.LeaderArea; | |||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
// values | // values | ||||
import org.apache.fop.fo.properties.TextAlignLast; // for enumerated | import org.apache.fop.fo.properties.TextAlignLast; // for enumerated | ||||
// values | // values | ||||
import org.apache.fop.fo.properties.LeaderPattern; | |||||
import org.apache.fop.fo.properties.LeaderAlignment; | |||||
import org.apache.fop.datatypes.IDNode; | import org.apache.fop.datatypes.IDNode; | ||||
} | } | ||||
/** | |||||
* adds text to line area | |||||
* | |||||
* @return int character position | |||||
*/ | |||||
public int addText(char odata[], int start, int end, LinkSet ls, | public int addText(char odata[], int start, int end, LinkSet ls, | ||||
boolean ul) { | boolean ul) { | ||||
boolean overrun = false; | boolean overrun = false; | ||||
Enumeration e = pendingAreas.elements(); | Enumeration e = pendingAreas.elements(); | ||||
while (e.hasMoreElements()) { | while (e.hasMoreElements()) { | ||||
InlineArea inlineArea = | |||||
(InlineArea) e.nextElement(); | |||||
if (ls != null) { | |||||
Rectangle lr = new Rectangle(finalWidth, 0, | |||||
inlineArea.getContentWidth(), | |||||
fontState.getFontSize()); | |||||
ls.addRect(lr, this); | |||||
Box box = (Box) e.nextElement(); | |||||
if (box instanceof InlineArea) { | |||||
if (ls != null) { | |||||
Rectangle lr = new Rectangle(finalWidth, 0, | |||||
((InlineArea) box). | |||||
getContentWidth(), | |||||
fontState.getFontSize()); | |||||
ls.addRect(lr, this); | |||||
} | |||||
} | } | ||||
addChild(inlineArea); | |||||
addChild(box); | |||||
} | } | ||||
finalWidth += pendingWidth; | finalWidth += pendingWidth; | ||||
// reset pending areas array | // reset pending areas array | ||||
if (this.spaceTreatment == | if (this.spaceTreatment == | ||||
SpaceTreatment.IGNORE) { | SpaceTreatment.IGNORE) { | ||||
// do nothing | // do nothing | ||||
} else { | |||||
} else { | |||||
spaceWidth = currentFontState.width(32); | spaceWidth = currentFontState.width(32); | ||||
} | |||||
} | |||||
*/ | */ | ||||
return -1; | return -1; | ||||
} | } | ||||
/** | |||||
* adds a Leader; actually the method receives the leader properties | |||||
* and creates a leader area or an inline area which is appended to | |||||
* the children of the containing line area. <br> | |||||
* leader pattern use-content is not implemented. | |||||
*/ | |||||
public void addLeader(int leaderPattern, int leaderLengthMinimum, | |||||
int leaderLengthOptimum, int leaderLengthMaximum, | |||||
int ruleStyle, int ruleThickness, int leaderPatternWidth, | |||||
int leaderAlignment) { | |||||
InlineArea leaderPatternArea; | |||||
int leaderLength; | |||||
int remainingWidth = this.getContentWidth() - this.getCurrentXPosition(); | |||||
//here is the point to decide which leader-length is to be used, either | |||||
//optimum or maximum. At the moment maximum is used if the remaining | |||||
//width isn't smaller. In this case only the remaining width is used for | |||||
//the leader. Actually this means, optimum is never used at the moment. | |||||
if (remainingWidth < leaderLengthMaximum) { | |||||
leaderLength = remainingWidth; | |||||
} else { | |||||
leaderLength = leaderLengthMaximum; | |||||
} | |||||
switch (leaderPattern) { | |||||
case LeaderPattern.SPACE: | |||||
//whitespace setting must be false for this | |||||
int whiteSpaceSetting = this.whiteSpaceCollapse; | |||||
this.changeWhiteSpaceCollapse(WhiteSpaceCollapse.FALSE); | |||||
pendingAreas.addElement(this.buildSimpleLeader(32,leaderLength)); | |||||
this.changeWhiteSpaceCollapse(whiteSpaceSetting); | |||||
break; | |||||
case LeaderPattern.RULE: | |||||
LeaderArea leaderArea = | |||||
new LeaderArea(fontState, red, green, blue, "", | |||||
leaderLength, leaderPattern, ruleThickness, | |||||
ruleStyle); | |||||
pendingAreas.addElement(leaderArea); | |||||
break; | |||||
case LeaderPattern.DOTS: | |||||
//if the width of a dot is larger than leader-pattern-width | |||||
//ignore this property | |||||
if (leaderPatternWidth < this.currentFontState.width(46)) { | |||||
leaderPatternWidth = 0; | |||||
} | |||||
//if value of leader-pattern-width is 'use-font-metrics' (0) | |||||
if (leaderPatternWidth == 0) { | |||||
pendingAreas.addElement(this.buildSimpleLeader(46,leaderLength)); | |||||
} else { | |||||
//if leader-alignment is used, calculate space to insert before leader | |||||
//so that all dots will be parallel. | |||||
if (leaderAlignment == LeaderAlignment.REFERENCE_AREA) { | |||||
int spaceBeforeLeader = | |||||
this.getLeaderAlignIndent(leaderLength, | |||||
leaderPatternWidth); | |||||
//appending indent space leader-alignment | |||||
//setting InlineSpace to false, so it is not used in line justification | |||||
if (spaceBeforeLeader != 0) { | |||||
pendingAreas.addElement( | |||||
new InlineSpace(spaceBeforeLeader,false)); | |||||
pendingWidth += spaceBeforeLeader; | |||||
//shorten leaderLength, otherwise - in case of | |||||
//leaderLength=remaining length - it will cut off the end of | |||||
//leaderlength | |||||
leaderLength -= spaceBeforeLeader; | |||||
} | |||||
} | |||||
// calculate the space to insert between the dots and create a | |||||
//inline area with this width | |||||
InlineSpace spaceBetweenDots = | |||||
new InlineSpace(leaderPatternWidth - | |||||
this.currentFontState.width(46),false); | |||||
leaderPatternArea = new InlineArea(currentFontState, this.red, | |||||
this.green, this.blue, new String ("."), | |||||
this.currentFontState.width(46)); | |||||
int dotsFactor = (int) Math.floor (((double) leaderLength )/ | |||||
((double)leaderPatternWidth)); | |||||
//add combination of dot + space to fill leader | |||||
//is there a way to do this in a more effective way? | |||||
for (int i = 0; i < dotsFactor; i++) { | |||||
pendingAreas.addElement(leaderPatternArea); | |||||
pendingAreas.addElement(spaceBetweenDots); | |||||
} | |||||
//append at the end some space to fill up to leader length | |||||
pendingAreas.addElement( new InlineSpace(leaderLength - | |||||
dotsFactor * leaderPatternWidth)); | |||||
} | |||||
break; | |||||
//leader pattern use-content not implemented. | |||||
case LeaderPattern.USECONTENT: | |||||
MessageHandler.errorln("leader-pattern=\"use-content\" not " | |||||
+ "supported by this version of Fop"); | |||||
return; | |||||
} | |||||
//adds leader length to length of pending inline areas | |||||
pendingWidth += leaderLength; | |||||
//sets prev to TEXT and makes so sure, that also blocks only | |||||
//containing leaders are processed | |||||
prev = TEXT; | |||||
} | |||||
/** | |||||
* adds pending inline areas to the line area | |||||
* normally done,if the line area is filled and | |||||
* added as child to the parent block area | |||||
*/ | |||||
public void addPending() { | public void addPending() { | ||||
if (spaceWidth > 0) { | if (spaceWidth > 0) { | ||||
addChild(new InlineSpace(spaceWidth)); | addChild(new InlineSpace(spaceWidth)); | ||||
Enumeration e = pendingAreas.elements(); | Enumeration e = pendingAreas.elements(); | ||||
while (e.hasMoreElements()) { | while (e.hasMoreElements()) { | ||||
InlineArea inlineArea = (InlineArea) e.nextElement(); | |||||
addChild(inlineArea); | |||||
Box box = (Box) e.nextElement(); | |||||
addChild(box); | |||||
} | } | ||||
finalWidth += pendingWidth; | finalWidth += pendingWidth; | ||||
// reset pending areas array | // reset pending areas array | ||||
pendingAreas = new Vector(); | pendingAreas = new Vector(); | ||||
} | } | ||||
/** | |||||
* aligns line area | |||||
* | |||||
*/ | |||||
public void align(int type) { | public void align(int type) { | ||||
int padding = 0; | int padding = 0; | ||||
Box b = (Box) e.nextElement(); | Box b = (Box) e.nextElement(); | ||||
if (b instanceof InlineSpace) { | if (b instanceof InlineSpace) { | ||||
InlineSpace space = (InlineSpace) b; | InlineSpace space = (InlineSpace) b; | ||||
spaceList.addElement(space); | |||||
spaceCount++; | |||||
if (space.getResizeable()) { | |||||
spaceList.addElement(space); | |||||
spaceCount++; | |||||
} | |||||
} | } | ||||
} | } | ||||
if (spaceCount > 0) { | if (spaceCount > 0) { | ||||
pendingWidth = width; | pendingWidth = width; | ||||
} | } | ||||
/** | |||||
* creates a leader as String out of the given char and the leader length | |||||
* and wraps it in an InlineArea which is returned | |||||
*/ | |||||
private InlineArea buildSimpleLeader(int charNumber,int leaderLength) { | |||||
int factor = (int) Math.floor (leaderLength / | |||||
this.currentFontState.width(charNumber)); | |||||
char [] leaderChars = new char [factor]; | |||||
char fillChar = (char) charNumber; | |||||
for (int i = 0; i < factor; i ++) { | |||||
leaderChars[i] = fillChar; | |||||
} | |||||
InlineArea leaderPatternArea = new InlineArea(currentFontState, this.red, | |||||
this.green, this.blue, new String (leaderChars), | |||||
leaderLength); | |||||
return leaderPatternArea; | |||||
} | |||||
/** | |||||
* calculates the width of space which has to be inserted before the | |||||
* start of the leader, so that all leader characters are aligned. | |||||
* is used if property leader-align is set. At the moment only the value | |||||
* for leader-align="reference-area" is supported. | |||||
* | |||||
*/ | |||||
private int getLeaderAlignIndent (int leaderLength, | |||||
int leaderPatternWidth ) { | |||||
//calculate position of used space in line area | |||||
double position = getCurrentXPosition(); | |||||
//calculate factor of next leader pattern cycle | |||||
double nextRepeatedLeaderPatternCycle = | |||||
Math.ceil(position / leaderPatternWidth); | |||||
//calculate difference between start of next leader | |||||
//pattern cycle and already used space | |||||
double difference = (leaderPatternWidth * | |||||
nextRepeatedLeaderPatternCycle) - position; | |||||
return (int) difference; | |||||
} | |||||
/** | |||||
* calculates the used space in this line area | |||||
*/ | |||||
private int getCurrentXPosition() { | |||||
return finalWidth + spaceWidth + startIndent + pendingWidth; | |||||
} | |||||
} | } |
/** render the given page */ | /** render the given page */ | ||||
public void renderPage(Page page); | public void renderPage(Page page); | ||||
/** render the given rule area */ | |||||
public void renderRuleArea(RuleArea area); | |||||
/** render the given leader area */ | |||||
public void renderLeaderArea(LeaderArea area); | |||||
} | } |
this.currentYPosition = ry - h; | this.currentYPosition = ry - h; | ||||
} | } | ||||
/** | |||||
* render rule area into PDF | |||||
* | |||||
* @param area area to render | |||||
*/ | |||||
public void renderRuleArea(RuleArea area) { | |||||
int rx = this.currentAreaContainerXPosition + area.getStartIndent(); | |||||
int ry = this.currentYPosition; | |||||
int w = area.getContentWidth(); | |||||
int h = area.getHeight(); | |||||
int th = area.getRuleThickness(); | |||||
float r = area.getRed(); | |||||
float g = area.getGreen(); | |||||
float b = area.getBlue(); | |||||
Color oldColor = graphics.getColor(); | |||||
/** | |||||
* render leader area into AWT | |||||
* | |||||
* @param area area to render | |||||
*/ | |||||
public void renderLeaderArea(LeaderArea area) { | |||||
int rx = this.currentXPosition; | |||||
int ry = this.currentYPosition; | |||||
int w = area.getLeaderLength(); | |||||
int h = area.getHeight(); | |||||
int th = area.getRuleThickness(); | |||||
int st = area.getRuleStyle(); //not used at the moment | |||||
float r = area.getRed(); | |||||
float g = area.getGreen(); | |||||
float b = area.getBlue(); | |||||
Color oldColor = graphics.getColor(); | |||||
graphics.setColor(new Color(r, g, b)); | |||||
graphics.fillRect((int)(rx / 1000f), (int)(pageHeight - ry / 1000f), | |||||
(int)(w / 1000f), (int)(th / 1000f)); | |||||
graphics.setColor(oldColor); | |||||
this.currentXPosition += area.getContentWidth(); | |||||
} | |||||
graphics.setColor(new Color(r, g, b)); | |||||
graphics.fillRect((int)(rx / 1000f), | |||||
(int)(pageHeight - ry / 1000f), (int)(w / 1000f), | |||||
(int)(th / 1000f)); | |||||
graphics.setColor(oldColor); | |||||
} | |||||
public void renderSVGArea(SVGArea area) { | public void renderSVGArea(SVGArea area) { | ||||
} | } | ||||
/** | /** | ||||
* render rule area into PDF | |||||
* render leader area into PDF | |||||
* | * | ||||
* @param area area to render | * @param area area to render | ||||
*/ | */ | ||||
public void renderRuleArea(RuleArea area) { | |||||
int rx = this.currentAreaContainerXPosition | |||||
+ area.getStartIndent(); | |||||
public void renderLeaderArea(LeaderArea area) { | |||||
int rx = this.currentXPosition;; | |||||
int ry = this.currentYPosition; | int ry = this.currentYPosition; | ||||
int w = area.getContentWidth(); | int w = area.getContentWidth(); | ||||
int h = area.getHeight(); | int h = area.getHeight(); | ||||
int th = area.getRuleThickness(); | int th = area.getRuleThickness(); | ||||
int st = area.getRuleStyle(); //not used at the moment | |||||
addLine(rx, ry, rx+w, ry, th, new PDFColor(area.getRed(), area.getGreen(),area.getBlue())); | addLine(rx, ry, rx+w, ry, th, new PDFColor(area.getRed(), area.getGreen(),area.getBlue())); | ||||
this.currentXPosition += area.getContentWidth(); | |||||
} | } | ||||
/** | /** |
import org.apache.fop.image.ImageArea; | import org.apache.fop.image.ImageArea; | ||||
import org.apache.fop.layout.*; | import org.apache.fop.layout.*; | ||||
import org.apache.fop.pdf.*; | import org.apache.fop.pdf.*; | ||||
import org.apache.fop.fo.properties.LeaderPattern; | |||||
// Java | // Java | ||||
import java.io.IOException; | import java.io.IOException; | ||||
} | } | ||||
/** | /** | ||||
* render a rule area to XML | |||||
* | |||||
* @param area the area to render | |||||
*/ | |||||
public void renderRuleArea(RuleArea area) { | |||||
writeEmptyElementTag("<Rule start-indent=\"" | |||||
+ area.getStartIndent() | |||||
+ "\" end-indent=\"" | |||||
+ area.getEndIndent() | |||||
+ "\" rule-thickness=\"" | |||||
+ area.getRuleThickness() | |||||
+ "\" red=\"" + area.getRed() | |||||
+ "\" green=\"" + area.getGreen() | |||||
+ "\" blue = \"" + area.getBlue() | |||||
+ "\"/>"); | |||||
* render a leader area to XML | |||||
* | |||||
* @param area the area to render | |||||
*/ | |||||
public void renderLeaderArea(LeaderArea area) { | |||||
String leaderPattern = ""; | |||||
switch (area.getLeaderPattern()) { | |||||
case LeaderPattern.SPACE: | |||||
leaderPattern = "space"; | |||||
break; | |||||
case LeaderPattern.RULE: | |||||
leaderPattern = "rule"; | |||||
break; | |||||
case LeaderPattern.DOTS: | |||||
leaderPattern = "dots"; | |||||
break; | |||||
case LeaderPattern.USECONTENT: | |||||
leaderPattern = "use-content"; | |||||
break; | |||||
} | |||||
writeEmptyElementTag("<Leader leader-pattern=\"" + leaderPattern + | |||||
" leader-length=\"" + area.getLeaderLength()+ | |||||
"\" rule-thickness=\"" + area.getRuleThickness() + | |||||
"\" rule-style=\"" + area.getRuleStyle() + | |||||
"\" red=\"" + area.getRed() + "\" green=\"" + area.getGreen() + | |||||
"\" blue = \"" + area.getBlue() + "\"/>"); | |||||
} | } | ||||
} | } |