Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.app / org.gvsig.vectorediting.app.mainplugin / src / main / java / org / gvsig / vectorediting / app / mainplugin / EditingExtension.java @ 3775

History | View | Annotate | Download (26.1 KB)

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

    
26
import java.awt.Component;
27
import java.awt.event.ActionEvent;
28
import java.io.File;
29
import java.util.ArrayList;
30
import java.util.Collections;
31
import java.util.List;
32
import java.util.function.Predicate;
33
import javax.swing.AbstractAction;
34
import javax.swing.Action;
35
import javax.swing.JMenuItem;
36
import javax.swing.JOptionPane;
37
import javax.swing.JPopupMenu;
38
import org.apache.commons.collections4.CollectionUtils;
39
import org.apache.commons.io.FileUtils;
40
import org.apache.commons.lang.StringUtils;
41

    
42
import org.slf4j.Logger;
43
import org.slf4j.LoggerFactory;
44

    
45
import org.gvsig.andami.IconThemeHelper;
46
import org.gvsig.andami.PluginServices;
47
import org.gvsig.andami.PluginsLocator;
48
import org.gvsig.andami.actioninfo.ActionInfo;
49
import org.gvsig.andami.plugins.Extension;
50
import org.gvsig.andami.plugins.IExtension;
51
import org.gvsig.andami.plugins.status.IExtensionStatus;
52
import org.gvsig.andami.plugins.status.IUnsavedData;
53
import org.gvsig.andami.plugins.status.UnsavedData;
54
import org.gvsig.app.ApplicationLocator;
55
import org.gvsig.app.ApplicationManager;
56
import org.gvsig.app.project.Project;
57
import org.gvsig.app.project.documents.Document;
58
import org.gvsig.app.project.documents.view.ViewDocument;
59
import org.gvsig.app.project.documents.view.ViewManager;
60
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
61
import org.gvsig.app.project.documents.view.gui.IView;
62
import org.gvsig.app.project.documents.view.toc.actions.EndEditingTocMenuEntry;
63
import org.gvsig.app.project.documents.view.toc.actions.StartEditingTocMenuEntry;
64
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
65
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
66
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
67
import org.gvsig.fmap.dal.exception.DataException;
68
import org.gvsig.fmap.dal.feature.FeatureStore;
69
import org.gvsig.fmap.mapcontext.MapContext;
70
import org.gvsig.fmap.mapcontext.MapContextLocator;
71
import org.gvsig.fmap.mapcontext.layers.FLayer;
72
import org.gvsig.fmap.mapcontext.layers.FLayers;
73
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
74
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
75
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolException;
76
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
77
import org.gvsig.fmap.mapcontrol.MapControl;
78
import org.gvsig.fmap.mapcontrol.MapControlCreationListener;
79
import org.gvsig.fmap.mapcontrol.MapControlLocator;
80
import org.gvsig.fmap.mapcontrol.MapControlManager;
81
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
82
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
83
import org.gvsig.tools.ToolsLocator;
84
import org.gvsig.tools.dynform.spi.DynFormSPILocator;
85
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
86
import org.gvsig.tools.extensionpoint.ExtensionPoint;
87
import org.gvsig.tools.i18n.I18nManager;
88
import org.gvsig.tools.observer.Notification;
89
import org.gvsig.tools.observer.Observable;
90
import org.gvsig.tools.observer.Observer;
91
import org.gvsig.tools.swing.api.ToolsSwingLocator;
92
import org.gvsig.tools.swing.api.windowmanager.Dialog;
93
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
94
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
95
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
96
import org.gvsig.utils.swing.threads.IMonitorableTask;
97
import org.gvsig.vectorediting.app.mainplugin.dynformfield.point.JDynFormFieldPointFactory;
98
import org.gvsig.vectorediting.lib.api.EditingService;
99
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
100
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
101
import org.gvsig.vectorediting.swing.api.EditingContext;
102
import org.gvsig.vectorediting.swing.api.EditingSwingLocator;
103
import org.gvsig.vectorediting.swing.api.EditingSwingManager;
104
import org.gvsig.vectorediting.swing.api.console.EditingConsole;
105

    
106
@SuppressWarnings("UseSpecificCatch")
107
public class EditingExtension extends Extension implements Observer {
108

    
109
    private static final Logger LOGGER = LoggerFactory.getLogger(EditingExtension.class);
110

    
111
    @Override
112
    public void execute(String actionCommand) {
113
        IView view = getActiveView();
114
        EditingSwingManager swingManager = EditingSwingLocator.getSwingManager();
115

    
116
        if (view != null) {
117
            EditingContext editingContext = swingManager.getEditingContext(view.getMapControl());
118

    
119
            if ("start-editing".equals(actionCommand)) {
120
                doStartEditing(view, editingContext);
121

    
122
            } else if ("end-editing".equals(actionCommand)) {
123
                doEndEditing(view, editingContext);
124

    
125
            } else if ("vector-editing-tooloptions".equalsIgnoreCase(actionCommand)) {
126
                doToolOptions(editingContext);
127
            } else if ("vector-editing-ortomode-enable".equalsIgnoreCase(actionCommand)) {
128
                editingContext.setDrawMode(EditingContext.DRAWMODE_ORTO);
129
            } else if ("vector-editing-ortomode-disable".equalsIgnoreCase(actionCommand)) {
130
                editingContext.setDrawMode(EditingContext.DRAWMODE_NORMAL);
131
            }
132
        }
133
    }
134

    
135
    private void doStartEditing(IView view, EditingContext editingContext) {
136
        ApplicationManager application = ApplicationLocator.getManager();
137
        MapControl mapControl = view.getMapControl();
138
        List<FLyrVect> reprojectedLayers = getActiveLayers(
139
                view,
140
                (FLyrVect layer) -> canBeEdited(layer)
141
                && !mapControl.getProjection().equals(layer.getProjection())
142
        );
143
        if (!reprojectedLayers.isEmpty()) {
144
            String msg = "_The_layer_is_reproyected_on_the_fly"
145
                    + "_Not_all_editing_tools_work_properly"
146
                    + "_When_you_finish_editing"
147
                    + "_will_only_export_the_changes_to_another_layer";
148
            application.messageDialog(msg, "_Warning", JOptionPane.WARNING_MESSAGE);
149
        } else {
150
            List<FLyrVect> nonWritableLayers = getActiveLayers(
151
                    view,
152
                    (FLyrVect layer) -> canBeEdited(layer) && !isWritable(layer)
153
            );
154
            if (!nonWritableLayers.isEmpty()) {
155
                String msg = "_The_layer_can_not_be_written"
156
                        + "_When_you_finish_editing"
157
                        + "_will_only_export_the_changes_to_another_layer";
158
                application.messageDialog(msg, "_Warning", JOptionPane.WARNING_MESSAGE);
159
            }
160
        }
161
        List<FLyrVect> activeLayers = getActiveLayers(
162
                view,
163
                (FLyrVect layer) -> canBeEdited(layer)
164
        );
165
        for (FLyrVect layer : activeLayers) {
166
            editingContext.beginEdition(layer);
167
            editingContext.addObserver(this);
168
        }
169
        
170
        EditingConsole console = editingContext.getConsolePanel();
171
        JPopupMenu popup = console.getComponentPopupMenu();
172
        boolean needadd = true;
173
        for (int i = 0; i < popup.getComponentCount(); i++) {
174
            Component comp = popup.getComponent(i);
175
            if( StringUtils.equals("ExpressionBuilder",comp.getName()) ) {
176
                needadd = false;
177
                break;
178
            }
179
        }
180
        if( needadd ) {
181
            JMenuItem entry = new JMenuItem(new ExpressionBuilderAction(editingContext, console));
182
            entry.setName("ExpressionBuilder");
183
            popup.add(entry);
184
        }
185
        ApplicationLocator.getManager().refreshMenusAndToolBars();
186
    }
187

    
188
    private void doEndEditing(IView view, EditingContext editingContext) {
189
        List<FLyrVect> activeLayers = getActiveLayers(
190
                view,
191
                (FLyrVect layer) -> layer.isEditing()
192
        );
193
//                for (FLyrVect layer : activeLayers) {
194
//                    editingContext.endEdition(layer);
195
//                }
196
        if (CollectionUtils.isEmpty(activeLayers)) {
197
            return;
198
        }
199
        if (activeLayers.size() == 1) {
200
            editingContext.endEdition(activeLayers.get(0));
201
            ApplicationLocator.getManager().refreshMenusAndToolBars();
202
        } else {
203
            showMultilaterFinishEditingPanel(view.getMapControl().getMapContext());
204
        }
205
    }
206

    
207
    private void doToolOptions(EditingContext editingContext) {
208
        I18nManager i18n = ToolsLocator.getI18nManager();
209
//        EditingSwingManager editingSwingManager = EditingSwingLocator.getSwingManager();
210
        if (editingContext == null) {
211
            return;
212
        }
213
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
214
        EditingToolOptionsPanel panel = new EditingToolOptionsPanel(editingContext);
215
        windowManager.showWindow(
216
                panel,
217
                i18n.getTranslation("_Vector_editing_tool_options"),
218
                WindowManager.MODE.TOOL
219
        );
220
    }
221

    
222
    @Override
223
    public void initialize() {
224
        registerIcons();
225

    
226
        // Disable default view panel console. Uses editing context console.
227
        DefaultViewPanel.setDisableConsole(true);
228

    
229
        // Adding TOC menu entry
230
        ExtensionPoint exPoint = ToolsLocator.getExtensionPointManager().add(
231
                "View_TocActions", "");
232
        exPoint.append(
233
                StartEditingTocMenuEntry.EXTENSION_POINT_NAME,
234
                "TOC popup menu to start vector layer's editing",
235
                new StartEditingTocMenuEntry());
236
        exPoint.append(
237
                EndEditingTocMenuEntry.EXTENSION_POINT_NAME,
238
                "TOC popup menu to end vector layer's editing",
239
                new EndEditingTocMenuEntry());
240
        EditingToolOptionsPanel.registerPersistence();
241
    }
242

    
243
    private void registerIcons() {
244
        IconThemeHelper.registerIcon("vectorediting", "vector-editing", this);
245
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-tooloptions", this);
246
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-tooloptions-confirm", this);
247
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-ortomode-enable", this);
248
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-ortomode-disable", this);
249
    }
250

    
251
    @Override
252
    @SuppressWarnings("Convert2Lambda")
253
    public void postInitialize() {
254
        super.postInitialize();
255
        registerSymbols();
256

    
257
        MapControlManager mapControlManager = MapControlLocator.getMapControlManager();
258
        mapControlManager.addMapControlCreationListener(new MapControlCreationListener() {
259
            @Override
260
            public MapControl mapControlCreated(MapControl mapControl) {
261
                EditingContext editingContext = EditingSwingLocator.getSwingManager().getEditingContext(mapControl);
262
                StatusBarListener sbl = new StatusBarListener(mapControl);
263
                editingContext.setDefaultBehaviors(new Behavior[]{new MouseMovementBehavior(sbl)});
264
                editingContext.addObserver(EditingExtension.this);
265
                ApplicationLocator.getManager().refreshMenusAndToolBars();
266
                return mapControl;
267
            }
268
        });
269

    
270
        DynFormSPIManager dynFormManager = DynFormSPILocator.getDynFormSPIManager();
271
        dynFormManager.registerDynFieldFactory(new JDynFormFieldPointFactory());
272

    
273
    }
274

    
275
    /**
276
     * Register all symbols in the plugin symbols folder in the providerManager.
277
     * The description of the symbols must be unique because the key used for
278
     * registration is the proper description of the symbol.
279
     *
280
     */
281
    private void registerSymbols() {
282

    
283
        EditingProviderManager providerManager = EditingProviderLocator.getProviderManager();
284

    
285
        SymbolManager symbolManager = MapContextLocator.getSymbolManager();
286
        File symbolsFolder = FileUtils.getFile(getPlugin().getPluginDirectory(), "symbols", "editing");
287
        ISymbol[] symbols = null;
288
        try {
289
            symbols = symbolManager.loadSymbols(symbolsFolder);
290
        } catch (SymbolException e) {
291
            LOGGER.warn("No symbols loaded from " + symbolsFolder.getAbsolutePath(), e);
292
        }
293

    
294
        if (symbols != null) {
295
            for (ISymbol symbol : symbols) {
296
                String description = symbol.getDescription();
297
                providerManager.registerSymbol(description, symbol);
298
            }
299
        }
300
    }
301

    
302
    @Override
303
    public boolean isEnabled() {
304
        return true;
305
    }
306

    
307
    @Override
308
    public boolean isVisible() {
309
        return true;
310
    }
311

    
312
    @Override
313
    public boolean isVisible(String action) {
314
        IView view = getActiveView();
315
        if (view == null) {
316
            return false;
317
        }
318
        EditingSwingManager swingManager = EditingSwingLocator.getSwingManager();
319
        EditingContext editingContext = swingManager.getEditingContext(view.getMapControl());
320
        if ("start-editing".equals(action)) {
321
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> !layer.isEditing());
322
            return !activeLayers.isEmpty();
323
        } else if ("vector-editing-ortomode-enable".equals(action)) {
324
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
325
            return editingContext.getDrawMode()==EditingContext.DRAWMODE_NORMAL && !activeLayers.isEmpty();
326
        } else if ("vector-editing-ortomode-disable".equals(action)) {
327
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
328
            return editingContext.getDrawMode()==EditingContext.DRAWMODE_ORTO && !activeLayers.isEmpty();
329
        } else {
330
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
331
            return !activeLayers.isEmpty();
332
        }
333
    }
