Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / filter / FilterListener.java @ 19285

History | View | Annotate | Download (17.4 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;
20

    
21
import java.awt.event.ActionEvent;
22
import java.awt.event.ActionListener;
23
import java.io.File;
24
import java.util.ArrayList;
25
import java.util.EventObject;
26
import java.util.Hashtable;
27

    
28
import javax.swing.JFileChooser;
29
import javax.swing.ListModel;
30

    
31
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
32
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
33
import org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener;
34
import org.gvsig.gui.beans.propertiespanel.PropertyStruct;
35
import org.gvsig.gui.beans.treelist.event.TreeListChangeEvent;
36
import org.gvsig.gui.beans.treelist.event.TreeListEvent;
37
import org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener;
38
import org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener;
39
import org.gvsig.raster.IProcessActions;
40
import org.gvsig.raster.RasterLibrary;
41
import org.gvsig.raster.dataset.GeoRasterWriter;
42
import org.gvsig.raster.dataset.IRasterDataSource;
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.FilterUIListener;
47
import org.gvsig.raster.grid.filter.IRasterFilterListManager;
48
import org.gvsig.raster.grid.filter.RasterFilter;
49
import org.gvsig.raster.grid.filter.RasterFilterList;
50
import org.gvsig.raster.grid.filter.RasterFilterListManager;
51
import org.gvsig.raster.grid.filter.RegistrableFilterListener;
52
import org.gvsig.raster.hierarchy.IRasterRendering;
53
import org.gvsig.raster.util.ExtendedFileFilter;
54
import org.gvsig.raster.util.RasterNotLoadException;
55
import org.gvsig.raster.util.RasterToolsUtil;
56
import org.gvsig.rastertools.filter.ui.FilterDialog;
57

    
58
import com.iver.andami.PluginServices;
59
import com.iver.andami.Utilities;
60
import com.iver.cit.gvsig.addlayer.fileopen.FileOpenWizard;
61
/**
62
 * <code>FilterListener</code> es la clase donde se procesar? gran parte del
63
 * c?digo que controla el panel para el manejo de un layer en la aplicaci?n de
64
 * filtros.
65
 *
66
 * @version 24/05/2007
67
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
68
 */
69
public class FilterListener implements ActionListener, TreeListComponentListener, TreeListChangeListener, PropertiesComponentListener, FilterUIListener, IProcessActions {
70
        private FilterDialog filterDialog  = null;
71
        private int          actualParam  = -1;
72
        private ArrayList    paramsList   = new ArrayList();
73
        /**
74
         * Cuando est? a false genera un TIFF de salida. Cuando est? a true un JPEG2000
75
         */
76
        private boolean      compress = false;
77

    
78
        public class ParamStruct {
79
                String filterName = null;
80
                Params filterParam = null;
81
                Class filterClass = null;
82

    
83
                /**
84
                 * @return the filterName
85
                 */
86
                public String getFilterName() {
87
                        return filterName;
88
                }
89

    
90
                /**
91
                 * @param filterName the filterName to set
92
                 */
93
                public void setFilterName(String filterName) {
94
                        this.filterName = filterName;
95
                }
96

    
97
                /**
98
                 * @return the filterParam
99
                 */
100
                public Params getFilterParam() {
101
                        return filterParam;
102
                }
103

    
104
                /**
105
                 * @param filterParam the filterParam to set
106
                 */
107
                public void setFilterParam(Params filterParam) {
108
                        this.filterParam = filterParam;
109
                }
110

    
111
                /**
112
                 * @return the filterClass
113
                 */
114
                public Class getFilterClass() {
115
                        return filterClass;
116
                }
117

    
118
                /**
119
                 * @param filterClass the filterClass to set
120
                 */
121
                public void setFilterClass(Class filterClass) {
122
                        this.filterClass = filterClass;
123
                }
124
        }
125

    
126
        /**
127
         * Construye un FilterListener especificando el FilterPanel asociado
128
         * @param filterDialog
129
         */
130
        public FilterListener(FilterDialog filterDialog) {
131
                this.filterDialog = filterDialog;
132
        }
133

    
134
        /**
135
         * Asigna un valor para el par?metro que informa de si el raster de salida hay
136
         * que comprimirlo o no. Este valor es necesario cuando el raster de salida 
137
         * es mayor de 4G ya que no se puede crear un tiff tan grande.
138
         * @param compress true para comprimir el raster de salida y false para no hacerlo.
139
         */
140
        public void setCompress(boolean compress) {
141
                this.compress = compress;
142
        }
143
        
144
        /**
145
         * Asignamos los valores del PropertiesComponent al Params seleccionado
146
         */
147
        public void RefreshDataProperties() {
148
                if (actualParam == -1)
149
                        return;
150

    
151
                ArrayList listValues = getFilterDialog().getPropertiesComponent().getValues();
152

    
153
                Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
154
                for (int j = 0; j < listValues.size(); j++) {
155
                        PropertyStruct ps = (PropertyStruct) listValues.get(j);
156
                        params.changeParamValue(ps.getKey(), ps.getNewValue());
157
                }
158
        }
159

    
160
        /**
161
         * Obtener la posici?n del Param seleccionado en el ArrayList
162
         * @param filterName
163
         * @return
164
         */
165
        private int getParamSelected(String filterName) {
166
                for (int i = 0; i < paramsList.size(); i++) {
167
                        if (((ParamStruct) paramsList.get(i)).getFilterName().equals(filterName))
168
                                return i;
169
                }
170
                return -1;
171
        }
172

    
173
        /**
174
         * Cambiar el panel de propiedades central por el nuevo panel, segun el filtro
175
         * seleccionado que se pasa por par?metro.
176
         * @param filter
177
         */
178
        public void changePanel(String filter) {
179
                int posParam = getParamSelected(filter);
180

    
181
                RefreshDataProperties();
182
                actualParam = posParam;
183

    
184
                PropertiesComponent propertiesComponent = new PropertiesComponent();
185

    
186
                if (posParam != -1) {
187
                        Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
188
                        if (params != null) {
189
                                Param paramPanel = params.getParamById("Panel");
190
                                if(paramPanel != null && paramPanel.defaultValue instanceof RegistrableFilterListener)
191
                                        ((RegistrableFilterListener)paramPanel.defaultValue).addFilterUIListener(this);
192
                                RasterToolsUtil.loadPropertiesFromWriterParams(propertiesComponent, params, new String[]{"FilterName"});
193
                        }
194
                }
195
                getFilterDialog().setNewPropertiesComponent(propertiesComponent, filter);
196
        }
197

    
198
        /**
199
         * A?adir un nuevo Params a la lista de Params que podemos manejar. Un Params
200
         * equivale a un filtro cargado. El hecho de trabajar con Params y no con
201
         * filtros, simplifica totalmente el panel. Sin tener que depender de los
202
         * filtros nada m?s que para el momento de dibujado o guardado.
203
         * @param name
204
         * @param params
205
         * @param classFilter
206
         */
207
        public void addNewParam(String name, Params params, Class classFilter) {
208
                ParamStruct param = new ParamStruct();
209
                param.setFilterName(name);
210
                param.setFilterParam(params);
211
                param.setFilterClass(classFilter);
212
                paramsList.add(param);
213
        }
214

    
215
        /*
216
         * (non-Javadoc)
217
         * @see org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener#actionChangeProperties(java.util.EventObject)
218
         */
219
        public void actionChangeProperties(EventObject e) {
220
                RefreshDataProperties();
221
                getFilterDialog().refreshPreview();
222
        }
223

    
224
        /*
225
         * (non-Javadoc)
226
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener#actionChangeSelection(org.gvsig.gui.beans.treelist.event.TreeListChangeEvent)
227
         */
228
        public void actionChangeSelection(TreeListChangeEvent e) {
229
                changePanel(e.getItem());
230
        }
231

    
232
        /*
233
         * (non-Javadoc)
234
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
235
         */
236
        public void actionPerformed(ActionEvent e) {
237
                getFilterDialog().refreshPreview();
238
        }
239

    
240
        /*
241
         * (non-Javadoc)
242
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementAdded(org.gvsig.gui.beans.treelist.event.TreeListEvent)
243
         */
244
        public void elementAdded(TreeListEvent e) {
245
                getFilterDialog().refreshPreview();
246
        }
247

    
248
        /*
249
         * (non-Javadoc)
250
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementMoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
251
         */
252
        public void elementMoved(TreeListEvent e) {
253
                getFilterDialog().refreshPreview();
254
        }
255

    
256
        /*
257
         * (non-Javadoc)
258
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementRemoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
259
         */
260
        public void elementRemoved(TreeListEvent e) {
261
                getFilterDialog().refreshPreview();
262
        }
263

    
264
        /**
265
         * @return the paramsList
266
         */
267
        public ArrayList getParamsList() {
268
                return paramsList;
269
        }
270

    
271
        /**
272
         * Devuelve la ruta del fichero donde se va a guardar, en caso de guardarse
273
         * en memoria, calcula el nombre sin preguntar y devuelve la ruta.
274
         * @return
275
         */
276
        public String getFileSelected() {
277
                String path = "";
278
                if (getFilterDialog().getRadioFileGenerate().isSelected()) {
279
                        JFileChooser chooser = new JFileChooser(FileOpenWizard.getLastPath());
280
                        chooser.setDialogTitle(PluginServices.getText(this, "seleccionar_fichero"));
281

    
282
                        //A?adimos las extensiones que hayan sido registradas en el driver
283
                        String[] extList = GeoRasterWriter.getDriversExtensions();
284
                        for(int i=0;i<extList.length;i++)
285
                                chooser.addChoosableFileFilter(new ExtendedFileFilter(extList[i]));
286

    
287
                        if (chooser.showOpenDialog(getFilterDialog()) != JFileChooser.APPROVE_OPTION)
288
                                return null;
289

    
290
                        FileOpenWizard.setLastPath(chooser.getSelectedFile().getPath().substring(0, chooser.getSelectedFile().getPath().lastIndexOf(File.separator)));
291

    
292
                        ExtendedFileFilter fileFilter = (ExtendedFileFilter) chooser.getFileFilter();
293
                        path = fileFilter.getNormalizedFilename(chooser.getSelectedFile());
294
                } else {
295

    
296
                        String file = getFilterDialog().getMainPanel().getFilenameTextField().getText();
297
                        if(file.compareTo(RasterLibrary.getOnlyLayerName()) == 0) 
298
                                RasterLibrary.usesOnlyLayerName();
299
                                                        
300
                        if(!compress)
301
                                path = Utilities.createTempDirectory() + File.separator + file + ".tif";
302
                        else
303
                                path = Utilities.createTempDirectory() + File.separator + file + ".jp2";
304
                        filterDialog.updateNewLayerText();
305
                }
306
                return path;
307
        }
308

    
309
        /**
310
         * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma
311
         * de ArrayList tanto para el dibujado como cuando aceptan o aplican el panel.
312
         * @param rendering
313
         * @return
314
         */
315
        public ArrayList applyFilters(IRasterRendering rendering) {
316
                ArrayList listFilterUsed = new ArrayList();
317

    
318
                RasterFilterList filterList = new RasterFilterList();
319
                filterList.setEnv(rendering.getRenderFilterList().getEnv());
320
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
321

    
322
                // Conservamos filtros no visibles ya existentes
323
                ArrayList filtersInit = getFilterDialog().getFilterStatus();
324
                for (int i = 0; i < filtersInit.size(); i++) {
325
                        // Si es visible no hacemos nada
326
                        if (((RasterFilter) filtersInit.get(i)).isVisible())
327
                                continue;
328

    
329
                        RasterFilter obj = null;
330
                        for (int j = 0; j < stackManager.getRasterFilterList().size(); j++) {
331
                                Class classFilter = (Class) stackManager.getRasterFilterList().get(j);
332
                                try {
333
                                        obj = (RasterFilter) classFilter.newInstance();
334
                                        if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName()))
335
                                                break;
336
                                } catch (InstantiationException e) {
337
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
338
                                } catch (IllegalAccessException e) {
339
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
340
                                }
341
                        }
342

    
343
                        // Si no encontramos el filtro apropiado, nos olvidamos de el
344
                        if (obj == null)
345
                                continue;
346

    
347
                        // Si no es visible tenemos que conservar el filtro
348
                        try {
349
                                Params params = (Params) ((RasterFilter) filtersInit.get(i)).getUIParams(((RasterFilter) filtersInit.get(i)).getName()).clone();
350
                                // A?ado el parametro RenderBands a los parametros del filtro
351
                                String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
352
                                params.setParam("RenderBands", rgb, 0, null);
353

    
354
                                ParamStruct newParam = new ParamStruct();
355
                                newParam.setFilterClass(obj.getClass());
356
                                newParam.setFilterName(((RasterFilter) filtersInit.get(i)).getName());
357
                                newParam.setFilterParam(params);
358
                                listFilterUsed.add(newParam);
359
                        } catch (CloneNotSupportedException e) {
360
                        }
361
                }
362

    
363
                // Metemos los filtros seleccionados en el panel
364
                ListModel list = getFilterDialog().getMainPanel().getTreeListContainer().getListModel();
365
                for (int i = 0; i < list.getSize(); i++) {
366
                        Hashtable hastTable = getFilterDialog().getMainPanel().getTreeListContainer().getMap();
367
                        for (int j = 0; j < paramsList.size(); j++) {
368
                                boolean active = true;
369
                                Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById("enabled");
370
                                if ((param != null) &&
371
                                        param.defaultValue instanceof Boolean &&
372
                                        ((((Boolean)param.defaultValue).booleanValue()) == false))
373
                                        active = false;
374
                                if (active) {
375
                                        if (((ParamStruct) paramsList.get(j)).getFilterName().equals(hastTable.get(list.getElementAt(i)))) {
376
                                                try {
377
                                                        Params params = (Params) ((ParamStruct) paramsList.get(j)).getFilterParam().clone();
378
                                                        // A?ado el parametro RenderBands a los parametros del filtro
379
                                                        String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
380
                                                        params.setParam("RenderBands", rgb, 0, null);
381

    
382
                                                        ParamStruct newParam = new ParamStruct();
383
                                                        newParam.setFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
384
                                                        newParam.setFilterName(((ParamStruct) paramsList.get(j)).getFilterName());
385
                                                        newParam.setFilterParam(params);
386
                                                        listFilterUsed.add(newParam);
387
                                                } catch (CloneNotSupportedException e) {
388
                                                }
389
                                        }
390
                                }
391
                        }
392
                }
393
                return listFilterUsed;
394
        }
