From: Peter Bernard West Date: Fri, 28 May 2004 15:29:48 +0000 (+0000) Subject: Line breaking example from J2SDK - NOT PART OF FOP X-Git-Tag: Defoe_export~126 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=09bc5ea41af08abf41ea2ee23a52afd7ec5f4397;p=xmlgraphics-fop.git Line breaking example from J2SDK - NOT PART OF FOP git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/FOP_0-20-0_Alt-Design@197649 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/fop/render/awt/LineBreakSample.java b/src/java/org/apache/fop/render/awt/LineBreakSample.java new file mode 100644 index 000000000..6796030c3 --- /dev/null +++ b/src/java/org/apache/fop/render/awt/LineBreakSample.java @@ -0,0 +1,140 @@ +package org.apache.fop.render.awt; + +import javax.swing.*; +import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.font.LineBreakMeasurer; +import java.awt.font.TextLayout; +import java.util.Hashtable; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; +import java.awt.font.TextAttribute; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +/** + * This class demonstrates how to line-break and draw a paragraph + * of text using LineBreakMeasurer and TextLayout. + * + * This class constructs a LineBreakMeasurer from an + * AttributedCharacterIterator. It uses the LineBreakMeasurer + * to create and draw TextLayouts (lines of text) which fit within + * the Component's width. + */ + +public class LineBreakSample extends JApplet { + + // The LineBreakMeasurer used to line-break the paragraph. + private LineBreakMeasurer lineMeasurer; + + // The index in the LineBreakMeasurer of the first character + // in the paragraph. + private int paragraphStart; + + // The index in the LineBreakMeasurer of the first character + // after the end of the paragraph. + private int paragraphEnd; + + private static final Hashtable map = new Hashtable(); + static { + map.put(TextAttribute.FAMILY, "Utopia"); + map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); + map.put(TextAttribute.WIDTH, TextAttribute.WIDTH_CONDENSED); + map.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD); + map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_LOW_ONE_PIXEL); + map.put(TextAttribute.FOREGROUND, Color.red); + map.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); + map.put(TextAttribute.SIZE, new Float(18.0)); + } + + private static AttributedString vanGogh = new AttributedString( + "Many people believe that Vincent van Gogh painted his best works " + + "during the two-year period he spent in Provence. Here is where he " + + "painted The Starry Night--which some consider to be his greatest " + + "work of all. However, as his artistic brilliance reached new heights " + + "in Provence, his physical and mental health plummeted. ", map); + + public void init() { + buildUI(getContentPane()); + } + + public void buildUI(Container container){ + LineBreakPanel lineBreakPanel = new LineBreakPanel(); + container.add(lineBreakPanel, BorderLayout.CENTER); + } + + class LineBreakPanel extends JPanel { + + public LineBreakPanel() { + //setFont(Font.decode("utopia-plain-14")); + AttributedCharacterIterator paragraph = vanGogh.getIterator(); + paragraphStart = paragraph.getBeginIndex(); + paragraphEnd = paragraph.getEndIndex(); + + // Create a new LineBreakMeasurer from the paragraph. + lineMeasurer = new LineBreakMeasurer(paragraph, + new FontRenderContext(null, true, true)); + } + + public void paintComponent(Graphics g) { + + super.paintComponent(g); + setBackground(Color.white); + + Graphics2D graphics2D = (Graphics2D) g; + + // Set formatting width to width of Component. + Dimension size = getSize(); + float formatWidth = (float) size.width; + + float drawPosY = 0; + + lineMeasurer.setPosition(paragraphStart); + + // Get lines from lineMeasurer until the entire + // paragraph has been displayed. + while (lineMeasurer.getPosition() < paragraphEnd) { + + // Retrieve next layout. + TextLayout layout = lineMeasurer.nextLayout(formatWidth); + // Move y-coordinate by the ascent of the layout. + drawPosY += layout.getAscent(); + + // Compute pen x position. If the paragraph is + // right-to-left, we want to align the TextLayouts + // to the right edge of the panel. + float drawPosX; + if (layout.isLeftToRight()) { + drawPosX = 0; + } + else { + drawPosX = formatWidth - layout.getAdvance(); + } + + // Draw the TextLayout at (drawPosX, drawPosY). + layout.draw(graphics2D, drawPosX, drawPosY); + + // Move y-coordinate in preparation for next layout. + drawPosY += layout.getDescent() + layout.getLeading(); + } + + } + } + + public static void main(String[] args) { + + JFrame f = new JFrame("HitTestSample"); + + f.addWindowListener(new WindowAdapter(){ + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + + LineBreakSample controller = new LineBreakSample(); + controller.buildUI(f.getContentPane()); + f.setSize(new Dimension(400, 250)); + f.setVisible(true); + } + +}