Statistics
| Revision:

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

History | View | Annotate | Download (6.65 KB)

1 5930 caballero
package org.gvsig.gui.beans.controls.comboscale;
2
3 9844 caballero
import java.awt.FlowLayout;
4 6582 cesar
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6 9844 caballero
import java.awt.event.KeyEvent;
7
import java.awt.event.KeyListener;
8 6937 jaume
import java.text.NumberFormat;
9 5930 caballero
import java.util.ArrayList;
10 9844 caballero
import java.util.BitSet;
11 6582 cesar
import java.util.Iterator;
12 5930 caballero
13
import javax.swing.DefaultComboBoxModel;
14
import javax.swing.JComboBox;
15 6582 cesar
import javax.swing.JLabel;
16 5930 caballero
import javax.swing.JPanel;
17
18 6582 cesar
import org.gvsig.gui.beans.controls.IControl;
19 5930 caballero
20 6582 cesar
public class ComboScale extends JPanel implements IControl {
21
22 5930 caballero
        private JLabel jLabel = null;
23 6823 fjp
24 5930 caballero
        private JComboBox jComboBox = null;
25 6632 caballero
26 6823 fjp
        private ArrayList actionCommandListeners = new ArrayList();
27
28
        // private Long[] scales;
29
        private boolean bDoCallListeners = true;
30
31 8765 jjdelcerro
        private boolean isScaleCombo;
32
33 6823 fjp
        static private int eventId = Integer.MIN_VALUE;
34
35 6937 jaume
        // 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 5930 caballero
        /**
56
         * This is the default constructor
57
         */
58
        public ComboScale() {
59
                super();
60
                initialize();
61
        }
62
63
        /**
64
         * This method initializes this
65 6937 jaume
         *
66 5930 caballero
         * @return void
67
         */
68
        private void initialize() {
69 7341 maquerol
                FlowLayout flowLayout = new FlowLayout();
70
                flowLayout.setHgap(0);
71
                flowLayout.setVgap(0);
72 5930 caballero
                jLabel = new JLabel();
73
                jLabel.setText("1:");
74 7341 maquerol
                this.setLayout(flowLayout);
75
                this.setSize(155, 16);
76
                //this.setBorder(javax.swing.BorderFactory.createLineBorder(
77 5930 caballero
                this.add(jLabel, null);
78
                this.add(getJComboBox(), null);
79 8765 jjdelcerro
                                //java.awt.Color.gray, 1));
80 5930 caballero
        }
81
82
        /**
83
         * This method initializes jComboBox
84 6937 jaume
         *
85 5930 caballero
         * @return javax.swing.JComboBox
86
         */
87
        private JComboBox getJComboBox() {
88
                if (jComboBox == null) {
89
                        jComboBox = new JComboBox();
90 6823 fjp
                        jComboBox.setPreferredSize(new java.awt.Dimension(130, 16));
91 5930 caballero
                        jComboBox.setEditable(true);
92
                        jComboBox.setMaximumRowCount(5);
93 6823 fjp
                        jComboBox.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD,
94
                                        10));
95 5930 caballero
                        jComboBox.setBackground(java.awt.SystemColor.window);
96 9844 caballero
                        jComboBox.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);
97 5930 caballero
                        jComboBox.addActionListener(new java.awt.event.ActionListener() {
98
                                public void actionPerformed(java.awt.event.ActionEvent e) {
99 6582 cesar
                                        if (e.getActionCommand().equals("comboBoxChanged")) {
100 6823 fjp
101
                                                // callActionCommandListeners(((Long)jComboBox.getSelectedItem()).longValue());
102
                                                // setScale(((Long)jComboBox.getSelectedItem()).longValue());
103 6937 jaume
                                                Object item = jComboBox.getSelectedItem();
104 9844 caballero
                                                long scale=0;
105 6937 jaume
                                                if (item instanceof String) {
106 6940 jaume
                                                        StringBuffer sb = new StringBuffer((String) item);
107 7018 jaume
                                                        // remove any point in the number
108
                                                        final String digits = "0123456789";
109
                                                        int i = sb.charAt(0) == '-' ? 1 : 0;
110 9844 caballero
                                                        BitSet deleteChars=new BitSet();
111
                                                        while (i < sb.length()) {
112 7018 jaume
                                                                if (digits.indexOf(sb.charAt(i))==-1)
113 9844 caballero
                                                                        deleteChars.set(i);
114 7018 jaume
                                                                i++;
115 6940 jaume
                                                        }
116 9844 caballero
                                                        for (int k=deleteChars.size();k>=0;k--){
117
                                                                if (deleteChars.get(k))
118
                                                                        sb.deleteCharAt(k);
119
                                                        }
120 6937 jaume
                                                        jComboBox.removeItem(item);
121 9844 caballero
                                                        try{
122
                                                                scale = Long.parseLong(sb.toString());
123
                                                        }catch (NumberFormatException e1) {
124
                                                        }
125 6937 jaume
                                                } else {
126
                                                        scale = ((ComboScaleItem) jComboBox.getSelectedItem())
127
                                                        .getValue();
128
                                                }
129 6823 fjp
                                                insertScaleIfNotPresent(scale);
130
                                                callActionCommandListeners(scale);
131 6582 cesar
                                        }
132 5930 caballero
                                }
133
                        });