395

    
396
        /*
397
         * (non-Javadoc)
398
         * @see org.gvsig.gui.beans.imagenavigator.IClientImageNavigator#drawImage(java.awt.Graphics2D, double, double, double, double, double, int, int)
399
         */
400
        public void drawImage(IRasterRendering rendering) {
401
                rendering.setRenderBands(((FLyrRasterSE) getFilterDialog().getLayer()).getRenderBands());
402
                rendering.getRenderFilterList().clear();
403

    
404
                if (getFilterDialog().getCBShowFilters().isSelected()) {
405
                        RasterFilterList filterList = rendering.getRenderFilterList();
406
                        RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
407

    
408
                        ArrayList listFilterUsed = applyFilters(rendering);
409
                        ArrayList exc = new ArrayList();
410
                        for (int i = 0; i < listFilterUsed.size(); i++) {
411
                                IRasterFilterListManager filterManager = stackManager.getManagerByFilterClass(((ParamStruct) listFilterUsed.get(i)).getFilterClass());
412
                                try {
413
                                        filterManager.addFilter(((ParamStruct) listFilterUsed.get(i)).getFilterClass(), ((ParamStruct) listFilterUsed.get(i)).getFilterParam());
414
                                } catch (FilterTypeException e) {
415
                                        exc.add(e);
416
                                }
417
                        }
418
                        if(exc.size() != 0) {
419
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, exc);
420
                                exc.clear();
421
                        }
422
                }
