Statistics
| Revision:

root / org.gvsig.legend.urbanhorizontalsignage / trunk / org.gvsig.legend.urbanhorizontalsignage / org.gvsig.legend.urbanhorizontalsignage.app / org.gvsig.legend.urbanhorizontalsignage.app.mainplugin / src / main / java / org / gvsig / legend / urbanhorizontalsignage / app / UrbanHorizontalSignageExtension.java @ 5130

History | View | Annotate | Download (10.8 KB)

1
package org.gvsig.legend.urbanhorizontalsignage.app;
2

    
3
import java.io.File;
4
import java.util.UUID;
5
import javax.swing.JOptionPane;
6
import org.gvsig.andami.IconThemeHelper;
7
import org.gvsig.andami.plugins.Extension;
8
import org.gvsig.app.ApplicationLocator;
9
import org.gvsig.app.ApplicationManager;
10
import org.gvsig.app.project.documents.view.ViewDocument;
11
import org.gvsig.app.project.documents.view.ViewManager;
12
import org.gvsig.fmap.dal.DALLocator;
13
import org.gvsig.fmap.dal.DataManager;
14
import org.gvsig.fmap.dal.DataStoreParameters;
15
import org.gvsig.fmap.dal.feature.EditableFeature;
16
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.EditableFeatureType;
18
import org.gvsig.fmap.dal.feature.Feature;
19
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
20
import org.gvsig.fmap.dal.feature.FeatureSelection;
21
import org.gvsig.fmap.dal.feature.FeatureSet;
22
import org.gvsig.fmap.dal.feature.FeatureStore;
23
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
24
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
25
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
26
import org.gvsig.fmap.geom.DataTypes;
27
import org.gvsig.fmap.geom.Geometry;
28
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
29
import org.gvsig.fmap.mapcontext.MapContext;
30
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
31
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData;
32
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_CONT_DISC;
33
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_DISC;
34
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_DISC_CONT;
35
import static org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageData.CONTINUITY_MODE_DISC_DISC;
36
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageLegend;
37
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageLocator;
38
import org.gvsig.legend.urbanhorizontalsignage.lib.api.UrbanHorizontalSignageManager;
39
import org.gvsig.tools.ToolsLocator;
40
import org.gvsig.tools.dispose.DisposeUtils;
41
import org.gvsig.tools.folders.FoldersManager;
42
import org.gvsig.tools.i18n.I18nManager;
43
import org.gvsig.tools.util.HasAFile;
44
import org.slf4j.Logger;
45
import org.slf4j.LoggerFactory;
46

    
47
public class UrbanHorizontalSignageExtension extends Extension {
48

    
49
    private static final Logger LOGGER = LoggerFactory.getLogger(UrbanHorizontalSignageExtension.class);
50

    
51
    @Override
52
    public void initialize() {
53
        IconThemeHelper.registerIcon("legend", "legend-overview-vectorial-urbanhorizontalsignage", this);
54
        IconThemeHelper.registerIcon("action", "layer-modify-clipboard-copy-as-polygons", this);
55

    
56
    }
57

    
58
    @Override
59
    public void execute(String actionCommand) {
60

    
61
        if (actionCommand.compareToIgnoreCase("layer-modify-clipboard-copy-as-polygons") != 0) {
62
            return;
63
        }
64
        DataManager dataManager = DALLocator.getDataManager();
65

    
66
        ApplicationManager application = ApplicationLocator.getManager();
67
        ViewDocument viewdoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
68
        if (viewdoc == null) {
69
            return;
70
        }
71
        MapContext mapContext = viewdoc.getMapContext();
72
        FLyrVect layer = mapContext.getLayers().getFirstActiveVectorLayer();
73
        if (layer == null) {
74
            return;
75
        }
76
        UrbanHorizontalSignageManager uhsManager = UrbanHorizontalSignageLocator.getUrbanHorizontalSignageManager();
77
        UrbanHorizontalSignageLegend legend = (UrbanHorizontalSignageLegend) layer.getLegend();
78
        EditableFeatureType targetFeatureType = createTargetFeatureType(layer.getFeatureStore());
79
        FeatureStore targetStore = createTemporalStore(targetFeatureType);
80
        FeatureSet featureSet = null;
81
        try {
82
            targetStore.edit(FeatureStore.MODE_APPEND);
83
            FeatureSelection selection = layer.getFeatureStore().getFeatureSelection();
84

    
85
            for (Feature feature : selection) {
86

    
87
                Geometry originalGeometry = feature.getDefaultGeometry();
88

    
89
                UrbanHorizontalSignageData data = legend.getValues(feature);
90

    
91
                uhsManager.calculateGeometries(originalGeometry, data);
92

    
93
                MultiPolygon multiGeom = data.getSegmentsGeometry();
94
                if (multiGeom != null && multiGeom.getPrimitivesNumber() > 0) {
95
                    for (Geometry geometry : multiGeom) {
96
                        EditableFeature targetFeature = targetStore.createNewFeature();
97
                        targetFeature.copyFrom(feature, (FeatureAttributeDescriptor t) -> !(t.isPrimaryKey() || (t.isIndexed() && !t.allowIndexDuplicateds()) || t.getType() == DataTypes.GEOMETRY));
98
                        targetFeature.setDefaultGeometry(geometry);
99
                        targetStore.insert(targetFeature);
100
                    }
101
                }
102

    
103
                switch (data.getContinuity()) {
104
                    case CONTINUITY_MODE_CONT_DISC:
105
                    case CONTINUITY_MODE_DISC_CONT:
106
                    case CONTINUITY_MODE_DISC:
107
                    case CONTINUITY_MODE_DISC_DISC:
108
                        if (data.isPaintHoles()) {
109
                            multiGeom = data.getHolesGeometry();
110
                            if (multiGeom != null && multiGeom.getPrimitivesNumber() > 0) {
111
                                for (Geometry geometry : multiGeom) {
112
                                    EditableFeature targetFeature = targetStore.createNewFeature();
113
                                    targetFeature.copyFrom(feature, (FeatureAttributeDescriptor t) -> !(t.isPrimaryKey() || (t.isIndexed() && !t.allowIndexDuplicateds()) || t.getType() == DataTypes.GEOMETRY));
114
                                    targetFeature.setDefaultGeometry(geometry);
115
                                    targetStore.insert(targetFeature);
116
                                }
117
                            }
118
                        }
119
                }
120

    
121
            }
122

    
123
            targetStore.finishEditing();
124

    
125
            featureSet = targetStore.getFeatureSet();
126

    
127
            I18nManager i18n = ToolsLocator.getI18nManager();
128
            int n = application.confirmDialog(
129
                    "_Number_of_geometries_to_be_copied_to_the_clipboard" + " " + featureSet.getSize() + "\n" + "_Do_you_want_to_continue",
130
                    i18n.getTranslation("_Copy_selected_features_as_polygons_to_clipboard"),
131
                    JOptionPane.YES_NO_OPTION,
132
                    JOptionPane.QUESTION_MESSAGE);
133
            if (n == JOptionPane.YES_OPTION) {
134
                dataManager.putFeaturesInClipboard(featureSet);
135
            }
136

    
137
        } catch (Exception e) {
138
            LOGGER.warn("Can't get the selection as JSON.", e);
139
        } finally {
140
            DisposeUtils.disposeQuietly(targetStore);
141
            DisposeUtils.disposeQuietly(featureSet);
142
        }
143

    
144
    }
145

    
146
    private EditableFeatureType createTargetFeatureType(FeatureStore store) {
147
        DataManager dataManager = DALLocator.getDataManager();
148

    
149
        EditableFeatureType featureType = dataManager.createFeatureType();
150
        featureType.addAll(store.getDefaultFeatureTypeQuietly());
151

    
152
        EditableFeatureAttributeDescriptor attr = (EditableFeatureAttributeDescriptor) featureType.getDefaultGeometryAttribute();
153
        attr.setGeometryType(Geometry.TYPES.POLYGON, Geometry.SUBTYPES.GEOM2D);
154

    
155
        return featureType;
156
    }
157

    
158
    private FeatureStore createTemporalStore(EditableFeatureType featType) {
159
        if (featType.getStore() != null) {
160
            throw new IllegalArgumentException("Can't create temporal store from a feature type of a already existent store.");
161
        }
162
        try {
163
            // crear ruta de archivo temporal
164
            FoldersManager foldersManager = ToolsLocator.getFoldersManager();
165
            File tempFile = foldersManager.getUniqueTemporaryFile("urbanHorizontalSignage_temporal_store_" + UUID.randomUUID().toString());
166

    
167
            // crear SERVER STORE
168
            DataManager dataManager = DALLocator.getDataManager();
169
            JDBCServerExplorerParameters serverParameters = (JDBCServerExplorerParameters) dataManager.createServerExplorerParameters("H2Spatial");
170
            ((HasAFile) serverParameters).setFile(tempFile);
171
            JDBCServerExplorer serverExplorer = (JDBCServerExplorer) dataManager.openServerExplorer("H2Spatial", serverParameters);
172

    
173
            //Crear tablas en server store
174
            JDBCNewStoreParameters parametersResults = serverExplorer.getAddParameters();
175
            parametersResults.setDynValue("Table", "results");
176

    
177
            parametersResults.setDefaultFeatureType(featType);
178
            serverExplorer.add("H2Spatial", parametersResults, true);
179

    
180
            DataStoreParameters storeParametersResults = dataManager.createStoreParameters("H2Spatial");
181
            storeParametersResults.setDynValue("database_file", tempFile);
182
            storeParametersResults.setDynValue("Table", "results");
183

    
184
            //Creaci?n del store con los resultados
185
            FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial", storeParametersResults);
186

    
187
            return storeResults;
188
        } catch (Exception ex) {
189
            LOGGER.debug("Can't create temporal store.", ex);
190
            return null;
191
        }
192
    }
193

    
194
    @Override
195
    public boolean isEnabled() {
196
        // it's enabled if there is exactly one vector layer in the active view
197
        // and it has a selection
198

    
199
        ApplicationManager application = ApplicationLocator.getManager();
200
        ViewDocument viewdoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
201
        if (viewdoc == null) {
202
            return false;
203
        }
204
        MapContext mapContext = viewdoc.getMapContext();
205
        FLyrVect layer = mapContext.getLayers().getFirstActiveVectorLayer();
206
        if (layer == null) {
207
            return false;
208
        }
209
        if (!layer.isAvailable()) {
210
            // This can happen when opening a persisted project
211
            // and there is a "slow" layer (GeoDB)
212
            return false;
213
        }
214
        try {
215
            FeatureStore store = layer.getFeatureStore();
216
            FeatureSelection selection = store.getFeatureSelection();
217
            if (selection.isEmpty()) {
218
                return false;
219
            }
220
            return (layer.getLegend() instanceof UrbanHorizontalSignageLegend);
221
//            return !selection.isEmpty();
222
        } catch (Exception ex) {
223
            LOGGER.warn("Can't get selection from layer '" + layer.getName() + "'.", ex);
224
            return false;
225
        }
226
    }
227

    
228
    @Override
229
    public boolean isVisible() {
230
        ApplicationManager application = ApplicationLocator.getManager();
231
        return application.getActiveDocument(ViewManager.TYPENAME) != null;
232
    }
233

    
234
}