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

History | View | Annotate | Download (16.7 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.Collections;
15
import java.util.List;
16
import javax.swing.AbstractListModel;
17
import javax.swing.DefaultListCellRenderer;
18
import javax.swing.ImageIcon;
19
import javax.swing.JComponent;
20
import javax.swing.JLabel;
21
import javax.swing.JList;
22
import javax.swing.SpinnerNumberModel;
23
import javax.swing.SwingConstants;
24
import javax.swing.event.ChangeEvent;
25
import javax.swing.event.ChangeListener;
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.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
31
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
32
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
33
import org.gvsig.fmap.dal.DALLocator;
34
import org.gvsig.fmap.dal.DataManager;
35
import org.gvsig.fmap.dal.exception.DataException;
36
import org.gvsig.fmap.dal.feature.Feature;
37
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
38
import org.gvsig.fmap.dal.feature.FeatureSelection;
39
import org.gvsig.fmap.dal.feature.FeatureSet;
40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.swing.DALSwingLocator;
43
import org.gvsig.fmap.dal.swing.DataSwingManager;
44
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
45
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributeListCellRenderer;
46
import org.gvsig.fmap.geom.Geometry;
47
import org.gvsig.fmap.geom.GeometryUtils;
48
import org.gvsig.fmap.geom.primitive.Envelope;
49
import org.gvsig.fmap.geom.type.GeometryType;
50
import org.gvsig.fmap.mapcontext.ViewPort;
51
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
52
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
53
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.impl.SimpleFillSymbol;
54
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.impl.SimpleLineSymbol;
55
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.impl.SimpleMarkerSymbol;
56
import org.gvsig.tools.dynobject.Tags;
57
import org.gvsig.tools.swing.api.FilteredListController;
58
import org.gvsig.tools.swing.api.ToolsSwingLocator;
59
import org.gvsig.tools.swing.api.ToolsSwingManager;
60
import org.gvsig.tools.swing.api.ToolsSwingUtils;
61
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
62
import org.gvsig.tools.util.LabeledValue;
63
import org.gvsig.tools.util.LabeledValueImpl;
64

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

    
71
    private AttributeDescriptorPickerController labelPicker;
72
    private FeatureAttributeDescriptor attributeLabel;
73
    private ISymbol symbol;
74
    private FeatureAttributeDescriptor geomattr;
75
    private FeatureStore store;
76
    private FilteredListController dataController;
77
    private AttributeDescriptorPickerController colorPicker;
78
//    private AttributeDescriptorPickerController groupPicker;
79
    private ExpressionPickerController filterPicker;
80
//    private Expression filter;
81

    
82
    private class FeratureWithGeomCellRenderer extends DefaultListCellRenderer {
83

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

    
113
    public GeometriesPalettePanel() {
114
        initComponents();
115

    
116
    }
117

    
118
    private void initComponents() {
119
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
120
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
121
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
122

    
123
        FeatureAttributeListCellRenderer renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
124
        renderer.setUseLabels(DataManager.USE_LABELS_NO);
125
        this.cboLabel.setRenderer(renderer);
126
        labelPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboLabel);
127
        labelPicker.addChangeListener((ChangeEvent e) -> {
128
            doChangeAttrLabel();
129
        });
130
        renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
131
        renderer.setUseLabels(DataManager.USE_LABELS_NO);
132
        this.cboColor.setRenderer(renderer);
133
        colorPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboColor);
134
        colorPicker.addChangeListener((ChangeEvent e) -> {
135
            doChangeAttrColor();
136
        });
137
        colorPicker.setAllowNull(true);
138
        
139
        renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
140
        renderer.setUseLabels(DataManager.USE_LABELS_NO);
141

    
142
        this.filterPicker = expressionSwingManager.createExpressionPickerController(
143
                this.txtFilter, 
144
                this.btnFilter
145
        );
146
        this.filterPicker.addChangeListener((ChangeEvent e) -> {
147
            doChangeAttrLabel();
148
        });
149
        SpinnerNumberModel spnSizeModel = new SpinnerNumberModel(100, 30, 600, 10);
150
        this.spnSize.setModel(spnSizeModel);
151
        this.spnSize.addChangeListener((ChangeEvent e) -> { doChangeSize(); });
152

    
153
        this.lstData.setCellRenderer(new FeratureWithGeomCellRenderer());
154
        this.lstData.addListSelectionListener((ListSelectionEvent e) -> {
155
            if( e.getValueIsAdjusting() ) {
156
                return;
157
            }
158
            doCopyFeature();
159
        });
160
        this.dataController = toolsSwingManager.createFilteredListController(lstData, txtDataFilter, btnDataFilter);
161

    
162
        colorPicker.setEnabled(false);
163
        filterPicker.setEnabled(true);
164
        ToolsSwingUtils.ensureRowsCols(this, 25,40,25,80);
165
    }
