Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.symbology / org.gvsig.symbology.swing / org.gvsig.symbology.swing.api / src / main / java / org / gvsig / app / gui / styling / PictureMarker.java @ 45526

History | View | Annotate | Download (15 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.app.gui.styling;
25

    
26
import java.awt.Color;
27
import java.awt.event.ActionEvent;
28
import java.awt.event.ActionListener;
29
import java.awt.geom.Point2D;
30
import java.io.File;
31
import java.net.URL;
32
import java.util.ArrayList;
33
import java.util.List;
34

    
35
import javax.swing.JPanel;
36
import javax.swing.SpinnerNumberModel;
37
import javax.swing.event.ChangeEvent;
38
import javax.swing.event.ChangeListener;
39
import org.gvsig.expressionevaluator.Expression;
40
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
41
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
42
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
43
import org.gvsig.fmap.dal.feature.FeatureStore;
44
import org.gvsig.fmap.dal.swing.DALSwingLocator;
45
import org.gvsig.fmap.dal.swing.DataSwingManager;
46
import org.gvsig.fmap.mapcontext.MapContextLocator;
47
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
48
import org.gvsig.fmap.mapcontext.rendering.symbols.IWarningSymbol;
49
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolDrawingException;
50
import org.gvsig.i18n.Messages;
51
import org.gvsig.symbology.SymbologyLocator;
52
import org.gvsig.symbology.SymbologyManager;
53
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IPictureMarkerSymbol;
54
import org.gvsig.tools.swing.api.ToolsSwingLocator;
55
import org.gvsig.tools.swing.api.ToolsSwingManager;
56
import org.gvsig.tools.swing.api.pickercontroller.ColorPickerController;
57
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
58
import org.gvsig.tools.util.URLUtils;
59
import org.slf4j.Logger;
60
import org.slf4j.LoggerFactory;
61

    
62
/**
63
 * PictureMarker allows the user to store and modify the properties that define
64
 * a
65
 * <b>picture marker symbol</b>.<p>
66
 * <p>
67
 * This functionality is carried out thanks to a tab (simple marker)which is
68
 * included in the panel to edit the properities of a symbol (SymbolEditor)how
69
 * is explained in AbstractTypeSymbolEditor.
70
 * <p>
71
 * First of all, in the above mentioned tab the user will have options to change
72
 * the files from where the pictures for the symbol are taken (one for the
73
 * symbol when it is not selected in the map and the other when it is done)
74
 * .<p>
75
 * <p>
76
 * Secondly, the user will have options to modify the pictures which had been
77
 * selected before (width and offset) .
78
 *
79
 * @see AbstractTypeSymbolEditor
80
 * @author gvSIG Team
81
 */
82
@SuppressWarnings("UseSpecificCatch")
83
public class PictureMarker
84
        extends AbstractTypeSymbolEditor
85
        implements ActionListener {
86

    
87
    protected static final Logger LOGGER = LoggerFactory.getLogger(PictureMarker.class);
88
    
89
    public static final double MARKER_IMAGE_DEFAULT_WIDTH = 18;
90

    
91
    private PictureMarkerView view = new PictureMarkerView();
92

    
93
    protected List<JPanel> tabs = new ArrayList<>();
94

    
95
    //TODO: Comentarizado hasta que mask est? acabado
96
//        protected Mask mask;
97
    private FilePickerController picturePicker;
98
    private FilePickerController selectedPicturePicker;
99
    private ColorPickerController colorLinePicker;
100
    private ExpressionPickerController xoffsetExpPicker;
101
    private ExpressionPickerController yoffsetExpPicker;
102
    private ExpressionPickerController rotationExpPicker;
103
    private ExpressionPickerController colorExpPicker;
104

    
105
    public PictureMarker(SymbolEditor owner) {
106
        super(owner);
107
        initComponents();
108
    }
109

    
110
    private void translate() {
111
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
112
        toolsSwingManager.translate(view.lblLabelFileName);
113
        toolsSwingManager.translate(view.lblLabelRotationExpression);
114
        toolsSwingManager.translate(view.lblLabelSelFileName);
115
        toolsSwingManager.translate(view.lblLabelSize);
116
        toolsSwingManager.translate(view.lblLabelX);
117
        toolsSwingManager.translate(view.lblLabelXExpression);
118
        toolsSwingManager.translate(view.lblLabelY);
119
        toolsSwingManager.translate(view.lblLabelYExpression);
120
    }
121

    
122
    /**
123
     * Initializes the parameters that define a picturmarker.To do it, a tab is
124
     * created inside the SymbolEditor panel with default values for the
125
     * different attributes of the picture marker.
126
     */
127
    private void initComponents() {
128

    
129
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
130
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
131

    
132
        this.translate();
133
        
134
        this.picturePicker = toolsSwingManager.createFilePickerController(view.txtPictureFile, view.btnPictureFile);
135
        this.selectedPicturePicker = toolsSwingManager.createFilePickerController(view.txtSelPictureFile, view.btnSelPictureFile);
136
        this.picturePicker.addChangeListener((ChangeEvent e) -> {
137
            if (this.picturePicker.get() == null) {
138
                this.selectedPicturePicker.setEnabled(false);
139
            }
140
        });
141
        view.txtSize.setModel(new SpinnerNumberModel(5, 0d, Double.POSITIVE_INFINITY, 0.5));
142
        view.txtX.setModel(new SpinnerNumberModel(0, Integer.MIN_VALUE, Integer.MAX_VALUE, 1));
143
        view.txtY.setModel(new SpinnerNumberModel(0, Integer.MIN_VALUE, Integer.MAX_VALUE, 1));
144

    
145

    
146
        this.colorLinePicker = toolsSwingManager.createColorPickerController(view.txtColorLine, view.btnColorLine);
147

    
148
        
149
        this.xoffsetExpPicker = expressionSwingManager.createExpressionPickerController(
150
                view.txtXOffset, 
151
                view.btnXOffsetExpression, 
152
                view.btnXOffsetExpressionBookmarks, 
153
                view.btnXOffsetExpressionHistory
154
        );
155
        this.yoffsetExpPicker = expressionSwingManager.createExpressionPickerController(
156
                view.txtYOffset, 
157
                view.btnYOffsetExpression, 
158
                view.btnYOffsetExpressionBookmarks, 
159
                view.btnYOffsetExpressionHistory
160
        );
161
        this.rotationExpPicker = expressionSwingManager.createExpressionPickerController(
162
                view.txtRotation, 
163
                view.btnRotationExpression, 
164
                view.btnRotationExpressionBookmarks, 
165
                view.btnRotationExpressionHistory
166
        );
167
        this.colorExpPicker = expressionSwingManager.createExpressionPickerController(
168
                view.txtColorLineExp, 
169
                view.btnColorLineExpression, 
170
                view.btnColorLineExpressionBookmarks, 
171
                view.btnColorLineExpressionHistory
172
        );
173
        
174
        view.txtSize.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
175
        view.txtX.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
176
        view.txtY.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
177
        this.colorLinePicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
178
        this.xoffsetExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
179
        this.yoffsetExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
180
        this.rotationExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
181
        this.colorExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
182
        view.chkDrawLineToOffset.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
183
        
184
        tabs.add(view);
185
    }
186

    
187
    @Override
188
    public ISymbol getLayer() {
189
        try {
190
            IPictureMarkerSymbol layer = null;
191

    
192
            if (this.getPictureFile()!=null ) {
193
                SymbologyManager symbologyManager = SymbologyLocator.getSymbologyManager();
194
                layer = symbologyManager.createPictureMarkerSymbol(
195
                        this.getPictureURL(), 
196
                        this.getSelectedPictureURL()
197
                );
198
                layer.setSize(getSize());
199
                layer.setOffset(new Point2D.Double(getX(),getY()));
200
                layer.setLineToOffsetColor(this.colorLinePicker.get());
201
                if(this.colorExpPicker.get() != null){
202
                    layer.setLineToOffsetColorExpression(getPhrase(this.colorExpPicker.get()));
203
                }
204
                layer.setOffsetXExpression(getPhrase(this.xoffsetExpPicker.get()));
205
                layer.setOffsetYExpression(getPhrase(this.yoffsetExpPicker.get()));
206
                layer.setRotationExpression(getPhrase(this.rotationExpPicker.get()));
207
                layer.setDrawLineToOffset(view.chkDrawLineToOffset.isSelected());
208
                
209
                
210
            }
211

    
212
            return layer;
213
        } catch (Exception e) {
214
            IWarningSymbol warning
215
                    = (IWarningSymbol) MapContextLocator.getSymbolManager()
216
                            .getWarningSymbol(
217
                                    SymbolDrawingException.STR_UNSUPPORTED_SET_OF_SETTINGS,
218
                                    Messages.getText("failed_acessing_files"),
219
                                    SymbolDrawingException.UNSUPPORTED_SET_OF_SETTINGS);
220
            return warning;
221

    
222
        }
223

    
224
    }
225
    
226
    private String getPhrase(Expression expression){
227
        if(expression == null){
228
            return null;
229
        }
230
        return expression.getPhrase();
231
    }
232

    
233
    @Override
234
    public String getName() {
235
        return Messages.getText("picture_marker_symbol");
236
    }
237

    
238
    @Override
239
    public JPanel[] getTabs() {
240
        return tabs.toArray(new JPanel[tabs.size()]);
241
    }
242

    
243
    @Override
244
    public void refreshControls(ISymbol layer) {
245
        try {
246
            if (layer == null) {
247
                setValues(1d, 0d, 0d, null, null, "", "", null, "", "", false);
248
            } else {
249
                IPictureMarkerSymbol sym = (IPictureMarkerSymbol) layer;
250
                setValues(
251
                        sym.getSize(), 
252
                        sym.getOffset().getX(), 
253
                        sym.getOffset().getY(), 
254
                        sym.getSource(), 
255
                        sym.getSelectedSource(),
256
                        sym.getOffsetXExpression(),
257
                        sym.getOffsetYExpression(),
258
                        sym.getLineToOffsetColor(),
259
                        sym.getLineToOffsetColorExpression(),
260
                        sym.getRotationExpression(),
261
                        sym.isDrawLineToOffset()
262
                );
263
            }
264
        } catch (Exception ex) {
265
            LOGGER.warn("Can't refresh picture marker symbol panel.", ex);
266
        }
267
    }
268

    
269
    protected void setValues(
270
            double size, 
271
            double xOffset, 
272
            double yOffset, 
273
            URL picture, 
274
            URL selectedPicture, 
275
            String offsetXExpression, 
276
            String offsetYExpression, 
277
            Color lineToOffsetColor, 
278
            String lineToOffsetColorExpression, 
279
            String rotationExpression,
280
            boolean isDrawLineToOffset) {
281
        
282
        setSize(size);
283
        setX(xOffset);
284
        setY(yOffset);
285
        
286
        setPicture(picture);
287
        setSelectedPicture(selectedPicture);
288
        
289
        xoffsetExpPicker.coerceAndSet(offsetXExpression);
290
        yoffsetExpPicker.coerceAndSet(offsetYExpression);
291
        rotationExpPicker.coerceAndSet(rotationExpression);
292
        colorLinePicker.coerceAndSet(lineToOffsetColor);
293
        colorExpPicker.coerceAndSet(lineToOffsetColorExpression);
294
        view.chkDrawLineToOffset.setSelected(isDrawLineToOffset);
295
        
296
    }
297

    
298
    @Override
299
    public EditorTool[] getEditorTools() {
300
        return null;
301

    
302
    }
303

    
304
    @Override
305
    public void actionPerformed(ActionEvent e) {
306
    }
307

    
308
    @Override
309
    public boolean canManageSymbol(ISymbol symbol) {
310
        return symbol instanceof IPictureMarkerSymbol;
311
    }
312

    
313
    protected String getPictureFileName() {
314
        File f = this.picturePicker.get();
315
        if( f == null ) {
316
            return null;
317
        }
318
        return f.getAbsolutePath();
319
    }
320

    
321
    protected String getSelectedPictureFileName() {
322
        File f = this.selectedPicturePicker.get();
323
        if( f == null ) {
324
            return null;
325
        }
326
        return f.getAbsolutePath();
327
    }
328

    
329
    protected URL getPictureURL() {
330
        return URLUtils.toURL(this.picturePicker.get());
331
    }
332

    
333
    protected URL getSelectedPictureURL() {
334
        return URLUtils.toURL(this.selectedPicturePicker.get());
335
    }
336

    
337
    protected File getPictureFile() {
338
        File f = this.picturePicker.get();
339
        return f;
340
    }
341

    
342
    protected File getSelectedPictureFile() {
343
        File f = this.selectedPicturePicker.get();
344
        return f;
345
    }
346

    
347
    protected double getSize() {
348
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtSize.getModel();
349
        return model.getNumber().doubleValue();
350
    }
351

    
352
    protected double getX() {
353
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtX.getModel();
354
        return model.getNumber().doubleValue();
355
    }
356

    
357
    protected double getY() {
358
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtY.getModel();
359
        return model.getNumber().doubleValue();
360
    }
361

    
362
    protected void setPicture(URL picture) {
363
        this.picturePicker.set(URLUtils.toFile(picture));
364
    }
365

    
366
    protected void setSelectedPicture(URL selectedPicture) {
367
       this.selectedPicturePicker.set(URLUtils.toFile(selectedPicture));
368
    }
369

    
370
    protected void setSize(double d) {
371
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtSize.getModel();
372
        model.setValue(d);
373
    }
374

    
375
    protected void setX(double d) {
376
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtX.getModel();
377
        model.setValue(d);
378
    }
379

    
380
    protected void setY(double d) {
381
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtY.getModel();
382
        model.setValue(d);
383
    }
384

    
385
    protected Color getColorLine() {
386
        return this.colorLinePicker.get();
387
    }
388
    
389
    protected void setColorLine(Color color) {
390
        this.colorLinePicker.set(color);
391
                
392
    }
393

    
394
    @Override
395
    public void setFeatureStore(FeatureStore store) {
396
        super.setFeatureStore(store); 
397
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
398
        dataSwingManager.configureExpressionBuilder(this.xoffsetExpPicker, store);
399
        dataSwingManager.configureExpressionBuilder(this.yoffsetExpPicker, store);
400
        dataSwingManager.configureExpressionBuilder(this.rotationExpPicker, store);
401
    }
402
    
403
    
404
}