Statistics
| Revision:

root / org.gvsig.legend.picturemarkersymboltable / trunk / org.gvsig.legend.picturemarkersymboltable / org.gvsig.legend.picturemarkersymboltable.swing / org.gvsig.legend.picturemarkersymboltable.swing.impl / src / main / java / org / gvsig / legend / picturemarkersymboltable / swing / impl / DefaultPictureMarkerSymbolTableLegendEditor.java @ 9514

History | View | Annotate | Download (17.5 KB)

1

    
2
package org.gvsig.legend.picturemarkersymboltable.swing.impl;
3

    
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ItemEvent;
6
import java.util.ArrayList;
7
import java.util.Collections;
8
import java.util.HashMap;
9
import java.util.List;
10
import java.util.Map;
11
import javax.swing.ComboBoxModel;
12
import javax.swing.DefaultComboBoxModel;
13
import javax.swing.ImageIcon;
14
import javax.swing.JPanel;
15
import org.apache.commons.collections4.CollectionUtils;
16
import org.apache.commons.lang.StringUtils;
17
import org.gvsig.app.project.documents.view.legend.gui.Categories;
18
import org.gvsig.expressionevaluator.ExpressionUtils;
19
import org.gvsig.fmap.dal.DALLocator;
20
import org.gvsig.fmap.dal.DataManager;
21
import org.gvsig.fmap.dal.DataStoreParameters;
22
import org.gvsig.fmap.dal.DataTypes;
23
import org.gvsig.fmap.dal.StoresRepository;
24
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
25
import org.gvsig.fmap.dal.feature.FeatureStore;
26
import org.gvsig.fmap.dal.feature.FeatureType;
27
import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
28
import org.gvsig.fmap.dal.swing.DALSwingLocator;
29
import org.gvsig.fmap.dal.swing.DataSwingManager;
30
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
31
import org.gvsig.fmap.geom.Geometry;
32
import org.gvsig.fmap.geom.GeometryUtils;
33
import org.gvsig.fmap.mapcontext.MapContext;
34
import org.gvsig.fmap.mapcontext.layers.FLayer;
35
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
36
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
37
import org.gvsig.legend.picturemarkersymboltable.lib.api.PictureMarkerSymbolTableLegend;
38
import static org.gvsig.legend.picturemarkersymboltable.lib.api.PictureMarkerSymbolTableLegend.DEFAULT_IMAGE_SIZE;
39
import org.gvsig.legend.picturemarkersymboltable.lib.api.PictureMarkerSymbolTableLocator;
40
import org.gvsig.legend.picturemarkersymboltable.swing.api.PictureMarkerSymbolTableLegendEditor;
41
import org.gvsig.tools.ToolsLocator;
42
import org.gvsig.tools.dispose.DisposeUtils;
43
import org.gvsig.tools.i18n.I18nManager;
44
import org.gvsig.tools.swing.api.ListElement;
45
import org.gvsig.tools.swing.api.ToolsSwingLocator;
46
import org.gvsig.tools.swing.api.ToolsSwingManager;
47
import org.gvsig.tools.swing.api.ToolsSwingUtils;
48
import org.gvsig.tools.swing.api.documentfilters.DoubleDocumentFilter;
49
import org.gvsig.tools.swing.api.pickercontroller.ColorPickerController;
50
import org.gvsig.tools.swing.icontheme.IconTheme;
51
import org.gvsig.tools.util.LabeledValue;
52
import org.gvsig.tools.util.LabeledValueImpl;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

    
56

    
57
@SuppressWarnings("UseSpecificCatch")
58
public class DefaultPictureMarkerSymbolTableLegendEditor extends DefaultPictureMarkerSymbolTableLegendEditorView implements PictureMarkerSymbolTableLegendEditor {
59

    
60
    private static final long serialVersionUID = 4307714097793669675L;
61

    
62
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultPictureMarkerSymbolTableLegendEditor.class);
63

    
64
    private PictureMarkerSymbolTableLegend legend;