334

    
335
    @Override
336
    @SuppressWarnings("ConvertToStringSwitch")
337
    public boolean isEnabled(String action) {
338
        IView view = getActiveView();
339
        if (view == null) {
340
            return false;
341
        }
342
        EditingSwingManager swingManager = EditingSwingLocator.getSwingManager();
343
        EditingContext editingContext = swingManager.getEditingContext(view.getMapControl());
344
        if( editingContext.isProcessing() ) {
345
            return false;
346
        }
347
        
348
        if ("start-editing".equals(action)) {
349
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> canBeEdited(layer));
350
            return !activeLayers.isEmpty();
351

    
352
        } else if ("end-editing".equals(action)) {
353
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
354
            return !activeLayers.isEmpty();
355

    
356
        } else if ("vector-editing-tooloptions".equals(action)) {
357
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
358
            return !activeLayers.isEmpty();
359
        } else if ("vector-editing-ortomode-enable".equals(action)) {
360
            return editingContext.getDrawMode()==EditingContext.DRAWMODE_NORMAL;
361
        } else if ("vector-editing-ortomode-disable".equals(action)) {
362
            return editingContext.getDrawMode()==EditingContext.DRAWMODE_ORTO;
363
        }
364

    
365
        return false;
366

    
367
    }
368

    
369
    @Override
