Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / filter / FilterListener.java @ 19564

History | View | Annotate | Download (15.3 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.ListModel;
29

    
30
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
31
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
32
import org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener;
33
import org.gvsig.gui.beans.propertiespanel.PropertyStruct;
34
import org.gvsig.gui.beans.treelist.event.TreeListChangeEvent;
35
import org.gvsig.gui.beans.treelist.event.TreeListEvent;
36
import org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener;
37
import org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener;
38
import org.gvsig.raster.IProcessActions;
39
import org.gvsig.raster.dataset.IRasterDataSource;
40
import org.gvsig.raster.dataset.Params;
41
import org.gvsig.raster.dataset.Params.Param;
42
import org.gvsig.raster.grid.filter.FilterTypeException;
43
import org.gvsig.raster.grid.filter.FilterUIListener;
44
import org.gvsig.raster.grid.filter.IRasterFilterListManager;
45
import org.gvsig.raster.grid.filter.RasterFilter;
46
import org.gvsig.raster.grid.filter.RasterFilterList;
47
import org.gvsig.raster.grid.filter.RasterFilterListManager;
48
import org.gvsig.raster.grid.filter.RegistrableFilterListener;
49
import org.gvsig.raster.hierarchy.IRasterRendering;
50
import org.gvsig.raster.util.RasterNotLoadException;
51
import org.gvsig.raster.util.RasterToolsUtil;
52
import org.gvsig.rastertools.filter.ui.FilterPanel;
53

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

    
75
                /**
76
                 * @return the filterName
77
                 */
78
                public String getFilterName() {
79
                        return filterName;
80
                }
81

    
82
                /**
83
                 * @param filterName the filterName to set
84
                 */
85
                public void setFilterName(String filterName) {
86
                        this.filterName = filterName;
87
                }
88

    
89
                /**
90
                 * @return the filterParam
91
                 */
92
                public Params getFilterParam() {
93
                        return filterParam;
94
                }
95

    
96
                /**
97
                 * @param filterParam the filterParam to set
98
                 */
99
                public void setFilterParam(Params filterParam) {
100
                        this.filterParam = filterParam;
101
                }
102

    
103
                /**
104
                 * @return the filterClass
105
                 */
106
                public Class getFilterClass() {
107
                        return filterClass;
108
                }
109

    
110
                /**
111
                 * @param filterClass the filterClass to set
112
                 */
113
                public void setFilterClass(Class filterClass) {
114
                        this.filterClass = filterClass;
115
                }
116
        }
117

    
118
        /**
119
         * Construye un FilterListener especificando el FilterPanel asociado
120
         * @param filterDialog
121
         */
122
        public FilterListener(FilterPanel filterDialog) {
123
                this.filterDialog = filterDialog;
124
        }
125
        
126
        /**
127
         * Asignamos los valores del PropertiesComponent al Params seleccionado
128
         */
129
        public void RefreshDataProperties() {
130
                if (actualParam == -1)
131
                        return;
132

    
133
                ArrayList listValues = getFilterDialog().getPropertiesComponent().getValues();
134

    
135
                Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
136
                for (int j = 0; j < listValues.size(); j++) {
137
                        PropertyStruct ps = (PropertyStruct) listValues.get(j);
138
                        params.changeParamValue(ps.getKey(), ps.getNewValue());
139
                }
140
        }
141

    
142
        /**
143
         * Obtener la posici?n del Param seleccionado en el ArrayList
144
         * @param filterName
145
         * @return
146
         */
147
        private int getParamSelected(String filterName) {
148
                for (int i = 0; i < paramsList.size(); i++) {
149
                        if (((ParamStruct) paramsList.get(i)).getFilterName().equals(filterName))
150
                                return i;
151
                }
152
                return -1;
153
        }
154

    
155
        /**
156
         * Cambiar el panel de propiedades central por el nuevo panel, segun el filtro
157
         * seleccionado que se pasa por par?metro.
158
         * @param filter
159
         */
