Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.fmap.control / src / main / java / org / gvsig / fmap / mapcontrol / swing / pickercontroller / impl / ScalePickerControllerImpl.java @ 47426

History | View | Annotate | Download (9.25 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.fmap.mapcontrol.swing.pickercontroller.impl;
7

    
8
import java.awt.Component;
9
import java.awt.Image;
10
import java.awt.event.ActionEvent;
11
import java.awt.event.ActionListener;
12
import java.net.URL;
13
import javax.swing.DefaultComboBoxModel;
14
import javax.swing.ImageIcon;
15
import javax.swing.JButton;
16
import javax.swing.JComboBox;
17
import javax.swing.JTextField;
18
import javax.swing.JToggleButton;
19
import javax.swing.SwingConstants;
20
import org.gvsig.fmap.dal.DataTypes;
21
import org.gvsig.fmap.mapcontrol.MapControl;
22
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
23
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
24
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseWheelBehavior;
25
import org.gvsig.fmap.mapcontrol.tools.Behavior.MoveBehavior;
26
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
27
import org.gvsig.fmap.mapcontrol.tools.Events.MoveEvent;
28
import org.gvsig.fmap.mapcontrol.tools.Events.PointEvent;
29
import org.gvsig.fmap.mapcontrol.tools.Listeners.PanListener;
30
import org.gvsig.fmap.mapcontrol.tools.Listeners.PointListener;
31
import org.gvsig.tools.IllegalValueException;
32
import org.gvsig.tools.ToolsLocator;
33
import org.gvsig.tools.dataTypes.CoercionException;
34
import org.gvsig.tools.dataTypes.DataType;
35
import org.gvsig.tools.swing.api.ToolsSwingLocator;
36
import org.gvsig.tools.swing.api.documentfilters.DoubleDocumentFilter;
37
import org.gvsig.tools.swing.api.pickercontroller.AbstractPickerController;
38
import org.gvsig.tools.swing.icontheme.IconTheme;
39
import org.gvsig.tools.swing.icontheme.IconThemeManager;
40

    
41
/**
42
 *
43
 * @author jjdelcerro
44
 */
45
public class ScalePickerControllerImpl extends AbstractPickerController<Double>{
46

    
47
        public static void selfRegister() {
48
            IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
49
            IconTheme theme = iconThemeManager.getCurrent();
50
            
51
            URL url = ScalePickerControllerImpl.class.getClassLoader().getResource("images/picker-scale-cursor-capture.png");
52
            if( url != null ) {
53
                ImageIcon icon = new ImageIcon(url);
54
                theme.registerDefault("mapcontrol", "picker", "picker-scale", "picker-scale-cursor-capture", icon, url);
55
            }
56
            url = ScalePickerControllerImpl.class.getClassLoader().getResource("images/picker-scale-capture.png");
57
            if( url != null ) {
58
                ImageIcon icon = new ImageIcon(url);
59
                theme.registerDefault("mapcontrol", "picker", "picker-scale", "picker-scale-capture", icon, url);
60
            }
61
            url = ScalePickerControllerImpl.class.getClassLoader().getResource("images/picker-scale-from-mapcontrol.png");
62
            if( url != null ) {
63
                ImageIcon icon = new ImageIcon(url);
64
                theme.registerDefault("mapcontrol", "picker", "picker-scale", "picker-scale-from-mapcontrol", icon, url);
65
            }
66
    }
67
    
68
    private class CaptureScaleListener implements PanListener,PointListener  {
69

    
70
        @Override
71
        public Image getImageCursor() {
72
            return captureCursor.getImage();
73
        }
74

    
75
        @Override
76
        public boolean cancelDrawing() {
77
            return false;
78
        }
79

    
80
        @Override
81
        public void move(MoveEvent event) throws BehaviorException {
82
            doSetScaleFromMapControlScale();
83
        }
84

    
85
        @Override
86
        public void point(PointEvent event) throws BehaviorException {
87
            doSetScaleFromMapControlScale();
88
        }
89

    
90
        @Override
91
        public void pointDoubleClick(PointEvent event) throws BehaviorException {
92
            doSetScaleFromMapControlScale();
93
        }
94
        
95
    }
96
    
97
    private final MapControl mapControl;
98
    private final JComboBox cboScale;
99
    private final JButton btnMapControlScale;
100
    private final JToggleButton btnCapture;
101

    
102
    private ImageIcon captureCursor;    
103
    private Behavior[] captureTool;
104
    private String previosTool;
105
    
106
    public ScalePickerControllerImpl(
107
            MapControl mapControl,
108
            JComboBox cboScale, 
109
            JButton btnMapControlScale, 
110
            final JToggleButton btnCapture
111
        ) {
112
        this.mapControl = mapControl;
113
        this.cboScale = cboScale;
114
        this.btnMapControlScale = btnMapControlScale;
115
        this.btnCapture = btnCapture;
116

    
117
        this.initComponents();      
118
    }
119
    
120
    private void initComponents() {
121
        this.captureCursor.setImage(this.getIcon("picker-scale-cursor-capture").getImage());
122
        this.btnCapture.setIcon(this.getIcon("picker-scale-capture"));
123
        this.btnMapControlScale.setIcon(this.getIcon("picker-scale-from-mapcontrol"));
124
        
125
        Component comboEditor = this.cboScale.getEditor().getEditorComponent();
126
        if( comboEditor instanceof JTextField ) {
127
            JTextField editor = (JTextField)comboEditor;
128
            editor.setHorizontalAlignment(SwingConstants.RIGHT);
129
            DoubleDocumentFilter.install(editor);
130
        }
131
        DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>(new String[] {
132
            "1000", "2000", "5000", "10000", "25000", "50000", "100000",
133
            "200000", "500000", "1000000", "2000000", "5000000"
134
        });
135
        this.cboScale.setModel(model);
136
        this.cboScale.setSelectedItem("10000");
137
        
138
        if( this.mapControl==null ) {
139
            this.btnCapture.setEnabled(false);
140
            this.btnMapControlScale.setEnabled(false);
141
        } else {
142
            this.btnCapture.setEnabled(true);
143
            this.btnMapControlScale.setEnabled(true);
144
            CaptureScaleListener captureListener = new CaptureScaleListener();
145
            this.captureTool = new Behavior[] {
146
                new MouseMovementBehavior(captureListener),
147
                new MouseWheelBehavior(),
148
                new MoveBehavior(captureListener, Behavior.BUTTON_MIDDLE)
149
            };
150

    
151
            this.mapControl.addBehavior("picker-scale-capture", this.captureTool);
152
            this.previosTool = this.mapControl.getCurrentTool();
153
            doSetScaleFromMapControlScale();
154
        }
155
            
156
        
157
        if( this.btnMapControlScale!=null ) {
158
            this.btnMapControlScale.addActionListener(new ActionListener() {
159
                @Override
160
                public void actionPerformed(ActionEvent e) {
161
                    doSetScaleFromMapControlScale();
162
                }
163
            });
164
        }
165
        this.btnCapture.addActionListener(new ActionListener() {
166
            @Override
167
            public void actionPerformed(ActionEvent e) {
168
                doCaptureScale(btnCapture.isSelected());
169
            }
170
        });
171
    }
172
            
173
    protected void doSetScaleFromMapControlScale() {
174
        if( !this.isEditable() ) {
175
            return;
176
        }
177
        try {
178
            double theScale = this.mapControl.getMapContext().getScaleView();
179
            this.set(theScale);
180
        } catch (Exception ex) {
181
            LOG.warn("Can't get scale from mapcontrol.", ex);
182
        }
183
    }
184
    
185
    protected void doCaptureScale(boolean enabled) {
186
        if( !this.isEditable() ) {
187
            return;
188
        }
189
        if( enabled ) {
190
            this.previosTool = this.mapControl.getCurrentTool();
191
            this.mapControl.setTool("picker-scale-capture");
192
        } else {
193
            this.mapControl.setTool(this.previosTool);
194
        }
195
    }
196

    
197
    @Override
198
    @SuppressWarnings("UseSpecificCatch")
199
    public boolean isValid() {
200
        String value = (String) this.cboScale.getSelectedItem();
201
        if ( value == null ) {
202
            return true;
203
        }
204
        try {
205
            Double.parseDouble(value);
206
            return true;
207
        } catch(Exception ex) {
208
            return false;
209
        }
210
    }
211

    
212
    @Override
213
    public boolean isEmpty() {
214
        String value = (String) this.cboScale.getSelectedItem();
215
        return ( value == null );
216
    }
217
    
218
    @Override
219
    @SuppressWarnings("UseSpecificCatch")
220
    public Double get() {
221
        String value = (String) this.cboScale.getSelectedItem();
222
        if ( value == null ) {
223
            return null;
224
        }
225
        double scale;
226
        try {
227
            scale = Double.parseDouble(value);
228
        } catch(Exception ex) {
229
            throw new IllegalValueException(ex);
230
        }
231
        return scale;
232
    }
233

    
234
    @Override
235
    public void set(Double scale) {
236
        this.cboScale.setSelectedItem(String.format("%f",scale));
237
    }
238

    
239
    @Override
240
    public void coerceAndSet(Object value) {
241
        DataType dataType = ToolsLocator.getDataTypesManager()
242
                .get(DataTypes.DOUBLE);
243
        try {
244
            this.set((Double) dataType.coerce(value));
245
        } catch (CoercionException ex) {
246
            LOG.warn("Can't set value.", ex);
247
        }
248
    }
249

    
250
    @Override
251
    public void setEnabled(boolean enabled) {
252
        this.cboScale.setEnabled(enabled);
253
        if( this.mapControl!=null ) {
254
            this.btnCapture.setEnabled(enabled);
255
            this.btnMapControlScale.setEnabled(enabled);
256
        }
257
    }
258

    
259
    @Override
260
    public boolean isEnabled() {
261
        return this.cboScale.isEnabled();
262
    }
263

    
264
    @Override
265
    public void setEditable(boolean editable) {
266
        super.setEditable(editable);
267
        this.cboScale.setEditable(editable);
268
    }
269

    
270
    
271
}