Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / filter / FilterListener.java @ 1426

History | View | Annotate | Download (15.5 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;
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
import java.util.List;
28

    
29
import javax.swing.ListModel;
30

    
31
import org.gvsig.andami.PluginServices;
32
import org.gvsig.fmap.dal.coverage.RasterLocator;
33
import org.gvsig.fmap.dal.coverage.datastruct.Param;
34
import org.gvsig.fmap.dal.coverage.datastruct.Params;
35
import org.gvsig.fmap.dal.coverage.exception.FilterManagerException;
36
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
37
import org.gvsig.fmap.dal.coverage.grid.FilterUIListener;
38
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
39
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
40
import org.gvsig.fmap.dal.coverage.grid.RasterFilterListManager;
41
import org.gvsig.fmap.dal.coverage.grid.RegistrableFilterListener;
42
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
43
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
44
import org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener;
45
import org.gvsig.gui.beans.propertiespanel.PropertyStruct;
46
import org.gvsig.gui.beans.treelist.event.TreeListChangeEvent;
47
import org.gvsig.gui.beans.treelist.event.TreeListEvent;
48
import org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener;
49
import org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener;
50
import org.gvsig.raster.fmap.layers.FLyrRaster;
51
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
52
import org.gvsig.raster.tools.app.basic.raster.bean.previewbase.ParamStruct;
53
import org.gvsig.raster.tools.app.basic.raster.process.FilterProcess;
54
import org.gvsig.raster.tools.app.basic.raster.process.IProcessActions;
55
import org.gvsig.raster.tools.app.basic.tool.filter.ui.FilterPanel;
56
import org.gvsig.raster.util.RasterNotLoadException;
57

    
58
/**
59
 * <code>FilterListener</code> es la clase donde se procesar? gran parte del
60
 * c?digo que controla el panel para el manejo de un layer en la aplicaci?n de
61
 * filtros.
62
 *
63
 * @version 24/05/2007
64
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
65
 */
66
public class FilterListener implements ActionListener, TreeListComponentListener, TreeListChangeListener, PropertiesComponentListener, FilterUIListener, IProcessActions {
67
        private FilterPanel               filterPanel  = null;
68
        private int                       actualParam  = -1;
69
        private ArrayList<ParamStruct>    paramsList   = new ArrayList<ParamStruct>();
70

    
71
        /**
72
         * Construye un FilterListener especificando el FilterPanel asociado
73
         * @param filterDialog
74
         */
75
        public FilterListener(FilterPanel filterPanel) {
76
                this.filterPanel = filterPanel;
77
        }
78
        
79
        /**
80
         * Asignamos los valores del PropertiesComponent al Params seleccionado
81
         */
82
        @SuppressWarnings("unchecked")
83
        public void refreshDataProperties() {
84
                if (actualParam == -1)
85
                        return;
86

    
87
                ArrayList<PropertyStruct> listValues = getFilterPanel().getPropertiesComponent().getValues();
88

    
89
                Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
90
                for (int j = 0; j < listValues.size(); j++) {
91
                        PropertyStruct ps = (PropertyStruct) listValues.get(j);
92
                        params.changeParamValue(ps.getKey(), ps.getNewValue());
93
                }
94
        }
95

    
96
        /**
97
         * Obtener la posici?n del Param seleccionado en el ArrayList
98
         * @param filterName
99
         * @return
100
         */
101
        private int getParamSelected(String filterName) {
102
                for (int i = 0; i < paramsList.size(); i++) {
103
                        if (((ParamStruct) paramsList.get(i)).getFilterName().equals(filterName))
104
                                return i;
105
                }
106
                return -1;
107
        }
108

    
109
        /**
110
         * Cambiar el panel de propiedades central por el nuevo panel, segun el filtro
111
         * seleccionado que se pasa por par?metro.
112
         * @param filter
113
         */
114
        public void changePanel(String filter) {
115
                int posParam = getParamSelected(filter);
116

    
117
                refreshDataProperties();
118
                actualParam = posParam;
119

    
120
                PropertiesComponent propertiesComponent = new PropertiesComponent();
121

    
122
                if (posParam != -1) {
123
                        Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
124
                        if (params != null) {
125
                                Param paramPanel = params.getParamById("Panel");
126
                                if(        paramPanel != null && 
127
                                        paramPanel.getDefaultValue() instanceof RegistrableFilterListener)
128
                                        ((RegistrableFilterListener)paramPanel.getDefaultValue()).addFilterUIListener(this);
129
                                RasterToolsUtil.loadPropertiesFromWriterParams(propertiesComponent, params, new String[]{"FilterName"});
130
                        }
131
                }
132
                getFilterPanel().setNewPropertiesComponent(propertiesComponent, filter);
133
        }
134

    
135
        /**
136
         * A?adir un nuevo Params a la lista de Params que podemos manejar. Un Params
137
         * equivale a un filtro cargado. El hecho de trabajar con Params y no con
138
         * filtros, simplifica totalmente el panel. Sin tener que depender de los
139
         * filtros nada m?s que para el momento de dibujado o guardado.
140
         * @param name
141
         * @param params
142
         * @param classFilter
143
         */
144
        @SuppressWarnings("unchecked")
145
        public void addNewParam(String name, Params params, Class classFilter) {
146
                ParamStruct param = new ParamStruct();
147
                param.setFilterName(name);
148
                param.setFilterParam(params);
149
                param.setFilterClass(classFilter);
150
                paramsList.add(param);
151
        }
152

    
153
        /*
154
         * (non-Javadoc)
155
         * @see org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener#actionChangeProperties(java.util.EventObject)
156
         */
157
        public void actionChangeProperties(EventObject e) {
158
                refreshDataProperties();
159
                getFilterPanel().refreshPreview();
160
        }
161

    
162
        /*
163
         * (non-Javadoc)
164
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener#actionChangeSelection(org.gvsig.gui.beans.treelist.event.TreeListChangeEvent)
165
         */
166
        public void actionChangeSelection(TreeListChangeEvent e) {
167
                changePanel(e.getItem());
168
        }
169

    
170
        /*
171
         * (non-Javadoc)
172
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
173
         */
174
        public void actionPerformed(ActionEvent e) {
175
                getFilterPanel().refreshPreview();
176
        }
177

    
178
        /*
179
         * (non-Javadoc)
180
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementAdded(org.gvsig.gui.beans.treelist.event.TreeListEvent)
181
         */
182
        public void elementAdded(TreeListEvent e) {
183
                getFilterPanel().refreshPreview();
184
        }
185

    
186
        /*
187
         * (non-Javadoc)
188
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementMoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
189
         */
190
        public void elementMoved(TreeListEvent e) {
191
                getFilterPanel().refreshPreview();
192
        }
193

    
194
        /*
195
         * (non-Javadoc)
196
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementRemoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
197
         */
198
        public void elementRemoved(TreeListEvent e) {
199
                getFilterPanel().refreshPreview();
200
        }
201

    
202
        /**
203
         * @return the paramsList
204
         */
205
        public ArrayList<ParamStruct> getParamsList() {
206
                return paramsList;
207
        }
208

    
209
        /**
210
         * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma
211
         * de ArrayList tanto para el dibujado como cuando aceptan o aplican el panel.
212
         * @param layerRaster
213
         * @return
214
         */
215
        @SuppressWarnings("unchecked")
216
        public ArrayList<ParamStruct> applyFilters(FLyrRaster layerRaster) {
217
                ArrayList<ParamStruct> listFilterUsed = new ArrayList<ParamStruct>();
218

    
219
                int initDataType = layerRaster.getRender().getFilterList().getInitDataType();
220
                RasterFilterList filterList = RasterLocator.getManager().createEmptyFilterList(initDataType);
221
                filterList.setEnv(layerRaster.getRender().getFilterList().getEnv());
222
                filterList.setInitDataType(initDataType);
223
                List<Class<?>> registeredFilters = filterList.getRegisteredFilterList();
224

    
225
                // Conservamos filtros no visibles ya existentes
226
                List<RasterFilter> filtersInit =  getFilterPanel().getLayerVisualStatus().getLast().getFilterStatus();
227
                for (int i = 0; i < filtersInit.size(); i++) {
228
                        // Si es visible no hacemos nada
229
                        if (((RasterFilter) filtersInit.get(i)).isVisible())
230
                                continue;
231

    
232
                        RasterFilter obj = null;
233
                        for (int j = 0; j < registeredFilters.size(); j++) {
234
                                Class classFilter = (Class) registeredFilters.get(j);
235
                                try {
236
                                        obj = (RasterFilter) classFilter.newInstance();
237
                                        if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName()))
238
                                                break;
239
                                } catch (InstantiationException e) {
240
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
241
                                } catch (IllegalAccessException e) {
242
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
243
                                }
244
                        }
245

    
246
                        // Si no encontramos el filtro apropiado, nos olvidamos de el
247
                        if (obj == null)
248
                                continue;
249

    
250
                        // Si no es visible tenemos que conservar el filtro
251
                        try {
252
                                Params params = (Params) ((RasterFilter) filtersInit.get(i)).getUIParams(((RasterFilter) filtersInit.get(i)).getName()).clone();
253
                                // A?ado el parametro RenderBands a los parametros del filtro
254
                                String rgb = layerRaster.getRender().getRenderBands()[0] + " " + layerRaster.getRender().getRenderBands()[1] + " " + layerRaster.getRender().getRenderBands()[2];
255
                                params.setParam("RenderBands", rgb, 0, null);
256
                                params.setParam("alphaBand", new Integer(layerRaster.getAlphaBandNumber()), 0, null);
257
                                
258
                                ParamStruct newParam = new ParamStruct();
259
                                newParam.setFilterClass(obj.getClass());
260
                                newParam.setFilterName(((RasterFilter) filtersInit.get(i)).getName());
261
                                newParam.setFilterParam(params);
262
                                listFilterUsed.add(newParam);
263
                        } catch (CloneNotSupportedException e) {
264
                        }
265
                }
266

    
267
                // Metemos los filtros seleccionados en el panel
268
                ListModel list = getFilterPanel().getMainPanel().getTreeListContainer().getListModel();
269
                for (int i = 0; i < list.getSize(); i++) {
270
                        Hashtable hastTable = getFilterPanel().getMainPanel().getTreeListContainer().getMap();
271
                        for (int j = 0; j < paramsList.size(); j++) {
272
                                boolean active = true;
273
                                Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById("enabled");
274
                                if ((param != null) &&
275
                                        param.getDefaultValue() instanceof Boolean &&
276
                                        ((((Boolean)param.getDefaultValue()).booleanValue()) == false))
277
                                        active = false;
278
                                if (active) {
279
                                        if (((ParamStruct) paramsList.get(j)).getFilterName().equals(hastTable.get(list.getElementAt(i)))) {
280
                                                try {
281
                                                        Params params = (Params) ((ParamStruct) paramsList.get(j)).getFilterParam().clone();
282
                                                        // A?ado el parametro RenderBands a los parametros del filtro
283
                                                        String rgb = layerRaster.getRender().getRenderBands()[0] + " " + layerRaster.getRender().getRenderBands()[1] + " " + layerRaster.getRender().getRenderBands()[2];
284
                                                        params.setParam("RenderBands", rgb, 0, null);
285
                                                        params.setParam("alphaBand", new Integer(layerRaster.getAlphaBandNumber()), 0, null);
286

    
287
                                                        ParamStruct newParam = new ParamStruct();
288
                                                        newParam.setFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
289
                                                        newParam.setFilterName(((ParamStruct) paramsList.get(j)).getFilterName());
290
                                                        newParam.setFilterParam(params);
291
                                                        listFilterUsed.add(newParam);
292
                                                } catch (CloneNotSupportedException e) {
293
                                                }
294
                                        }
295
                                }
296
                        }
297
                }
298
                return listFilterUsed;
299
        }