160
        public void changePanel(String filter) {
161
                int posParam = getParamSelected(filter);
162

    
163
                RefreshDataProperties();
164
                actualParam = posParam;
165

    
166
                PropertiesComponent propertiesComponent = new PropertiesComponent();
167

    
168
                if (posParam != -1) {
169
                        Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
170
                        if (params != null) {
171
                                Param paramPanel = params.getParamById("Panel");
172
                                if(paramPanel != null && paramPanel.defaultValue instanceof RegistrableFilterListener)
173
                                        ((RegistrableFilterListener)paramPanel.defaultValue).addFilterUIListener(this);
174
                                RasterToolsUtil.loadPropertiesFromWriterParams(propertiesComponent, params, new String[]{"FilterName"});
175
                        }
176
                }
177
                getFilterDialog().setNewPropertiesComponent(propertiesComponent, filter);
178
        }
179

    
180
        /**
181
         * A?adir un nuevo Params a la lista de Params que podemos manejar. Un Params
182
         * equivale a un filtro cargado. El hecho de trabajar con Params y no con
183
         * filtros, simplifica totalmente el panel. Sin tener que depender de los
184
         * filtros nada m?s que para el momento de dibujado o guardado.
185
         * @param name
186
         * @param params
187
         * @param classFilter
188
         */
189
        public void addNewParam(String name, Params params, Class classFilter) {
190
                ParamStruct param = new ParamStruct();
191
                param.setFilterName(name);
192
                param.setFilterParam(params);
193
                param.setFilterClass(classFilter);
194
                paramsList.add(param);
195
        }
196

    
197
        /*
198
         * (non-Javadoc)
199
         * @see org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener#actionChangeProperties(java.util.EventObject)
200
         */
201
        public void actionChangeProperties(EventObject e) {
202
                RefreshDataProperties();
203
                getFilterDialog().refreshPreview();
204
        }
205

    
206
        /*
207
         * (non-Javadoc)
208
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener#actionChangeSelection(org.gvsig.gui.beans.treelist.event.TreeListChangeEvent)
209
         */
210
        public void actionChangeSelection(TreeListChangeEvent e) {
211
                changePanel(e.getItem());
212
        }
213

    
214
        /*
215
         * (non-Javadoc)
216
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
217
         */
218
        public void actionPerformed(ActionEvent e) {
219
                getFilterDialog().refreshPreview();
220
        }
221

    
222
        /*
223
         * (non-Javadoc)
224
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementAdded(org.gvsig.gui.beans.treelist.event.TreeListEvent)
225
         */
226
        public void elementAdded(TreeListEvent e) {
227
                getFilterDialog().refreshPreview();
228
        }
229

    
230
        /*
231
         * (non-Javadoc)
232
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementMoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
233
         */
234
        public void elementMoved(TreeListEvent e) {
235
                getFilterDialog().refreshPreview();
236
        }
237

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

    
246
        /**
247
         * @return the paramsList
248
         */
249
        public ArrayList getParamsList() {
250
                return paramsList;
251
        }
252

    
253
        /**
254
         * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma
255
         * de ArrayList tanto para el dibujado como cuando aceptan o aplican el panel.
256
         * @param rendering
257
         * @return
258
         */
259
        public ArrayList applyFilters(IRasterRendering rendering) {
260
                ArrayList listFilterUsed = new ArrayList();
261

    
262
                RasterFilterList filterList = new RasterFilterList();
263
                filterList.setEnv(rendering.getRenderFilterList().getEnv());
264
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
265

    
266
                // Conservamos filtros no visibles ya existentes
267
                ArrayList filtersInit = getFilterDialog().getFilterStatus();
268
                for (int i = 0; i < filtersInit.size(); i++) {
269
                        // Si es visible no hacemos nada
270
                        if (((RasterFilter) filtersInit.get(i)).isVisible())
271
                                continue;
272

    
273
                        RasterFilter obj = null;
274
                        for (int j = 0; j < stackManager.getRasterFilterList().size(); j++) {
275
                                Class classFilter = (Class) stackManager.getRasterFilterList().get(j);
276
                                try {
277
                                        obj = (RasterFilter) classFilter.newInstance();
278
                                        if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName()))
279
                                                break;
280
                                } catch (InstantiationException e) {
281
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
282
                                } catch (IllegalAccessException e) {
283
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
284
                                }
285
                        }
