Statistics
| Revision:

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 @ 2010

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
}