65
    private FLayer layer;
66
    private final Class<? extends PictureMarkerSymbolTableLegend> legendClass;
67
    
68
    private ColorPickerController pickerLineToOffsetColor;
69

    
70
    private AttributeDescriptorPickerController pickerClassifyingField;
71
    private AttributeDescriptorPickerController pickerOffsetXField;
72
    private AttributeDescriptorPickerController pickerOffsetYField;
73
    private AttributeDescriptorPickerController pickerRotationField;
74
    private AttributeDescriptorPickerController pickerLineToOffsetColorField;
75
    
76
    private AttributeDescriptorPickerController pickerImagesTableClassifyingField;
77
    private AttributeDescriptorPickerController pickerImageField;
78
    private AttributeDescriptorPickerController pickerImageSelectedField;
79
    private List<String> availablesTables;
80

    
81
    public DefaultPictureMarkerSymbolTableLegendEditor() {
82
        this.legendClass = PictureMarkerSymbolTableLocator
83
                .getPictureMarkerSymbolTableManager()
84
                .getPictureMarkerSymbolTableLegendClass();
85
        initComponents();
86
    }
87

    
88
    private void initComponents(){
89
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
90
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
91
        
92
        translateAll();
93

    
94
        DoubleDocumentFilter.install(this.txtImageSize);
95
        this.cboUnits.setModel(this.createModelUnits());
96
        this.cboUnits.setSelectedIndex(0);
97
        
98
        this.pickerLineToOffsetColor = toolsSwingManager.createColorPickerController(this.txtLineToOffsetColor, this.btnLineToOffsetColor);
99
        
100
        
101
        this.pickerClassifyingField = dataSwingManager.createAttributeDescriptorPickerController(cboClassifyingFieldName, (t) -> {
102
            return t.getDataType().isNumeric() || t.getType() == DataTypes.STRING;
103
        });
104
        this.pickerOffsetXField = dataSwingManager.createAttributeDescriptorPickerController(cboOffsetXFieldName, (t) -> {
105
            return t.getDataType().isNumeric();
106
        });
107
        this.pickerOffsetYField = dataSwingManager.createAttributeDescriptorPickerController(cboOffsetYFieldName, (t) -> {
108
            return t.getDataType().isNumeric();
109
        });
110
        this.pickerRotationField = dataSwingManager.createAttributeDescriptorPickerController(cboRotationFieldName, (t) -> {
111
            return t.getDataType().isNumeric();
112
        });
113
        this.pickerLineToOffsetColorField = dataSwingManager.createAttributeDescriptorPickerController(cboLineToOffsetColorFieldName, (t) -> {
114
            return t.getDataType().isNumeric() || t.getType() == DataTypes.STRING;
115
        });
116
        
117
        this.cboImagesTableName.setModel(this.createImagesTableNameModel());        
118
        this.pickerImagesTableClassifyingField = dataSwingManager.createAttributeDescriptorPickerController(cboImagesTableClassifyingFieldName, (t) -> {
119
            return t.getDataType().isNumeric() || t.getType() == DataTypes.STRING;
120
        });
121
        this.pickerImageField = dataSwingManager.createAttributeDescriptorPickerController(cboImageFieldName, (t) -> {
122
            return StringUtils.equalsIgnoreCase("Image", t.getDataProfileName());
123
        });
124
        this.pickerImageSelectedField = dataSwingManager.createAttributeDescriptorPickerController(cboImageSelectedFieldName, (t) -> {
125
            return StringUtils.equalsIgnoreCase("Image", t.getDataProfileName());
126
        });
127

    
128
        this.cboImagesTableName.addItemListener((ItemEvent e) -> {
129
            doChangeImageTableName();
130
        });
131
        this.btnImagesTableNameRefresh.addActionListener((ActionEvent e) -> {
132
            doRefreshImageTables();
133
        });
134
        this.cboImagesTableName.setSelectedIndex(-1);
135
        
136
        DoubleDocumentFilter.install(this.txtScale);
137
    }