370
    public boolean canQueryByAction() {
371
        return true;
372
    }
373

    
374
    private IView getActiveView() {
375
        ApplicationManager application = ApplicationLocator.getManager();
376
        IView view = (IView) application.getActiveComponent(ViewDocument.class);
377
        return view;
378
    }
379

    
380
    private boolean isWritable(FLyrVect layer) {
381
        if (layer != null && layer.isAvailable() && layer.isVisible()) {
382
            return layer.getFeatureStore().allowWrite();
383
        }
384
        return false;
385
    }
386

    
387
    private boolean canBeEdited(FLyrVect layer) {
388
        if (layer != null && layer.isAvailable() && layer.isVisible()) {
389
            FeatureStore store = layer.getFeatureStore();
390
            boolean storeCanBeEdited=  false;
391
            if(store != null){
392
                storeCanBeEdited = store.canBeEdited();
393
            }
394
            return storeCanBeEdited && !layer.isEditing();
395
        }
396

    
397
        return false;
398
    }
399

    
400
//  private FLyrVect getActiveLayer(IView vista) {
401
//    if (vista != null) {
402
//      ViewDocument viewDocument = vista.getViewDocument();
403
//      FLayer[] actives
404
//              = viewDocument.getMapContext().getLayers().getActives();
405
//
406
//      if ((actives.length == 1) && (actives[0] instanceof FLyrVect)) {
407
//        return (FLyrVect) actives[0];
408
//      }
409
//    }
410
//    return null;
411
//  }
412
    private List<FLyrVect> getActiveLayers(IView view, Predicate<FLyrVect> valid) {
413
        if (view == null) {
414
            return Collections.EMPTY_LIST;
415
        }
416
        List<FLyrVect> layers = new ArrayList<>();
417
        ViewDocument viewDocument = view.getViewDocument();
418
        FLayer[] actives = viewDocument.getMapContext().getLayers().getActives();
419
        for (FLayer layer : actives) {
420
            if (layer instanceof FLyrVect && valid.test((FLyrVect) layer)) {
421
                layers.add((FLyrVect) layer);
422
            }
423
        }
424
        return layers;
425
    }
