1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.xnap.gui.component;
20
21 import org.apache.log4j.Logger;
22
23 import org.xnap.gui.util.*;
24
25 import javax.swing.*;
26 import java.awt.event.*;
27 import java.awt.*;
28
29 /***
30 *
31 * @todo handle icons too.
32 */
33 public class SqueezedTextLabel extends JLabel implements ComponentListener
34 {
35
36
37
38
39 private static Logger logger = Logger.getLogger(SqueezedTextLabel.class);
40
41 private String text = null;
42
43
44
45 public SqueezedTextLabel()
46 {
47 addComponentListener(this);
48 }
49
50 public SqueezedTextLabel(String text)
51 {
52 this();
53 setText(text);
54 }
55
56
57
58 private void squeezeText()
59 {
60 if (text == null) {
61 super.setText(null);
62 return;
63 }
64
65 Font font = getFont();
66 if (font == null) {
67 return;
68 }
69
70 FontMetrics fm = getFontMetrics(font);
71 int textwidth = fm.stringWidth(text);
72 int width = getWidth();
73
74 setPreferredSize(new Dimension(textwidth, getPreferredSize().height));
75
76 if (textwidth > width) {
77 super.setText(getSqueezedText(fm, width));
78 setToolTipText(GUIHelper.label(text));
79 }
80 else {
81 super.setText(text);
82 setToolTipText(null);
83 }
84 }
85
86
87
88
89
90
91
92
93
94
95
96 private String getSqueezedText(FontMetrics fm, int width)
97 {
98 int dots = fm.stringWidth("...") + fm.getMaxAdvance();
99 char[] array = text.toCharArray();
100 int length = 0;
101
102
103
104 while (length < array.length
105 && fm.charsWidth(array, 0, length) + dots < width) {
106 length++;
107 }
108 return new String(array, 0, length) + "...";
109 }
110
111 public void setText(String t)
112 {
113 text = t;
114 squeezeText();
115 }
116
117 /***
118 * Returns the original unsqueezed text.
119 */
120 public String getUnsqueezedText()
121 {
122 return text;
123 }
124
125 public void componentHidden(ComponentEvent e)
126 {
127 }
128
129 public void componentMoved(ComponentEvent e)
130 {
131 }
132
133 public void componentResized(ComponentEvent e)
134 {
135 squeezeText();
136 }
137
138
139 public void componentShown(ComponentEvent e)
140 {
141 }
142 }