Statistics
| Revision:

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

History | View | Annotate | Download (15.6 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.imagenavigator.ImageUnavailableException;
37
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
38
import org.gvsig.gui.beans.treelist.TreeListContainer;
39
import org.gvsig.raster.beans.createlayer.CreateLayerPanel;
40
import org.gvsig.raster.beans.previewbase.IPreviewRenderProcess;
41
import org.gvsig.raster.beans.previewbase.ParamStruct;
42
import org.gvsig.raster.beans.previewbase.PreviewBasePanel;
43
import org.gvsig.raster.dataset.Params;
44
import org.gvsig.raster.dataset.Params.Param;
45
import org.gvsig.raster.grid.filter.FilterTypeException;
46
import org.gvsig.raster.grid.filter.RasterFilter;
47
import org.gvsig.raster.grid.filter.RasterFilterList;
48
import org.gvsig.raster.grid.filter.RasterFilterListManager;
49
import org.gvsig.raster.hierarchy.IRasterRendering;
50
import org.gvsig.raster.util.RasterToolsUtil;
51
import org.gvsig.raster.util.LayerVisualStatusList;
52
import org.gvsig.rastertools.filter.FilterListener;
53

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

    
67
        private PreviewBasePanel       previewBasePanel    = null;
68
        private FLyrRasterSE           layer               = null;
69
        private FilterListener         filterListener      = null;
70
        private PropertiesComponent    propertiesComponent = null;
71

    
72
        private LayerVisualStatusList  status              = new LayerVisualStatusList();
73
        private JCheckBox              jCBShowFilters      = null;
74
        private String                 viewName            = null;
75
        private JPanel                 jPanelOptions       = null;
76
        private FilterMainPanel        filterMain          = null;
77
        private FilterDialog           filterDialog        = null;
78
        private CreateLayerPanel       newLayerPanel       = null;
79
        private boolean                showPreview         = true;        
80

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

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

    
129
                return filterListener;
130
        }
131

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

    
140
                        GridBagConstraints gridBagConstraints;
141

    
142
                        jPanelOptions.setLayout(new GridBagLayout());
143

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

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

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

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

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

    
185
                int count = 0;
186
                RasterFilter obj = null;
187

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

    
191
                        try {
192
                                obj = (RasterFilter) classFilter.newInstance();
193

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

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

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

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

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

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

    
359
        /**
360
         * Cuando se aceptan los cambios en el panel ejecutaremos el aceptar del
361
         * listener
362
         */
363
        public void accept() {
364
                filterListener.accept();
365
        }
366
        
367
        /**
368
         * Obtener el PropertiesComponent del panel de filtros, en caso de no existir,
369
         * lo crea.
370
         * @return
371
         */
372
        public PropertiesComponent getPropertiesComponent() {
373
                if (propertiesComponent == null) {
374
                        propertiesComponent = new PropertiesComponent();
375
                        getMainPanel().getCentralPanel().add(propertiesComponent, BorderLayout.CENTER);
376

    
377
                        propertiesComponent.addStateChangedListener(getFilterListener());
378
                }
379
                return propertiesComponent;
380
        }
381

    
382
        /**
383
         * Asignar un nuevo componente de PropertiesComponent, eliminando el anterior
384
         * que hubiera.
385
         * @param component
386
         * @param name
387
         */
388
        public void setNewPropertiesComponent(PropertiesComponent component, String name) {
389
                getPropertiesComponent().setVisible(false);
390
                this.remove(propertiesComponent);
391
                propertiesComponent = null;
392
                propertiesComponent = component;
393
                getMainPanel().getCentralPanel().add(propertiesComponent, BorderLayout.CENTER);
394
                propertiesComponent.addStateChangedListener(getFilterListener());
395
                setTitle(name);
396
                this.validate();
397
        }
398
        
399
        /**
400
         * Asigna el t?tulo al panel
401
         * @param title T?tulo del panel
402
         */
403
        public void setTitle(String title) {
404
                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));
405
        }
406
        
407
        /**
408
         * Devuelve el estado de los filtros inicial
409
         * @return VisualStatusLayerStack
410
         */
411
        public LayerVisualStatusList getLayerVisualStatus() {
412
                return status;
413
        }
414
        
415

    
416
        /**
417
         * Actualizamos la vista previa
418
         */
419
        public void refreshPreview() {
420
                getPreviewBasePanel().refreshPreview();
421
        }
422
        
423
        /**
424
         * Devuelve el FLayer asignado al panel
425
         * @return
426
         */
427
        public FLayer getLayer() {
428
                return layer;
429
        }
430
        
431

    
432
        /**
433
         * @return the jLabelShowFilters
434
         */
435
        public JCheckBox getCBShowFilters() {
436
                if (jCBShowFilters == null) {
437
                        jCBShowFilters = new JCheckBox();
438
                        jCBShowFilters.addActionListener(getFilterListener());
439
                        jCBShowFilters.setSelected(true);
440
                }
441
                return jCBShowFilters;
442
        }
443

    
444
        /**
445
         * Obtiene el nombre de la vista
446
         * @return
447
         */
448
        public String getViewName() {
449
                return viewName;
450
        }
451

    
452
        /**
453
         * Especificar el nombre de la nueva capa para el recuadro de texto asign?ndo
454
         * en cada llamada un nombre consecutivo.
455
         */
456
        public void updateNewLayerText() {
457
                getNewLayerPanel().updateNewLayerText();
458
        }
459

    
460
        /*
461
         * (non-Javadoc)
462
         * @see org.gvsig.raster.beans.previewbase.IPreviewRenderProcess#process(org.gvsig.raster.hierarchy.IRasterRendering)
463
         */
464
        public void process(IRasterRendering rendering) throws FilterTypeException, ImageUnavailableException {
465
                if(!showPreview)
466
                        throw new ImageUnavailableException(RasterToolsUtil.getText(this, "panel_preview_not_available"));
467
                
468
                getFilterListener().drawImage(rendering);
469
        }
470
        
471
        /**
472
         * Obtiene el flag que informa de si se est? mostrando la previsualizaci?n o no.
473
         * En caso de no mostrarse se lanza una excepci?n ImageUnavailableExcepcion con el 
474
         * mensaje "La previsualizaci?n no est? disponible para este panel"
475
         * @return
476
         */
477
        public boolean isShowPreview() {
478
                return showPreview;
479
        }
480
        
481
        /**
482
         * Asigna el flag para mostrar u ocultar la preview. En caso de no mostrarse se lanza una 
483
         * excepci?n ImageUnavailableExcepcion con el mensaje "La previsualizaci?n no est? disponible para
484
         * este panel"
485
         * @param showPreview
486
         */
487
        public void setShowPreview(boolean showPreview) {
488
                this.showPreview = showPreview;
489
        }
490
}