Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_2_Build_894 / libraries / libUI / src / org / gvsig / gui / beans / controls / comboscale / ComboScale.java @ 10309

History | View | Annotate | Download (6.65 KB)

1
package org.gvsig.gui.beans.controls.comboscale;
2

    
3
import java.awt.FlowLayout;
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6
import java.awt.event.KeyEvent;
7
import java.awt.event.KeyListener;
8
import java.text.NumberFormat;
9
import java.util.ArrayList;
10
import java.util.BitSet;
11
import java.util.Iterator;
12

    
13
import javax.swing.DefaultComboBoxModel;
14
import javax.swing.JComboBox;
15
import javax.swing.JLabel;
16
import javax.swing.JPanel;
17

    
18
import org.gvsig.gui.beans.controls.IControl;
19

    
20
public class ComboScale extends JPanel implements IControl {
21

    
22
        private JLabel jLabel = null;
23

    
24
        private JComboBox jComboBox = null;
25

    
26
        private ArrayList actionCommandListeners = new ArrayList();
27

    
28
        // private Long[] scales;
29
        private boolean bDoCallListeners = true;
30

    
31
        private boolean isScaleCombo;
32

    
33
        static private int eventId = Integer.MIN_VALUE;
34

    
35
        // jaume
36
        private class ComboScaleItem {
37
                private long value;
38

    
39
                public ComboScaleItem(long itemScale) {
40
                        this.value = itemScale;
41
                }
42

    
43
                public String toString() {
44
                        return NumberFormat.getNumberInstance().format(value);
45
                }
46

    
47
                public boolean equals(Object obj) {
48
                        return obj instanceof ComboScaleItem && ((ComboScaleItem) obj).getValue() == value;
49
                }
50

    
51
                public long getValue() {
52
                        return value;
53
                }
54
        }
55
        /**
56
         * This is the default constructor
57
         */
58
        public ComboScale() {
59
                super();
60
                initialize();
61
        }
62

    
63
        /**
64
         * This method initializes this
65
         *
66
         * @return void
67
         */
68
        private void initialize() {
69
                FlowLayout flowLayout = new FlowLayout();
70
                flowLayout.setHgap(0);
71
                flowLayout.setVgap(0);
72
                jLabel = new JLabel();
73
                jLabel.setText("1:");
74
                this.setLayout(flowLayout);
75
                this.setSize(155, 16);
76
                //this.setBorder(javax.swing.BorderFactory.createLineBorder(
77
                this.add(jLabel, null);
78
                this.add(getJComboBox(), null);
79
                                //java.awt.Color.gray, 1));
80
        }
81

    
82
        /**
83
         * This method initializes jComboBox
84
         *
85
         * @return javax.swing.JComboBox
86
         */
87
        private JComboBox getJComboBox() {
88
                if (jComboBox == null) {
89
                        jComboBox = new JComboBox();
90
                        jComboBox.setPreferredSize(new java.awt.Dimension(130, 16));
91
                        jComboBox.setEditable(true);
92
                        jComboBox.setMaximumRowCount(5);
93
                        jComboBox.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD,
94
                                        10));
95
                        jComboBox.setBackground(java.awt.SystemColor.window);
96
                        jComboBox.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);
97
                        jComboBox.addActionListener(new java.awt.event.ActionListener() {
98
                                public void actionPerformed(java.awt.event.ActionEvent e) {
99
                                        if (e.getActionCommand().equals("comboBoxChanged")) {
100

    
101
                                                // callActionCommandListeners(((Long)jComboBox.getSelectedItem()).longValue());
102
                                                // setScale(((Long)jComboBox.getSelectedItem()).longValue());
103
                                                Object item = jComboBox.getSelectedItem();
104
                                                long scale=0;
105
                                                if (item instanceof String) {
106
                                                        StringBuffer sb = new StringBuffer((String) item);
107
                                                        // remove any point in the number
108
                                                        final String digits = "0123456789";
109
                                                        int i = sb.charAt(0) == '-' ? 1 : 0;
110
                                                        BitSet deleteChars=new BitSet();
111
                                                        while (i < sb.length()) {
112
                                                                if (digits.indexOf(sb.charAt(i))==-1)
113
                                                                        deleteChars.set(i);
114
                                                                i++;
115
                                                        }
116
                                                        for (int k=deleteChars.size();k>=0;k--){
117
                                                                if (deleteChars.get(k))
118
                                                                        sb.deleteCharAt(k);
119
                                                        }
120
                                                        jComboBox.removeItem(item);
121
                                                        try{
122
                                                                scale = Long.parseLong(sb.toString());
123
                                                        }catch (NumberFormatException e1) {
124
                                                        }
125
                                                } else {
126
                                                        scale = ((ComboScaleItem) jComboBox.getSelectedItem())
127
                                                        .getValue();
128
                                                }
129
                                                insertScaleIfNotPresent(scale);
130
                                                callActionCommandListeners(scale);
131
                                        }
132
                                }
133
                        });