426

    
427
    @Override
428
    public void update(Observable observable, Object notification) {
429

    
430
        if (notification instanceof Notification) {
431
            ApplicationManager appManager = ApplicationLocator.getManager();
432
            Notification n = (Notification) notification;
433
            if (n.isOfType(EditingContext.CHANGE_SELECTED_TOOL_NOTIFICATION)) {
434
                String name = (String) n.getValue();
435
                if( name!=null ) {
436
                    LOGGER.trace("Changed selected tool to '{}'", name);
437
                    appManager.getMainFrame().setSelectedTool(name);
438
                    appManager.refreshMenusAndToolBars();
439
                }
440

    
441
            } else if (n.isOfType(EditingContext.EXPORT_LAYER_NOTIFICATION)) {
442
                exportLayer((FLyrVect) (n.getValue()));
443

    
444
            } else if (n.isOfType(EditingContext.REFRESH_TOOLS_NOTIFICATION)) {
445
                EditingService activeService = ((EditingContext)observable).getActiveService();
446
                if(activeService != null){
447
                    appManager.getMainFrame().setSelectedTool(activeService.getName());
448
                }
449
                appManager.refreshMenusAndToolBars();
450
            }
451
        }
452
    }
453

    
454
    private void exportLayer(FLyrVect layer) {
455
        ApplicationManager appManager = ApplicationLocator.getManager();
456
        I18nManager i18nManager = ToolsLocator.getI18nManager();
457
        ActionInfo action = PluginsLocator.getActionInfoManager().getAction("layer-exportto");
458
        action.execute(new Object[]{layer, MODE.toInteger(MODE.DIALOG)});
459
        String msg = "_Do_you_want_to_finish_editing_If_not_exported_the_data_the_changes_will_be_lost";
460
        if (appManager.confirmDialog(
461
                i18nManager.getTranslation(msg),
462
                i18nManager.getTranslation("end_editing"),
463
                JOptionPane.YES_NO_OPTION,
464
                JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
465
            try {
466
                layer.getFeatureStore().cancelEditing();
467
            } catch (Exception e) {
468
                LOGGER.warn("Can't abort editing of layer '" + layer.getName() + "'.", e);
469
                msg = "_Cant_finish_editing_See_the_error_log_for_more_information";
470
                appManager.messageDialog(msg, "_Warning", JOptionPane.WARNING_MESSAGE);
471
            }
472
        }
473
    }
474

    
475
    private List<FLyrVect> getEditedLayers() {
476
        ApplicationManager application = ApplicationLocator.getManager();
477
        List<FLyrVect> editedLayers = new ArrayList<>();
478

    
479
        Project project = application.getCurrentProject();
480
        for (Document document : project.getDocuments(ViewManager.TYPENAME)) {
481
            ViewDocument view = (ViewDocument) document;
482
            MapContext mapContext = view.getMapContext();
483
            if (mapContext != null) {
484
                FLayers layers = mapContext.getLayers();
485
                for (int j = 0; j < layers.getLayersCount(); j++) {
486
                    FLayer lyr = layers.getLayer(j);
487
                    if (lyr instanceof FLyrVect) {
488
                        FLyrVect layerVect = (FLyrVect) lyr;
489
                        if (layerVect.isEditing()) {
490
                            editedLayers.add(layerVect);
491
                        }
492
                    }
493
                }
494
            }
495
        }
496
        return editedLayers;
497
    }
498

    
499
    private List<IUnsavedData> getUnsavedData(List<FLyrVect> editedLayers) {
500
        List<IUnsavedData> unsavedData = new ArrayList<>();
501
        for (FLyrVect editedLayer : editedLayers) {
502
            IUnsavedData unsavedDataLayer = new UnsavedLayer(this, editedLayer);
503
            unsavedData.add(unsavedDataLayer);
504
        }
505
        return unsavedData;
506

    
507
    }
508

    
509
    private static class UnsavedLayer extends UnsavedData {
510

    
511
        private final FLyrVect layer;
512

    
513
        public UnsavedLayer(IExtension extension, FLyrVect layer) {
514
            super(extension);
515
            this.layer = layer;
516
        }
517

    
518
        @Override
519
        public String getDescription() {
520
            return layer.getName();
521
        }
522

    
523
        @Override
524
        public String getResourceName() {
525
            return layer.getFeatureStore().getFullName();
526
        }
527

    
528
        @Override
529
        public boolean saveData() {
530
            FeatureStore featureStore = layer.getFeatureStore();
531
            if (featureStore.isEditing()) {
532
                try {
533
                    featureStore.finishEditing();
534
                    return true;
535
                } catch (DataException e) {
536
                    throw new RuntimeException(e);
537
                }
538
            }
539
            return true;
540
        }
541
    }
542

    
543
    @Override
544
    public IExtensionStatus getStatus() {
545
        List<FLyrVect> editedLayers = getEditedLayers();
546
        final List<IUnsavedData> unsavedData = getUnsavedData(editedLayers);
547

    
548
        return new IExtensionStatus() {
549

    
550
            @Override
551
            public boolean hasUnsavedData() {
552
                if (unsavedData == null) {
553
                    return false;
554
                }
555
                return !unsavedData.isEmpty();
556
            }
557

    
558
            @Override
559
            public boolean hasRunningProcesses() {
560
                return false;
561
            }
562

    
563
            @Override
564
            public IUnsavedData[] getUnsavedData() {
565
                if (unsavedData == null) {
566
                    return null;
567
                }
568
                return unsavedData.toArray(new IUnsavedData[0]);
569
            }
570

    
571
            @Override
572
            public IMonitorableTask[] getRunningProcesses() {
573
                return null;
574
            }
575
        };
576
    }
577

    
578
    private void showMultilaterFinishEditingPanel(MapContext mapContext) {
579
        I18nManager i18n = ToolsLocator.getI18nManager();
580
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
581
        MultilayerFinishEditingPanel finishEditingPanel = new MultilayerFinishEditingPanel(mapContext);
582
        Dialog dialog = windowManager.createDialog(
583
                finishEditingPanel.asJComponent(),
584
                i18n.getTranslation("end_editing"),
585
                i18n.getTranslation("_List_of_layers_to_finish_editing"),
586
                WindowManager_v2.BUTTONS_OK_CANCEL
587
        );
588
        finishEditingPanel.setDialog(dialog);
589
        dialog.addActionListener((ActionEvent e) -> {
590
            if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
591
                finishEditingPanel.apply();
592
            }
593
        });
594
        dialog.show(WindowManager.MODE.WINDOW);
595
    }
