Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / extension / geometriespalette / GeometriesPalettePanel.java @ 47430

History | View | Annotate | Download (16.4 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.app.extension.geometriespalette;
7

    
8
import java.awt.Component;
9
import java.awt.Dimension;
10
import java.awt.Graphics2D;
11
import java.awt.Image;
12
import java.awt.image.BufferedImage;
13
import java.util.AbstractList;
14
import java.util.ArrayList;
15
import java.util.Collections;
16
import java.util.List;
17
import javax.swing.AbstractListModel;
18
import javax.swing.DefaultListCellRenderer;
19
import javax.swing.ImageIcon;
20
import javax.swing.JComponent;
21
import javax.swing.JLabel;
22
import javax.swing.JList;
23
import javax.swing.SpinnerNumberModel;
24
import javax.swing.SwingConstants;
25
import javax.swing.event.ChangeEvent;
26
import javax.swing.event.ListSelectionEvent;
27
import org.apache.commons.lang3.StringUtils;
28
import org.gvsig.expressionevaluator.Expression;
29
import org.gvsig.expressionevaluator.ExpressionUtils;
30
import org.gvsig.fmap.dal.DALLocator;
31
import org.gvsig.fmap.dal.DataManager;
32
import org.gvsig.fmap.dal.exception.DataException;
33
import org.gvsig.fmap.dal.feature.Feature;
34
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
35
import org.gvsig.fmap.dal.feature.FeatureSelection;
36
import org.gvsig.fmap.dal.feature.FeatureSet;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.dal.feature.FeatureType;
39
import org.gvsig.fmap.dal.swing.DALSwingLocator;
40
import org.gvsig.fmap.dal.swing.DataSwingManager;
41
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
42
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributeListCellRenderer;
43
import org.gvsig.fmap.geom.Geometry;
44
import org.gvsig.fmap.geom.GeometryUtils;
45
import org.gvsig.fmap.geom.primitive.Envelope;
46
import org.gvsig.fmap.geom.type.GeometryType;
47
import org.gvsig.fmap.mapcontext.ViewPort;
48
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
49
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
50
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.impl.SimpleFillSymbol;
51
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.impl.SimpleLineSymbol;
52
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.impl.SimpleMarkerSymbol;
53
import org.gvsig.tools.dispose.DisposeUtils;
54
import org.gvsig.tools.dynobject.Tags;
55
import org.gvsig.tools.swing.api.FilteredListController;
56
import org.gvsig.tools.swing.api.ToolsSwingLocator;
57
import org.gvsig.tools.swing.api.ToolsSwingManager;
58
import org.gvsig.tools.swing.api.ToolsSwingUtils;
59
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
60
import org.gvsig.tools.util.LabeledValue;
61
import org.gvsig.tools.util.LabeledValueImpl;
62

    
63
/**
64
 *
65
 * @author gvSIG Team
66
 */
67
public class GeometriesPalettePanel extends GeometriesPalettePanelView implements org.gvsig.tools.swing.api.Component {
68

    
69
    private AttributeDescriptorPickerController labelPicker;
70
    private FeatureAttributeDescriptor attributeLabel;
71
    private ISymbol symbol;
72
    private FeatureAttributeDescriptor geomattr;
73
    private FeatureStore store;
74
    private FilteredListController dataController;
75
    private AttributeDescriptorPickerController colorPicker;
76
    private AttributeDescriptorPickerController groupPicker;
77
    private Expression filter;
78

    
79
    private class FeratureWithGeomCellRenderer extends DefaultListCellRenderer {
80

    
81
        @Override
82
        public Component getListCellRendererComponent(
83
                JList<?> list,
84
                Object value,
85
                int index,
86
                boolean isSelected,
87
                boolean cellHasFocus) {
88
            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
89
            try {
90
                LabeledValue<List<Feature>> x = (LabeledValue<List<Feature>>) value;
91
                if ( x!=null && x.getValue() != null && symbol!=null ) {
92
                    Image img = drawGeometry(x.getValue());
93
                    label.setHorizontalAlignment(SwingConstants.CENTER);
94
                    label.setHorizontalTextPosition(JLabel.CENTER);
95
                    label.setVerticalTextPosition(JLabel.BOTTOM);
96
                    label.setIcon(new ImageIcon(img));
97
                    if( StringUtils.isBlank(x.getLabel()) ) {
98
                        label.setText("(Configure label)");
99
                    } else {
100
                        label.setText(x.getLabel());
101
                    }
102
                }
103
            } catch(Throwable th) {
104
                label.setText("Error");
105
            }
106
            return label;
107
        }
108
    }
109

    
110
    public GeometriesPalettePanel() {
111
        initComponents();
112

    
113
    }
114

    
115
    private void initComponents() {
116
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
117
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
118

    
119
        FeatureAttributeListCellRenderer renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
120
        renderer.setUseLabels(DataManager.USE_LABELS_NO);
121
        this.cboLabel.setRenderer(renderer);
122
        labelPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboLabel);
123
        labelPicker.addChangeListener((ChangeEvent e) -> {
124
            doChangeAttrLabel();
125
        });
126
        renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
127
        renderer.setUseLabels(DataManager.USE_LABELS_NO);
128
        this.cboColor.setRenderer(renderer);
129
        colorPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboColor);
130
        colorPicker.addChangeListener((ChangeEvent e) -> {
131
            doChangeAttrColor();
132
        });
133
        colorPicker.setAllowNull(true);
134
        
135
        renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
136
        renderer.setUseLabels(DataManager.USE_LABELS_NO);
137
        this.cboGroup.setRenderer(renderer);
138
        groupPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboGroup);