138

    
139
    private void translateAll() {
140
        ToolsSwingManager toolsSwingmanager = ToolsSwingLocator.getToolsSwingManager();
141
        toolsSwingmanager.translate(this.lblClassifyingFieldName);
142
        toolsSwingmanager.translate(this.lblDrawLineToOffset);
143
        toolsSwingmanager.translate(this.lblImageFieldName);
144
        toolsSwingmanager.translate(this.lblImageSelectedFieldName);
145
        toolsSwingmanager.translate(this.lblImagesTableClassifyingFieldName);
146
        toolsSwingmanager.translate(this.lblImagesTableFields);
147
        toolsSwingmanager.translate(this.lblImagesTableName);
148
        toolsSwingmanager.translate(this.lblLegendTableFields);
149
        toolsSwingmanager.translate(this.lblLineToOffsetColor);
150
        toolsSwingmanager.translate(this.lblLineToOffsetColorFieldName);
151
        toolsSwingmanager.translate(this.lblOffsetXFieldName);
152
        toolsSwingmanager.translate(this.lblOffsetYFieldName);
153
        toolsSwingmanager.translate(this.lblRotationFieldName);
154
        toolsSwingmanager.translate(this.lblImageSize);
155
        toolsSwingmanager.translate(this.lblUnits);
156
        toolsSwingmanager.translate(this.lblScale);
157
        toolsSwingmanager.translate(this.lblReverseDirectionOfAngle);
158
    }
159

    
160
    private ComboBoxModel createModelUnits() {
161
        I18nManager i18n = ToolsLocator.getI18nManager();
162
        DefaultComboBoxModel<LabeledValue<Integer>> model = new DefaultComboBoxModel<>();
163
        model.addElement(new LabeledValueImpl<>(i18n.getTranslation("_Pixels"),-1));
164
        String[] names=MapContext.getDistanceNames();
165
        int n = 0;
166
        for (String name : names) {
167
            model.addElement(new LabeledValueImpl<>(i18n.getTranslation(name),n++));
168
        }
169
        return model;
170
    }
171
    
172
    @Override
173
    public void setData(FLayer layer, ILegend legend) {
174
        if( layer == this.layer && legend == this.legend ) {
175
            return;
176
        }
177
        this.layer = layer;
178
        if( this.getLegendClass().isInstance(legend) ) {
179
            this.legend = (PictureMarkerSymbolTableLegend) legend;
180
        } else {
181
            this.legend = PictureMarkerSymbolTableLocator
182
                    .getPictureMarkerSymbolTableManager()
183
                    .createPictureMarkerSymbolTableLegend();
184
        }
185
               
186
        if( layer instanceof FLyrVect ) {
187
            FeatureStore store = ((FLyrVect) layer).getFeatureStore();
188
            if( store != null ) {
189
                try {
190
                    FeatureType ftype = store.getDefaultFeatureType();
191
                    this.txtImageSize.setText(String.valueOf(this.legend.getImageSize()));
192
                    ListElement.setSelected(this.cboUnits, this.legend.getUnits());
193
                            
194
                    this.pickerLineToOffsetColor.set(this.legend.getDefaultLineToOffsetColor());
195
                    this.chkDrawLineToOffset.setSelected(this.legend.isDrawLineToOffset());
196
                    this.chkReverseDirectionOfAngle.setSelected(this.legend.isReverseDirectionOfAngle());
197

    
198
                    this.pickerClassifyingField.setFeatureType(ftype);
199
                    this.pickerOffsetXField.setFeatureType(ftype);
200
                    this.pickerOffsetYField.setFeatureType(ftype);
201
                    this.pickerRotationField.setFeatureType(ftype);
202
                    this.pickerLineToOffsetColorField.setFeatureType(ftype);
203
                    
204
                    ListElement.setSelected(this.cboImagesTableName, this.legend.getImagesTableName());
205
                    
206
                    this.pickerClassifyingField.set(this.legend.getClassifyingFieldName());
207
                    this.pickerLineToOffsetColorField.set(this.legend.getLineToOffsetColorFieldName());
208
                    this.pickerRotationField.set(this.legend.getRotationFieldName());
209
                    this.pickerOffsetXField.set(this.legend.getOffsetXFieldName());
210
                    this.pickerOffsetYField.set(this.legend.getOffsetYFieldName());
211
                    
212
                    DoubleDocumentFilter.setValue(this.txtScale, this.legend.getScale());
213
                } catch (Exception ex) {
214
                    LOGGER.warn("Can't fill data of legend.", ex);
215
                    //FIXME: ?hacemos algo m?s con la excepci?n?
216
                }
217
            }
218
        }
219
    }