300

    
301
        /*
302
         * (non-Javadoc)
303
         * @see org.gvsig.gui.beans.imagenavigator.IClientImageNavigator#drawImage(java.awt.Graphics2D, double, double, double, double, double, int, int)
304
         */
305
        public void drawImage(FLyrRaster rendering) {
306
                rendering.getRender().getFilterList().clear();
307

    
308
                if (getFilterPanel().getCBShowFilters().isSelected()) {
309
                        RasterFilterList filterList = rendering.getRender().getFilterList();
310

    
311
                        ArrayList<ParamStruct> listFilterUsed = applyFilters(rendering);
312
                        ArrayList<Exception> exc = new ArrayList<Exception>();
313
                        for (int i = 0; i < listFilterUsed.size(); i++) {
314
                                try {
315
                                        RasterFilterListManager filterManager = filterList.getManagerByFilterClass(((ParamStruct) listFilterUsed.get(i)).getFilterClass());
316
                                        filterManager.addFilter(((ParamStruct) listFilterUsed.get(i)).getFilterClass(), ((ParamStruct) listFilterUsed.get(i)).getFilterParam());
317
                                } catch (FilterTypeException e) {
318
                                        exc.add(e);
319
                                } catch (FilterManagerException e1) {
320
                                        exc.add(e1);
321
                                }
322
                        }
323
                        if(exc.size() != 0) {
324
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, exc);
325
                                exc.clear();
326
                        }
327
                }
