Statistics
| Revision:

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

History | View | Annotate | Download (14.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.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.beans.previewbase.ParamStruct;
40
import org.gvsig.raster.dataset.IRasterDataSource;
41
import org.gvsig.raster.dataset.Params;
42
import org.gvsig.raster.dataset.Params.Param;
43
import org.gvsig.raster.grid.filter.FilterTypeException;
44
import org.gvsig.raster.grid.filter.FilterUIListener;
45
import org.gvsig.raster.grid.filter.IRasterFilterListManager;
46
import org.gvsig.raster.grid.filter.RasterFilter;
47
import org.gvsig.raster.grid.filter.RasterFilterList;
48
import org.gvsig.raster.grid.filter.RasterFilterListManager;
49
import org.gvsig.raster.grid.filter.RegistrableFilterListener;
50
import org.gvsig.raster.hierarchy.IRasterRendering;
51
import org.gvsig.raster.util.RasterNotLoadException;
52
import org.gvsig.raster.util.RasterToolsUtil;
53
import org.gvsig.raster.util.process.FilterProcess;
54
import org.gvsig.rastertools.filter.ui.FilterPanel;
55

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

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

    
85
                ArrayList listValues = getFilterDialog().getPropertiesComponent().getValues();
86

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

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

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

    
115
                RefreshDataProperties();
116
                actualParam = posParam;
117

    
118
                PropertiesComponent propertiesComponent = new PropertiesComponent();
119

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

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

    
149
        /*
150
         * (non-Javadoc)
151
         * @see org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener#actionChangeProperties(java.util.EventObject)
152
         */
153
        public void actionChangeProperties(EventObject e) {
154
                RefreshDataProperties();
155
                getFilterDialog().refreshPreview();
156
        }
157

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

    
166
        /*
167
         * (non-Javadoc)
168
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
169
         */
170
        public void actionPerformed(ActionEvent e) {
171
                getFilterDialog().refreshPreview();
172
        }
173

    
174
        /*
175
         * (non-Javadoc)
176
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementAdded(org.gvsig.gui.beans.treelist.event.TreeListEvent)
177
         */
178
        public void elementAdded(TreeListEvent e) {
179
                getFilterDialog().refreshPreview();
180
        }
181

    
182
        /*
183
         * (non-Javadoc)
184
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementMoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
185
         */
186
        public void elementMoved(TreeListEvent e) {
187
                getFilterDialog().refreshPreview();
188
        }
189

    
190
        /*
191
         * (non-Javadoc)
192
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementRemoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
193
         */
194
        public void elementRemoved(TreeListEvent e) {
195
                getFilterDialog().refreshPreview();
196
        }
197

    
198
        /**
199
         * @return the paramsList
200
         */
201
        public ArrayList getParamsList() {
202
                return paramsList;
203
        }
204

    
205
        /**
206
         * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma
207
         * de ArrayList tanto para el dibujado como cuando aceptan o aplican el panel.
208
         * @param rendering
209
         * @return
210
         */
211
        public ArrayList applyFilters(IRasterRendering rendering) {
212
                ArrayList listFilterUsed = new ArrayList();
213

    
214
                RasterFilterList filterList = new RasterFilterList();
215
                filterList.setEnv(rendering.getRenderFilterList().getEnv());
216
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
217

    
218
                // Conservamos filtros no visibles ya existentes
219
                ArrayList filtersInit = getFilterDialog().getFilterStatus();
220
                for (int i = 0; i < filtersInit.size(); i++) {
221
                        // Si es visible no hacemos nada
222
                        if (((RasterFilter) filtersInit.get(i)).isVisible())
223
                                continue;
224

    
225
                        RasterFilter obj = null;
226
                        for (int j = 0; j < stackManager.getRasterFilterList().size(); j++) {
227
                                Class classFilter = (Class) stackManager.getRasterFilterList().get(j);
228
                                try {
229
                                        obj = (RasterFilter) classFilter.newInstance();
230
                                        if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName()))
231
                                                break;
232
                                } catch (InstantiationException e) {
233
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
234
                                } catch (IllegalAccessException e) {
235
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
236
                                }
237
                        }
238

    
239
                        // Si no encontramos el filtro apropiado, nos olvidamos de el
240
                        if (obj == null)
241
                                continue;
242

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

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

    
280
                                                        ParamStruct newParam = new ParamStruct();
281
                                                        newParam.setFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
282
                                                        newParam.setFilterName(((ParamStruct) paramsList.get(j)).getFilterName());
283
                                                        newParam.setFilterParam(params);
284
                                                        listFilterUsed.add(newParam);
285
                                                } catch (CloneNotSupportedException e) {
286
                                                }
287
                                        }
288
                                }
289
                        }
290
                }
