Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / filter / ui / FilterPanel.java @ 11899

History | View | Annotate | Download (16.7 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.rastertools.filter.ui;
20

    
21
import java.awt.BorderLayout;
22
import java.awt.Dimension;
23
import java.util.ArrayList;
24
import java.util.Hashtable;
25

    
26
import javax.swing.BorderFactory;
27
import javax.swing.ButtonGroup;
28
import javax.swing.DefaultListModel;
29
import javax.swing.JCheckBox;
30
import javax.swing.JPanel;
31
import javax.swing.JRadioButton;
32

    
33
import org.gvsig.fmap.layers.FLyrRasterSE;
34
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
35
import org.gvsig.gui.beans.defaultbuttonspanel.DefaultButtonsPanel;
36
import org.gvsig.gui.beans.imagenavigator.ImageNavigator;
37
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
38
import org.gvsig.gui.beans.treelist.TreeListContainer;
39
import org.gvsig.raster.dataset.Params;
40
import org.gvsig.raster.dataset.Params.Param;
41
import org.gvsig.raster.grid.filter.RasterFilter;
42
import org.gvsig.raster.grid.filter.RasterFilterList;
43
import org.gvsig.raster.grid.filter.RasterFilterListManager;
44
import org.gvsig.raster.grid.render.Rendering;
45
import org.gvsig.raster.shared.Extent;
46
import org.gvsig.rastertools.filter.FilterListener;
47
import org.gvsig.rastertools.filter.FilterListener.ParamStruct;
48

    
49
import com.iver.andami.PluginServices;
50
import com.iver.cit.gvsig.fmap.layers.FLayer;
51
import com.iver.cit.gvsig.project.documents.view.gui.View;
52
/**
53
 * <code>FilterPanel</code> es el panel para filtros donde se construye sus
54
 * componentes visuales b?sicos.
55
 *
56
 * @version 18/05/2007
57
 * @author Borja S?nchez Zamorano (borja.sanchez@iver.es)
58
 */
59
public class FilterPanel extends DefaultButtonsPanel {
60
        private static final long                serialVersionUID = -5406900542488229074L;
61

    
62
        private JCheckBox                                                jCBShowFilters = null;
63
        private JPanel                                                        jPanelOptions = null;
64
        private JPanel                                                        jPreview = null;
65
        private JRadioButton                                jRBFileGenerate = null;
66
        private JRadioButton                                jRBNewLayer = null;
67
        private JRadioButton                                jRBOnlyView = null;
68
        private JRadioButton                                jRBOpenMemory = null;
69
        private ImageNavigator                        imageNavigator = null;
70
        private PropertiesComponent        propertiesComponent = null;
71
        private TreeListContainer                treeListContainer = null;
72

    
73
        private FilterListener                        filterListener = null;
74
        private FLayer                                                         fLayer = null;
75

    
76
        private String                                                        viewName = null;
77

    
78
        private ArrayList                                                filterStatus = null;
79

    
80

    
81
        /**
82
         * Constructor de un FilterPanel
83
         */
84
        public FilterPanel() {
85
                super(ButtonsPanel.BUTTONS_ACCEPTCANCELAPPLY);
86

    
87
                this.setLayout(new BorderLayout(5, 5));
88
                initialize();
89
                getPropertiesComponent();
90
                translate();
91
        }
92

    
93
        /**
94
         * Seccion donde ir?n todas las traducciones invariables del componente
95
         */
96
        private void translate() {
97
                getCBShowFilters().setText(PluginServices.getText(this, "aplicar_vista_previa"));
98
                getRadioOnlyView().setText(PluginServices.getText(this, "solo_visualizacion"));
99
                getRadioFileGenerate().setText(PluginServices.getText(this, "generar_fichero"));
100
                getRadioNewLayer().setText(PluginServices.getText(this, "capa_nueva"));
101
                getRadioOpenMemory().setText(PluginServices.getText(this, "abrir_memoria"));
102
        }
103

    
104
        /**
105
         * This method initializes this
106
         */
107
        private void initialize() {
108
                this.add(getTreeListContainer(), BorderLayout.WEST);
109
                this.add(getPPreview(), BorderLayout.EAST);
110
                menuBuild();
111
        }
112

    
113
        /**
114
         * Construye el arbol para el men? de filtros disponibles
115
         */
116
        private void menuBuild() {
117
                Hashtable keys = new Hashtable();
118
                RasterFilterList filterList = new RasterFilterList();
119
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
120

    
121
                int count = 0;
122
                boolean error;
123
                RasterFilter obj = null;
124

    
125
                for (int i = 0; i < stackManager.getRasterFilterList().size(); i++) {
126
                        Class classFilter = (Class) stackManager.getRasterFilterList().get(i);
127
                        error = true;
128

    
129
                        try {
130
                                obj = (RasterFilter) classFilter.newInstance();
131
                                error = false;
132
                        } catch (InstantiationException e) {
133
                                e.printStackTrace();
134
                        } catch (IllegalAccessException e) {
135
                                e.printStackTrace();
136
                        }
137

    
138
                        if (!error) {
139
                                if (!keys.containsKey(new String(obj.getGroup()))) {
140
                                        keys.put(new String(obj.getGroup()), obj);
141
                                        getTreeListContainer().addClass(new String(obj.getGroup()), count);
142
                                        count++;
143
                                }
144
                                getFilterListener().addNewParam(obj.getName(), initFilterParam(obj.getUIParams()), classFilter);
145
                                getTreeListContainer().addEntry(PluginServices.getText(this, obj.getName()), obj.getGroup(), obj.getName());
146
                        }
147
                }
148

    
149
                getTreeListContainer().getTree().expandRow(0);
150
        }
151

    
152
        /**
153
         * Sirve para a?adir mas parametros genericos por defecto al panel, de momento
154
         * solo he puesto para activar o desactivar un filtro.
155
         * @param params
156
         * @return
157
         */
158
        private Params initFilterParam(Params params) {
159
                params.setParam(PluginServices.getText(this, "enabled"), true + "", Params.CHECK, null);
160
                Param param = params.getParamById(PluginServices.getText(this, "enabled"));
161
                params.getParams().remove(params.getParams().size() - 1);
162
                params.getParams().add(0, param);
163
                return params;
164
        }
165

    
166
        /**
167
         * This method initializes jPanel        
168
         * @return javax.swing.JPanel        
169
         */
170
        public TreeListContainer getTreeListContainer() {
171
                if (treeListContainer == null) {
172
                        treeListContainer = new TreeListContainer();
173
                        treeListContainer.getTree().expandRow(0);
174
                        treeListContainer.addTreeListListener(getFilterListener());
175
                        treeListContainer.addChangeSelectionListener(getFilterListener());
176
                }
177
                return treeListContainer;
178
        }
179

    
180
        /**
181
         * Obtener el PropertiesComponent del panel de filtros, en caso de no existir,
182
         * lo crea.
183
         * @return
184
         */
185
        public PropertiesComponent getPropertiesComponent() {
186
                if (propertiesComponent == null) {
187
                        propertiesComponent = new PropertiesComponent();
188
                        this.add(propertiesComponent, BorderLayout.CENTER);
189
                        propertiesComponent.addStateChangedListener(getFilterListener());
190
                }
191
                return propertiesComponent;
192
        }
193

    
194
        /**
195
         * Devuelve el panel donde estar? el widget de preview
196
         * @return
197
         */
198
        private JPanel getPPreview() {
199
                if (jPreview == null) {
200
                        jPreview = new JPanel();
201
                        JPanel jsubpanel = new JPanel();
202
                        JPanel jsubpanel2 = new JPanel();
203
                        jsubpanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, PluginServices.getText(this, "vista_previa"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
204
                        jsubpanel.setLayout(new BorderLayout());
205
                        jsubpanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(8, 8, 8, 8));
206
                        jsubpanel2.setLayout(new BorderLayout());
207

    
208
                        jsubpanel.setPreferredSize(new Dimension(192, 192));
209
                        jsubpanel.setMinimumSize(new Dimension(192, 192));
210
                        jsubpanel.setMaximumSize(new Dimension(192, 192));
211

    
212
                        jsubpanel2.add(getImageNavigator(), BorderLayout.CENTER);
213
                        jsubpanel.add(jsubpanel2, BorderLayout.CENTER);
214

    
215
                        jPreview.setLayout(new javax.swing.BoxLayout(jPreview, javax.swing.BoxLayout.Y_AXIS));
216
                        jPreview.add(jsubpanel);
217
                        jPreview.add(panelOptions());
218

    
219
                        panelOptions().setPreferredSize(new Dimension(192, 132));
220
                        panelOptions().setMinimumSize(new Dimension(192, 132));
221
                        panelOptions().setMaximumSize(new Dimension(192, 132));
222
                }
223
                return jPreview;
224
        }
225

    
226
        /**
227
         * @return the jLabelShowFilters
228
         */
229
        public JCheckBox getCBShowFilters() {
230
                if (jCBShowFilters == null) {
231
                        jCBShowFilters = new JCheckBox();
232
                        jCBShowFilters.addActionListener(getFilterListener());
233
                        jCBShowFilters.setSelected(true);
234
                }
235
                return jCBShowFilters;
236
        }
237

    
238
        /**
239
         * Devuelve el Widget del preview, en caso de no existir lo crea.
240
         * @return
241
         */
242
        private ImageNavigator getImageNavigator() {
243
                if (imageNavigator == null) {
244
                        imageNavigator = new ImageNavigator(getFilterListener());
245
                        imageNavigator.setFocusable(true);
246
                        imageNavigator.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray, 1));
247
                }
248
                return imageNavigator;
249
        }