139
        groupPicker.addChangeListener((ChangeEvent e) -> {
140
            doChangeAttrGroup();
141
        });
142
        groupPicker.setAllowNull(true);
143
        SpinnerNumberModel spnSizeModel = new SpinnerNumberModel(100, 30, 600, 10);
144
        this.spnSize.setModel(spnSizeModel);
145
        this.spnSize.addChangeListener((ChangeEvent e) -> { doChangeSize(); });
146

    
147
        this.lstData.setCellRenderer(new FeratureWithGeomCellRenderer());
148
        this.lstData.addListSelectionListener((ListSelectionEvent e) -> {
149
            if( e.getValueIsAdjusting() ) {
150
                return;
151
            }
152
            doCopyFeature();
153
        });
154
        this.dataController = toolsSwingManager.createFilteredListController(lstData, txtDataFilter, btnDataFilter);
155

    
156
        colorPicker.setEnabled(false);
157
        groupPicker.setEnabled(false);
158
        ToolsSwingUtils.ensureRowsCols(this, 25,40,25,80);
159
    }
160

    
161
    private void doChangeSize() {
162
        this.lstData.updateUI();
163
    }
164
    
165
    private void doChangeAttrGroup() {
166
        
167
    }
168
    
169
    private void doChangeAttrColor() {
170
        
171
    }
172
    
173
    private void doCopyFeature() {
174
        try {
175
            LabeledValue<List<Feature>> x = (LabeledValue<List<Feature>>) this.lstData.getSelectedValue();
176
            if( x == null ) {
177
                return;
178
            }
179
            DataManager dataManager = DALLocator.getDataManager();
180
            FeatureSelection selection = this.store.createFeatureSelection();
181
            for (Feature feature : x.getValue()) {
182
                selection.select(feature);
183
            }
184
            dataManager.putFeaturesInClipboard(selection);
185
        } catch (DataException ex) {
186
            // TODO: LOGGER.warn
187
        }
188
    }
189
    
190
    private Image drawGeometry(List<Feature> features) {
191
                
192
        int pixels = (int) this.spnSize.getValue();
193
        Dimension size = new Dimension(pixels, pixels);
194
        BufferedImage img = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
195
        
196
        ViewPort viewPort = new ViewPort();
197
        viewPort.setImageSize(size);
198
        viewPort.setProjection(geomattr.getSRS());
199
        if( features.size()==1 ) {
200
            Geometry geom = (Geometry) features.get(0).get(geomattr.getName());
201
            viewPort.setEnvelope(geom.getEnvelope());
202
        } else {
203
            Envelope envelope = GeometryUtils.createEnvelope(Geometry.SUBTYPES.GEOM2D);
204
            for (Feature feature : features) {
205
                Geometry geom = (Geometry) feature.get(geomattr.getName());
206
                envelope.add(geom);
207
            }
208
            viewPort.setEnvelope(envelope);
209
        }
210
        
211
        for (Feature feature : features) {
212
            Geometry geom = (Geometry) feature.get(geomattr.getName());
213
            this.symbol.draw(
214
                    (Graphics2D) img.getGraphics(), 
215
                    viewPort.getAffineTransform(),
216
                    geom,
217
                    feature, 
218
                    null
219
            );
220
        }
221
        return img;
222
    }
