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

History | View | Annotate | Download (24.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.codehaus.plexus.util.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.spi.EditingProviderLocator;
99
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
100
import org.gvsig.vectorediting.swing.api.EditingContext;
101
import org.gvsig.vectorediting.swing.api.EditingSwingLocator;
102
import org.gvsig.vectorediting.swing.api.EditingSwingManager;
103
import org.gvsig.vectorediting.swing.api.console.EditingConsole;
104

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

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

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

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

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

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

    
124
            } else if ("vector-editing-tooloptions".equalsIgnoreCase(actionCommand)) {
125
                doToolOptions(editingContext);
126
            }
127
        }
128
    }
129

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

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

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

    
217
    @Override
218
    public void initialize() {
219
        registerIcons();
220

    
221
        // Disable default view panel console. Uses editing context console.
222
        DefaultViewPanel.setDisableConsole(true);
223

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

    
238
    private void registerIcons() {
239
        IconThemeHelper.registerIcon("vectorediting", "vector-editing", this);
240
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-tooloptions", this);
241
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-tooloptions-confirm", this);
242
    }
243

    
244
    @Override
245
    @SuppressWarnings("Convert2Lambda")
246
    public void postInitialize() {
247
        super.postInitialize();
248
        registerSymbols();
249

    
250
        MapControlManager mapControlManager = MapControlLocator.getMapControlManager();
251
        mapControlManager.addMapControlCreationListener(new MapControlCreationListener() {
252
            @Override
253
            public MapControl mapControlCreated(MapControl mapControl) {
254
                EditingContext editingContext = EditingSwingLocator.getSwingManager().getEditingContext(mapControl);
255
                StatusBarListener sbl = new StatusBarListener(mapControl);
256
                editingContext.setDefaultBehaviors(new Behavior[]{new MouseMovementBehavior(sbl)});
257
                editingContext.addObserver(EditingExtension.this);
258
                ApplicationLocator.getManager().refreshMenusAndToolBars();
259
                return mapControl;
260
            }
261
        });
262

    
263
        DynFormSPIManager dynFormManager = DynFormSPILocator.getDynFormSPIManager();
264
        dynFormManager.registerDynFieldFactory(new JDynFormFieldPointFactory());
265

    
266
    }
267

    
268
    /**
269
     * Register all symbols in the plugin symbols folder in the providerManager.
270
     * The description of the symbols must be unique because the key used for
271
     * registration is the proper description of the symbol.
272
     *
273
     */
274
    private void registerSymbols() {
275

    
276
        EditingProviderManager providerManager = EditingProviderLocator.getProviderManager();
277

    
278
        SymbolManager symbolManager = MapContextLocator.getSymbolManager();
279
        File symbolsFolder = FileUtils.getFile(getPlugin().getPluginDirectory(), "symbols", "editing");
280
        ISymbol[] symbols = null;
281
        try {
282
            symbols = symbolManager.loadSymbols(symbolsFolder);
283
        } catch (SymbolException e) {
284
            LOGGER.warn("No symbols loaded from " + symbolsFolder.getAbsolutePath(), e);
285
        }
286

    
287
        if (symbols != null) {
288
            for (ISymbol symbol : symbols) {
289
                String description = symbol.getDescription();
290
                providerManager.registerSymbol(description, symbol);
291
            }
292
        }
293
    }
294

    
295
    @Override
296
    public boolean isEnabled() {
297
        return true;
298
    }
299

    
300
    @Override
301
    public boolean isVisible() {
302
        return true;
303
    }
304

    
305
    @Override
306
    public boolean isVisible(String action) {
307
        IView view = getActiveView();
308
        if (view == null) {
309
            return false;
310
        }
311
        if ("start-editing".equals(action)) {
312
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> !layer.isEditing());
313
            return !activeLayers.isEmpty();
314
        } else {
315
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
316
            return !activeLayers.isEmpty();
317

    
318
        }
319
    }
320

    
321
    @Override
322
    @SuppressWarnings("ConvertToStringSwitch")
323
    public boolean isEnabled(String action) {
324
        IView view = getActiveView();
325
        if (view == null) {
326
            return false;
327
        }
328
        EditingSwingManager swingManager = EditingSwingLocator.getSwingManager();
329
        EditingContext editingContext = swingManager.getEditingContext(view.getMapControl());
330
        if( editingContext.isProcessing() ) {
331
            return false;
332
        }
333
        
334
        if ("start-editing".equals(action)) {
335
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> canBeEdited(layer));
336
            return !activeLayers.isEmpty();
337

    
338
        } else if ("end-editing".equals(action)) {
339
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
340
            return !activeLayers.isEmpty();
341

    
342
        } else if ("vector-editing-tooloptions".equals(action)) {
343
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
344
            return !activeLayers.isEmpty();
345

    
346
        }
347

    
348
        return false;
349

    
350
    }
351

    
352
    @Override
353
    public boolean canQueryByAction() {
354
        return true;
355
    }
356

    
357
    private IView getActiveView() {
358
        ApplicationManager application = ApplicationLocator.getManager();
359
        IView view = (IView) application.getActiveComponent(ViewDocument.class);
360
        return view;
361
    }