250

    
251
        /**
252
         * Devuelve el panel de Opciones, en caso de no existir, lo crea.
253
         * @return
254
         */
255
        private JPanel panelOptions() {
256
                if (jPanelOptions == null) {
257
                        JPanel jPanel2 = null;
258

    
259
                        ButtonGroup buttonGroup1;
260
                        ButtonGroup buttonGroup2;
261

    
262
                        java.awt.GridBagConstraints gridBagConstraints;
263

    
264
                        buttonGroup1 = new javax.swing.ButtonGroup();
265
                        buttonGroup2 = new ButtonGroup();
266
                        jPanelOptions = new JPanel();
267
                        jPanel2 = new JPanel();
268

    
269
                        jPanelOptions.setLayout(new java.awt.GridBagLayout());
270

    
271
                        gridBagConstraints = new java.awt.GridBagConstraints();
272
                        gridBagConstraints.gridx = 0;
273
                        gridBagConstraints.gridy = 1;
274
                        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
275
                        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
276
                        jPanelOptions.add(getCBShowFilters(), gridBagConstraints);
277

    
278
                        buttonGroup1.add(getRadioOnlyView());
279

    
280
                        gridBagConstraints = new java.awt.GridBagConstraints();
281
                        gridBagConstraints.gridx = 0;
282
                        gridBagConstraints.gridy = 2;
283
                        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
284
                        gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
285
                        jPanelOptions.add(getRadioOnlyView(), gridBagConstraints);
286

    
287
                        buttonGroup1.add(getRadioNewLayer());
288

    
289
                        gridBagConstraints = new java.awt.GridBagConstraints();
290
                        gridBagConstraints.gridx = 0;
291
                        gridBagConstraints.gridy = 3;
292
                        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
293
                        gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
294
                        jPanelOptions.add(getRadioNewLayer(), gridBagConstraints);
295

    
296
                        jPanel2.setLayout(new java.awt.GridBagLayout());
297

    
298
                        jPanel2.setBorder(BorderFactory.createTitledBorder(""));
299
                        buttonGroup2.add(getRadioFileGenerate());
300
                        gridBagConstraints = new java.awt.GridBagConstraints();
301
                        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
302
                        gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
303
                        jPanel2.add(getRadioFileGenerate(), gridBagConstraints);
304

    
305
                        buttonGroup2.add(getRadioOpenMemory());
306
                        gridBagConstraints = new java.awt.GridBagConstraints();
307
                        gridBagConstraints.gridx = 0;
308
                        gridBagConstraints.gridy = 1;
309
                        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
310
                        gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
311
                        jPanel2.add(getRadioOpenMemory(), gridBagConstraints);
312

    
313
                        gridBagConstraints = new java.awt.GridBagConstraints();
314
                        gridBagConstraints.gridx = 0;
315
                        gridBagConstraints.gridy = 4;
316
                        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
317
                        gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
318
                        jPanelOptions.add(jPanel2, gridBagConstraints);
319
                }
320

    
321
                return jPanelOptions;
322
        }
