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 @ 47497

History | View | Annotate | Download (20.1 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.event.ItemEvent;
30
import java.awt.geom.Point2D;
31
import java.io.File;
32
import java.net.URL;
33
import java.util.ArrayList;
34
import java.util.List;
35
import javax.swing.JPanel;
36
import javax.swing.JPopupMenu;
37
import javax.swing.SpinnerNumberModel;
38
import javax.swing.event.ChangeEvent;
39
import javax.swing.event.DocumentEvent;
40
import javax.swing.event.DocumentListener;
41
import org.apache.commons.lang3.StringUtils;
42
import org.gvsig.expressionevaluator.Expression;
43
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
44
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
45
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
46
import org.gvsig.fmap.dal.feature.FeatureStore;
47
import org.gvsig.fmap.dal.swing.DALSwingLocator;
48
import org.gvsig.fmap.dal.swing.DataSwingManager;
49
import org.gvsig.fmap.mapcontext.MapContextLocator;
50
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
51
import org.gvsig.fmap.mapcontext.rendering.symbols.IWarningSymbol;
52
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolDrawingException;
53
import org.gvsig.i18n.Messages;
54
import org.gvsig.symbology.SymbologyLocator;
55
import org.gvsig.symbology.SymbologyManager;
56
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IPictureMarkerSymbol;
57
import org.gvsig.tools.swing.api.ToolsSwingLocator;
58
import org.gvsig.tools.swing.api.ToolsSwingManager;
59
import org.gvsig.tools.swing.api.pickercontroller.ColorPickerController;
60
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
61
import org.gvsig.tools.util.URLUtils;
62
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
64

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

    
90
    protected static final Logger LOGGER = LoggerFactory.getLogger(PictureMarker.class);
91
    
92
    public static final double MARKER_IMAGE_DEFAULT_WIDTH = 18;
93

    
94
    protected final PictureMarkerView view = new PictureMarkerView();
95

    
96
    protected List<JPanel> tabs = new ArrayList<>();
97

    
98
    //TODO: Comentarizado hasta que mask est? acabado
99
//        protected Mask mask;
100
    private FilePickerController picturePicker;
101
    private FilePickerController selectedPicturePicker;
102
    protected ColorPickerController colorLinePicker;
103
    protected ExpressionPickerController xoffsetExpPicker;
104
    protected ExpressionPickerController yoffsetExpPicker;
105
    protected ExpressionPickerController rotationExpPicker;
106
    protected ExpressionPickerController colorExpPicker;
107
    private ExpressionPickerController sizeExpPicker;
108

    
109
    public PictureMarker(SymbolEditor owner) {
110
        super(owner);
111
        initComponents();
112
    }
113

    
114
    private void translate() {
115
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
116
        toolsSwingManager.translate(view.lblLabelFileName);
117
        toolsSwingManager.translate(view.lblLabelRotationExpression);
118
        toolsSwingManager.translate(view.lblLabelSelFileName);
119
        toolsSwingManager.translate(view.lblLabelSize);
120
        toolsSwingManager.translate(view.lblLabelRotation);
121
        toolsSwingManager.translate(view.lblLabelX);
122
        toolsSwingManager.translate(view.lblLabelXExpression);
123
        toolsSwingManager.translate(view.lblLabelY);
124
        toolsSwingManager.translate(view.lblLabelYExpression);
125
        toolsSwingManager.translate(view.chkDrawLineToOffset);
126
        toolsSwingManager.translate(view.lblColorLine);
127
        toolsSwingManager.translate(view.lblLabelSizeExpression);
128
        toolsSwingManager.translate(view.lblLabelXExpression);
129
        toolsSwingManager.translate(view.lblLabelYExpression);
130
        toolsSwingManager.translate(view.lblLabelRotationExpression);
131
        toolsSwingManager.translate(view.lblColorLineExpression);
132
    }
133

    
134
    /**
135
     * Initializes the parameters that define a picturmarker.To do it, a tab is
136
     * created inside the SymbolEditor panel with default values for the
137
     * different attributes of the picture marker.
138
     */
139
    protected void initComponents() {
140

    
141
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
142
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
143

    
144
        this.translate();
145
        
146
        this.picturePicker = toolsSwingManager.createFilePickerController(
147
                view.txtPictureFile, 
148
                view.btnPictureFile, 
149
                null, 
150
                "PictureMarkerFiles", 
151
                null, 
152
                true
153
        );
154
        JPopupMenu menu = view.txtPictureFile.getComponentPopupMenu();
155
        menu.add(expressionSwingManager.createJExpressionBuilderAction(view.txtPictureFile));
156
        menu.add(expressionSwingManager.createUniqueTemporalFileAction(view.txtPictureFile,"picture",".png"));
157

    
158
        this.selectedPicturePicker = toolsSwingManager.createFilePickerController(
159
                view.txtSelPictureFile, 
160
                view.btnSelPictureFile,
161
                null, 
162
                "PictureMarkerFiles", 
163
                null, 
164
                true
165
        );
166
        menu = view.txtSelPictureFile.getComponentPopupMenu();
167
        menu.add(expressionSwingManager.createJExpressionBuilderAction(view.txtSelPictureFile));
168
        menu.add(expressionSwingManager.createUniqueTemporalFileAction(view.txtSelPictureFile,"picture",".png"));
169
        this.picturePicker.addChangeListener((ChangeEvent e) -> {
170
            if (this.picturePicker.get() == null) {
171
                this.selectedPicturePicker.setEnabled(false);
172
            }
173
        });
174
        view.txtSize.setModel(new SpinnerNumberModel(5, 0d, Double.POSITIVE_INFINITY, 0.5));
175
        view.txtRotation.setModel(new SpinnerNumberModel(0, 0d, 360d, 0.5));
176
        view.txtX.setModel(new SpinnerNumberModel(0, Integer.MIN_VALUE, Integer.MAX_VALUE, 1));
177
        view.txtY.setModel(new SpinnerNumberModel(0, Integer.MIN_VALUE, Integer.MAX_VALUE, 1));
178

    
179

    
180
        this.colorLinePicker = toolsSwingManager.createColorPickerController(view.txtColorLine, view.btnColorLine);
181

    
182
        view.txtSizeExp.getDocument().addDocumentListener(new DocumentListener() {
183
            @Override
184
            public void insertUpdate(DocumentEvent e) {
185
                doSizeExpChange();
186
            }
187

    
188
            @Override
189
            public void removeUpdate(DocumentEvent e) {
190
                doSizeExpChange();
191
            }
192

    
193
            @Override
194
            public void changedUpdate(DocumentEvent e) {
195
                doSizeExpChange();
196
            }
197
        });
198
        
199
        this.sizeExpPicker = expressionSwingManager.createExpressionPickerController(
200
                view.txtSizeExp, 
201
                view.btnSizeExpression, 
202
                view.btnSizeExpressionBookmarks, 
203
                view.btnSizeExpressionHistory
204
        );
205
        this.xoffsetExpPicker = expressionSwingManager.createExpressionPickerController(
206
                view.txtXOffset, 
207
                view.btnXOffsetExpression, 
208
                view.btnXOffsetExpressionBookmarks, 
209
                view.btnXOffsetExpressionHistory
210
        );
211
        this.yoffsetExpPicker = expressionSwingManager.createExpressionPickerController(
212
                view.txtYOffset, 
213
                view.btnYOffsetExpression, 
214
                view.btnYOffsetExpressionBookmarks, 
215
                view.btnYOffsetExpressionHistory
216
        );
217
        this.rotationExpPicker = expressionSwingManager.createExpressionPickerController(
218
                view.txtRotationExp, 
219
                view.btnRotationExpression, 
220
                view.btnRotationExpressionBookmarks, 
221
                view.btnRotationExpressionHistory
222
        );
223
        this.colorExpPicker = expressionSwingManager.createExpressionPickerController(
224
                view.txtColorLineExp, 
225
                view.btnColorLineExpression, 
226
                view.btnColorLineExpressionBookmarks, 
227
                view.btnColorLineExpressionHistory
228
        );
229
        this.picturePicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
230
        this.selectedPicturePicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
231
        
232
        view.txtSize.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
233
        view.txtRotation.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
234
        view.txtX.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
235
        view.txtY.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
236
        this.colorLinePicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
237
        view.chkDrawLineToOffset.addItemListener((ItemEvent e) -> {
238
            fireSymbolChangedEvent();
239
        });
240
        
241
        this.sizeExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
242
        this.xoffsetExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
243
        this.yoffsetExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
244
        this.rotationExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
245
        this.colorExpPicker.addChangeListener((ChangeEvent e) -> {fireSymbolChangedEvent();});
246
        view.setName(this.getName());
247
        tabs.add(view);
248
    }
249
    
250
    private void doSizeExpChange() {
251
        String txt = this.view.txtSizeExp.getText();
252
        this.view.txtSize.setEnabled(StringUtils.isBlank(txt));
253
    }
254

    
255

    
256
    @Override
257
    public ISymbol getLayer() {
258
        try {
259
            IPictureMarkerSymbol layer = null;
260

    
261
            if (this.getPictureFile()!=null ) {
262
                SymbologyManager symbologyManager = SymbologyLocator.getSymbologyManager();
263
                layer = symbologyManager.createPictureMarkerSymbol(
264
                        this.getPictureURL(), 
265
                        this.getSelectedPictureURL()
266
                );
267
                layer.setFeature(this.getSampleFeature());
268
                layer.setSize(getSize());
269
                layer.setOffset(new Point2D.Double(getX(),getY()));
270
                layer.setLineToOffsetColor(getLineToOffsetColor());
271
                layer.setDrawLineToOffset(isSelectedDrawLineToOffset());
272
                layer.setRotation(Math.toRadians(getRotation()));
273

    
274
                layer.setLineToOffsetColorExpression(getPhrase(getLineToOffsetColorExpression()));
275
                layer.setOffsetXExpression(getPhrase(getXOffsetExpression()));
276
                layer.setOffsetYExpression(getPhrase(getYOffsetExpression()));
277
                layer.setRotationExpression(getPhrase(getRotationExpression()));
278
                layer.setSizeExpression(getPhrase(getSizeExpression()));
279
            }
280

    
281
            return layer;
282
        } catch (Exception e) {
283
            IWarningSymbol warning
284
                    = (IWarningSymbol) MapContextLocator.getSymbolManager()
285
                            .getWarningSymbol(
286
                                    SymbolDrawingException.STR_UNSUPPORTED_SET_OF_SETTINGS,
287
                                    Messages.getText("failed_acessing_files"),
288
                                    SymbolDrawingException.UNSUPPORTED_SET_OF_SETTINGS);
289
            return warning;
290

    
291
        }
292

    
293
    }
294

    
295
    protected Color getLineToOffsetColor() {
296
        return this.colorLinePicker.get();
297
    }
298

    
299
    protected boolean isSelectedDrawLineToOffset() {
300
        return view.chkDrawLineToOffset.isSelected();
301
    }
302

    
303
    protected Expression getSizeExpression() {
304
        return this.sizeExpPicker.get();
305
    }
306

    
307
    protected Expression getYOffsetExpression() {
308
        return this.yoffsetExpPicker.get();
309
    }
310

    
311
    protected Expression getLineToOffsetColorExpression() {
312
        return this.colorExpPicker.get();
313
    }
314

    
315
    protected Expression getXOffsetExpression() {
316
        return this.xoffsetExpPicker.get();
317
    }
318

    
319
    protected Expression getRotationExpression() {
320
        return this.rotationExpPicker.get();
321
    }
322
    
323
    private String getPhrase(Expression expression){
324
        if(expression == null){
325
            return null;
326
        }
327
        return expression.getPhrase();
328
    }
329

    
330
    @Override
331
    public String getName() {
332
        return Messages.getText("picture_marker_symbol");
333
    }
334

    
335
    @Override
336
    public JPanel[] getTabs() {
337
        return tabs.toArray(new JPanel[tabs.size()]);
338
    }
339

    
340
    @Override
341
    public void refreshControls(ISymbol layer) {
342
        try {
343
            if (layer == null) {
344
                setValues(1d, 0d, 0d, null, null, "", "", "", null, "", "", false);
345
            } else {
346
                IPictureMarkerSymbol sym = (IPictureMarkerSymbol) layer;
347
                setValues(
348
                        sym.getSize(), 
349
                        sym.getRotation(), 
350
                        sym.getOffset().getX(), 
351
                        sym.getOffset().getY(), 
352
                        sym.getSource(), 
353
                        sym.getSelectedSource(),
354
                        sym.getSizeExpression(),
355
                        sym.getOffsetXExpression(),
356
                        sym.getOffsetYExpression(),
357
                        sym.getLineToOffsetColor(),
358
                        sym.getLineToOffsetColorExpression(),
359
                        sym.getRotationExpression(),
360
                        sym.isDrawLineToOffset()
361
                );
362
                fireSymbolChangedEvent();
363
            }
364
        } catch (Exception ex) {
365
            LOGGER.warn("Can't refresh picture marker symbol panel.", ex);
366
        }
367
    }
368

    
369
    protected void setValues(
370
            double size, 
371
            double xOffset, 
372
            double yOffset, 
373
            URL picture, 
374
            URL selectedPicture, 
375
            String sizeExpression,
376
            String offsetXExpression, 
377
            String offsetYExpression, 
378
            Color lineToOffsetColor, 
379
            String lineToOffsetColorExpression, 
380
            String rotationExpression,
381
            boolean isDrawLineToOffset) {
382

    
383
        setValues(size, 0d, xOffset, yOffset, picture, selectedPicture, sizeExpression, offsetXExpression, offsetYExpression, lineToOffsetColor, lineToOffsetColorExpression, rotationExpression, isDrawLineToOffset);
384
    }
385
    protected void setValues(
386
            double size,
387
            double rotation,
388
            double xOffset, 
389
            double yOffset, 
390
            URL picture, 
391
            URL selectedPicture, 
392
            String sizeExpression,
393
            String offsetXExpression, 
394
            String offsetYExpression, 
395
            Color lineToOffsetColor, 
396
            String lineToOffsetColorExpression, 
397
            String rotationExpression,
398
            boolean isDrawLineToOffset) {
399
        
400
        setSize(size);
401
        setRotation(Math.toDegrees(rotation));
402
        setX(xOffset);
403
        setY(yOffset);
404
        
405
        setPicture(picture);
406
        setSelectedPicture(selectedPicture);
407
        
408
        sizeExpPicker.coerceAndSet(sizeExpression);
409
        xoffsetExpPicker.coerceAndSet(offsetXExpression);
410
        yoffsetExpPicker.coerceAndSet(offsetYExpression);
411
        rotationExpPicker.coerceAndSet(rotationExpression);
412
        colorLinePicker.coerceAndSet(lineToOffsetColor);
413
        colorExpPicker.coerceAndSet(lineToOffsetColorExpression);
414
        view.chkDrawLineToOffset.setSelected(isDrawLineToOffset);
415
        
416
    }
417

    
418
    @Override
419
    public EditorTool[] getEditorTools() {
420
        return null;
421

    
422
    }
423

    
424
    @Override
425
    public void actionPerformed(ActionEvent e) {
426
    }
427

    
428
    @Override
429
    public boolean canManageSymbol(ISymbol symbol) {
430
        return symbol instanceof IPictureMarkerSymbol;
431
    }
432

    
433
    protected String getPictureFileName() {
434
        File f = this.picturePicker.get();
435
        if( f == null ) {
436
            return null;
437
        }
438
        return f.getAbsolutePath();
439
    }
440

    
441
    protected String getSelectedPictureFileName() {
442
        File f = this.selectedPicturePicker.get();
443
        if( f == null ) {
444
            return null;
445
        }
446
        return f.getAbsolutePath();
447
    }
448

    
449
    protected URL getPictureURL() {
450
        return URLUtils.toURL(this.picturePicker.get());
451
    }
452

    
453
    protected URL getSelectedPictureURL() {
454
        return URLUtils.toURL(this.selectedPicturePicker.get());
455
    }
456

    
457
    protected File getPictureFile() {
458
        File f = this.picturePicker.get();
459
        return f;
460
    }
461

    
462
    protected File getSelectedPictureFile() {
463
        File f = this.selectedPicturePicker.get();
464
        return f;
465
    }
466

    
467
    protected double getSize() {
468
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtSize.getModel();
469
        return model.getNumber().doubleValue();
470
    }
471

    
472
    protected double getRotation() {
473
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtRotation.getModel();
474
        return model.getNumber().doubleValue();
475
    }
476

    
477
    protected double getX() {
478
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtX.getModel();
479
        return model.getNumber().doubleValue();
480
    }
481

    
482
    protected double getY() {
483
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtY.getModel();
484
        return model.getNumber().doubleValue();
485
    }
486

    
487
    protected void setPicture(URL picture) {
488
        this.picturePicker.set(URLUtils.toFile(picture));
489
    }
490

    
491
    protected void setSelectedPicture(URL selectedPicture) {
492
       this.selectedPicturePicker.set(URLUtils.toFile(selectedPicture));
493
    }
494

    
495
    protected void setSize(double d) {
496
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtSize.getModel();
497
        model.setValue(d);
498
    }
499

    
500
    protected void setRotation(double degrees) {
501
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtRotation.getModel();
502
        model.setValue(degrees);
503
    }
504

    
505
    protected void setX(double d) {
506
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtX.getModel();
507
        model.setValue(d);
508
    }
509

    
510
    protected void setY(double d) {
511
        SpinnerNumberModel model = (SpinnerNumberModel) view.txtY.getModel();
512
        model.setValue(d);
513
    }
514

    
515
    protected Color getColorLine() {
516
        return this.colorLinePicker.get();
517
    }
518
    
519
    protected void setColorLine(Color color) {
520
        this.colorLinePicker.set(color);
521
                
522
    }
523

    
524
    @Override
525
    public void setFeatureStore(FeatureStore store) {
526
        if( store==null ) {
527
            return;
528
        }
529
        super.setFeatureStore(store); 
530
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
531
        dataSwingManager.configureExpressionBuilder(this.xoffsetExpPicker.getConfig(), store);
532
        dataSwingManager.configureExpressionBuilder(this.yoffsetExpPicker.getConfig(), store);
533
        dataSwingManager.configureExpressionBuilder(this.rotationExpPicker.getConfig(), store);
534
    }
535
    
536
    
537
}