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

History | View | Annotate | Download (16.3 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 && attributeLabel!=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
                    label.setText(x.getLabel());
98
                }
99
            } catch(Throwable th) {
100
                label.setText("Error");
101
            }
102
            return label;
103
        }
104
    }
105

    
106
    public GeometriesPalettePanel() {
107
        initComponents();
108

    
109
    }
110

    
111
    private void initComponents() {
112
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
113
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
114

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

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

    
152
        colorPicker.setEnabled(false);
153
        groupPicker.setEnabled(false);
154
        ToolsSwingUtils.ensureRowsCols(this, 25,40,25,80);
155
    }
156

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

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

    
277
                @Override
278
                public int size() {
279
                    return features.size();
280
                }
281
            };
282
        }
283
        
284
        @Override
285
        public int getSize() {
286
            return this.elements.size();
287
        }
288

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

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

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

    
344
    public static void showPalette(FeatureStore store, String labelattr, String title, String filter) {
345
        final WindowManager windowManager = ToolsSwingLocator.getWindowManager();
346

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

    
383
    }
384
    
385
    void setLabelAttributeName(String labelattr) {
386
        this.labelPicker.set(labelattr);
387
    }
388

    
389
    void setGroupAttributeName(String attrGroup) {
390
        this.groupPicker.set(attrGroup);
391
    }
392

    
393
    void setColorAttributeName(String attrColor) {
394
        this.colorPicker.set(attrColor);
395
    }
396
    
397
    public void setSize(int size) {
398
        this.spnSize.setValue(size);
399
    }
400

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

    
410
    @Override
411
    public JComponent asJComponent() {
412
        if( this.lstData.getModel().getSize()==0 ) {
413
            updateListContents();
414
        }
415
        return this;
416
    }
417

    
418
}