323

    
324
        /**
325
         * Devuelve el JRadioButton de generar fichero 
326
         * @return
327
         */
328
        public JRadioButton getRadioFileGenerate() {
329
                if (jRBFileGenerate == null) {
330
                        jRBFileGenerate = new JRadioButton();
331
                        jRBFileGenerate.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
332
                        jRBFileGenerate.setMargin(new java.awt.Insets(0, 0, 0, 0));
333
                }
334
                return jRBFileGenerate;
335
        }
336

    
337
        /**
338
         * Devuelve el JRadioButton de Solo vista
339
         * @return
340
         */
341
        public JRadioButton getRadioOnlyView() {
342
                if (jRBOnlyView == null) {
343
                        jRBOnlyView = new JRadioButton();
344
                        jRBOnlyView.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
345
                        jRBOnlyView.setMargin(new java.awt.Insets(0, 0, 0, 0));
346
                }
347
                return jRBOnlyView;
348
        }
349

    
350
        /**
351
         * Devuelve el JRadioButton de nueva capa
352
         * @return
353
         */
354
        public JRadioButton getRadioNewLayer() {
355
                if (jRBNewLayer == null) {
356
                        jRBNewLayer = new JRadioButton();
357
                        jRBNewLayer.setSelected(true);
358
                        jRBNewLayer.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
359
                        jRBNewLayer.setMargin(new java.awt.Insets(0, 0, 0, 0));
360
                        jRBNewLayer.addItemListener(new java.awt.event.ItemListener() {
361
                                public void itemStateChanged(java.awt.event.ItemEvent evt) {
362
                                        jRadioButton2ItemStateChanged(evt);
363
                                }
364
                        });
365
                }
366
                return jRBNewLayer;
367
        }
