Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extRasterTools-SE / src / org / gvsig / rastertools / filter / ui / FilterPanel.java @ 33611

History | View | Annotate | Download (15.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.andami.PluginServices;
36
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
37
import org.gvsig.fmap.mapcontext.layers.FLayer;
38
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
39
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
40
import org.gvsig.gui.beans.imagenavigator.ImageUnavailableException;
41
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
42
import org.gvsig.gui.beans.treelist.TreeListContainer;
43
import org.gvsig.raster.beans.createlayer.CreateLayerPanel;
44
import org.gvsig.raster.beans.previewbase.IPreviewRenderProcess;
45
import org.gvsig.raster.beans.previewbase.ParamStruct;
46
import org.gvsig.raster.beans.previewbase.PreviewBasePanel;
47
import org.gvsig.raster.dataset.Params;
48
import org.gvsig.raster.dataset.Params.Param;
49
import org.gvsig.raster.grid.filter.FilterTypeException;
50
import org.gvsig.raster.grid.filter.RasterFilter;
51
import org.gvsig.raster.grid.filter.RasterFilterList;
52
import org.gvsig.raster.grid.filter.RasterFilterListManager;
53
import org.gvsig.raster.hierarchy.IRasterRendering;
54
import org.gvsig.raster.util.LayerVisualStatusList;
55
import org.gvsig.raster.util.RasterToolsUtil;
56
import org.gvsig.rastertools.filter.FilterListener;
57

    
58
/**
59
 * Dialogo para los filtros de raster.
60
 *
61
 * @version 30/05/2007
62
 * @author Nacho Brodin <brodin_ign@gva.es>
63
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
64
 */
65
public class FilterPanel extends JPanel implements IPreviewRenderProcess {
66
        private static final long serialVersionUID = 7152780112689637266L;
67

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

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

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

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

    
131
                return filterListener;
132
        }
133

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

    
142
                        GridBagConstraints gridBagConstraints;
143

    
144
                        jPanelOptions.setLayout(new GridBagLayout());
145

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

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

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

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

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

    
187
                int count = 0;
188
                RasterFilter obj = null;
189

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

    
193
                        try {
194
                                obj = (RasterFilter) classFilter.newInstance();
195

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

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

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

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

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

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

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

    
379
                        propertiesComponent.addStateChangedListener(getFilterListener());
380
                }
381
                return propertiesComponent;
382
        }
383

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

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

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

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

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

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