Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / filter / ui / FilterPanel.java @ 20646

History | View | Annotate | Download (14.8 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.awt.GridBagConstraints;
24
import java.awt.GridBagLayout;
25
import java.awt.Insets;
26
import java.util.ArrayList;
27
import java.util.Hashtable;
28

    
29
import javax.swing.BorderFactory;
30
import javax.swing.DefaultListModel;
31
import javax.swing.JCheckBox;
32
import javax.swing.JPanel;
33
import javax.swing.border.TitledBorder;
34

    
35
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
36
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
37
import org.gvsig.gui.beans.treelist.TreeListContainer;
38
import org.gvsig.raster.beans.createlayer.CreateLayerPanel;
39
import org.gvsig.raster.beans.previewbase.IPreviewRenderProcess;
40
import org.gvsig.raster.beans.previewbase.ParamStruct;
41
import org.gvsig.raster.beans.previewbase.PreviewBasePanel;
42
import org.gvsig.raster.dataset.Params;
43
import org.gvsig.raster.dataset.Params.Param;
44
import org.gvsig.raster.grid.filter.FilterTypeException;
45
import org.gvsig.raster.grid.filter.RasterFilter;
46
import org.gvsig.raster.grid.filter.RasterFilterList;
47
import org.gvsig.raster.grid.filter.RasterFilterListManager;
48
import org.gvsig.raster.grid.render.Rendering;
49
import org.gvsig.raster.hierarchy.IRasterRendering;
50
import org.gvsig.raster.util.RasterToolsUtil;
51
import org.gvsig.rastertools.filter.FilterListener;
52

    
53
import com.iver.andami.PluginServices;
54
import com.iver.cit.gvsig.fmap.layers.FLayer;
55
import com.iver.cit.gvsig.project.documents.view.gui.View;
56
/**
57
 * Dialogo para los filtros de raster.
58
 *
59
 * @version 30/05/2007
60
 * @author Nacho Brodin <brodin_ign@gva.es>
61
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
62
 */
63
public class FilterPanel extends JPanel implements IPreviewRenderProcess {
64
        private static final long serialVersionUID = 7152780112689637266L;
65

    
66
        private PreviewBasePanel    previewBasePanel    = null;
67
        private FLayer              layer               = null;
68
        private FilterListener      filterListener      = null;
69
        private PropertiesComponent propertiesComponent = null;
70

    
71
        private ArrayList           filterStatus        = null;
72
        private JCheckBox           jCBShowFilters      = null;
73
        private String              viewName            = null;
74
        private JPanel              jPanelOptions       = null;
75
        private FilterMainPanel     filterMain          = null;
76
        private FilterDialog        filterDialog        = null;
77
        private CreateLayerPanel    newLayerPanel       = null;
78

    
79
        /**
80
         * Constructor
81
         * @param width Ancho del panel
82
         * @param height Alto del panel
83
         */
84
        public FilterPanel(FLayer layer, FilterDialog filterDialog) {
85
                this.filterDialog = filterDialog;
86
                setLayer(layer);
87
                initialize();
88
        }
89
        
90
        private void initialize() {
91
                translate();
92
                setLayout(new BorderLayout());
93
                add(getPreviewBasePanel(), BorderLayout.CENTER);
94
        }
95
        
96
        /**
97
         * Seccion donde ir?n todas las traducciones invariables del componente
98
         */
99
        private void translate() {
100
                getCBShowFilters().setText(PluginServices.getText(this, "aplicar_vista_previa"));
101
        }
102
        
103
        /**
104
         * Obtiene el panel con el histograma
105
         * @return HistogramPanel
106
         */
107
        private PreviewBasePanel getPreviewBasePanel() {
108
                if (previewBasePanel == null) {
109
                        ArrayList list = new ArrayList();
110
                        list.add(getMainPanel());
111
                        previewBasePanel = new PreviewBasePanel(list, null, panelOptions(), this, (FLyrRasterSE) layer);
112
                        previewBasePanel.setPreviewSize(new Dimension(230, 215));
113
                        previewBasePanel.addButtonPressedListener(filterDialog);
114
                }
115
                return previewBasePanel;
116
        }
117

    
118
        /**
119
         * Devuelve el componente <code>FilterListener</code>, que contendr? el
120
         * proceso en si del panel
121
         */
122
        private FilterListener getFilterListener() {
123
                if (filterListener == null) {
124
                        filterListener = new FilterListener(this);
125
                }
126

    
127
                return filterListener;
128
        }
129

    
130
        /**
131
         * Devuelve el panel de Opciones, en caso de no existir, lo crea.
132
         * @return
133
         */
134
        private JPanel panelOptions() {
135
                if (jPanelOptions == null) {
136
                        jPanelOptions = new JPanel();
137

    
138
                        GridBagConstraints gridBagConstraints;
139

    
140
                        jPanelOptions.setLayout(new GridBagLayout());
141

    
142
                        gridBagConstraints = new GridBagConstraints();
143
                        gridBagConstraints.gridx = 0;
144
                        gridBagConstraints.gridy = 1;
145
                        gridBagConstraints.anchor = GridBagConstraints.WEST;
146
                        gridBagConstraints.insets = new Insets(2, 2, 2, 2);
147
                        jPanelOptions.add(getCBShowFilters(), gridBagConstraints);
148

    
149
                        gridBagConstraints = new GridBagConstraints();
150
                        gridBagConstraints.gridx = 0;
151
                        gridBagConstraints.gridy = 4;
152
                        gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
153
                        gridBagConstraints.insets = new Insets(3, 3, 3, 3);
154
                        jPanelOptions.add(getNewLayerPanel(), gridBagConstraints);
155

    
156
                        gridBagConstraints = new GridBagConstraints();
157
                        gridBagConstraints.gridx = 0;
158
                        gridBagConstraints.gridy = 5;
159
                        gridBagConstraints.weightx = 1.0;
160
                        gridBagConstraints.weighty = 1.0;
161
                        jPanelOptions.add(new JPanel(), gridBagConstraints);
162
                }
163

    
164
                return jPanelOptions;
165
        }
166
        
167
        public CreateLayerPanel getNewLayerPanel() {
168
                if (newLayerPanel == null) {
169
                        newLayerPanel = new CreateLayerPanel();
170
                }
171
                return newLayerPanel;
172
        }
173

    
174
        /**
175
         * Construye el arbol para el men? de filtros disponibles
176
         */
177
        private void menuBuild() {
178
                Hashtable keys = new Hashtable();
179
                RasterFilterList filterList = ((FLyrRasterSE) layer).getRenderFilterList();
180
                // Creamos un stackManager para recorrer los filtros registrados en gvSIG
181
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
182

    
183
                int count = 0;
184
                RasterFilter obj = null;
185

    
186
                for (int i = 0; i < stackManager.getRasterFilterList().size(); i++) {
187
                        Class classFilter = (Class) stackManager.getRasterFilterList().get(i);
188

    
189
                        try {
190
                                obj = (RasterFilter) classFilter.newInstance();
191

    
192
                                initFilter(obj);
193
                                
194
                                if (!obj.isVisible())
195
                                        continue;
196
                                
197
                                // Crear grupos de los filtros
198
                                if (!keys.containsKey(PluginServices.getText(this, new String(obj.getGroup())))) {
199
                                        keys.put(PluginServices.getText(this, new String(obj.getGroup())), obj);
200
                                        getMainPanel().getTreeListContainer().addClass(PluginServices.getText(this, new String(obj.getGroup())), count);
201
                                        count++;
202
                                                
203
                                }
204
                                // Crear cada entrada de los filtro
205
                                String[] names = obj.getNames();
206
                                for (int j = 0; j < names.length; j++) {
207
                                        obj.setName(names[j]);
208
                                        getFilterListener().addNewParam(names[j], initFilterParam(obj.getUIParams(names[j])), classFilter);
209
                                        getMainPanel().getTreeListContainer().addEntry(PluginServices.getText(this, names[j]), PluginServices.getText(this, obj.getGroup()), names[j]);
210
                                }
211
                        } catch (InstantiationException e) {
212
                                RasterToolsUtil.debug("No se ha podido meter el filtro en la lista", this, e);
213
                        } catch (IllegalAccessException e) {
214
                                RasterToolsUtil.debug("No se ha podido meter el filtro en la lista", this, e);
215
                        }
216
                }
217

    
218
                getMainPanel().getTreeListContainer().getTree().expandRow(0);
219
        }
220
        
221
        /**
222
         * Pasamos los parametros basicos a un filtro
223
         * @param filter
224
         */
225
        private void initFilter(RasterFilter filter) {
226
                if (layer != null) {
227
                        filter.getEnv().put("MultiRasterDataset", ((FLyrRasterSE) layer).getDataSource());
228
                        filter.getEnv().put("initRaster", layer);
229
                }
230
        }
231
        
232
        /**
233
         * Sirve para a?adir mas parametros genericos por defecto al panel, de momento
234
         * solo he puesto para activar o desactivar un filtro.
235
         * @param params
236
         * @return
237
         */
238
        private Params initFilterParam(Params params) {
239
                params.setParam("enabled", new Boolean(true), Params.CHECK, null);
240
                Param param = params.getParamById("enabled");
241
                params.getParams().remove(params.getParams().size() - 1);
242
                params.getParams().add(0, param);
243
                return params;
244
        }
245
        
246
        /**
247
         * Comprueba que el nombre del filtro esta cargado en las extensiones
248
         * @param filter
249
         * @return
250
         */
251
        private boolean hasThisFilter(String filter) {
252
                RasterFilterList filterList = new RasterFilterList();
253
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
254
        
255
                boolean error;
256
                RasterFilter obj = null;
257
        
258
                for (int i = 0; i < stackManager.getRasterFilterList().size(); i++) {
259
                        Class classFilter = (Class) stackManager.getRasterFilterList().get(i);
260
                        error = true;
261
        
262
                        try {
263
                                obj = (RasterFilter) classFilter.newInstance();
264
                                error = false;
265
                        } catch (InstantiationException e) {
266
                        } catch (IllegalAccessException e) {
267
                        }
268
        
269
                        if (!error) {
270
                                String[] names = obj.getNames();
271
                                for (int j = 0; j < names.length; j++)
272
                                        if (filter.equals(names[j]))
273
                                                return true;
274
                        }
275
                }
276
                return false;
277
        }
278

    
279
        /**
280
         * Definir el FLayer del panel, haciendo todas las cargas necesarias despues
281
         * de especificarlo.
282
         * @param layer
283
         */
284
        private void setLayer(FLayer layer) {
285
                if (layer == null)
286
                        return;
287

    
288
                this.layer = layer;
289
                getPreviewBasePanel().setLayer((FLyrRasterSE) layer);
290
        
291
                // Construimos el arbol de filtros
292
                menuBuild();
293
        
294
                View view = (View) PluginServices.getMDIManager().getActiveWindow();
295
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
296
        
297
                //Comprobamos que el raster de salida no exceda los 4GB que es el m?ximo 
298
                //admisible por un TIFF. Si es as? se hace un setCompress para salvar en JPEG2000
299
                long sizeB = (long)((((FLyrRasterSE) layer).getPxWidth() * ((FLyrRasterSE) layer).getPxWidth() * ((FLyrRasterSE) layer).getBandCount())); 
300
                int sizeMB = (int)(sizeB / 1048576);
301
                if(sizeMB >= 4096) {
302
                        RasterToolsUtil.messageBoxInfo("file_too_big", this);
303
                        getNewLayerPanel().setCompress(true);
304
                }
305
        
306
                RasterFilterList rfl = ((FLyrRasterSE) layer).getRenderFilterList();
307
                filterStatus = rfl.getStatusCloned();
308
        
309
                //Carga el listado de filtros que ya estaban aplicados en la capa al abrir
310
                 
311
                int i = 0;
312
                boolean filters = false;
313
                while (rfl.get(i) != null) {
314
                        DefaultListModel list = (DefaultListModel) getMainPanel().getTreeListContainer().getListModel();
315
                        if (rfl.get(i).isVisible() && hasThisFilter(rfl.get(i).getName())) {
316
                                list.addElement(PluginServices.getText(this, rfl.get(i).getName()));
317
                                for (int j = 0; j < getFilterListener().getParamsList().size(); j++) {
318
                                        if (((ParamStruct) getFilterListener().getParamsList().get(j)).getFilterName().equals(rfl.get(i).getName())) {
319
                                                filters = true;
320
                                                initFilter(rfl.get(i));
321
                                                ((ParamStruct) getFilterListener().getParamsList().get(j)).setFilterParam(initFilterParam(rfl.get(i).getUIParams(rfl.get(i).getName())));
322
                                        }
323
                                }
324
                        }
325
                        i++;
326
                }
327
        
328
                // Si existen filtros ya en la capa, pondremos los RadioButton para que
329
                // los cambios se hagan sobre la visualizaci?n
330
                if (filters)
331
                        getNewLayerPanel().setOnlyView(true);
332
        
333
                // Selecciona el primer item del arbol
334
                TreeListContainer lc = getMainPanel().getTreeListContainer();
335
                lc.getTree().expandRow(1);
336
                lc.getTree().setSelectionInterval(2, 2);
337
        }
338

    
339
        public FilterMainPanel getMainPanel() {
340
                if (filterMain == null) {
341
                        filterMain = new FilterMainPanel(getFilterListener());
342
                        JPanel panel = getNewLayerPanel().getFileNamePanel();
343
                        panel.setBorder(BorderFactory.createTitledBorder(null, PluginServices.getText(this, "nombre_capa"), TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
344
                        filterMain.getCentralPanel().add(panel, BorderLayout.SOUTH);
345
                }
346
                return filterMain;
347
        }
348

    
349
        /**
350
         * Volvemos todo a la normalidad cuando se cancela
351
         */
352
        public void cancel() {
353
                if (layer != null)
354
                        layer.getMapContext().invalidate();
355
        }
356

    
357
        /**
358
         * Cuando se aceptan los cambios en el panel ejecutaremos el aceptar del
359
         * listener
360
         */
361
        public void accept() {
362
                filterListener.accept();
363
        }
364

    
365
        /**
366
         * Volvemos todo a la normalidad cuando se cancela
367
         */
368
        public void restoreFilters() {
369
                Rendering rendering = ((FLyrRasterSE) layer).getRender();
370
                if(rendering.getFilterList() != null)
371
                        rendering.getFilterList().setStatus(getFilterStatus());
372
        }
373
        
374
        /**
375
         * Obtener el PropertiesComponent del panel de filtros, en caso de no existir,
376
         * lo crea.
377
         * @return
378
         */
379
        public PropertiesComponent getPropertiesComponent() {
380
                if (propertiesComponent == null) {
381
                        propertiesComponent = new PropertiesComponent();
382
                        getMainPanel().getCentralPanel().add(propertiesComponent, BorderLayout.CENTER);
383

    
384
                        propertiesComponent.addStateChangedListener(getFilterListener());
385
                }
386
                return propertiesComponent;
387
        }
388

    
389
        /**
390
         * Asignar un nuevo componente de PropertiesComponent, eliminando el anterior
391
         * que hubiera.
392
         * @param component
393
         * @param name
394
         */
395
        public void setNewPropertiesComponent(PropertiesComponent component, String name) {
396
                getPropertiesComponent().setVisible(false);
397
                this.remove(propertiesComponent);
398
                propertiesComponent = null;
399
                propertiesComponent = component;
400
                getMainPanel().getCentralPanel().add(propertiesComponent, BorderLayout.CENTER);
401
                propertiesComponent.addStateChangedListener(getFilterListener());
402
                setTitle(name);
403
                this.validate();
404
        }
405
        
406

    
407
        /**
408
         * Asigna el t?tulo al panel
409
         * @param title T?tulo del panel
410
         */
411
        public void setTitle(String title) {
412
                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));
413
        }
414
        
415
        /**
416
         * Devuelve el arrayList de filtros inicial
417
         * @return
418
         */
419
        public ArrayList getFilterStatus() {
420
                return filterStatus;
421
        }
422

    
423
        /**
424
         * Actualizamos la vista previa
425
         */
426
        public void refreshPreview() {
427
                getPreviewBasePanel().refreshPreview();
428
        }
429
        
430
        /**
431
         * Devuelve el FLayer asignado al panel
432
         * @return
433
         */
434
        public FLayer getLayer() {
435
                return layer;
436
        }
437
        
438

    
439
        /**
440
         * @return the jLabelShowFilters
441
         */
442
        public JCheckBox getCBShowFilters() {
443
                if (jCBShowFilters == null) {
444
                        jCBShowFilters = new JCheckBox();
445
                        jCBShowFilters.addActionListener(getFilterListener());
446
                        jCBShowFilters.setSelected(true);
447
                }
448
                return jCBShowFilters;
449
        }
450

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

    
459
        /**
460
         * Especificar el nombre de la nueva capa para el recuadro de texto asign?ndo
461
         * en cada llamada un nombre consecutivo.
462
         */
463
        public void updateNewLayerText() {
464
                getNewLayerPanel().updateNewLayerText();
465
        }
466

    
467
        /*
468
         * (non-Javadoc)
469
         * @see org.gvsig.raster.beans.previewbase.IPreviewRenderProcess#process(org.gvsig.raster.hierarchy.IRasterRendering)
470
         */
471
        public void process(IRasterRendering rendering) throws FilterTypeException {
472
                getFilterListener().drawImage(rendering);
473
        }
474
}