134
                }
135
                return jComboBox;
136
        }
137
138
        public void setItems(long[] items) {
139 6937 jaume
                ComboScaleItem[] scales = new ComboScaleItem[items.length];
140 6823 fjp
                for (int i = 0; i < items.length; i++) {
141 6937 jaume
                        scales[i] = new ComboScaleItem(items[i]);
142 5930 caballero
                }
143 6823 fjp
                DefaultComboBoxModel newModel = new DefaultComboBoxModel(scales);
144
                getJComboBox().setModel(newModel);
145 5930 caballero
        }
146 6823 fjp
147
        /**
148
         * This funcion ONLY sets the text in combo. It will NOT call listeners.
149 6937 jaume
         *
150 6823 fjp
         * @param scale
151
         */
152 5930 caballero
        public void setScale(long item) {
153 6823 fjp
                bDoCallListeners = false;
154 6937 jaume
                getJComboBox().setSelectedItem(new ComboScaleItem(item));
155 7019 jaume
                bDoCallListeners = true;
156 6823 fjp
        }
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 7286 jaume
                if (!bDoCallListeners)
164
                        return;
165 6937 jaume
166 6823 fjp
                DefaultComboBoxModel model = (DefaultComboBoxModel) jComboBox
167
                                .getModel();
168
                // model=new DefaultComboBoxModel();
169
                boolean inserted = false;
170
                for (int i = 0; i < model.getSize(); i++) {
171 6937 jaume
                        ComboScaleItem itemScale = (ComboScaleItem) model.getElementAt(i);
172
                        if (scale == itemScale.getValue()) {
173 6823 fjp
                                inserted = true;
174
                                break;
175 5930 caballero
                        }
176 6823 fjp
                }
177
                if (!inserted) {
178
                        for (int i = 0; i < model.getSize(); i++) {
179 6937 jaume
                                ComboScaleItem itemScale = (ComboScaleItem) model.getElementAt(i);
180
                                if (scale < itemScale.getValue()) {
181
                                        model.insertElementAt(new ComboScaleItem(scale), i);
182 6823 fjp
                                        inserted = true;
183
                                        break;
184
                                }
185 5930 caballero
                        }
186 6823 fjp
                        if (!inserted)
187 6937 jaume
                                model.addElement(new ComboScaleItem(scale));
188 5930 caballero
                }
189 8765 jjdelcerro
                jComboBox.setSelectedItem(new ComboScaleItem(scale));
190
                isScaleCombo=true;
191 5930 caballero
        }
192 6823 fjp
193
        private void callActionCommandListeners(long scale) {
194 7286 jaume
                if (!bDoCallListeners)
195 6823 fjp
                        return;
196 6632 caballero
197 6582 cesar
                Iterator acIterator = actionCommandListeners.iterator();
198
                while (acIterator.hasNext()) {
199
                        ActionListener listener = (ActionListener) acIterator.next();
200 6823 fjp
                        listener.actionPerformed(new ActionEvent(this, eventId,
201
                                        "CHANGE_SCALE_" + scale));
202 6582 cesar
                }
203
                eventId++;
204
        }
205 6632 caballero
206 6582 cesar
        public void addActionListener(ActionListener listener) {
207
                if (!actionCommandListeners.contains(listener))
208
                        actionCommandListeners.add(listener);
209
        }
210 6632 caballero
211 6582 cesar
        public void removeActionListener(ActionListener listener) {
212
                actionCommandListeners.remove(listener);
213
        }
214 6632 caballero
215 6618 cesar
        /**
216
         * Returns the current selected item.
217 6937 jaume
         *
218 6823 fjp
         * @return The value of the selected scale, or -1 if there was an invalid
219
         *         value (ie. not long value).
220 6618 cesar
         */
221
        public long getScale() {
222 6937 jaume
                return ((ComboScaleItem) jComboBox.getSelectedItem()).getValue();
223 6618 cesar
        }
224 6632 caballero
225 6618 cesar
        /**
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 6632 caballero
232 6618 cesar
        /**
233
         * Gets the label
234
         */
235
        public String getLabel() {
236
                return jLabel.getText();
237
        }
238 6632 caballero
239 6937 jaume
        public Object setValue(Object value) {
240 8765 jjdelcerro
                if (isScaleCombo) {
241
                        isScaleCombo=false;
242
                        return null;
243
                }
244 6622 cesar
                try {
245 6937 jaume
                        long scale = Long.parseLong((String)value);
246
247 6938 jaume
                        if (scale < 0)
248 6937 jaume
                                return null;
249
250
                        ComboScaleItem item = new ComboScaleItem(scale);
251
                        if (item.equals(jComboBox.getSelectedItem()))
252
                                return item;
253 6622 cesar
                        this.setScale(scale);
254 6937 jaume
                        return item;
255 6823 fjp
                } catch (NumberFormatException ex) {
256 6632 caballero
                        // don't change the status if the provided value was not valid
257 6622 cesar
                        return null;
258
                }
259
        }
260 6937 jaume
261 6823 fjp
} // @jve:decl-index=0:visual-constraint="10,10"