134
                }
135
                return jComboBox;
136
        }
137

    
138
        public void setItems(long[] items) {
139
                ComboScaleItem[] scales = new ComboScaleItem[items.length];
140
                for (int i = 0; i < items.length; i++) {
141
                        scales[i] = new ComboScaleItem(items[i]);
142
                }
143
                DefaultComboBoxModel newModel = new DefaultComboBoxModel(scales);
144
                getJComboBox().setModel(newModel);
145
        }
146

    
147
        /**
148
         * This funcion ONLY sets the text in combo. It will NOT call listeners.
149
         *
150
         * @param scale
151
         */
152
        public void setScale(long item) {
153
                bDoCallListeners = false;
154
                getJComboBox().setSelectedItem(new ComboScaleItem(item));
155
                bDoCallListeners = true;
156
        }
157

    
158
        /**
159
         * @param scale
160
         */
161
        private void insertScaleIfNotPresent(long scale) {
162
                // Si viene de un setScale, no insertamos la escala en el combo
163
                if (!bDoCallListeners)
164
                        return;
165

    
166
                DefaultComboBoxModel model = (DefaultComboBoxModel) jComboBox
167
                                .getModel();
168
                // model=new DefaultComboBoxModel();
169
                boolean inserted = false;
170
                for (int i = 0; i < model.getSize(); i++) {
171
                        ComboScaleItem itemScale = (ComboScaleItem) model.getElementAt(i);
172
                        if (scale == itemScale.getValue()) {
173
                                inserted = true;
174
                                break;
175
                        }
176
                }
177
                if (!inserted) {
178
                        for (int i = 0; i < model.getSize(); i++) {
179
                                ComboScaleItem itemScale = (ComboScaleItem) model.getElementAt(i);
180
                                if (scale < itemScale.getValue()) {
181
                                        model.insertElementAt(new ComboScaleItem(scale), i);
182
                                        inserted = true;
183
                                        break;
184
                                }
185
                        }
186
                        if (!inserted)
187
                                model.addElement(new ComboScaleItem(scale));
188
                }
189
                jComboBox.setSelectedItem(new ComboScaleItem(scale));
190
                isScaleCombo=true;
191
        }
192

    
193
        private void callActionCommandListeners(long scale) {
194
                if (!bDoCallListeners)
195
                        return;
196

    
197
                Iterator acIterator = actionCommandListeners.iterator();
198
                while (acIterator.hasNext()) {
199
                        ActionListener listener = (ActionListener) acIterator.next();
200
                        listener.actionPerformed(new ActionEvent(this, eventId,
201
                                        "CHANGE_SCALE_" + scale));
202
                }
203
                eventId++;
204
        }
205

    
206
        public void addActionListener(ActionListener listener) {
207
                if (!actionCommandListeners.contains(listener))
208
                        actionCommandListeners.add(listener);
209
        }
210

    
211
        public void removeActionListener(ActionListener listener) {
212
                actionCommandListeners.remove(listener);
213
        }
214

    
215
        /**
216
         * Returns the current selected item.
217
         *
218
         * @return The value of the selected scale, or -1 if there was an invalid
219
         *         value (ie. not long value).
220
         */
221
        public long getScale() {
222
                return ((ComboScaleItem) jComboBox.getSelectedItem()).getValue();
223
        }
224

    
225
        /**
226
         * Sets the label to be displayed on the left of the combo
227
         */
228
        public void setLabel(String label) {
229
                jLabel.setText(label);
230
        }
231

    
232
        /**
233
         * Gets the label
234
         */
235
        public String getLabel() {
236
                return jLabel.getText();
237
        }
238

    
239
        public Object setValue(Object value) {
240
                if (isScaleCombo) {
241
                        isScaleCombo=false;
242
                        return null;
243
                }
244
                try {
245
                        long scale = Long.parseLong((String)value);
246

    
247
                        if (scale < 0)
248
                                return null;
249

    
250
                        ComboScaleItem item = new ComboScaleItem(scale);
251
                        if (item.equals(jComboBox.getSelectedItem()))
252
                                return item;
253
                        this.setScale(scale);
254
                        return item;
255
                } catch (NumberFormatException ex) {
256
                        // don't change the status if the provided value was not valid
257
                        return null;
258
                }
259
        }
260

    
261
} // @jve:decl-index=0:visual-constraint="10,10"