Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.plugin / org.gvsig.raster.app / org.gvsig.raster.app.mainplugin / src / main / java / org / gvsig / raster / app / mainplugin / operations / OperationsPagePanelController.java @ 43836

History | View | Annotate | Download (20 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2017 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.raster.app.mainplugin.operations;
24

    
25
import java.awt.Color;
26
import java.awt.Dimension;
27
import java.awt.GridBagConstraints;
28
import java.awt.GridBagLayout;
29
import java.awt.event.ActionEvent;
30
import java.awt.event.ActionListener;
31
import java.util.Locale;
32

    
33
import javax.swing.JComponent;
34
import javax.swing.JLabel;
35
import javax.swing.JPanel;
36
import javax.swing.JSplitPane;
37
import javax.swing.SwingUtilities;
38
import javax.swing.event.ListSelectionEvent;
39
import javax.swing.event.ListSelectionListener;
40
import javax.swing.event.TableModelEvent;
41
import javax.swing.event.TableModelListener;
42

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

    
46
import org.gvsig.fmap.mapcontext.layers.FLayer;
47
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer;
48
import org.gvsig.fmap.mapcontext.raster.swing.MapContextRasterSwingLocator;
49
import org.gvsig.fmap.mapcontext.raster.swing.MapContextRasterSwingManager;
50
import org.gvsig.fmap.mapcontext.raster.swing.operations.OperationListPanel;
51
import org.gvsig.fmap.mapcontext.raster.swing.operations.OperationSelectorPanel;
52
import org.gvsig.fmap.mapcontext.raster.swing.previewer.OneLayerPreviewer;
53
import org.gvsig.raster.lib.buffer.api.BufferLocator;
54
import org.gvsig.raster.lib.buffer.api.OperationManager;
55
import org.gvsig.raster.lib.buffer.api.operations.OperationFactory;
56
import org.gvsig.raster.lib.buffer.api.operations.OperationList;
57
import org.gvsig.raster.lib.buffer.api.operations.OperationListEntry;
58
import org.gvsig.raster.lib.legend.api.RasterLegend;
59
import org.gvsig.tools.ToolsLocator;
60
import org.gvsig.tools.dispose.DisposeUtils;
61
import org.gvsig.tools.dynform.DynFormLocator;
62
import org.gvsig.tools.dynform.JDynForm;
63
import org.gvsig.tools.dynform.JDynForm.JDynFormListener;
64
import org.gvsig.tools.dynform.JDynFormField;
65
import org.gvsig.tools.dynobject.DynObject;
66
import org.gvsig.tools.i18n.I18nManager;
67

    
68

    
69
/**
70
 * @author fdiaz
71
 *
72
 */
73
public class OperationsPagePanelController extends OperationsPagePanelView implements OperationsPagePanel {
74

    
75
    /**
76
     *
77
     */
78
    private static final long serialVersionUID = -274577556465497747L;
79

    
80
    private static final Logger LOG = LoggerFactory.getLogger(OperationsPagePanelController.class);
81

    
82
    private OperationSelectorPanel selector;
83
    private OperationListPanel operationListPanel;
84
    private JSplitPane splPanelRight = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
85
    private JSplitPane splPanelMiddleLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
86
    private JSplitPane splPanelLeft = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
87
    private RasterLayer rasterLayer;
88
    private OneLayerPreviewer previewer;
89
    private OneLayerPreviewer middlePreviewer;
90
    private boolean initialized;
91
    private boolean isChanged;
92

    
93
    private JDynForm form;
94

    
95
    private RasterLayer clonedLayerForPreview;
96

    
97
    private RasterLayer clonedLayerForMiddlePreview;
98

    
99
    /**
100
     *
101
     */
102
    public OperationsPagePanelController() {
103
        this.initialized = false;
104
        DisposeUtils.bind(this);
105
        initializeComponents();
106
        translate();
107
    }
108

    
109
    private void initializeComponents() {
110
        splPanelRight.setTopComponent(getPreviewer().asJComponent());
111
        splPanelRight.setBottomComponent(getMiddlePreviewer().asJComponent());
112
        splPanelRight.setResizeWeight(0.5);
113

    
114
        splPanel.setRightComponent(splPanelRight);
115

    
116
        MapContextRasterSwingManager manager = MapContextRasterSwingLocator.getSwingManager();
117
        selector = manager.createOperationSelectorPanel();
118
        selector.addListSelectionListener(new ListSelectionListener() {
119

    
120
            @Override
121
            public void valueChanged(ListSelectionEvent e) {
122
                Thread thread = new Thread(new Runnable() {
123
                    @Override
124
                    public void run() {
125
                        SwingUtilities.invokeLater(new Runnable() {
126
                            @Override
127
                            public void run() {
128
                                OperationFactory selected = selector.getSelected();
129
                                if (selected != null) {
130
                                    updateParametersPanelFromSelector(selected);
131
                                    operationListPanel.clearSelection();
132
                                }
133
                            }
134
                        });
135
                    }
136
                }, "Selector changed");
137

    
138
                thread.setDaemon(false);
139
                thread.start();
140
            }
141
        });
142

    
143

    
144
        operationListPanel = manager.createOperationListPanel();
145

    
146
        operationListPanel.addListSelectionListener(new ListSelectionListener() {
147

    
148
            @Override
149
            public void valueChanged(ListSelectionEvent e) {
150
                Thread thread = new Thread(new Runnable() {
151
                    @Override
152
                    public void run() {
153
                        SwingUtilities.invokeLater(new Runnable() {
154
                            @Override
155
                            public void run() {
156
                                OperationListEntry selected = operationListPanel.getSelected();
157
                                if(selected!=null){
158
                                    updateParametersPanelFromOperationListPanel(selected);
159
                                    selector.clearSelection();
160
                                } else {
161
                                    int location = splPanelMiddleLeft.getDividerLocation();
162
                                    form = null;
163
                                    JPanel emptyPanel = getEmptyPanel();
164
                                    splPanelMiddleLeft.setRightComponent(emptyPanel);
165
                                    splPanelMiddleLeft.setDividerLocation(location);
166
                                }
167
                            }
168
                        });
169
                    }
170
                }, "Selector changed");
171

    
172
                thread.setDaemon(false);
173
                thread.start();
174
            }
175
        });
176

    
177
        operationListPanel.addTableModelListener(new TableModelListener() {
178

    
179
            @Override
180
            public void tableChanged(TableModelEvent e) {
181
                isChanged = true;
182
                updatePreviewers();
183
            }
184
        });
185

    
186
        operationListPanel.addActionListener(new ActionListener() {
187

    
188
            @Override
189
            public void actionPerformed(ActionEvent e) {
190
                if (e.getActionCommand().equals(OperationListPanel.ADD_ACTION_COMMAND)) {
191
                    doAddOperation();
192
                } else if (e.getActionCommand().equals(OperationListPanel.UPDATE_ACTION_COMMAND)) {
193
                    doUpdateOperation();
194
                } else if (e.getActionCommand().equals(OperationListPanel.UP_ACTION_COMMAND)) {
195
                    isChanged = true;
196
                } else if (e.getActionCommand().equals(OperationListPanel.DOWN_ACTION_COMMAND)) {
197
                    isChanged = true;
198
                } else if (e.getActionCommand().equals(OperationListPanel.REMOVE_ACTION_COMMAND)) {
199
                    isChanged = true;
200
                }
201
            }
202
        });
203

    
204
        splPanelLeft.setTopComponent(selector.asJComponent());
205
        splPanelLeft.setBottomComponent(operationListPanel.asJComponent());
206
        splPanelMiddleLeft.setLeftComponent(splPanelLeft);
207
        splPanelMiddleLeft.setRightComponent(getEmptyPanel());
208

    
209
        splPanel.setLeftComponent(splPanelMiddleLeft);
210
        splPanel.setResizeWeight(0.75);
211
        splPanel.setDividerLocation(0.75);
212

    
213
        splPanelRight.setResizeWeight(0.50);
214

    
215
        splPanelMiddleLeft.setResizeWeight(0.1875);
216
        splPanelMiddleLeft.setDividerLocation(0.1875);
217

    
218
        splPanelLeft.setResizeWeight(0.50);
219
    }
220

    
221

    
222

    
223
    private void updateParametersPanelFromSelector(OperationFactory selected) {
224
        try {
225
            DynObject parameters = selected.createParameters();
226
            form = DynFormLocator.getDynFormManager().createJDynForm(parameters);
227
            form.addListener(new JDynFormListener() {
228

    
229
                @Override
230
                public void message(String arg0) {
231
                    // TODO Auto-generated method stub
232
                }
233

    
234
                @Override
235
                public void fieldChanged(JDynFormField arg0) {
236
                    updatePreviewers();
237
                }
238
            });
239
            splPanelMiddleLeft.setRightComponent(form.asJComponent());
240
            this.operationListPanel.enableAdd(true);
241
            this.operationListPanel.enableUpdate(false);
242
            updatePreviewers();
243

    
244
        } catch (Exception e) {
245
            LOG.warn("Can't create parameters for '"+selected.getName()+"'.", e);
246
            return;
247
        }
248

    
249
    }
250

    
251
    private void updateParametersPanelFromOperationListPanel(OperationListEntry selected) {
252
        try {
253
            DynObject parameters = selected.getParameters();
254
            form = DynFormLocator.getDynFormManager().createJDynForm(parameters);
255
            form.addListener(new JDynFormListener() {
256

    
257
                @Override
258
                public void message(String arg0) {
259
                    // TODO Auto-generated method stub
260
                }
261

    
262
                @Override
263
                public void fieldChanged(JDynFormField arg0) {
264
                    updatePreviewers();
265
                }
266
            });
267
            splPanelMiddleLeft.setRightComponent(form.asJComponent());
268
            this.operationListPanel.enableAdd(false);
269
            this.operationListPanel.enableUpdate(true);
270
            updatePreviewers();
271

    
272
        } catch (Exception e) {
273
            LOG.warn("Can't create parameters for '"+selected.getOperation().getFactory().getName()+"'.", e);
274
            return;
275
        }
276

    
277
    }
278

    
279
    private OneLayerPreviewer getPreviewer() {
280
        if(previewer == null){
281
            previewer = MapContextRasterSwingLocator.getSwingManager().createOneLayerPreviewer();
282
            previewer.asJComponent().setToolTipText("_previewer");
283
        }
284
        return this.previewer;
285

    
286
    }
287

    
288
    private OneLayerPreviewer getMiddlePreviewer() {
289
        if(middlePreviewer == null){
290
            middlePreviewer = MapContextRasterSwingLocator.getSwingManager().createOneLayerPreviewer();
291
            middlePreviewer.asJComponent().setToolTipText("_middle_previewer");
292
        }
293
        return this.middlePreviewer;
294

    
295
    }
296

    
297
    private void initializePreviewers() {
298
        getPreviewer().setLayer(clonedLayerForPreview);
299
        getMiddlePreviewer().setLayer(clonedLayerForMiddlePreview);
300

    
301
        splPanelRight.setTopComponent(previewer.asJComponent());
302
        splPanelRight.setBottomComponent(middlePreviewer.asJComponent());
303
        initialized = true;
304
    }
305

    
306
    private void updatePreviewers() {
307
        updatePreviewer();
308
        updateMiddlePreviewer();
309
    }
310

    
311
    private void updatePreviewer() {
312
        if (this.initialized) {
313
            RasterLegend legendForPreview = ((RasterLayer)this.getPreviewer().getLayer()).getLegend();
314
            OperationList operationListForPreview = ((OperationManager) BufferLocator.getBufferManager()).createOperationList();
315
            operationListPanel.fetch(operationListForPreview);
316
            int selectedRow = operationListPanel.getSelectedRow();
317
            if (selectedRow >= 0 && selectedRow<operationListForPreview.size()) {
318
                OperationListEntry selectedEntryForPreview = operationListForPreview.get(selectedRow);
319
                DynObject parametersForPreview = selectedEntryForPreview.getParameters();
320
                if (form.hasValidValues()) {
321
                    form.getValues(parametersForPreview);
322
                    // Update complete previewer but the selected entry is filled with form values
323
                    legendForPreview.setFilters(operationListForPreview);
324
                }
325
            } else if(selector.getSelected()!=null){
326
                updateLegendFromSelector(legendForPreview, operationListForPreview);
327
            } else {
328
                form = null;
329
                //update legend with complete operationList
330
                legendForPreview.setFilters(operationListForPreview);
331
            }
332
        }
333
    }
334

    
335
    private void updateMiddlePreviewer() {
336
        if (this.initialized) {
337
            RasterLegend legendForMiddlePreview = ((RasterLayer)this.getMiddlePreviewer().getLayer()).getLegend();
338
            OperationList operationListForMiddlePreview =
339
                ((OperationManager) BufferLocator.getBufferManager()).createOperationList();
340
            operationListPanel.fetch(operationListForMiddlePreview);
341
            int selectedRow = operationListPanel.getSelectedRow();
342
            if (selectedRow >= 0 && selectedRow<operationListForMiddlePreview.size()) {
343
                OperationListEntry selectedEntryForMiddlePreview = operationListForMiddlePreview.get(selectedRow);
344
                DynObject parametersForMiddlePreview = selectedEntryForMiddlePreview.getParameters();
345
                if (form.hasValidValues()) {
346
                    form.getValues(parametersForMiddlePreview);
347
                    // Update middle previewer but the selected entry is filled with form values
348
                    while(operationListForMiddlePreview.size()>selectedRow+1){
349
                        operationListForMiddlePreview.remove(operationListForMiddlePreview.size()-1);
350
                    }
351
                    legendForMiddlePreview.setFilters(operationListForMiddlePreview);
352
                }
353
            } else if(selector.getSelected()!=null){
354
                updateLegendFromSelector(legendForMiddlePreview, operationListForMiddlePreview);
355
            } else {
356
                form = null;
357
                //update legend with complete operationList
358
                legendForMiddlePreview.setFilters(operationListForMiddlePreview);
359
            }
360
        }
361
    }
362

    
363
    /**
364
     * @param rasterLegend
365
     * @param operationList
366
     */
367
    private void updateLegendFromSelector(RasterLegend rasterLegend, OperationList operationList) {
368
        OperationFactory factory = selector.getSelected();
369
        DynObject parameters = factory.createParameters();
370
        if (form.hasValidValues()) {
371
            //update legend with complete operationList but the last entry is filled with form values
372
            form.getValues(parameters);
373
            OperationManager operationManager = BufferLocator.getOperationManager();
374
            OperationListEntry entryForPreview = operationManager.createOperationListEntry(factory.create(), parameters);
375
            entryForPreview.setActive(true);
376
            operationList.add(entryForPreview);
377
            rasterLegend.setFilters(operationList);
378
        }
379
    }
380

    
381

    
382
    private void translate() {
383
        I18nManager i18nManager = ToolsLocator.getI18nManager();
384
        previewer.asJComponent().setToolTipText(i18nManager.getTranslation(previewer.asJComponent().getToolTipText()));
385
        middlePreviewer.asJComponent().setToolTipText(i18nManager.getTranslation(middlePreviewer.asJComponent().getToolTipText()));
386
        selector.asJComponent().setToolTipText(i18nManager.getTranslation(selector.asJComponent().getToolTipText()));
387
    }
388

    
389
    /**
390
     * @param locale
391
     *
392
     */
393
    public void setLocate(Locale locale) {
394
        Locale l = super.getLocale();
395
        if (!l.equals(locale)) {
396
            translate();
397
        }
398
        super.setLocale(locale);
399
    }
400

    
401

    
402
    @Override
403
    public JComponent asJComponent() {
404
        return this;
405
    }
406

    
407
    @Override
408
    public boolean fetch(FLayer layer) {
409
        if(isChanged) {
410
            RasterLayer rasterLayer = (RasterLayer) layer;
411
            RasterLegend rasterLegend = (RasterLegend) rasterLayer.getLegend();
412
            OperationList operationList = ((OperationManager)BufferLocator.getBufferManager()).createOperationList();
413
            operationListPanel.fetch(operationList);
414
            rasterLegend.setFilters(operationList);
415
        }
416
        isChanged = false;
417
        return true;
418
    }
419

    
420
    @Override
421
    public void set(FLayer layer) {
422
        this.rasterLayer = (RasterLayer) layer;
423
        DisposeUtils.bind(rasterLayer);
424

    
425
        try {
426
            if(clonedLayerForPreview!=null){
427
                DisposeUtils.dispose(clonedLayerForPreview);
428
            }
429
            clonedLayerForPreview = (RasterLayer) this.rasterLayer.cloneLayer();
430
            if(clonedLayerForMiddlePreview!=null){
431
                DisposeUtils.dispose(clonedLayerForMiddlePreview);
432
            }
433
            if(clonedLayerForMiddlePreview!=null){
434
                DisposeUtils.dispose(clonedLayerForMiddlePreview);
435
            }
436
            clonedLayerForMiddlePreview = (RasterLayer) this.rasterLayer.cloneLayer();
437
            this.initializePreviewers();
438
            OperationList filters = this.rasterLayer.getLegend().getFilters();
439
            operationListPanel.set(filters);
440

    
441
            if(filters!=null && filters.size()>0){
442
                operationListPanel.select(filters.size()-1);
443
            }
444
        } catch (Exception e1) {
445
            LOG.warn("Can't clone the raster layer to preview.", e1);
446
            return;
447
        }
448
        isChanged = false;
449
    }
450

    
451
    @Override
452
    public void setVisible(boolean aFlag) {
453
        super.setVisible(aFlag);
454
        splPanel.setResizeWeight(0.75);
455
        splPanelRight.setResizeWeight(0.50);
456
        splPanelMiddleLeft.setResizeWeight(0.1875);
457
        splPanelLeft.setResizeWeight(0.50);
458
    }
459

    
460
    /**
461
     * @return
462
     */
463
    private JPanel getEmptyPanel() {
464
        JPanel emptyPanel = new JPanel();
465
        GridBagLayout layout = new GridBagLayout();
466
        emptyPanel.setLayout(layout);
467
        GridBagConstraints constraints = new GridBagConstraints();
468
        constraints.fill = GridBagConstraints.BOTH;
469
        constraints.weightx = 1.0;
470
        constraints.weighty = 1.0;
471
        emptyPanel.setPreferredSize(new Dimension(100,100));
472
        return emptyPanel;
473
    }
474

    
475
    @Override
476
    public void dispose() {
477
        if(initialized) {
478
            if(!ToolsLocator.getDisposableManager().release(this)){
479
                return;
480
            }
481
            DisposeUtils.dispose(this.rasterLayer);
482
            this.rasterLayer = null;
483
            DisposeUtils.dispose(this.previewer);
484
            this.previewer = null;
485
            DisposeUtils.dispose(this.middlePreviewer);
486
            this.middlePreviewer = null;
487
            DisposeUtils.disposeQuietly(this.clonedLayerForPreview);
488
            this.clonedLayerForPreview = null;
489
            DisposeUtils.disposeQuietly(this.clonedLayerForMiddlePreview);
490
            this.clonedLayerForMiddlePreview = null;
491
        }
492
    }
493

    
494
    /**
495
     *
496
     */
497
    private void doAddOperation() {
498
        OperationFactory factory = selector.getSelected();
499
        DynObject parameters = factory.createParameters();
500
        form.getValues(parameters);
501
        OperationManager operationManager = BufferLocator.getOperationManager();
502
        OperationListEntry entry = operationManager.createOperationListEntry(factory.create(), parameters);
503
        entry.setActive(true);
504
        operationListPanel.add(entry);
505
        isChanged = true;
506
        selector.clearSelection();
507
    }
508

    
509
    /**
510
     *
511
     */
512
    private void doUpdateOperation() {
513
        OperationListEntry entry = operationListPanel.getSelected();
514
        if (entry != null) {
515
            DynObject parameters = entry.getParameters();
516
            form.getValues(parameters);
517
        } else {
518
            form.clear();
519
        }
520
        updatePreviewers();
521
        isChanged = true;
522
    }
523

    
524
}