362

    
363
    private boolean isWritable(FLyrVect layer) {
364
        if (layer != null && layer.isAvailable()) {
365
            return layer.getFeatureStore().allowWrite();
366
        }
367
        return false;
368
    }
369

    
370
    private boolean canBeEdited(FLyrVect layer) {
371
        if (layer != null && layer.isAvailable()) {
372

    
373
            boolean isNotTransformed
374
                    = layer.getFeatureStore().getTransforms().isEmpty();
375

    
376
            return isNotTransformed && !layer.isEditing();
377
        }
378

    
379
        return false;
380
    }
381

    
382
//  private FLyrVect getActiveLayer(IView vista) {
383
//    if (vista != null) {
384
//      ViewDocument viewDocument = vista.getViewDocument();
385
//      FLayer[] actives
386
//              = viewDocument.getMapContext().getLayers().getActives();
387
//
388
//      if ((actives.length == 1) && (actives[0] instanceof FLyrVect)) {
389
//        return (FLyrVect) actives[0];
390
//      }
391
//    }
392
//    return null;
393
//  }
394
    private List<FLyrVect> getActiveLayers(IView view, Predicate<FLyrVect> valid) {
395
        if (view == null) {
396
            return Collections.EMPTY_LIST;
397
        }
398
        List<FLyrVect> layers = new ArrayList<>();
399
        ViewDocument viewDocument = view.getViewDocument();
400
        FLayer[] actives = viewDocument.getMapContext().getLayers().getActives();
401
        for (FLayer layer : actives) {
402
            if (layer instanceof FLyrVect && valid.test((FLyrVect) layer)) {
403
                layers.add((FLyrVect) layer);
404
            }
405
        }
406
        return layers;
407
    }
408

    
409
    @Override
410
    public void update(Observable observable, Object notification) {
411

    
412
        if (notification instanceof Notification) {
413
            ApplicationManager appManager = ApplicationLocator.getManager();
414
            Notification n = (Notification) notification;
415
            if (n.isOfType(EditingContext.CHANGE_SELECTED_TOOL_NOTIFICATION)) {
416
                String name = (String) n.getValue();
417
                if( name!=null ) {
418
                    LOGGER.trace("Changed selected tool to '{}'", name);
419
                    PluginServices.getMainFrame().setSelectedTool(name);
420
                    appManager.refreshMenusAndToolBars();
421
                }
422

    
423
            } else if (n.isOfType(EditingContext.EXPORT_LAYER_NOTIFICATION)) {
424
                exportLayer((FLyrVect) (n.getValue()));
425

    
426
            } else if (n.isOfType(EditingContext.REFRESH_TOOLS_NOTIFICATION)) {
427
                appManager.refreshMenusAndToolBars();
428
            }
429
        }
430
    }