291
                return listFilterUsed;
292
        }
293

    
294
        /*
295
         * (non-Javadoc)
296
         * @see org.gvsig.gui.beans.imagenavigator.IClientImageNavigator#drawImage(java.awt.Graphics2D, double, double, double, double, double, int, int)
297
         */
298
        public void drawImage(IRasterRendering rendering) {
299
                rendering.getRenderFilterList().clear();
300

    
301
                if (getFilterDialog().getCBShowFilters().isSelected()) {
302
                        RasterFilterList filterList = rendering.getRenderFilterList();
303
                        RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
304

    
305
                        ArrayList listFilterUsed = applyFilters(rendering);
306
                        ArrayList exc = new ArrayList();
307
                        for (int i = 0; i < listFilterUsed.size(); i++) {
308
                                IRasterFilterListManager filterManager = stackManager.getManagerByFilterClass(((ParamStruct) listFilterUsed.get(i)).getFilterClass());
309
                                try {
310
                                        filterManager.addFilter(((ParamStruct) listFilterUsed.get(i)).getFilterClass(), ((ParamStruct) listFilterUsed.get(i)).getFilterParam());
311
                                } catch (FilterTypeException e) {
312
                                        exc.add(e);
313
                                }
314
                        }
315
                        if(exc.size() != 0) {
316
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, exc);
317
                                exc.clear();
318
                        }
319
                }
320
        }
321

    
322
        /**
323
         * Que acciones se ejecutaran al haber presionado el bot?n aceptar o aplicar
324
         */
325
        public void accept() {
326
                IRasterDataSource raster = ((FLyrRasterSE) getFilterDialog().getLayer()).getDataSource();
327
                if (raster == null)
328
                        return;
329

    
330
                String path = null;
331
                if (!getFilterDialog().getNewLayerPanel().isOnlyViewSelected()) {
332
                        path = getFilterDialog().getNewLayerPanel().getFileSelected();
333
                        if (path == null)
334
                                return;
335
                }
336

    
337
                //Rendering rendering = ((FLyrRasterSE) getFilterPanel().getLayer()).getRender();
338
                IRasterRendering rendering = (IRasterRendering) getFilterDialog().getLayer();
339

    
340
                // Array para guardar los filtros que se van a usar en forma de ParamStruct
341
                ArrayList listFilterUsed = applyFilters(rendering);
342

    
343
                if (filterDialog.getNewLayerPanel().isOnlyViewSelected()) {
344
                        try {
345
                                FilterProcess.addSelectedFilters(rendering.getRenderFilterList(), listFilterUsed);
346
                                ((FLyrRasterSE) getFilterDialog().getLayer()).setRenderFilterList(rendering.getRenderFilterList());
347
                                getFilterDialog().getLayer().getMapContext().invalidate();
348
                        } catch (FilterTypeException e) {
349
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
350
                        }
351
                } else {
352
                        FilterProcess filterProcess = new FilterProcess();
353
                        filterProcess.setActions(this);
354
                        filterProcess.addParam("rendering", rendering);
355
                        filterProcess.addParam("filename", path);
356
                        filterProcess.addParam("rasterdatasource", raster);
357
                        filterProcess.addParam("listfilterused", listFilterUsed);
358
                        filterProcess.start();
359
                }
360
        }
361

    
362
        /**
363
         * Devuelve el FilterPanel asociado al FilterListener
364
         * @return
365
         */
366
        public FilterPanel getFilterDialog() {
367
                return filterDialog;
368
        }
369

    
370
        /**
371
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
372
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
373
         */
374
        public void loadLayerInToc(String fileName) {
375
                if (!getFilterDialog().getNewLayerPanel().isNewLayerSelected())
376
                        return;
377
                if(!new File(fileName).exists())
378
                        return;
379
                try {
380
                        RasterToolsUtil.loadLayer(getFilterDialog().getViewName(), fileName, null);
381
                } catch (RasterNotLoadException e) {
382
                        RasterToolsUtil.messageBoxError("error_cargar_capa", this, e);
383
                }
384

    
385
                if(filterDialog != null)
386
                        filterDialog.updateNewLayerText();
387
        }
388

    
389
        /*
390
         * (non-Javadoc)
391
         * @see org.gvsig.raster.grid.filter.FilterUIListener#actionValuesCompleted(java.util.EventObject)
392
         */
393
        public void actionValuesCompleted(EventObject e) {
394
                actionChangeProperties(e);
395
        }
396

    
397
        /*
398
         * (non-Javadoc)
399
         * @see org.gvsig.rastertools.IProcessActions#end(java.lang.Object)
400
         */
401
        public void end(Object param) {
402
                loadLayerInToc((String) param);
403
        }
404

    
405
        public void interrupted() {}
406
}