328
        }
329

    
330
        /**
331
         * Que acciones se ejecutaran al haber presionado el bot?n aceptar o aplicar
332
         */
333
        public void accept() {
334
                RasterDataStore raster = ((FLyrRaster) getFilterPanel().getLayer()).getDataStore();
335
                if (raster == null)
336
                        return;
337

    
338
                String path = null;
339
                if (!getFilterPanel().getNewLayerPanel().isOnlyViewSelected()) {
340
                        path = getFilterPanel().getNewLayerPanel().getFileSelected();
341
                        if (path == null)
342
                                return;
343
                }
344

    
345
                //Rendering rendering = ((FLyrRaster) getFilterPanel().getLayer()).getRender();
346
                FLyrRaster rendering = (FLyrRaster) getFilterPanel().getLayer();
347

    
348
                // Array para guardar los filtros que se van a usar en forma de ParamStruct
349
                ArrayList<ParamStruct> listFilterUsed = applyFilters(rendering);
350

    
351
                if (filterPanel.getNewLayerPanel().isOnlyViewSelected()) {
352
                        try {
353
                                ParamStruct.addSelectedFilters(rendering.getRender().getFilterList(), listFilterUsed);
354
                                ((FLyrRaster) getFilterPanel().getLayer()).getRender().setFilterList(rendering.getRender().getFilterList());
355
                                getFilterPanel().getLayer().getMapContext().invalidate();
356
                        } catch (FilterTypeException e) {
357
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
358
                        } catch (FilterManagerException e) {
359
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
360
                        }
361
                } else {
362
                        FilterProcess filterProcess = new FilterProcess();
363
                        filterProcess.setActions(this);
364
                        filterProcess.addParam("rendering", rendering);
365
                        filterProcess.addParam("filename", path);
366
                        filterProcess.addParam("rasterdatasource", raster);
367
                        filterProcess.addParam("layer", ((FLyrRaster) getFilterPanel().getLayer()));
368
                        filterProcess.addParam("listfilterused", listFilterUsed);
369
                        filterProcess.start();
370
                        filterProcess = null;
371
                }
372
        }