223
    
224
    private static class DataModel extends AbstractListModel<LabeledValue<List<Feature>>> {
225

    
226
        private List<LabeledValue<List<Feature>>> elements;
227
        private FeatureAttributeDescriptor attributeLabel;
228
        
229
        public DataModel() {
230
            this.elements = Collections.EMPTY_LIST;
231
        }
232
        
233
        public DataModel(FeatureAttributeDescriptor attributeLabel) {
234
            this();
235
            this.attributeLabel = attributeLabel;
236
        }
237
        
238
        public DataModel(FeatureStore store, Expression filter, FeatureAttributeDescriptor attributeLabel, FeatureAttributeDescriptor attributeGroup) {
239
            this(attributeLabel);
240
            String groupAttributeName = attributeGroup.getName();
241
            String order = groupAttributeName;
242
            if( attributeLabel!=null ) {
243
                order = order+","+attributeLabel.getName();
244
            }
245
            LabeledValueImpl<List<Feature>> element = null;
246
            String previousGroup = null;
247
            FeatureSet features = createFeatureSet(store, filter, order);
248
            for (Feature feature : features) {
249
                if( !StringUtils.equals(previousGroup, feature.getString(groupAttributeName)) ) {
250
                    if( element != null ) {
251
                        elements.add(element);
252
                    }
253
                    element = new LabeledValueImpl<>(
254
                            feature.getString(attributeLabel.getName()),
255
                            new ArrayList<>()
256
                    );
257
                }
258
                element.getValue().add(feature.getCopy());
259
            }
260
            DisposeUtils.disposeQuietly(features);
261
        }
262
        
263
        public DataModel(FeatureStore store, Expression filter, FeatureAttributeDescriptor attributeLabel) {
264
            this(attributeLabel);
265
            String order = null;
266
            if( attributeLabel != null ) {
267
                order = attributeLabel.getName();
268
            }
269
            List<Feature> features = store.getFeatures(filter, order);
270
            this.elements = new AbstractList<LabeledValue<List<Feature>>> () {
271
                @Override
272
                public LabeledValue<List<Feature>> get(int index) {
273
                    Feature feature = features.get(index);
274
                    String label = "";
275
                    if( attributeLabel!=null ) {
276
                        label = feature.getLabelOfValue(attributeLabel.getName());
277
                    }
278
                    return new LabeledValueImpl(label,Collections.singletonList(feature));
279
                }
280

    
281
                @Override
282
                public int size() {
283
                    return features.size();
284
                }
285
            };
286
        }
287
        
288
        @Override
289
        public int getSize() {
290
            return this.elements.size();
291
        }
292

    
293
        @Override
294
        public LabeledValue<List<Feature>> getElementAt(int index) {
295
            LabeledValue<List<Feature>> element = this.elements.get(index);
296
            return element;
297
        }
298
        
299
    }
300
    
301
    private void doChangeAttrLabel() {
302
        this.attributeLabel = this.labelPicker.get();
303
        this.lstData.setModel(new DataModel(store, filter, attributeLabel));
304
    }
305

    
306
    public void setFilter(String filter) {
307
        this.filter = ExpressionUtils.createExpression(filter);
308
    }
309
    
310
    public void setFilter(Expression filter) {
311
        this.filter = filter;
312
    }
313
    
314
    public void setFeatureStore(FeatureStore store) {
315
        this.store = store;
316
        FeatureType featureType = store.getDefaultFeatureTypeQuietly();
317
        this.lstData.setModel(new DataModel());
318
        this.labelPicker.setFeatureType(featureType);
319
        this.colorPicker.setFeatureType(featureType);
320
        this.groupPicker.setFeatureType(featureType);
321
        this.geomattr = featureType.getDefaultGeometryAttribute();
322
        GeometryType geomtype = geomattr.getGeomType();
323
        if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geomtype.getType()) ||