220
    
221
    @Override
222
    public ILegend getLegend() {
223
        this.legend.setImageSize(this.getImageSize());
224
        this.legend.setUnits((int) ListElement.getSelected(this.cboUnits));
225
        this.legend.setDefaultLineToOffsetColor(this.pickerLineToOffsetColor.get());
226
        this.legend.setDrawLineToOffset(this.chkDrawLineToOffset.isSelected());
227
        this.legend.setReverseDirectionOfAngle(this.chkReverseDirectionOfAngle.isSelected());
228
        
229
        this.legend.setClassifyingFieldName(this.pickerClassifyingField.getName());
230
        this.legend.setOffsetXFieldName(this.pickerOffsetXField.getName());
231
        this.legend.setOffsetYFieldName(this.pickerOffsetYField.getName());
232
        this.legend.setRotationFieldName(this.pickerRotationField.getName());
233
        this.legend.setLineToOffsetColorFieldName(this.pickerLineToOffsetColorField.getName());
234

    
235
        this.legend.setImagesTableName((String) this.cboImagesTableName.getSelectedItem());
236
        this.legend.setImagesTableClassifyingFieldName(this.pickerImagesTableClassifyingField.getName());
237
        this.legend.setImageFieldName(this.pickerImageField.getName());
238
        this.legend.setImageSelectedFieldName(this.pickerImageSelectedField.getName());
239
        this.legend.setScale(DoubleDocumentFilter.getValue(this.txtScale));
240
        return legend;
241
    }
242

    
243
    private int getImageSize() {
244
        String s = this.txtImageSize.getText();
245
        return ExpressionUtils.parseInt(null, s, DEFAULT_IMAGE_SIZE);
246
    }
247
    
248
    @Override
249
    public String getDescription() {
250
        I18nManager i18n = ToolsLocator.getI18nManager();
251
        return i18n.getTranslation( "_Picture_marker_symbol_table_legend");
252
    }
253

    
254
    @Override
255
    public ImageIcon getIcon() {
256
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
257
        return theme.get("legend-overview-vectorial-picturemarkersymboltable");
258
    }
259

    
260
    @Override
261
        public Class getParentClass() {
262
                return Categories.class;
263
        }
264

    
265
    @Override
266
    public String getTitle() {
267
        I18nManager i18n = ToolsLocator.getI18nManager();
268
        return i18n.getTranslation( "_Picture_marker_symbol_table_legend");
269
    }
270

    
271
    @Override
272
    public JPanel getPanel() {
273
        return this;
274
    }
275

    
276
    @Override
277
    public Class getLegendClass() {
278
        return this.legendClass;
279
    }
280

    
281
    @Override
282
    public boolean isSuitableFor(FLayer layer) {
283
        if(layer instanceof FLyrVect){
284
            return true;
285
//            try {
286
//                int shapeType = ((FLyrVect)layer).getShapeType();
287
//                return GeometryUtils.isSubtype(Geometry.TYPES.POINT, shapeType);
288
//            } catch (Exception ex) {
289
//                LOGGER.debug("Can't get shape type for layer "+layer.getName(), ex);
290
//                return false;
291
//            }
292
        }
293
        return false;
294
    }