368

    
369
        /**
370
         * Devuelve el JRadioButton de Abrir en memoria
371
         * @return
372
         */
373
        public JRadioButton getRadioOpenMemory() {
374
                if (jRBOpenMemory == null) {
375
                        jRBOpenMemory = new JRadioButton();
376
                        jRBOpenMemory.setSelected(true);
377
                        jRBOpenMemory.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
378
                        jRBOpenMemory.setMargin(new java.awt.Insets(0, 0, 0, 0));
379
                }
380
                return jRBOpenMemory;
381
        }
382

    
383
        /**
384
         * Devuelve el componente <code>FilterListener</code>, que contendr? el
385
         * proceso en si del panel
386
         */
387
        private FilterListener getFilterListener() {
388
                if (filterListener == null) {
389
                        filterListener = new FilterListener(this);
390
                }
391

    
392
                return filterListener;
393
        }
394

    
395
        /**
396
         * Devuelve el FLayer asignado al panel
397
         * @return
398
         */
399
        public FLayer getLayer() {
400
                return fLayer;
401
        }
402

    
403
        /**
404
         * Definir el FLayer del panel, haciendo todas las cargas necesarias despues
405
         * de especificarlo.
406
         * @param layer
407
         */
408
        public void setLayer(FLayer layer) {
409
                this.fLayer = layer;
410
                View view = (View) PluginServices.getMDIManager().getActiveWindow();
411
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
412

    
413
                Extent extent2 = ((FLyrRasterSE) fLayer).getDatasource().getExtent();
414
                getImageNavigator().setViewDimensions(extent2.getMin().getX(), extent2.getMax().getY(), extent2.getMax().getX(), extent2.getMin().getY());
415
                getImageNavigator().setZoom(1.0/((FLyrRasterSE) fLayer).getDatasource().getXCellSize());
416
                getImageNavigator().imageCenter();
417
                getImageNavigator().updateBuffer();
418

    
419
                Rendering rendering = ((FLyrRasterSE) layer).getRender();
420
                RasterFilterList rfl = rendering.getFilterList();
421

    
422
                filterStatus = rfl.getStatusCloned();
423

    
424
                int i=0;
425
                boolean filters = false;
426
                while (rfl.get(i) != null) {
427
                        DefaultListModel list = (DefaultListModel) getTreeListContainer().getListModel();
428
                        list.addElement(PluginServices.getText(this, rfl.get(i).getName()));
429
                        for (int j = 0; j < getFilterListener().getParamsList().size(); j++) {
430
                                if (((ParamStruct) getFilterListener().getParamsList().get(j)).getFilterName().equals(rfl.get(i).getName())) {
431
                                        filters = true;
432
                                        ((ParamStruct) getFilterListener().getParamsList().get(j)).setFilterParam(initFilterParam(rfl.get(i).getUIParams()));
433
                                }
434
                        }
435

    
436
                        i++;
437
                }
438

    
439
                // Si existen filtros ya en la capa, pondremos los RadioButton para que
440
                // los cambios se hagan sobre la visualizaci?n
441
                if (filters)
442
                        getRadioOnlyView().setSelected(true);
443

    
444
                // Selecciona el primer item del arbol
445
                TreeListContainer lc = getTreeListContainer();
446
                lc.getTree().expandRow(1);
447
                lc.getTree().setSelectionInterval(2, 2);
448
        }
