Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / branches / org.gvsig.raster.tools_dataaccess_refactoring / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / filter / ui / FilterPanel.java @ 2314

History | View | Annotate | Download (16.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.raster.tools.app.basic.tool.filter.ui;
20

    
21
import java.awt.BorderLayout;
22
import java.awt.Component;
23
import java.awt.Dimension;
24
import java.awt.GridBagConstraints;
25
import java.awt.GridBagLayout;
26
import java.awt.Insets;
27
import java.util.ArrayList;
28
import java.util.Hashtable;
29
import java.util.List;
30

    
31
import javax.swing.BorderFactory;
32
import javax.swing.DefaultListModel;
33
import javax.swing.JCheckBox;
34
import javax.swing.JPanel;
35
import javax.swing.border.TitledBorder;
36

    
37
import org.gvsig.andami.PluginServices;
38
import org.gvsig.andami.ui.mdiManager.IWindow;
39
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
40
import org.gvsig.fmap.dal.coverage.RasterLocator;
41
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
42
import org.gvsig.fmap.dal.coverage.datastruct.Param;
43
import org.gvsig.fmap.dal.coverage.datastruct.Params;
44
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
45
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
46
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
47
import org.gvsig.gui.beans.imagenavigator.ImageUnavailableException;
48
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
49
import org.gvsig.gui.beans.treelist.TreeListContainer;
50
import org.gvsig.raster.fmap.layers.FLyrRaster;
51
import org.gvsig.raster.mainplugin.beans.createlayer.CreateLayerPanel;
52
import org.gvsig.raster.swing.RasterSwingLocator;
53
import org.gvsig.raster.swing.preview.DataSourcePreview;
54
import org.gvsig.raster.swing.preview.PreviewBasePanelTab;
55
import org.gvsig.raster.swing.preview.PreviewPanel;
56
import org.gvsig.raster.swing.preview.PreviewRenderProcess;
57
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
58
import org.gvsig.raster.tools.app.basic.raster.bean.previewbase.ParamStruct;
59
import org.gvsig.raster.tools.app.basic.raster.bean.previewbase.RasterDataSourcePreview;
60
import org.gvsig.raster.tools.app.basic.tool.filter.FilterListener;
61
import org.gvsig.raster.util.LayerVisualStatusList;
62

    
63
/**
64
 * Dialogo para los filtros de raster.
65
 *
66
 * @author Nacho Brodin (nachobrodin@gmail.com)
67
 * @author BorSanZa - Borja S?nchez Zamorano 
68
 */
69
public class FilterPanel extends JPanel implements PreviewRenderProcess {
70
        private static final long serialVersionUID = 7152780112689637266L;
71

    
72
        private PreviewPanel           previewBasePanel    = null;
73
        private FLyrRaster             layer               = null;
74
        private FilterListener         filterListener      = null;
75
        private PropertiesComponent    propertiesComponent = null;
76

    
77
        private LayerVisualStatusList  status              = new LayerVisualStatusList();
78
        private JCheckBox              jCBShowFilters      = null;
79
        private String                 viewName            = null;
80
        private JPanel                 jPanelOptions       = null;
81
        private FilterMainPanel        filterMain          = null;
82
        private FilterDialog           filterDialog        = null;
83
        private CreateLayerPanel       newLayerPanel       = null;
84
        private boolean                showPreview         = true;        
85

    
86
        /**
87
         * Constructor
88
         * @param width Ancho del panel
89
         * @param height Alto del panel
90
         */
91
        public FilterPanel(FLyrRaster layer, FilterDialog filterDialog) {
92
                this.filterDialog = filterDialog;
93
                setLayer(layer);
94
                initialize();
95
        }
96
        
97
        private void initialize() {
98
                translate();
99
                setLayout(new BorderLayout());
100
                add((Component)getPreviewBasePanel(), BorderLayout.CENTER);
101
        }
102
        
103
        /**
104
         * Seccion donde ir?n todas las traducciones invariables del componente
105
         */
106
        private void translate() {
107
                getCBShowFilters().setText(PluginServices.getText(this, "aplicar_vista_previa"));
108
        }
109
        
110
        /**
111
         * Obtiene el panel con el histograma
112
         * @return HistogramPanel
113
         */
114
        public PreviewPanel getPreviewBasePanel() {
115
                if (previewBasePanel == null) {
116
                        ArrayList<PreviewBasePanelTab> list = new ArrayList<PreviewBasePanelTab>();
117
                        list.add(getMainPanel());
118
                        RasterDataSourcePreview source = new RasterDataSourcePreview((FLyrRaster)layer);
119
                        previewBasePanel = RasterSwingLocator.getSwingManager().createPreviewPanel(
120
                                        ButtonsPanel.BUTTONS_APPLYCLOSE, 
121
                                        list, 
122
                                        null, 
123
                                        panelOptions(), 
124
                                        this, 
125
                                        source);
126
                        previewBasePanel.getButtonsPanel().addCancel();
127
                        previewBasePanel.setPreviewSize(new Dimension(230, 215));
128
                        previewBasePanel.addButtonPressedListener(filterDialog);
129
                }
130
                return previewBasePanel;
131
        }
132

    
133
        /**
134
         * Devuelve el componente <code>FilterListener</code>, que contendr? el
135
         * proceso en si del panel
136
         */
137
        private FilterListener getFilterListener() {
138
                if (filterListener == null) {
139
                        filterListener = new FilterListener(this);
140
                }
141

    
142
                return filterListener;
143
        }
144

    
145
        /**
146
         * Devuelve el panel de Opciones, en caso de no existir, lo crea.
147
         * @return
148
         */
149
        private JPanel panelOptions() {
150
                if (jPanelOptions == null) {
151
                        jPanelOptions = new JPanel();
152

    
153
                        GridBagConstraints gridBagConstraints;
154

    
155
                        jPanelOptions.setLayout(new GridBagLayout());
156

    
157
                        gridBagConstraints = new GridBagConstraints();
158
                        gridBagConstraints.gridx = 0;
159
                        gridBagConstraints.gridy = 1;
160
                        gridBagConstraints.anchor = GridBagConstraints.WEST;
161
                        gridBagConstraints.insets = new Insets(2, 2, 2, 2);
162
                        jPanelOptions.add(getCBShowFilters(), gridBagConstraints);
163

    
164
                        gridBagConstraints = new GridBagConstraints();
165
                        gridBagConstraints.gridx = 0;
166
                        gridBagConstraints.gridy = 4;
167
                        gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
168
                        gridBagConstraints.insets = new Insets(3, 3, 3, 3);
169
                        jPanelOptions.add(getNewLayerPanel().getJPanel(), gridBagConstraints);
170

    
171
                        gridBagConstraints = new GridBagConstraints();
172
                        gridBagConstraints.gridx = 0;
173
                        gridBagConstraints.gridy = 5;
174
                        gridBagConstraints.weightx = 1.0;
175
                        gridBagConstraints.weighty = 1.0;
176
                        jPanelOptions.add(new JPanel(), gridBagConstraints);
177
                }
178

    
179
                return jPanelOptions;
180
        }
181
        
182
        public CreateLayerPanel getNewLayerPanel() {
183
                if (newLayerPanel == null) {
184
                        newLayerPanel = new CreateLayerPanel(layer);
185
                         if(layer.isRemote())
186
                                 newLayerPanel.disableNewLayer();
187
                }
188
                return newLayerPanel;
189
        }
190

    
191
        /**
192
         * Construye el arbol para el men? de filtros disponibles
193
         */
194
        @SuppressWarnings("unchecked")
195
        private void menuBuild() {
196
                Hashtable keys = new Hashtable();
197
                RasterFilterList filterList = layer.getRender().getFilterList();
198
                int dataType = layer.getDataStore().getDataType()[0];
199
                if( filterList.getByName("enhanced_stretch") != null ||
200
                        filterList.getByName("enhanced") != null ||
201
                        filterList.getByName("colortable") != null)
202
                        dataType = Buffer.TYPE_BYTE;
203
                List<Class<?>>  registeredFilters = filterList.getRegisteredFilterListByDataType(dataType);
204

    
205
                int count = 0;
206
                RasterFilter obj = null;
207

    
208
                for (int i = 0; i < registeredFilters.size(); i++) {
209
                        Class classFilter = (Class) registeredFilters.get(i);
210

    
211
                        try {
212
                                obj = (RasterFilter) classFilter.newInstance();
213

    
214
                                initFilter(obj);
215
                                
216
                                if (!obj.isVisible())
217
                                        continue;
218
                                
219
                                // Crear grupos de los filtros
220
                                if (!keys.containsKey(PluginServices.getText(this, new String(obj.getGroup())))) {
221
                                        keys.put(PluginServices.getText(this, new String(obj.getGroup())), obj);
222
                                        getMainPanel().getTreeListContainer().addClass(PluginServices.getText(this, new String(obj.getGroup())), count);
223
                                        count++;
224
                                                
225
                                }
226
                                // Crear cada entrada de los filtro
227
                                String[] names = obj.getNames();
228
                                for (int j = 0; j < names.length; j++) {
229
                                        obj.setName(names[j]);
230
                                        getFilterListener().addNewParam(names[j], initFilterParam(obj.getUIParams(names[j])), classFilter);
231
                                        getMainPanel().getTreeListContainer().addEntry(PluginServices.getText(this, names[j]), PluginServices.getText(this, obj.getGroup()), names[j]);
232
                                }
233
                        } catch (InstantiationException e) {
234
                                RasterToolsUtil.debug("No se ha podido meter el filtro en la lista", this, e);
235
                        } catch (IllegalAccessException e) {
236
                                RasterToolsUtil.debug("No se ha podido meter el filtro en la lista", this, e);
237
                        }
238
                }
239

    
240
                getMainPanel().getTreeListContainer().getTree().expandRow(0);
241
        }
242
        
243
        /**
244
         * Pasamos los parametros basicos a un filtro
245
         * @param filter
246
         */
247
        @SuppressWarnings("unchecked")
248
        private void initFilter(RasterFilter filter) {
249
                if (layer != null) {
250
                        filter.getEnv().put("datastore", layer.getDataStore());
251
                        filter.getEnv().put("initRaster", layer);
252
                }
253
        }
254
        
255
        /**
256
         * Sirve para a?adir mas parametros genericos por defecto al panel, de momento
257
         * solo he puesto para activar o desactivar un filtro.
258
         * @param params
259
         * @return
260
         */
261
        private Params initFilterParam(Params params) {
262
                params.setParam("enabled", new Boolean(true), Params.CHECK, null);
263
                Param param = params.getParamById("enabled");
264
                params.getParams().remove(params.getParams().size() - 1);
265
                params.getParams().add(0, param);
266
                return params;
267
        }
268
        
269
        /**
270
         * Comprueba que el nombre del filtro esta cargado en las extensiones
271
         * @param filter
272
         * @return
273
         */
274
        @SuppressWarnings("unchecked")
275
        private boolean hasThisFilter(String filter) {
276
                RasterFilterList filterList = RasterLocator.getManager().createEmptyFilterList(Buffer.TYPE_BYTE);
277
                List<Class<?>> registeredFilters = filterList.getRegisteredFilterList();
278
        
279
                boolean error;
280
                RasterFilter obj = null;
281
        
282
                for (int i = 0; i < registeredFilters.size(); i++) {
283
                        Class classFilter = (Class) registeredFilters.get(i);
284
                        error = true;
285
        
286
                        try {
287
                                obj = (RasterFilter) classFilter.newInstance();
288
                                error = false;
289
                        } catch (InstantiationException e) {
290
                        } catch (IllegalAccessException e) {
291
                        }
292
        
293
                        if (!error) {
294
                                String[] names = obj.getNames();
295
                                for (int j = 0; j < names.length; j++)
296
                                        if (filter.equals(names[j]))
297
                                                return true;
298
                        }
299
                }
300
                return false;
301
        }
302

    
303
        /**
304
         * Definir el FLayer del panel, haciendo todas las cargas necesarias despues
305
         * de especificarlo.
306
         * @param layer
307
         */
308
        private void setLayer(FLyrRaster layer) {
309
                if (layer == null)
310
                        return;
311

    
312
                this.layer = layer;
313
                RasterDataSourcePreview source = new RasterDataSourcePreview(layer);
314
                getPreviewBasePanel().setLayer(source);
315
        
316
                // Construimos el arbol de filtros
317
                menuBuild();
318
        
319
                IWindow win = PluginServices.getMDIManager().getActiveWindow();
320
                AbstractViewPanel view = null;
321
                if(win instanceof AbstractViewPanel)
322
                        view = (AbstractViewPanel) win;
323
                else {
324
                        RasterToolsUtil.messageBoxInfo("view_not_active", this);
325
                        return;
326
                }
327

    
328
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
329
        
330
                //Comprobamos que el raster de salida no exceda los 4GB que es el m?ximo 
331
                //admisible por un TIFF. Si es as? se hace un setCompress para salvar en JPEG2000
332
                long sizeB = (long)(( layer.getDataStore().getWidth() * layer.getDataStore().getWidth() * layer.getDataStore().getBandCount())); 
333
                int sizeMB = (int)(sizeB / 1048576);
334
                if(sizeMB >= 4096) {
335
                        RasterToolsUtil.messageBoxInfo("file_too_big", this);
336
                        getNewLayerPanel().setCompress(true);
337
                }
338
        
339
                RasterFilterList rfl = layer.getRender().getFilterList();
340
                status.getVisualStatus(layer);
341
        
342
                //Carga el listado de filtros que ya estaban aplicados en la capa al abrir
343
                 
344
                int i = 0;
345
                boolean filters = false;
346
                while (rfl.get(i) != null) {
347
                        DefaultListModel list = (DefaultListModel) getMainPanel().getTreeListContainer().getListModel();
348
                        if (rfl.get(i).isVisible() && hasThisFilter(rfl.get(i).getName())) {
349
                                list.addElement(PluginServices.getText(this, rfl.get(i).getName()));
350
                                for (int j = 0; j < getFilterListener().getParamsList().size(); j++) {
351
                                        if (((ParamStruct) getFilterListener().getParamsList().get(j)).getFilterName().equals(rfl.get(i).getName())) {
352
                                                filters = true;
353
                                                initFilter(rfl.get(i));
354
                                                ((ParamStruct) getFilterListener().getParamsList().get(j)).setFilterParam(initFilterParam(rfl.get(i).getUIParams(rfl.get(i).getName())));
355
                                        }
356
                                }
357
                        }
358
                        i++;
359
                }
360
        
361
                // Si existen filtros ya en la capa, pondremos los RadioButton para que
362
                // los cambios se hagan sobre la visualizaci?n
363
                if (filters)
364
                        getNewLayerPanel().setOnlyView(true);
365
        
366
                // Selecciona el primer item del arbol
367
                TreeListContainer lc = getMainPanel().getTreeListContainer();
368
                lc.getTree().expandRow(1);
369
                lc.getTree().setSelectionInterval(2, 2);
370
        }
371

    
372
        public FilterMainPanel getMainPanel() {
373
                if (filterMain == null) {
374
                        filterMain = new FilterMainPanel(getFilterListener());
375
                        JPanel panel = getNewLayerPanel().getFileNamePanel();
376
                        panel.setBorder(BorderFactory.createTitledBorder(null, PluginServices.getText(this, "nombre_capa"), TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
377
                        filterMain.getCentralPanel().add(panel, BorderLayout.SOUTH);
378
                }
379
                return filterMain;
380
        }
381

    
382
        /**
383
         * Volvemos todo a la normalidad cuando se cancela
384
         */
385
        public void cancel() {
386
                if (layer != null)
387
                        layer.getMapContext().invalidate();
388
        }
389

    
390
        /**
391
         * Cuando se aceptan los cambios en el panel ejecutaremos el aceptar del
392
         * listener
393
         */
394
        public void apply() {
395
                filterListener.accept();
396
        }
397
        
398
        /**
399
         * Obtener el PropertiesComponent del panel de filtros, en caso de no existir,
400
         * lo crea.
401
         * @return
402
         */
403
        public PropertiesComponent getPropertiesComponent() {
404
                if (propertiesComponent == null) {
405
                        propertiesComponent = new PropertiesComponent();
406
                        getMainPanel().getCentralPanel().add(propertiesComponent, BorderLayout.CENTER);
407

    
408
                        propertiesComponent.addStateChangedListener(getFilterListener());
409
                }
410
                return propertiesComponent;
411
        }
412

    
413
        /**
414
         * Asignar un nuevo componente de PropertiesComponent, eliminando el anterior
415
         * que hubiera.
416
         * @param component
417
         * @param name
418
         */
419
        public void setNewPropertiesComponent(PropertiesComponent component, String name) {
420
                getPropertiesComponent().setVisible(false);
421
                this.remove(propertiesComponent);
422
                propertiesComponent = null;
423
                propertiesComponent = component;
424
                getMainPanel().getCentralPanel().add(propertiesComponent, BorderLayout.CENTER);
425
                propertiesComponent.addStateChangedListener(getFilterListener());
426
                setTitle(name);
427
                this.validate();
428
        }
429
        
430
        /**
431
         * Asigna el t?tulo al panel
432
         * @param title T?tulo del panel
433
         */
434
        public void setTitle(String title) {
435
                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));
436
        }
437
        
438
        /**
439
         * Devuelve el estado de los filtros inicial
440
         * @return VisualStatusLayerStack
441
         */
442
        public LayerVisualStatusList getLayerVisualStatus() {
443
                return status;
444
        }
445
        
446

    
447
        /**
448
         * Actualizamos la vista previa
449
         */
450
        public void refreshPreview() {
451
                getPreviewBasePanel().refreshPreview();
452
        }
453
        
454
        /**
455
         * Devuelve el FLayer asignado al panel
456
         * @return
457
         */
458
        public FLyrRaster getLayer() {
459
                return layer;
460
        }
461
        
462

    
463
        /**
464
         * @return the jLabelShowFilters
465
         */
466
        public JCheckBox getCBShowFilters() {
467
                if (jCBShowFilters == null) {
468
                        jCBShowFilters = new JCheckBox();
469
                        jCBShowFilters.addActionListener(getFilterListener());
470
                        jCBShowFilters.setSelected(true);
471
                }
472
                return jCBShowFilters;
473
        }
474

    
475
        /**
476
         * Obtiene el nombre de la vista
477
         * @return
478
         */
479
        public String getViewName() {
480
                return viewName;
481
        }
482

    
483
        /**
484
         * Especificar el nombre de la nueva capa para el recuadro de texto asign?ndo
485
         * en cada llamada un nombre consecutivo.
486
         */
487
        public void updateNewLayerText() {
488
                getNewLayerPanel().updateNewLayerText();
489
        }
490

    
491
        public void process(DataSourcePreview rendering) throws ImageUnavailableException {
492
                if(!showPreview)
493
                        throw new ImageUnavailableException(RasterToolsUtil.getText(this, "panel_preview_not_available"));
494
                
495
                getFilterListener().drawImage((FLyrRaster)rendering.getSource());
496
        }
497
        
498
        /**
499
         * Obtiene el flag que informa de si se est? mostrando la previsualizaci?n o no.
500
         * En caso de no mostrarse se lanza una excepci?n ImageUnavailableExcepcion con el 
501
         * mensaje "La previsualizaci?n no est? disponible para este panel"
502
         * @return
503
         */
504
        public boolean isShowPreview() {
505
                return showPreview;
506
        }
507
        
508
        /**
509
         * Asigna el flag para mostrar u ocultar la preview. En caso de no mostrarse se lanza una 
510
         * excepci?n ImageUnavailableExcepcion con el mensaje "La previsualizaci?n no est? disponible para
511
         * este panel"
512
         * @param showPreview
513
         */
514
        public void setShowPreview(boolean showPreview) {
515
                this.showPreview = showPreview;
516
        }
517
}