source: josm/trunk/src/org/openstreetmap/josm/gui/JMultilineLabel.java@ 1864

Last change on this file since 1864 was 1864, checked in by stoecker, 15 years ago

close #3114 - patch by Michi - large dialogs

File size: 3.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2
3// This class was taken from
4// http://forum.java.sun.com/thread.jspa?threadID=459705&messageID=2104021
5// - Removed hardcoded margin
6// - Added constructor
7
8package org.openstreetmap.josm.gui;
9
10import java.awt.Dimension;
11import java.awt.Graphics;
12import java.awt.Graphics2D;
13import java.awt.Insets;
14import java.awt.font.FontRenderContext;
15import java.awt.font.LineBreakMeasurer;
16import java.awt.font.TextAttribute;
17import java.text.AttributedCharacterIterator;
18import java.text.AttributedString;
19import java.awt.font.TextLayout;
20
21import javax.swing.JComponent;
22
23public class JMultilineLabel extends JComponent {
24 private String text;
25 private int maxWidth = Integer.MAX_VALUE;
26 private boolean justify;
27 private final FontRenderContext frc = new FontRenderContext(null, false, false);
28
29 public JMultilineLabel(String description) {
30 super();
31 setText(description);
32 }
33
34 private void morph() {
35 revalidate();
36 repaint();
37 }
38
39 public String getText() {
40 return text;
41 }
42
43 public void setText(String text) {
44 String old = this.text;
45 this.text = text;
46 firePropertyChange("text", old, this.text);
47 if ((old == null) ? text!=null : !old.equals(text))
48 morph();
49 }
50
51 public int getMaxWidth() {
52 return maxWidth;
53 }
54
55 public void setMaxWidth(int maxWidth) {
56 if (maxWidth <= 0)
57 throw new IllegalArgumentException();
58 int old = this.maxWidth;
59 this.maxWidth = maxWidth;
60 firePropertyChange("maxWidth", old, this.maxWidth);
61 if (old != this.maxWidth)
62 morph();
63 }
64
65 public boolean isJustified() {
66 return justify;
67 }
68
69 public void setJustified(boolean justify) {
70 boolean old = this.justify;
71 this.justify = justify;
72 firePropertyChange("justified", old, this.justify);
73 if (old != this.justify)
74 repaint();
75 }
76
77 public Dimension getPreferredSize() {
78 return paintOrGetSize(null, getMaxWidth());
79 }
80
81 public Dimension getMinimumSize() {
82 return getPreferredSize();
83 }
84
85 protected void paintComponent(Graphics g) {
86 super.paintComponent(g);
87 paintOrGetSize((Graphics2D)g, getWidth());
88 }
89
90 private Dimension paintOrGetSize(Graphics2D g, int width) {
91 Insets insets = getInsets();
92 width -= insets.left + insets.right;
93 float w = insets.left + insets.right;
94 float x = insets.left, y=insets.top;
95
96 if (width > 0 && text != null && text.length() > 0) {
97 String[] lines = getText().split("\n");
98 for(String line : lines) {
99 // Insert a space so new lines get rendered
100 if(line.length() == 0) line = " ";
101 AttributedString as = new AttributedString(line);
102 as.addAttribute(TextAttribute.FONT, getFont());
103 AttributedCharacterIterator aci = as.getIterator();
104 LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);
105 float max = 0;
106 while (lbm.getPosition() < aci.getEndIndex()) {
107 TextLayout textLayout = lbm.nextLayout(width);
108 if (g != null && isJustified() && textLayout.getVisibleAdvance() > 0.80 * width)
109 textLayout = textLayout.getJustifiedLayout(width);
110 if (g != null)
111 textLayout.draw(g, x, y + textLayout.getAscent());
112 y += textLayout.getDescent() + textLayout.getLeading() + textLayout.getAscent();
113 max = Math.max(max, textLayout.getVisibleAdvance());
114 }
115 w = Math.max(max, w);
116 }
117 }
118 return new Dimension((int)Math.ceil(w), (int)Math.ceil(y) + insets.bottom);
119 }
120}
Note: See TracBrowser for help on using the repository browser.