286

    
287
                        // Si no encontramos el filtro apropiado, nos olvidamos de el
288
                        if (obj == null)
289
                                continue;
290

    
291
                        // Si no es visible tenemos que conservar el filtro
292
                        try {
293
                                Params params = (Params) ((RasterFilter) filtersInit.get(i)).getUIParams(((RasterFilter) filtersInit.get(i)).getName()).clone();
294
                                // A?ado el parametro RenderBands a los parametros del filtro
295
                                String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
296
                                params.setParam("RenderBands", rgb, 0, null);
297

    
298
                                ParamStruct newParam = new ParamStruct();
299
                                newParam.setFilterClass(obj.getClass());
300
                                newParam.setFilterName(((RasterFilter) filtersInit.get(i)).getName());
301
                                newParam.setFilterParam(params);
302
                                listFilterUsed.add(newParam);
303
                        } catch (CloneNotSupportedException e) {
304
                        }
305
                }
306

    
307
                // Metemos los filtros seleccionados en el panel
308
                ListModel list = getFilterDialog().getMainPanel().getTreeListContainer().getListModel();
309
                for (int i = 0; i < list.getSize(); i++) {
310
                        Hashtable hastTable = getFilterDialog().getMainPanel().getTreeListContainer().getMap();
311
                        for (int j = 0; j < paramsList.size(); j++) {
312
                                boolean active = true;
313
                                Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById("enabled");
314
                                if ((param != null) &&
315
                                        param.defaultValue instanceof Boolean &&
316
                                        ((((Boolean)param.defaultValue).booleanValue()) == false))
317
                                        active = false;
318
                                if (active) {
319
                                        if (((ParamStruct) paramsList.get(j)).getFilterName().equals(hastTable.get(list.getElementAt(i)))) {
320
                                                try {
321
                                                        Params params = (Params) ((ParamStruct) paramsList.get(j)).getFilterParam().clone();
322
                                                        // A?ado el parametro RenderBands a los parametros del filtro
323
                                                        String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
324
                                                        params.setParam("RenderBands", rgb, 0, null);
325

    
326
                                                        ParamStruct newParam = new ParamStruct();
327
                                                        newParam.setFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
328
                                                        newParam.setFilterName(((ParamStruct) paramsList.get(j)).getFilterName());
329
                                                        newParam.setFilterParam(params);
330
                                                        listFilterUsed.add(newParam);
331
                                                } catch (CloneNotSupportedException e) {
332
                                                }
333
                                        }
334
                                }
335
                        }
336
                }
337
                return listFilterUsed;
338
        }
339

    
340
        /*
341
         * (non-Javadoc)
342
         * @see org.gvsig.gui.beans.imagenavigator.IClientImageNavigator#drawImage(java.awt.Graphics2D, double, double, double, double, double, int, int)
343
         */
344
        public void drawImage(IRasterRendering rendering) {
345
                rendering.getRenderFilterList().clear();
346

    
347
                if (getFilterDialog().getCBShowFilters().isSelected()) {
348
                        RasterFilterList filterList = rendering.getRenderFilterList();
349
                        RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
350

    
351
                        ArrayList listFilterUsed = applyFilters(rendering);
352
                        ArrayList exc = new ArrayList();
353
                        for (int i = 0; i < listFilterUsed.size(); i++) {
354
                                IRasterFilterListManager filterManager = stackManager.getManagerByFilterClass(((ParamStruct) listFilterUsed.get(i)).getFilterClass());
355
                                try {
356
                                        filterManager.addFilter(((ParamStruct) listFilterUsed.get(i)).getFilterClass(), ((ParamStruct) listFilterUsed.get(i)).getFilterParam());
357
                                } catch (FilterTypeException e) {
358
                                        exc.add(e);
359
                                }
360
                        }
361
                        if(exc.size() != 0) {
362
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, exc);
363
                                exc.clear();
364
                        }
365
                }