166

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

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

    
287
                @Override
288
                public int size() {
289
                    return features.size();
290
                }
291
            };
292
        }
293
        
294
        @Override
295
        public int getSize() {
296
            return this.elements.size();
297
        }
298

    
299
        @Override
300
        public LabeledValue<List<Feature>> getElementAt(int index) {
301
            LabeledValue<List<Feature>> element = this.elements.get(index);
302
            return element;
303
        }
304
        
305
    }
306
    
307
    private void doChangeAttrLabel() {
308
        this.attributeLabel = this.labelPicker.get();
309
        this.lstData.setModel(new DataModel(store, this.getFilter(), attributeLabel));
310
    }
311

    
312
    public void setFilter(String filter) {
313
        this.filterPicker.set(ExpressionUtils.createExpression(filter));
314
    }
315
    
316
    public void setFilter(Expression filter) {
317
        this.filterPicker.set(filter);
318
    }
319
    
320
    public void setFeatureStore(FeatureStore store) {
321
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
322

    
323
        this.store = store;
324
        FeatureType featureType = store.getDefaultFeatureTypeQuietly();
325
        this.lstData.setModel(new DataModel());
326
        this.labelPicker.setFeatureType(featureType);
327
        this.colorPicker.setFeatureType(featureType);
328

    
329
        dataSwingManager.configureExpressionBuilder(this.filterPicker.getConfig(), this.store);        
330
        
331
        this.geomattr = featureType.getDefaultGeometryAttribute();
332
        GeometryType geomtype = geomattr.getGeomType();
333
        if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geomtype.getType()) ||
334
                GeometryUtils.isSubtype(Geometry.TYPES.MULTIPOINT, geomtype.getType())) {
335
            this.symbol = new SimpleMarkerSymbol();
336
        } else if( GeometryUtils.isSubtype(Geometry.TYPES.SURFACE, geomtype.getType()) ||
337
                GeometryUtils.isSubtype(Geometry.TYPES.MULTISURFACE, geomtype.getType())) {
338
            this.symbol = new SimpleFillSymbol();
339
        } else if( GeometryUtils.isSubtype(Geometry.TYPES.CURVE, geomtype.getType()) ||
340
                GeometryUtils.isSubtype(Geometry.TYPES.MULTICURVE, geomtype.getType())) {
341
            this.symbol = new SimpleLineSymbol();
342
        }
343
    }
344

    
345
    public void updateListContents() {
346
        this.lstData.setModel(new DataModel(store, this.getFilter(), attributeLabel));
347
    }
348
    
349
    public static void showPalette(FLyrVect layer) {
350
        showPalette(layer.getFeatureStore(), null, null, null);
351
    }
352

    
353
    public static void showPalette(FeatureStore store, String labelattr, String title, String filter) {
354
        final WindowManager windowManager = ToolsSwingLocator.getWindowManager();
355

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

    
391
    }
392
    
393
    void setLabelAttributeName(String labelattr) {
394
        this.labelPicker.set(labelattr);
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
    public Expression getFilter() {
423
        return this.filterPicker.get();
424
    }
425
}