1 17 package org.columba.core.gui.base; 18 19 import java.awt.Container ; 20 import java.awt.Dimension ; 21 import java.awt.Graphics ; 22 import java.awt.Graphics2D ; 23 import java.awt.Insets ; 24 import java.awt.Point ; 25 import java.awt.Toolkit ; 26 import java.awt.font.LineBreakMeasurer ; 27 import java.awt.font.TextAttribute ; 28 import java.awt.font.TextLayout ; 29 import java.text.AttributedString ; 30 import java.util.Iterator ; 31 import java.util.LinkedList ; 32 import java.util.List ; 33 34 import javax.swing.JComponent ; 35 import javax.swing.UIManager ; 36 37 40 public class MultiLineLabel extends JComponent { 41 private String text; 42 private int[] lineBreaks; 43 protected LineBreakMeasurer measurer; 44 protected int lineSpacing = 4; 45 46 49 public MultiLineLabel(String text) { 50 setForeground(UIManager.getColor("Label.foreground")); 51 setFont(UIManager.getFont("Label.font")); 52 setAlignmentX(LEFT_ALIGNMENT); 53 setPreferredSize(new Dimension ( 54 Toolkit.getDefaultToolkit().getScreenSize().width / 3, 50)); 55 setText(text); 56 } 57 58 61 public String getText() { 62 return text; 63 } 64 65 68 public void setText(String text) { 69 String oldValue = this.text; 70 this.text = text; 71 measurer = null; 72 firePropertyChange("text", oldValue, text); 73 revalidate(); 74 repaint(); 75 } 76 77 80 public int getLineSpacing() { 81 return lineSpacing; 82 } 83 84 87 public void setLineSpacing(int lineSpacing) { 88 Integer oldValue = new Integer (this.lineSpacing); 89 this.lineSpacing = lineSpacing; 90 firePropertyChange("lineSpacing", oldValue, new Integer (lineSpacing)); 91 revalidate(); 92 repaint(); 93 } 94 95 99 public Dimension getMinimumSize() { 100 int height = 5; 101 int width = 0; 102 Container parent = getParent(); 103 if (parent != null) { 104 width = parent.getWidth(); 105 } 106 if (width == 0) { 107 width = Toolkit.getDefaultToolkit().getScreenSize().width / 3; 108 } 109 LineBreakMeasurer measurer = getLineBreakMeasurer(); 110 TextLayout layout; 111 int i = 0; 112 while (measurer != null && measurer.getPosition() < text.length()) { 113 layout = measurer.nextLayout(width - 20, lineBreaks[i], false); 114 115 if (measurer.getPosition() == lineBreaks[i]) { 117 i++; 118 } 119 120 height += layout.getAscent() + layout.getDescent() + 122 layout.getLeading() + lineSpacing; 123 } 124 125 Insets insets = getInsets(); 127 return new Dimension (width + insets.left + insets.right, 128 height + insets.top + insets.bottom); 129 } 130 131 protected LineBreakMeasurer getLineBreakMeasurer() { 132 if (measurer == null) { 133 if (text != null && text.length() > 0) { 134 AttributedString string = new AttributedString (text); 135 string.addAttribute(TextAttribute.FONT, getFont()); 136 measurer = new LineBreakMeasurer (string.getIterator(), 137 ((Graphics2D )getGraphics()).getFontRenderContext()); 138 139 List temp = new LinkedList (); 141 int i; 142 char c; 143 for (i = 0; i < text.length(); i++) { 144 c = text.charAt(i); 145 if (c == '\r' || c == '\n') { 146 temp.add(new Integer (i + 1)); 147 } 148 } 149 i = 0; 151 lineBreaks = new int[temp.size() + 1]; 152 Iterator iterator = temp.iterator(); 153 while (iterator.hasNext()) { 154 lineBreaks[i++] = ((Integer )iterator.next()).intValue(); 155 } 156 lineBreaks[i] = text.length(); 157 } 158 } else { 159 measurer.setPosition(0); 160 } 161 return measurer; 162 } 163 164 protected void paintComponent(Graphics graphics) { 165 super.paintComponent(graphics); 166 graphics.setColor(getForeground()); 167 Graphics2D g = (Graphics2D )graphics; 168 LineBreakMeasurer measurer = getLineBreakMeasurer(); 169 float wrappingWidth = getWidth() - 15; 170 if (wrappingWidth <= 0 || measurer == null) { 171 return; 172 } 173 Insets insets = getInsets(); 174 Point pen = new Point (5 + insets.left, 5 + insets.top); 175 TextLayout layout; 176 int i = 0; 177 while (measurer.getPosition() < text.length()) { 178 layout = measurer.nextLayout(wrappingWidth, lineBreaks[i], false); 179 180 if (measurer.getPosition() == lineBreaks[i]) { 182 i++; 183 } 184 185 pen.y += layout.getAscent(); 187 float dx = layout.isLeftToRight() ? 188 0 : (wrappingWidth - layout.getAdvance()); 189 layout.draw(g, pen.x + dx, pen.y); 190 pen.y += layout.getDescent() + layout.getLeading() + lineSpacing; 191 } 192 } 193 194 195 198 public Dimension getPreferredSize() { 199 200 return getMinimumSize(); 201 } 202 } 203 | Popular Tags |