423
        }
424

    
425
        /**
426
         * Que acciones se ejecutaran al haber presionado el bot?n aceptar o aplicar
427
         */
428
        public void accept() {
429
                IRasterDataSource raster = ((FLyrRasterSE) getFilterDialog().getLayer()).getDataSource();
430
                if (raster == null)
431
                        return;
432

    
433
                String path = null;
434
                if (!getFilterDialog().getRadioOnlyView().isSelected()) {
435
                        path = getFileSelected();
436
                        if (path == null)
437
                                return;
438
                }
439

    
440
                //Rendering rendering = ((FLyrRasterSE) getFilterPanel().getLayer()).getRender();
441
                IRasterRendering rendering = (IRasterRendering) getFilterDialog().getLayer();
442

    
443
                // Array para guardar los filtros que se van a usar en forma de ParamStruct
444
                ArrayList listFilterUsed = applyFilters(rendering);
445

    
446
                if (filterDialog.getRadioOnlyView().isSelected()) {
447
                        try {
448
                                FilterProcess.addSelectedFilters(rendering.getRenderFilterList(), listFilterUsed);
449
                                ((FLyrRasterSE) getFilterDialog().getLayer()).setRenderFilterList(rendering.getRenderFilterList());
450
                                getFilterDialog().getLayer().getMapContext().invalidate();
451
                        } catch (FilterTypeException e) {
452
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
453
                        }
454
                } else {
455
                        FilterProcess filterProcess = new FilterProcess();
456
                        filterProcess.setActions(this);
457
                        filterProcess.addParam("rendering", rendering);
458
                        filterProcess.addParam("filename", path);
459
                        filterProcess.addParam("rasterdatasource", raster);
460
                        filterProcess.addParam("listfilterused", listFilterUsed);
461
                        filterProcess.start();
462
                }
463
        }
