gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / DropDownLabel.java @ 2339
History | View | Annotate | Download (6.96 KB)
1 | 1884 | jjdelcerro | package org.gvsig.tools.swing.impl; |
---|---|---|---|
2 | |||
3 | 1947 | jjdelcerro | import java.awt.BorderLayout; |
4 | 2010 | jjdelcerro | import java.awt.Color; |
5 | 1884 | jjdelcerro | import java.awt.Cursor; |
6 | import java.awt.Point; |
||
7 | import java.awt.event.ActionEvent; |
||
8 | import java.awt.event.ActionListener; |
||
9 | import java.awt.event.ItemEvent; |
||
10 | import java.awt.event.ItemListener; |
||
11 | import java.awt.event.MouseAdapter; |
||
12 | import java.awt.event.MouseEvent; |
||
13 | 2010 | jjdelcerro | import java.lang.reflect.Method; |
14 | 1884 | jjdelcerro | import java.util.HashSet; |
15 | 1887 | jjdelcerro | import java.util.List; |
16 | 1884 | jjdelcerro | import java.util.Objects; |
17 | import java.util.Set; |
||
18 | 2010 | jjdelcerro | import javax.swing.AbstractButton; |
19 | 1884 | jjdelcerro | import javax.swing.ComboBoxModel; |
20 | 1887 | jjdelcerro | import javax.swing.ImageIcon; |
21 | 1884 | jjdelcerro | import javax.swing.JComponent; |
22 | import javax.swing.JLabel; |
||
23 | import javax.swing.JMenuItem; |
||
24 | import javax.swing.JPopupMenu; |
||
25 | 1947 | jjdelcerro | import javax.swing.UIManager; |
26 | import org.apache.commons.lang3.StringUtils; |
||
27 | 1884 | jjdelcerro | import org.gvsig.tools.swing.api.DropDown; |
28 | |||
29 | /**
|
||
30 | *
|
||
31 | * @author jjdelcerro
|
||
32 | */
|
||
33 | 2010 | jjdelcerro | @SuppressWarnings("UseSpecificCatch") |
34 | 1884 | jjdelcerro | public class DropDownLabel implements DropDown { |
35 | |||
36 | 2010 | jjdelcerro | private final JComponent component; |
37 | 1884 | jjdelcerro | private final Set<ItemListener> itemListeners; |
38 | private ComboBoxModel model; |
||
39 | private int selectedIndex; |
||
40 | private JPopupMenu popup; |
||
41 | 1887 | jjdelcerro | private List<ImageIcon>icons; |
42 | 1946 | jjdelcerro | private boolean readonly = false; |
43 | 2010 | jjdelcerro | private final JLabel arrow; |
44 | private Color disabledForeground = null; |
||
45 | private Color enabledForeground = null; |
||
46 | |||
47 | |||
48 | public DropDownLabel(final JComponent component) { |
||
49 | this.component = component;
|
||
50 | 1884 | jjdelcerro | this.itemListeners = new HashSet<>(); |
51 | 2010 | jjdelcerro | this.component.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); |
52 | this.component.addMouseListener(new MouseAdapter() { |
||
53 | 1884 | jjdelcerro | @Override
|
54 | public void mouseClicked(MouseEvent e) { |
||
55 | doShowPopup(); |
||
56 | } |
||
57 | }); |
||
58 | 1887 | jjdelcerro | this.icons=null; |
59 | 2010 | jjdelcerro | this.component.setLayout(new BorderLayout(2,0)); |
60 | 1947 | jjdelcerro | // http://www.unicode.org/charts/PDF/U25A0.pdf
|
61 | this.arrow = new JLabel("\u25BE"); |
||
62 | 2010 | jjdelcerro | this.component.add(arrow, BorderLayout.EAST); |
63 | 1947 | jjdelcerro | this.arrow.setVisible(false); |
64 | this.arrow.addMouseListener(new MouseAdapter() { |
||
65 | @Override
|
||
66 | public void mouseClicked(MouseEvent e) { |
||
67 | doShowPopup(); |
||
68 | } |
||
69 | }); |
||
70 | 1884 | jjdelcerro | } |
71 | |||
72 | @Override
|
||
73 | public JComponent asJComponent() { |
||
74 | 2010 | jjdelcerro | return this.component; |
75 | 1884 | jjdelcerro | } |
76 | 1946 | jjdelcerro | |
77 | 1947 | jjdelcerro | @Override
|
78 | 1946 | jjdelcerro | public boolean isReadOnly() { |
79 | return this.readonly; |
||
80 | } |
||
81 | |||
82 | 1947 | jjdelcerro | @Override
|
83 | 1946 | jjdelcerro | public void setReadOnly(boolean readOnly) { |
84 | 2010 | jjdelcerro | if( disabledForeground == null ) { |
85 | disabledForeground = UIManager.getColor("Label.disabledForeground"); |
||
86 | enabledForeground = UIManager.getColor("Label.foreground"); |
||
87 | if( this.component instanceof AbstractButton ) { |
||
88 | disabledForeground = UIManager.getColor("Button.disabledText"); |
||
89 | enabledForeground = UIManager.getColor("Button.foreground"); |
||
90 | } |
||
91 | } |
||
92 | |||
93 | 1946 | jjdelcerro | this.readonly = readOnly;
|
94 | 1947 | jjdelcerro | if( readOnly ) {
|
95 | 2010 | jjdelcerro | component.setForeground(disabledForeground); |
96 | 1947 | jjdelcerro | } else {
|
97 | 2010 | jjdelcerro | component.setForeground(enabledForeground); |
98 | 1947 | jjdelcerro | } |
99 | 1946 | jjdelcerro | } |
100 | 1884 | jjdelcerro | |
101 | 1886 | jjdelcerro | @Override
|
102 | 1947 | jjdelcerro | public void setVisibleDropdownArrow(boolean visible) { |
103 | this.arrow.setVisible(visible);
|
||
104 | } |
||
105 | |||
106 | @Override
|
||
107 | public boolean isVisibleDropdownArrow() { |
||
108 | return this.arrow.isVisible(); |
||
109 | } |
||
110 | |||
111 | @Override
|
||
112 | 1886 | jjdelcerro | public void setEnabled(boolean enabled) { |
113 | 2010 | jjdelcerro | this.component.setEnabled(enabled);
|
114 | 1947 | jjdelcerro | this.arrow.setEnabled(enabled);
|
115 | 1886 | jjdelcerro | } |
116 | |||
117 | 1884 | jjdelcerro | private void doShowPopup() { |
118 | if (model == null) { |
||
119 | return;
|
||
120 | } |
||
121 | this.popup = new JPopupMenu(); |
||
122 | for (int i = 0; i < model.getSize(); i++) { |
||
123 | this.popup.add(this.createItem(i)); |
||
124 | } |
||
125 | 2010 | jjdelcerro | Point p = component.getLocationOnScreen();
|
126 | popup.show(component, 0, component.getHeight());
|
||
127 | 1884 | jjdelcerro | } |
128 | |||
129 | 1887 | jjdelcerro | @Override
|
130 | public void setIcons(List<ImageIcon> icons) { |
||
131 | this.icons= icons;
|
||
132 | } |
||
133 | |||
134 | @Override
|
||
135 | public List<ImageIcon> getIcons() { |
||
136 | return this.icons; |
||
137 | } |
||
138 | |||
139 | private ImageIcon getIcon(int index) { |
||
140 | if( this.icons == null || index<0 || index>this.icons.size() ) { |
||
141 | return null; |
||
142 | } |
||
143 | return this.icons.get(index); |
||
144 | } |
||
145 | |||
146 | 1884 | jjdelcerro | private JMenuItem createItem(final int index) { |
147 | JMenuItem item = new JMenuItem(Objects.toString(model.getElementAt(index), "")); |
||
148 | 1947 | jjdelcerro | item.setEnabled(!readonly); |
149 | 1887 | jjdelcerro | item.setIcon(this.getIcon(index));
|
150 | 1884 | jjdelcerro | item.addActionListener(new ActionListener() { |
151 | @Override
|
||
152 | public void actionPerformed(ActionEvent e) { |
||
153 | 1947 | jjdelcerro | if( readonly ) {
|
154 | return;
|
||
155 | } |
||
156 | 1884 | jjdelcerro | setSelectedIndex(index); |
157 | ItemEvent ie = new ItemEvent(DropDownLabel.this, 1, index, ItemEvent.SELECTED); |
||
158 | for (ItemListener itemListener : itemListeners) { |
||
159 | if (itemListener != null) { |
||
160 | itemListener.itemStateChanged(ie); |
||
161 | } |
||
162 | } |
||
163 | } |
||
164 | }); |
||
165 | return item;
|
||
166 | } |
||
167 | |||
168 | @Override
|
||
169 | public void setModel(ComboBoxModel model) { |
||
170 | this.model = model;
|
||
171 | } |
||
172 | |||
173 | @Override
|
||
174 | public ComboBoxModel getModel() { |
||
175 | return this.model; |
||
176 | } |
||
177 | |||
178 | @Override
|
||
179 | public void setSelectedIndex(int i) { |
||
180 | if( model == null ) { |
||
181 | return;
|
||
182 | } |
||
183 | 1947 | jjdelcerro | String value=null; |
184 | 1890 | jjdelcerro | if( i<0 ) { |
185 | 2010 | jjdelcerro | this.component.setToolTipText(null); |
186 | 1890 | jjdelcerro | } else {
|
187 | value = Objects.toString(this.model.getElementAt(i), ""); |
||
188 | 2010 | jjdelcerro | this.component.setToolTipText(value);
|
189 | 1890 | jjdelcerro | } |
190 | 1947 | jjdelcerro | if( StringUtils.isBlank(value) ) {
|
191 | value = " ";
|
||
192 | } |
||
193 | 2010 | jjdelcerro | this.setText(value);
|
194 | 1884 | jjdelcerro | this.selectedIndex = i;
|
195 | } |
||
196 | |||
197 | 2010 | jjdelcerro | private void setText(String s) { |
198 | if( this.component instanceof JLabel ) { |
||
199 | ((JLabel)this.component).setText(s); |
||
200 | } else if( this.component instanceof AbstractButton ) { |
||
201 | ((AbstractButton)this.component).setText(s); |
||
202 | } else {
|
||
203 | try {
|
||
204 | Class<? extends JComponent> theClass = this.component.getClass(); |
||
205 | Method method = theClass.getMethod("setText", String.class); |
||
206 | method.invoke(this.component, s);
|
||
207 | } catch(Throwable th) { |
||
208 | // Ignore
|
||
209 | } |
||
210 | } |
||
211 | } |
||
212 | |||
213 | @Override
|
||
214 | 1884 | jjdelcerro | public Object getSelectedItem() { |
215 | if( model == null ) { |
||
216 | return null; |
||
217 | } |
||
218 | return this.model.getElementAt(selectedIndex); |
||
219 | } |
||
220 | |||
221 | @Override
|
||
222 | public int getSelectedIndex() { |
||
223 | return this.selectedIndex; |
||
224 | } |
||
225 | |||
226 | @Override
|
||
227 | public Object[] getSelectedObjects() { |
||
228 | if( model == null ) { |
||
229 | return null; |
||
230 | } |
||
231 | return new Object[]{this.getSelectedItem()}; |
||
232 | } |
||
233 | |||
234 | @Override
|
||
235 | public void addItemListener(ItemListener itemListener) { |
||
236 | this.itemListeners.add(itemListener);
|
||
237 | } |
||
238 | |||
239 | @Override
|
||
240 | public void removeItemListener(ItemListener l) { |
||
241 | this.itemListeners.remove(l);
|
||
242 | } |
||
243 | |||
244 | } |