324
                GeometryUtils.isSubtype(Geometry.TYPES.MULTIPOINT, geomtype.getType())) {
325
            this.symbol = new SimpleMarkerSymbol();
326
        } else if( GeometryUtils.isSubtype(Geometry.TYPES.SURFACE, geomtype.getType()) ||
327
                GeometryUtils.isSubtype(Geometry.TYPES.MULTISURFACE, geomtype.getType())) {
328
            this.symbol = new SimpleFillSymbol();
329
        } else if( GeometryUtils.isSubtype(Geometry.TYPES.CURVE, geomtype.getType()) ||
330
                GeometryUtils.isSubtype(Geometry.TYPES.MULTICURVE, geomtype.getType())) {
331
            this.symbol = new SimpleLineSymbol();
332
        }
333
    }
334

    
335
    public void updateListContents() {
336
        FeatureAttributeDescriptor groupAttribute = this.groupPicker.get();
337
        if( groupAttribute == null ) {
338
            this.lstData.setModel(new DataModel(store, filter, attributeLabel));
339
        } else {
340
            this.lstData.setModel(new DataModel(store, filter, attributeLabel, groupAttribute));
341
        }
342
    }
343
    
344
    public static void showPalette(FLyrVect layer) {
345
        showPalette(layer.getFeatureStore(), null, null, null);
346
    }
347

    
348
    public static void showPalette(FeatureStore store, String labelattr, String title, String filter) {
349
        final WindowManager windowManager = ToolsSwingLocator.getWindowManager();
350

    
351
        FeatureType featureType = store.getDefaultFeatureTypeQuietly();
352
        Tags tags = featureType.getTags();
353
        if( StringUtils.isBlank(title) ) {
354
            title = tags.getString("geometriespalette.title", "");
355
        }
356
        if( StringUtils.isBlank(filter) ) {
357
            title = tags.getString("geometriespalette.filter", null);
358
        }
359
        if( StringUtils.isBlank(labelattr) ) {
360
            labelattr = tags.getString("geometriespalette.attribute.label", null);
361
        }
362
        String attrGroup = tags.getString("geometriespalette.attribute.group", null);
363
        String attrColor = tags.getString("geometriespalette.attribute.color", null);
364
        int size = tags.getInt("geometriespalette.size",-1);
365
        
366
        GeometriesPalettePanel palette = new GeometriesPalettePanel();
367
        palette.setFilter(filter);
368
        palette.setFeatureStore((FeatureStore) store);
369
        palette.setGroupAttributeName(attrGroup);
370
        palette.setColorAttributeName(attrColor);
371
        if( size>0 ) {
372
            palette.setSize(size);
373
        }
374
        
375
        if( StringUtils.isNotBlank(labelattr) ) {
376
            palette.setLabelAttributeName(labelattr);
377
        }
378
        if( StringUtils.isBlank(title) ) {
379
            title = ToolsSwingUtils.makeTitle("Palette",store.getName(),null);
380
        }
381
        windowManager.showWindow(
382
                palette.asJComponent(),
383
                title,
384
                WindowManager.MODE.TOOL
385
        );
386

    
387
    }
388
    
389
    void setLabelAttributeName(String labelattr) {
390
        this.labelPicker.set(labelattr);
391
    }
392

    
393
    void setGroupAttributeName(String attrGroup) {
394
        this.groupPicker.set(attrGroup);
395
    }
396

    
397
    void setColorAttributeName(String attrColor) {
398
        this.colorPicker.set(attrColor);
399
    }
400
    
401
    public void setSize(int size) {
402
        this.spnSize.setValue(size);
403
    }
404

    
405
    private static FeatureSet createFeatureSet(FeatureStore store, Expression filter, String groupAttributeName) {
406
        try {
407
            FeatureSet features = store.getFeatureSet(filter, groupAttributeName);
408
            return features;
409
        } catch (DataException ex) {
410
            throw new RuntimeException("Can't create feature set", ex);
411
        }
412
    }
413

    
414
    @Override
415
    public JComponent asJComponent() {
416
        if( this.lstData.getModel().getSize()==0 ) {
417
            updateListContents();
418
        }
419
        return this;
420
    }
421

    
422
}