596

    
597
    private static class ExpressionBuilderAction extends AbstractAction {
598

    
599
        private final EditingConsole console;
600
        private final EditingContext editingContext;
601
        
602
        
603
        @SuppressWarnings("OverridableMethodCallInConstructor")
604
        public ExpressionBuilderAction(EditingContext editingContext, EditingConsole console) {
605
            this.editingContext = editingContext;
606
            this.console = console;
607
            I18nManager i18n = ToolsLocator.getI18nManager();
608
            this.putValue(
609
                    Action.ACTION_COMMAND_KEY, 
610
                    "CreateJExpressionBuilderAction"
611
            );
612
            this.putValue(
613
                    Action.NAME, 
614
                    i18n.getTranslation("_Show_expression_builder")
615
            );
616
            this.putValue(
617
                    Action.SMALL_ICON, 
618
                    ToolsSwingLocator.getIconThemeManager().getCurrent().get("picker-expression")
619
            );
620
        }
621
        
622
        @Override
623
        public void actionPerformed(ActionEvent e) {
624
            I18nManager i18n = ToolsLocator.getI18nManager();
625
            WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
626
            final JExpressionBuilder panel = ExpressionEvaluatorSwingLocator.getManager().createJExpressionBuilder();
627
            panel.getConfig().addSymbolTable(this.editingContext.getContextSymbolTable());
628
            panel.getConfig().setPreviewSymbolTable(this.editingContext.getContextSymbolTable());
629
            final Dialog dialog = winmgr.createDialog(
630
                    panel.asJComponent(),
631
                    i18n.getTranslation("_Expression_builder"),
632
                    null, 
633
                    WindowManager_v2.BUTTONS_OK_CANCEL
634
            );
635
            dialog.addActionListener((ActionEvent e2) -> {
636
                if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
637
                    console.addResponseText(panel.getExpression().getPhrase());
638
                }
639
            });
640
            dialog.show(WindowManager.MODE.DIALOG);
641
        }
642
        
643
    }
644
    
645
}