373

    
374
        /**
375
         * Devuelve el FilterPanel asociado al FilterListener
376
         * @return
377
         */
378
        public FilterPanel getFilterPanel() {
379
                return filterPanel;
380
        }
381

    
382
        /**
383
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
384
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
385
         */
386
        public void loadLayerInToc(String fileName) {
387
                if (!getFilterPanel().getNewLayerPanel().isNewLayerSelected())
388
                        return;
389
                if(!new File(fileName).exists())
390
                        return;
391
                try {
392
                        RasterToolsUtil.loadLayer(getFilterPanel().getViewName(), fileName, null);
393
                } catch (RasterNotLoadException e) {
394
                        RasterToolsUtil.messageBoxError("error_cargar_capa", this, e);
395
                }
396

    
397
                if(filterPanel != null)
398
                        filterPanel.updateNewLayerText();
399
        }
400

    
401
        /*
402
         * (non-Javadoc)
403
         * @see org.gvsig.raster.grid.filter.FilterUIListener#actionValuesCompleted(java.util.EventObject)
404
         */
405
        public void actionValuesCompleted(EventObject e) {
406
                actionChangeProperties(e);
407
        }
408

    
409
        /*
410
         * (non-Javadoc)
411
         * @see org.gvsig.rastertools.IProcessActions#end(java.lang.Object)
412
         */
413
        public void end(Object param) {
414
                loadLayerInToc((String) param);
415
        }
416

    
417
        public void interrupted() {}
418
}