366
        }
367

    
368
        /**
369
         * Que acciones se ejecutaran al haber presionado el bot?n aceptar o aplicar
370
         */
371
        public void accept() {
372
                IRasterDataSource raster = ((FLyrRasterSE) getFilterDialog().getLayer()).getDataSource();
373
                if (raster == null)
374
                        return;
375

    
376
                String path = null;
377
                if (!getFilterDialog().getNewLayerPanel().getRadioOnlyView().isSelected()) {
378
                        path = getFilterDialog().getNewLayerPanel().getFileSelected();
379
                        if (path == null)
380
                                return;
381
                }
382

    
383
                //Rendering rendering = ((FLyrRasterSE) getFilterPanel().getLayer()).getRender();
384
                IRasterRendering rendering = (IRasterRendering) getFilterDialog().getLayer();
385

    
386
                // Array para guardar los filtros que se van a usar en forma de ParamStruct
387
                ArrayList listFilterUsed = applyFilters(rendering);
388

    
389
                if (filterDialog.getNewLayerPanel().getRadioOnlyView().isSelected()) {
390
                        try {
391
                                FilterProcess.addSelectedFilters(rendering.getRenderFilterList(), listFilterUsed);
392
                                ((FLyrRasterSE) getFilterDialog().getLayer()).setRenderFilterList(rendering.getRenderFilterList());
393
                                getFilterDialog().getLayer().getMapContext().invalidate();
394
                        } catch (FilterTypeException e) {
395
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
396
                        }
397
                } else {
398
                        FilterProcess filterProcess = new FilterProcess();
399
                        filterProcess.setActions(this);
400
                        filterProcess.addParam("rendering", rendering);
401
                        filterProcess.addParam("filename", path);
402
                        filterProcess.addParam("rasterdatasource", raster);
403
                        filterProcess.addParam("listfilterused", listFilterUsed);
404
                        filterProcess.start();
405
                }
406
        }
407

    
408
        /**
409
         * Devuelve el FilterPanel asociado al FilterListener
410
         * @return
411
         */
412
        public FilterPanel getFilterDialog() {
413
                return filterDialog;
414
        }
415

    
416
        /**
417
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
418
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
419
         */
420
        public void loadLayerInToc(String fileName) {
421
                if (!getFilterDialog().getNewLayerPanel().getRadioNewLayer().isSelected())
422
                        return;
423
                if(!new File(fileName).exists())
424
                        return;
425
                try {
426
                        RasterToolsUtil.loadLayer(getFilterDialog().getViewName(), fileName, null);
427
                } catch (RasterNotLoadException e) {
428
                        RasterToolsUtil.messageBoxError("error_cargar_capa", this, e);
429
                }
430

    
431
                if(filterDialog != null)
432
                        filterDialog.updateNewLayerText();
433
        }
434

    
435
        /*
436
         * (non-Javadoc)
437
         * @see org.gvsig.raster.grid.filter.FilterUIListener#actionValuesCompleted(java.util.EventObject)
438
         */
439
        public void actionValuesCompleted(EventObject e) {
440
                actionChangeProperties(e);
441
        }
442

    
443
        /*
444
         * (non-Javadoc)
445
         * @see org.gvsig.rastertools.IProcessActions#end(java.lang.Object)
446
         */
447
        public void end(Object param) {
448
                loadLayerInToc((String) param);
449
        }
450

    
451
        public void interrupted() {}
452
}