449

    
450
        /**
451
         * Obtiene el nombre de la vista
452
         * @return
453
         */
454
        public String getViewName() {
455
                return viewName;
456
        }
457

    
458
        /**
459
         * Poner los estados de los RadioButton en caso de que cambien de valor
460
         * @param evt
461
         */
462
        private void jRadioButton2ItemStateChanged(java.awt.event.ItemEvent evt) {
463
                if (getRadioNewLayer().getSelectedObjects() != null) {
464
                        getRadioFileGenerate().setEnabled(true);
465
                        getRadioOpenMemory().setEnabled(true);
466
                } else {
467
                        getRadioFileGenerate().setEnabled(false);
468
                        getRadioOpenMemory().setEnabled(false);
469
                }
470
        }
471

    
472
        /**
473
         * Asigna el t?tulo al panel
474
         * @param title T?tulo del panel
475
         */
476
        public void setTitle(String title) {
477
                getPropertiesComponent().setBorder(BorderFactory.createTitledBorder(null, PluginServices.getText(this, "filtro_de") + " " + PluginServices.getText(this, title), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
478
        }
479

    
480
        /**
481
         * Actualizamos la vista previa
482
         */
483
        public void refreshPreview() {
484
                getImageNavigator().updateBuffer();
485
        }
486

    
487
        /**
488
         * Volvemos todo a la normalidad cuando se cancela
489
         */
490
        public void cancel() {
491
                getLayer().getMapContext().invalidate();
492
        }
493

    
494
        /**
495
         * Volvemos todo a la normalidad cuando se cancela
496
         */
497
        public void restoreFilters() {
498
                Rendering rendering = ((FLyrRasterSE) getLayer()).getRender();
499
                rendering.getFilterList().setStatus(filterStatus);
500
        }
501

    
502
        /**
503
         * Asignar un nuevo componente de PropertiesComponent, eliminando el anterior
504
         * que hubiera.
505
         * @param component
506
         * @param name
507
         */
508
        public void setNewPropertiesComponent(PropertiesComponent component, String name) {
509
                getPropertiesComponent().setVisible(false);
510
                this.remove(propertiesComponent);
511
                propertiesComponent = null;
512
                propertiesComponent = component;
513
                this.add(propertiesComponent, BorderLayout.CENTER);
514
                propertiesComponent.addStateChangedListener(getFilterListener());
515
                setTitle(name);
516
                this.validate();
517
        }
518

    
519
        /**
520
         * Cuando se aceptan los cambios en el panel ejecutaremos el aceptar del
521
         * listener
522
         */
523
        public void accept() {
524
                filterListener.accept();
525
        }
526
}