464

    
465
        /**
466
         * Devuelve el FilterPanel asociado al FilterListener
467
         * @return
468
         */
469
        public FilterDialog getFilterDialog() {
470
                return filterDialog;
471
        }
472

    
473
        /**
474
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
475
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
476
         */
477
        public void loadLayerInToc(String fileName) {
478
                if (!getFilterDialog().getRadioNewLayer().isSelected())
479
                        return;
480
                if(!new File(fileName).exists())
481
                        return;
482
                try {
483
                        RasterToolsUtil.loadLayer(getFilterDialog().getViewName(), fileName, null);
484
                } catch (RasterNotLoadException e) {
485
                        RasterToolsUtil.messageBoxError("error_cargar_capa", this, e);
486
                }
487

    
488
                if(filterDialog != null)
489
                        filterDialog.updateNewLayerText();
490
        }
491

    
492
        /*
493
         * (non-Javadoc)
494
         * @see org.gvsig.raster.grid.filter.FilterUIListener#actionValuesCompleted(java.util.EventObject)
495
         */
496
        public void actionValuesCompleted(EventObject e) {
497
                actionChangeProperties(e);
498
        }
499

    
500
        /*
501
         * (non-Javadoc)
502
         * @see org.gvsig.rastertools.IProcessActions#end(java.lang.Object)
503
         */
504
        public void end(Object param) {
505
                loadLayerInToc((String) param);
506
        }
507

    
508
        public void interrupted() {}
509
}