Statistics
| Revision:

gvsig-lrs / org.gvsig.lrs / trunk / org.gvsig.lrs / org.gvsig.lrs.app / org.gvsig.lrs.app.mainplugin / src / main / java / org / gvsig / lrs / app / editroutecalibration / EditRouteCalibrationExtension.java @ 42

History | View | Annotate | Download (15.7 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2015 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.lrs.app.editroutecalibration;
24

    
25
import java.awt.Component;
26
import java.awt.event.ActionEvent;
27
import java.awt.event.ActionListener;
28
import java.awt.event.ComponentEvent;
29
import java.awt.event.ComponentListener;
30
import java.text.MessageFormat;
31
import java.util.List;
32

    
33
import javax.swing.JOptionPane;
34

    
35
import org.apache.commons.lang3.StringUtils;
36
import org.slf4j.Logger;
37
import org.slf4j.LoggerFactory;
38

    
39
import org.gvsig.andami.IconThemeHelper;
40
import org.gvsig.andami.plugins.Extension;
41
import org.gvsig.app.ApplicationLocator;
42
import org.gvsig.app.ApplicationManager;
43
import org.gvsig.app.project.documents.view.ViewDocument;
44
import org.gvsig.app.project.documents.view.gui.IView;
45
import org.gvsig.fmap.dal.exception.DataException;
46
import org.gvsig.fmap.dal.feature.EditableFeature;
47
import org.gvsig.fmap.dal.feature.Feature;
48
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
49
import org.gvsig.fmap.dal.feature.FeatureSet;
50
import org.gvsig.fmap.dal.feature.FeatureStore;
51
import org.gvsig.fmap.geom.Geometry;
52
import org.gvsig.fmap.mapcontext.MapContext;
53
import org.gvsig.fmap.mapcontext.layers.FLayer;
54
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
55
import org.gvsig.lrs.lib.api.LrsEditRouteCalibrationAlgorithmParams;
56
import org.gvsig.lrs.lib.api.LrsEditRouteCalibrationSelectIdRouteAlgorithmParams;
57
import org.gvsig.lrs.lib.api.exceptions.LrsGettingParametersException;
58
import org.gvsig.lrs.lib.api.exceptions.LrsNeededParameterException;
59
import org.gvsig.lrs.swing.api.JLrsAlgorithmParams;
60
import org.gvsig.lrs.swing.api.LrsAlgorithmsSwingLocator;
61
import org.gvsig.lrs.swing.api.LrsAlgorithmsSwingManager;
62
import org.gvsig.lrs.swing.impl.JLrsEditRouteCalibrationController;
63
import org.gvsig.lrs.swing.impl.JLrsEditRouteCalibrationSelectIdRouteController;
64
import org.gvsig.lrs.swing.impl.JLrsUtils;
65
import org.gvsig.tools.ToolsLocator;
66
import org.gvsig.tools.dispose.DisposableIterator;
67
import org.gvsig.tools.i18n.I18nManager;
68
import org.gvsig.tools.swing.api.ToolsSwingLocator;
69
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
70

    
71

    
72
/**
73
 * @author dmartinez
74
 *
75
 */
76
public class EditRouteCalibrationExtension extends Extension implements ComponentListener {
77

    
78
    private static final Logger logger = LoggerFactory.getLogger(EditRouteCalibrationExtension.class);
79

    
80
    private JLrsEditRouteCalibrationSelectIdRouteController panelSelectId;
81

    
82
    private JLrsEditRouteCalibrationController panelController;
83

    
84

    
85

    
86
    /* (non-Javadoc)
87
     * @see org.gvsig.andami.plugins.IExtension#execute(java.lang.String)
88
     */
89
    public void execute(String actionCommand) {
90
        if (StringUtils.equalsIgnoreCase(actionCommand, "edit-route-calibration")) {
91
            IView view = getActiveView();
92
            final FLyrVect activeLayer;
93
            if (view!=null){
94
                activeLayer = getActiveLayer(view);
95
            }else{
96
                activeLayer = null;
97
            }
98

    
99
            final MapContext mapContext = view.getMapControl().getMapContext();
100

    
101
            final WindowManager winManager = ToolsSwingLocator.getWindowManager();
102

    
103
            final LrsAlgorithmsSwingManager manager = LrsAlgorithmsSwingLocator.getLrsAlgorithmsSwingManager();
104

    
105
            final I18nManager i18nManager = ToolsLocator.getI18nManager();
106

    
107
            try {
108
                panelSelectId = (JLrsEditRouteCalibrationSelectIdRouteController)manager.createJLrsEditRouteCalibrationSelectIdRouteAlgorithmParameters(activeLayer, null);
109
                panelSelectId.addComponentListener(this);
110
            } catch (LrsNeededParameterException e2) {
111
                logger.error("Error creating panel", e2);
112
                JOptionPane.showMessageDialog(
113
                    null,
114
                    new StringBuilder().append(i18nManager.getTranslation("error_creating_panel"))
115
                        .append(":").append(e2.getLocalizedMessage()),
116
                    i18nManager.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
117
                return;
118
            }
119
            panelSelectId.setVisibleAceptCancel(true);
120
            panelSelectId.addActionListener(new ActionListener() {
121

    
122
                public void actionPerformed(ActionEvent e) {
123
                    JLrsAlgorithmParams panel = (JLrsAlgorithmParams) e.getSource();
124
                    if (panel.isCanceled()) {
125
                        return;
126
                    }
127
                    LrsEditRouteCalibrationSelectIdRouteAlgorithmParams params = null;
128
                    try {
129
                        params = (LrsEditRouteCalibrationSelectIdRouteAlgorithmParams)panel.getParams();
130
                    } catch (LrsGettingParametersException e1) {
131
                        logger.error("Error getting parameters", e1);
132
                        JOptionPane.showMessageDialog(
133
                            null,
134
                            new StringBuilder().append(i18nManager.getTranslation("error_getting_parameters"))
135
                                .append(":").append(e1.getLocalizedMessage()),
136
                            i18nManager.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
137
                        return;
138
                    } catch (LrsNeededParameterException e1) {
139
                        logger.warn("Error getting parameters", e1);
140
                        JOptionPane.showMessageDialog(
141
                            null,
142
                            i18nManager.getTranslation(e1.getMessage()),
143
                            i18nManager.getTranslation("warning"), JOptionPane.WARNING_MESSAGE);
144
                        return;
145
                    }
146

    
147
                    try {
148
                        panelController = (JLrsEditRouteCalibrationController)manager.createJLrsEditRouteCalibrationAlgorithmParameters(activeLayer, mapContext, params.getIdRouteField(), null);
149
                        panelController.addComponentListener(EditRouteCalibrationExtension.this);
150
                    } catch (Exception e2) {
151
                        logger.error("Error creating panel", e2);
152
                        JOptionPane.showMessageDialog(
153
                            null,
154
                            new StringBuilder().append(i18nManager.getTranslation("error_creating_panel"))
155
                                .append(":").append(e2.getLocalizedMessage()),
156
                            i18nManager.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
157
                        return;
158
                    }
159
                    panelController.setVisibleAceptCancel(true);
160
                    panelController.addActionListener(new ActionListener() {
161
                        public void actionPerformed(ActionEvent e) {
162
                            JLrsEditRouteCalibrationController panel = (JLrsEditRouteCalibrationController) e.getSource();
163
                            if (panel.isCanceled()) {
164
                                return;
165
                            }
166

    
167
                            if (panel.hasWarnings()){
168
                                boolean acceptedWarnings=showWarnings(panel.getWarnings());
169
                                if (acceptedWarnings){
170
                                    panel.close();
171
                                }else{
172
                                    return;
173
                                }
174
                            }
175

    
176
                            final LrsEditRouteCalibrationAlgorithmParams params;
177
                            try {
178
                                params = (LrsEditRouteCalibrationAlgorithmParams)panel.getParams();
179
                            } catch (LrsGettingParametersException e1) {
180
                                logger.error("Error getting parameters", e1);
181
                                JOptionPane.showMessageDialog(
182
                                    null,
183
                                    new StringBuilder().append(i18nManager.getTranslation("error_getting_parameters"))
184
                                        .append(":").append(e1.getLocalizedMessage()),
185
                                    i18nManager.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
186
                                return;
187
                            } catch (LrsNeededParameterException e1) {
188
                                logger.warn("Error getting parameters", e1);
189
                                JOptionPane.showMessageDialog(
190
                                    null,
191
                                    i18nManager.getTranslation(e1.getMessage()),
192
                                    i18nManager.getTranslation("warning"), JOptionPane.WARNING_MESSAGE);
193
                                return;
194
                            }
195

    
196
                            if (params!=null){
197
                                saveLayer(activeLayer,params);
198
                            }
199

    
200
                            panel.close();
201
                        }
202

    
203
                    });
204
                    winManager.showWindow(panelController.asJComponent(), i18nManager.getTranslation("edit_route_calibration"),
205
                        WindowManager.MODE.WINDOW);
206
                }
207
            });
208
            winManager.showWindow(panelSelectId.asJComponent(), i18nManager.getTranslation("edit_route_calibration"),
209
                WindowManager.MODE.WINDOW);
210
        }
211
    }
212

    
213
    /* (non-Javadoc)
214
     * @see org.gvsig.andami.plugins.IExtension#initialize()
215
     */
216
    public void initialize() {
217
        registerIcons();
218
    }
219

    
220
    /* (non-Javadoc)
221
     * @see org.gvsig.andami.plugins.IExtension#isEnabled()
222
     */
223
    public boolean isEnabled() {
224
        IView view = getActiveView();
225
        if (view!=null){
226
            FLyrVect activeLayer = getActiveLayer(view);
227
            if (panelSelectId == null && panelController == null && activeLayer!=null && activeLayer.isEditing()){
228
                return JLrsUtils.isMlayerWithNonGeomField(activeLayer);
229
            }
230
        }
231
        return false;
232
    }
233

    
234
    /* (non-Javadoc)
235
     * @see org.gvsig.andami.plugins.IExtension#isVisible()
236
     */
237
    public boolean isVisible() {
238
        return true;
239
    }
240

    
241
    private void registerIcons() {
242
        IconThemeHelper.registerIcon("lrs", "pk_cian", this);
243
    }
244

    
245

    
246
    private IView getActiveView() {
247
        ApplicationManager application = ApplicationLocator.getManager();
248
        IView view = (IView) application.getActiveComponent(ViewDocument.class);
249
        return view;
250
    }
251

    
252
    private FLyrVect getActiveLayer(IView vista) {
253
        if (vista != null) {
254
            ViewDocument viewDocument = vista.getViewDocument();
255
            FLayer[] actives =
256
                viewDocument.getMapContext().getLayers().getActives();
257

    
258
            if ((actives.length == 1) && (actives[0] instanceof FLyrVect)) {
259
                return (FLyrVect) actives[0];
260
            }
261
        }
262
        return null;
263
    }
264

    
265
    private boolean showWarnings(List<String> warnings){
266
        final int MAXWARNINGSSHOWED=15;
267

    
268
        final I18nManager i18nManager = ToolsLocator.getI18nManager();
269
        logger.debug("Warnings found accepting edit route panel");
270
        StringBuilder messageBuilder= new StringBuilder().append(i18nManager.getTranslation("warnings_in_edit_route"));
271
        String newLine=System.getProperty("line.separator");
272
        messageBuilder.append(newLine);
273
        for (int i=0;(i<=MAXWARNINGSSHOWED&&i<warnings.size());i++){
274
            if(i<MAXWARNINGSSHOWED){
275
                String warning=warnings.get(i);
276
                messageBuilder.append(newLine);
277
                messageBuilder.append(warning);
278
            }
279
            if (i==MAXWARNINGSSHOWED&&warnings.size()>MAXWARNINGSSHOWED){
280
                messageBuilder.append(newLine);
281
                int warningsNotShowed=warnings.size()-MAXWARNINGSSHOWED;
282
                messageBuilder.append(MessageFormat.format(
283
                    i18nManager.getTranslation("more_warnings_found"), warningsNotShowed));
284
            }
285
        }
286
        messageBuilder.append(newLine);
287
        messageBuilder.append(newLine).append(i18nManager.getTranslation("accept_warnings_question"));
288
        int result =JOptionPane.showConfirmDialog(
289
            null,
290
            messageBuilder,
291
            i18nManager.getTranslation("warnings_dialog"), JOptionPane.YES_NO_OPTION);
292
        if (result==JOptionPane.YES_OPTION)return true;
293
        else return false;
294
    }
295

    
296
    private void saveLayer(FLyrVect activeLayer,LrsEditRouteCalibrationAlgorithmParams params){
297
        FeatureAttributeDescriptor fieldRoute=params.getIdRouteField();
298
        String routeName=params.getSelectedRouteName();
299
        Geometry modifiedGeometry=params.getModifiedGeometry();
300

    
301
        FeatureStore featureStore=activeLayer.getFeatureStore();
302
        if (!featureStore.isEditing()){
303
            throw new IllegalArgumentException();
304
        }
305
        DisposableIterator it=null;
306
        EditableFeature editableFeature=null;
307
        try {
308
            FeatureSet selectedFeatures=featureStore.getFeatureSet();
309
            it=selectedFeatures.fastIterator();
310
            while (it.hasNext()&&editableFeature==null) {
311
                Feature feature = (Feature) it.next();
312
                if (feature.get(fieldRoute.getName()) instanceof String &&
313
                    routeName.equals((String)feature.get(fieldRoute.getName()))){
314
                    editableFeature=feature.getEditable();
315
                }
316
            }
317
            if (editableFeature==null){
318
                throw new IllegalArgumentException();
319
            }else{
320
                editableFeature.setDefaultGeometry(modifiedGeometry);
321
                featureStore.update(editableFeature);
322
            }
323

    
324
        } catch (DataException e) {
325
            logger.error("Error saving modified layer",e);
326
        }finally{
327
            if (it!=null){
328
                it.dispose();
329
            }
330
        }
331
    }
332

    
333
    /* (non-Javadoc)
334
     * @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent)
335
     */
336
    public void componentResized(ComponentEvent e) {
337
        // TODO Auto-generated method stub
338

    
339
    }
340

    
341
    /* (non-Javadoc)
342
     * @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent)
343
     */
344
    public void componentMoved(ComponentEvent e) {
345
        // TODO Auto-generated method stub
346

    
347
    }
348

    
349
    /* (non-Javadoc)
350
     * @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent)
351
     */
352
    public void componentShown(ComponentEvent e) {
353
        // TODO Auto-generated method stub
354

    
355
    }
356

    
357
    /* (non-Javadoc)
358
     * @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent)
359
     */
360
    public void componentHidden(ComponentEvent e) {
361
        Component component = e.getComponent();
362
        if (component == panelSelectId) {
363
            panelSelectId = null;
364
        } else if (component == panelController) {
365
            panelController = null;
366
        } else {
367
            if (panelSelectId != null && panelSelectId.getParent() == component) {
368
                panelSelectId = null;
369
            } else if (panelController != null && panelController.getParent() == component) {
370
                panelController.close();
371
                panelController = null;
372

    
373
            }
374
        }
375
    }
376
}