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

History | View | Annotate | Download (10.1 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.List;
14
import javax.swing.AbstractListModel;
15
import javax.swing.DefaultListCellRenderer;
16
import javax.swing.ImageIcon;
17
import javax.swing.JLabel;
18
import javax.swing.JList;
19
import javax.swing.ListCellRenderer;
20
import javax.swing.SpinnerNumberModel;
21
import javax.swing.SwingConstants;
22
import javax.swing.event.ChangeEvent;
23
import javax.swing.event.ListSelectionEvent;
24
import org.gvsig.fmap.dal.DALLocator;
25
import org.gvsig.fmap.dal.DataManager;
26
import org.gvsig.fmap.dal.exception.DataException;
27
import org.gvsig.fmap.dal.feature.Feature;
28
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
29
import org.gvsig.fmap.dal.feature.FeatureSelection;
30
import org.gvsig.fmap.dal.feature.FeatureStore;
31
import org.gvsig.fmap.dal.feature.FeatureType;
32
import org.gvsig.fmap.dal.swing.DALSwingLocator;
33
import org.gvsig.fmap.dal.swing.DataSwingManager;
34
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
35
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributeListCellRenderer;
36
import org.gvsig.fmap.geom.Geometry;
37
import org.gvsig.fmap.geom.GeometryUtils;
38
import org.gvsig.fmap.geom.type.GeometryType;
39
import org.gvsig.fmap.mapcontext.ViewPort;
40
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
41
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
42
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.impl.SimpleFillSymbol;
43
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.impl.SimpleLineSymbol;
44
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.impl.SimpleMarkerSymbol;
45
import org.gvsig.tools.swing.api.FilteredListController;
46
import org.gvsig.tools.swing.api.ToolsSwingLocator;
47
import org.gvsig.tools.swing.api.ToolsSwingManager;
48
import org.gvsig.tools.swing.api.ToolsSwingUtils;
49
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
50
import org.gvsig.tools.util.LabeledValue;
51
import org.gvsig.tools.util.LabeledValueImpl;
52

    
53
/**
54
 *
55
 * @author gvSIG Team
56
 */
57
public class GeometriesPalettePanel extends GeometriesPalettePanelView {
58

    
59
    private AttributeDescriptorPickerController labelPicker;
60
    private FeatureAttributeDescriptor attributeLabel;
61
    private ISymbol symbol;
62
    private FeatureAttributeDescriptor geomattr;
63
    private FeatureStore store;
64
    private FilteredListController dataController;
65
    private AttributeDescriptorPickerController colorPicker;
66
    private AttributeDescriptorPickerController groupPicker;
67

    
68
    private class FeratureWithGeomCellRenderer extends DefaultListCellRenderer {
69

    
70
        @Override
71
        public Component getListCellRendererComponent(
72
                JList<?> list,
73
                Object value,
74
                int index,
75
                boolean isSelected,
76
                boolean cellHasFocus) {
77
            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
78
            LabeledValue<Feature> x = (LabeledValue<Feature>) value;
79
            if ( x!=null && x.getValue() != null && attributeLabel!=null && symbol!=null ) {
80
                Image img = drawGeometry(x.getValue());
81
                label.setHorizontalAlignment(SwingConstants.CENTER);
82
                label.setHorizontalTextPosition(JLabel.CENTER);
83
                label.setVerticalTextPosition(JLabel.BOTTOM);
84
                label.setIcon(new ImageIcon(img));
85
                label.setText(x.getLabel());
86
            }
87
            return label;
88
        }
89
    }
90

    
91
    public GeometriesPalettePanel() {
92
        initComponents();
93

    
94
    }
95

    
96
    private void initComponents() {
97
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
98
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
99

    
100
        FeatureAttributeListCellRenderer renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
101
        renderer.setUseLabeld(DataManager.USE_LABELS_NO);
102
        this.cboLabel.setRenderer(renderer);
103
        labelPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboLabel);
104
        labelPicker.addChangeListener((ChangeEvent e) -> {
105
            doChangeAttrLabel();
106
        });
107
        renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
108
        renderer.setUseLabeld(DataManager.USE_LABELS_NO);
109
        this.cboColor.setRenderer(renderer);
110
        colorPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboColor);
111
        colorPicker.addChangeListener((ChangeEvent e) -> {
112
            doChangeAttrColor();
113
        });
114
        renderer = dataSwingManager.createDefaultFeatureAttributeListCellRenderer();
115
        renderer.setUseLabeld(DataManager.USE_LABELS_NO);
116
        this.cboGroup.setRenderer(renderer);
117
        groupPicker = dataSwingManager.createAttributeDescriptorPickerController(this.cboGroup);
118
        groupPicker.addChangeListener((ChangeEvent e) -> {
119
            doChangeAttrGroup();
120
        });
121
        SpinnerNumberModel spnSizeModel = new SpinnerNumberModel(100, 30, 600, 10);
122
        this.spnSize.setModel(spnSizeModel);
123
        this.spnSize.addChangeListener((ChangeEvent e) -> { doChangeSize(); });
124

    
125
        this.lstData.setCellRenderer(new FeratureWithGeomCellRenderer());
126
        this.lstData.addListSelectionListener((ListSelectionEvent e) -> {
127
            if( e.getValueIsAdjusting() ) {
128
                return;
129
            }
130
            doCopyFeature();
131
        });
132
        this.dataController = toolsSwingManager.createFilteredListController(lstData, txtDataFilter, btnDataFilter);
133
        
134
        ToolsSwingUtils.ensureRowsCols(this, 25,40);
135
        ToolsSwingUtils.ensureMaxRows(this, 25);
136
    }
