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 |
} |