431

    
432
    private void exportLayer(FLyrVect layer) {
433
        ApplicationManager appManager = ApplicationLocator.getManager();
434
        I18nManager i18nManager = ToolsLocator.getI18nManager();
435
        ActionInfo action = PluginsLocator.getActionInfoManager().getAction("layer-exportto");
436
        action.execute(new Object[]{layer, MODE.toInteger(MODE.DIALOG)});
437
        String msg = "_Do_you_want_to_finish_editing_If_not_exported_the_data_the_changes_will_be_lost";
438
        if (appManager.confirmDialog(
439
                i18nManager.getTranslation(msg),
440
                i18nManager.getTranslation("end_editing"),
441
                JOptionPane.YES_NO_OPTION,
442
                JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
443
            try {
444
                layer.getFeatureStore().cancelEditing();
445
            } catch (Exception e) {
446
                LOGGER.warn("Can't abort editing of layer '" + layer.getName() + "'.", e);
447
                msg = "_Cant_finish_editing_See_the_error_log_for_more_information";
448
                appManager.messageDialog(msg, "_Warning", JOptionPane.WARNING_MESSAGE);
449
            }
450
        }
451
    }
452

    
453
    private List<FLyrVect> getEditedLayers() {
454
        ApplicationManager application = ApplicationLocator.getManager();
455
        List<FLyrVect> editedLayers = new ArrayList<>();
456

    
457
        Project project = application.getCurrentProject();
458
        for (Document document : project.getDocuments(ViewManager.TYPENAME)) {
459
            ViewDocument view = (ViewDocument) document;
460
            MapContext mapContext = view.getMapContext();
461
            if (mapContext != null) {
462
                FLayers layers = mapContext.getLayers();
463
                for (int j = 0; j < layers.getLayersCount(); j++) {
464
                    FLayer lyr = layers.getLayer(j);
465
                    if (lyr instanceof FLyrVect) {
466
                        FLyrVect layerVect = (FLyrVect) lyr;
467
                        if (layerVect.isEditing()) {
468
                            editedLayers.add(layerVect);
469
                        }
470
                    }
471
                }
472
            }
473
        }
474
        return editedLayers;
475
    }
476

    
477
    private List<IUnsavedData> getUnsavedData(List<FLyrVect> editedLayers) {
478
        List<IUnsavedData> unsavedData = new ArrayList<>();
479
        for (FLyrVect editedLayer : editedLayers) {
480
            IUnsavedData unsavedDataLayer = new UnsavedLayer(this, editedLayer);
481
            unsavedData.add(unsavedDataLayer);
482
        }
483
        return unsavedData;
484

    
485
    }
486

    
487
    private static class UnsavedLayer extends UnsavedData {
488

    
489
        private final FLyrVect layer;
490

    
491
        public UnsavedLayer(IExtension extension, FLyrVect layer) {
492
            super(extension);
493
            this.layer = layer;
494
        }
495

    
496
        @Override
497
        public String getDescription() {
498
            return layer.getName();
499
        }
500

    
501
        @Override
502
        public String getResourceName() {
503
            return layer.getFeatureStore().getFullName();
504
        }
505

    
506
        @Override
507
        public boolean saveData() {
508
            FeatureStore featureStore = layer.getFeatureStore();
509
            if (featureStore.isEditing()) {
510
                try {
511
                    featureStore.finishEditing();
512
                    return true;
513
                } catch (DataException e) {
514
                    throw new RuntimeException(e);
515
                }
516
            }
517
            return true;
518
        }
519
    }
520

    
521
    @Override
522
    public IExtensionStatus getStatus() {
523
        List<FLyrVect> editedLayers = getEditedLayers();
524
        final List<IUnsavedData> unsavedData = getUnsavedData(editedLayers);
525

    
526
        return new IExtensionStatus() {
527

    
528
            @Override
529
            public boolean hasUnsavedData() {
530
                if (unsavedData == null) {
531
                    return false;
532
                }
533
                return !unsavedData.isEmpty();
534
            }
535

    
536
            @Override
537
            public boolean hasRunningProcesses() {
538
                return false;
539
            }
540

    
541
            @Override
542
            public IUnsavedData[] getUnsavedData() {
543
                if (unsavedData == null) {
544
                    return null;
545
                }
546
                return unsavedData.toArray(new IUnsavedData[0]);
547
            }
548

    
549
            @Override
550
            public IMonitorableTask[] getRunningProcesses() {
551
                return null;
552
            }
553
        };
554
    }
555

    
556
    private void showMultilaterFinishEditingPanel(MapContext mapContext) {
557
        I18nManager i18n = ToolsLocator.getI18nManager();
558
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
559
        MultilayerFinishEditingPanel finishEditingPanel = new MultilayerFinishEditingPanel(mapContext);
560
        Dialog dialog = windowManager.createDialog(
561
                finishEditingPanel.asJComponent(),
562
                i18n.getTranslation("end_editing"),
563
                i18n.getTranslation("_List_of_layers_to_finish_editing"),
564
                WindowManager_v2.BUTTONS_OK_CANCEL
565
        );
566
        finishEditingPanel.setDialog(dialog);
567
        dialog.addActionListener((ActionEvent e) -> {
568
            if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
569
                finishEditingPanel.apply();
570
            }
571
        });
572
        dialog.show(WindowManager.MODE.WINDOW);
573
    }
574

    
575
    private static class ExpressionBuilderAction extends AbstractAction {
576

    
577
        private final EditingConsole console;
578
        private final EditingContext editingContext;
579
        
580
        
581
        @SuppressWarnings("OverridableMethodCallInConstructor")
582
        public ExpressionBuilderAction(EditingContext editingContext, EditingConsole console) {
583
            this.editingContext = editingContext;
584
            this.console = console;
585
            I18nManager i18n = ToolsLocator.getI18nManager();
586
            this.putValue(
587
                    Action.ACTION_COMMAND_KEY, 
588
                    "CreateJExpressionBuilderAction"
589
            );
590
            this.putValue(
591
                    Action.NAME, 
592
                    i18n.getTranslation("_Show_expression_builder")
593
            );
594
            this.putValue(
595
                    Action.SMALL_ICON, 
596
                    ToolsSwingLocator.getIconThemeManager().getCurrent().get("picker-expression")
597
            );
598
        }
599
        
600
        @Override
601
        public void actionPerformed(ActionEvent e) {
602
            I18nManager i18n = ToolsLocator.getI18nManager();
603
            WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
604
            final JExpressionBuilder panel = ExpressionEvaluatorSwingLocator.getManager().createJExpressionBuilder();
605
            panel.addSymbolTable(this.editingContext.getContextSymbolTable());
606
            panel.setPreviewSymbolTable(this.editingContext.getContextSymbolTable());
607
            final Dialog dialog = winmgr.createDialog(
608
                    panel.asJComponent(),
609
                    i18n.getTranslation("_Expression_builder"),
610
                    null, 
611
                    WindowManager_v2.BUTTONS_OK_CANCEL
612
            );
613
            dialog.addActionListener((ActionEvent e2) -> {
614
                if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
615
                    console.addResponseText(panel.getExpression().getPhrase());
616
                }
617
            });
618
            dialog.show(WindowManager.MODE.DIALOG);
619
        }
620
        
621
    }
622
    
623
}