137

    
138
    private void doChangeSize() {
139
        this.lstData.updateUI();
140
    }
141
    
142
    private void doChangeAttrGroup() {
143
        
144
    }
145
    
146
    private void doChangeAttrColor() {
147
        
148
    }
149
    
150
    private void doCopyFeature() {
151
        try {
152
            LabeledValue<Feature> x = (LabeledValue<Feature>) this.lstData.getSelectedValue();
153
            if( x == null ) {
154
                return;
155
            }
156
            DataManager dataManager = DALLocator.getDataManager();
157
            FeatureSelection selection = this.store.createFeatureSelection();
158
            selection.select(x.getValue());
159
            dataManager.putFeaturesInClipboard(selection);
160
        } catch (DataException ex) {
161
            // TODO: LOGGER.warn
162
        }
163
    }
164
    
165
    private Image drawGeometry(Feature feature) {
166
        Geometry geom = (Geometry) feature.get(geomattr.getName());
167
                
168
        int pixels = (int) this.spnSize.getValue();
169
        Dimension size = new Dimension(pixels, pixels);
170
        BufferedImage img = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
171
        
172
        ViewPort viewPort = new ViewPort();
173
        viewPort.setImageSize(size);
174
        viewPort.setProjection(geomattr.getSRS());
175
        viewPort.setEnvelope(geom.getEnvelope());
176
        this.symbol.draw(
177
                (Graphics2D) img.getGraphics(), 
178
                viewPort.getAffineTransform(),
179
                geom,
180
                feature, 
181
                null
182
        );
183
        return img;
184
    }
185
    
186
    private void doChangeAttrLabel() {
187
        this.attributeLabel = this.labelPicker.get();
188
        this.lstData.setModel(new AbstractListModel<LabeledValue<Feature>>() {
189
            List<Feature> features = store.getFeatures((String)null, attributeLabel.getName());
190

    
191
            @Override
192
            public int getSize() {
193
                return features.size();
194
            }
195

    
196
            @Override
197
            public LabeledValue<Feature> getElementAt(int index) {
198
                Feature feature = features.get(index);
199
                return new LabeledValueImpl(
200
                        feature.getString(attributeLabel.getName()),
201
                        feature
202
                );
203
            }
204
        });
205
    }
206

    
207
    public void setFeatureStore(FeatureStore store) {
208
        this.store = store;
209
        this.lstData.setModel(new AbstractListModel<LabeledValue<Feature>>() {
210
            List<Feature> features = store.getFeatures();
211

    
212
            @Override
213
            public int getSize() {
214
                return features.size();
215
            }
216

    
217
            @Override
218
            public LabeledValue<Feature> getElementAt(int index) {
219
                Feature feature = features.get(index);
220
                return new LabeledValueImpl(
221
                        feature.getString(attributeLabel.getName()),
222
                        feature
223
                );
224
            }
225
        });
226
        FeatureType featureType = store.getDefaultFeatureTypeQuietly();
227
        this.labelPicker.setFeatureType(featureType);
228
        this.colorPicker.setFeatureType(featureType);
229
        this.groupPicker.setFeatureType(featureType);
230
        this.geomattr = featureType.getDefaultGeometryAttribute();
231
        GeometryType geomtype = geomattr.getGeomType();
232
        if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geomtype.getType()) ||
233
                GeometryUtils.isSubtype(Geometry.TYPES.MULTIPOINT, geomtype.getType())) {
234
            this.symbol = new SimpleMarkerSymbol();
235
        } else if( GeometryUtils.isSubtype(Geometry.TYPES.SURFACE, geomtype.getType()) ||
236
                GeometryUtils.isSubtype(Geometry.TYPES.MULTISURFACE, geomtype.getType())) {
237
            this.symbol = new SimpleFillSymbol();
238
        } else if( GeometryUtils.isSubtype(Geometry.TYPES.CURVE, geomtype.getType()) ||
239
                GeometryUtils.isSubtype(Geometry.TYPES.MULTICURVE, geomtype.getType())) {
240
            this.symbol = new SimpleLineSymbol();
241
        }
242
    }
243

    
244
    public static void showPalette(FLyrVect layer) {
245
        WindowManager winmanager = ToolsSwingLocator.getWindowManager();
246
        GeometriesPalettePanel panel = new GeometriesPalettePanel();
247

    
248
        winmanager.showWindow(
249
                panel,
250
                "Paleta",
251
                WindowManager.MODE.TOOL
252
        );
253
        panel.setFeatureStore(layer.getFeatureStore());
254
    }
255
}