295

    
296
    public void doChangeImageTableName() {
297
        String tableName = (String) this.cboImagesTableName.getSelectedItem();
298
        if( StringUtils.isNotBlank(tableName) ) {
299
            FeatureStore store = null;
300
            try {
301
                DataManager dataManager = DALLocator.getDataManager();
302
                StoresRepository repositories = dataManager.getStoresRepository();
303
                store = (FeatureStore) repositories.getStore(tableName);
304
                FeatureType ftype = store.getDefaultFeatureTypeQuietly();
305
                boolean hasimages = false;
306
                for (FeatureAttributeDescriptor attr : ftype) {
307
                    if( StringUtils.equalsIgnoreCase("Image", attr.getDataProfileName()) ) {
308
                        hasimages = true;
309
                        break;
310
                    } 
311
                }
312
                if( hasimages ) {
313
                    this.pickerImagesTableClassifyingField.setFeatureType(ftype);
314
                    this.pickerImageField.setFeatureType(ftype);
315
                    this.pickerImageSelectedField.setFeatureType(ftype);
316
                    this.pickerImagesTableClassifyingField.setEnabled(true);
317
                    this.pickerImageField.setEnabled(true);
318
                    this.pickerImageSelectedField.setEnabled(true);    
319
                    
320
                    this.pickerImagesTableClassifyingField.set(this.legend.getImagesTableClassifyingFieldName());
321
                    this.pickerImageField.set(this.legend.getImageFieldName());
322
                    this.pickerImageSelectedField.set(this.legend.getImageSelectedFieldName());
323
                    return;
324
                }
325
            } catch(Exception ex) {
326
                LOGGER.debug("Can't use '"+tableName+"' as table for retrieve images.",ex);
327
                // Do nothing
328
            } finally {
329
                DisposeUtils.disposeQuietly(store);
330
            }
331
        }
332
        this.pickerImagesTableClassifyingField.clean();
333
        this.pickerImageField.clean();
334
        this.pickerImageSelectedField.clean();
335
        this.pickerImagesTableClassifyingField.setEnabled(false);
336
        this.pickerImageField.setEnabled(false);
337
        this.pickerImageSelectedField.setEnabled(false);
338
    }
339
    
340
    private void createListOfAvailableTables() {
341
        DataManager dataManager = DALLocator.getDataManager();
342
        Map<String,Integer> allTableNames = new HashMap<>();
343
        StoresRepository repositories = dataManager.getStoresRepository();
344
        for (String tableName : repositories.keySet()) {
345
            DataStoreParameters params = repositories.get(tableName);
346
            if( params instanceof OpenFeatureStoreParameters ) {
347
                if( allTableNames.containsKey(tableName) ) {
348
                    allTableNames.put(tableName, allTableNames.get(tableName)+1);
349
                } else {
350
                    allTableNames.put(tableName, 1);
351
                }
352
            }
353
        }
354
        List<String> tableNames = new ArrayList<>();
355
        for (String tableName : allTableNames.keySet()) {
356
            if( allTableNames.get(tableName)==1 ) {
357
                tableNames.add(tableName);
358
            }
359
        }
360
        Collections.sort(tableNames);
361
        this.availablesTables = tableNames;
362
    }
363
    
364
    private ComboBoxModel createImagesTableNameModel() {
365
        if( CollectionUtils.isEmpty(this.availablesTables) ) {
366
            createListOfAvailableTables();
367
        }
368
        DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
369
        for (String tableName : availablesTables) {
370
            model.addElement(tableName);
371
        }
372
        return model;
373
    }
374

    
375
    private void doRefreshImageTables() {
376
        availablesTables = null;
377
        cboImagesTableName.setModel(createImagesTableNameModel());        
378
        cboImagesTableName.setSelectedIndex(-1);
379
    }
380

    
381
    @Override
382
    public ImageIcon loadImage(String imageName) {
383
        return ToolsSwingUtils.loadImage(this, imageName);
384
    }
385

    
386
}