Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / branches / org.gvsig.raster.tools_dataaccess_refactoring / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / filter / FilterListener.java @ 2308

History | View | Annotate | Download (14.1 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
 * @author BorSanZa - Borja S?nchez Zamorano 
64
 */
65
public class FilterListener implements ActionListener, TreeListComponentListener, TreeListChangeListener, PropertiesComponentListener, FilterUIListener, IProcessActions {
66
        private FilterPanel               filterPanel  = null;
67
        private int                       actualParam  = -1;
68
        private ArrayList<ParamStruct>    paramsList   = new ArrayList<ParamStruct>();
69

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

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

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

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

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

    
116
                refreshDataProperties();
117
                actualParam = posParam;
118

    
119
                PropertiesComponent propertiesComponent = new PropertiesComponent();
120

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

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

    
151
        public void actionChangeProperties(EventObject e) {
152
                refreshDataProperties();
153
                getFilterPanel().refreshPreview();
154
        }
155

    
156
        public void actionChangeSelection(TreeListChangeEvent e) {
157
                changePanel(e.getItem());
158
        }
159

    
160
        public void actionPerformed(ActionEvent e) {
161
                getFilterPanel().refreshPreview();
162
        }
163

    
164
        public void elementAdded(TreeListEvent e) {
165
                getFilterPanel().refreshPreview();
166
        }
167

    
168
        public void elementMoved(TreeListEvent e) {
169
                getFilterPanel().refreshPreview();
170
        }
171

    
172
        public void elementRemoved(TreeListEvent e) {
173
                getFilterPanel().refreshPreview();
174
        }
175

    
176
        /**
177
         * @return the paramsList
178
         */
179
        public ArrayList<ParamStruct> getParamsList() {
180
                return paramsList;
181
        }
182

    
183
        /**
184
         * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma
185
         * de ArrayList tanto para el dibujado como cuando aceptan o aplican el panel.
186
         * @param layerRaster
187
         * @return
188
         */
189
        public ArrayList<ParamStruct> applyFilters(FLyrRaster layerRaster) {
190
                ArrayList<ParamStruct> listFilterUsed = new ArrayList<ParamStruct>();
191

    
192
                int initDataType = layerRaster.getRender().getFilterList().getInitDataType();
193
                RasterFilterList filterList = RasterLocator.getManager().createEmptyFilterList(initDataType);
194
                filterList.setEnv(layerRaster.getRender().getFilterList().getEnv());
195
                filterList.setInitDataType(initDataType);
196
                List<Class<?>> registeredFilters = filterList.getRegisteredFilterList();
197

    
198
                // Conservamos filtros no visibles ya existentes
199
                List<RasterFilter> filtersInit =  getFilterPanel().getLayerVisualStatus().getLast().getFilterStatus();
200
                for (int i = 0; i < filtersInit.size(); i++) {
201
                        // Si es visible no hacemos nada
202
                        if (((RasterFilter) filtersInit.get(i)).isVisible())
203
                                continue;
204

    
205
                        RasterFilter obj = null;
206
                        for (int j = 0; j < registeredFilters.size(); j++) {
207
                                Class<?> classFilter = (Class<?>) registeredFilters.get(j);
208
                                try {
209
                                        obj = (RasterFilter) classFilter.newInstance();
210
                                        if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName()))
211
                                                break;
212
                                } catch (InstantiationException e) {
213
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
214
                                } catch (IllegalAccessException e) {
215
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
216
                                }
217
                        }
218

    
219
                        // Si no encontramos el filtro apropiado, nos olvidamos de el
220
                        if (obj == null)
221
                                continue;
222

    
223
                        // Si no es visible tenemos que conservar el filtro
224
                        try {
225
                                Params params = (Params) ((RasterFilter) filtersInit.get(i)).getUIParams(((RasterFilter) filtersInit.get(i)).getName()).clone();
226
                                // A?ado el parametro RenderBands a los parametros del filtro
227
                                String rgb = layerRaster.getRender().getRenderBands()[0] + " " + layerRaster.getRender().getRenderBands()[1] + " " + layerRaster.getRender().getRenderBands()[2];
228
                                params.setParam("RenderBands", rgb, 0, null);
229
                                params.setParam("alphaBand", new Integer(layerRaster.getAlphaBandNumber()), 0, null);
230
                                
231
                                ParamStruct newParam = new ParamStruct();
232
                                newParam.setFilterClass(obj.getClass());
233
                                newParam.setFilterName(((RasterFilter) filtersInit.get(i)).getName());
234
                                newParam.setFilterParam(params);
235
                                listFilterUsed.add(newParam);
236
                        } catch (CloneNotSupportedException e) {
237
                        }
238
                }
239

    
240
                // Metemos los filtros seleccionados en el panel
241
                ListModel list = getFilterPanel().getMainPanel().getTreeListContainer().getListModel();
242
                for (int i = 0; i < list.getSize(); i++) {
243
                        Hashtable<?, ?> hastTable = getFilterPanel().getMainPanel().getTreeListContainer().getMap();
244
                        for (int j = 0; j < paramsList.size(); j++) {
245
                                boolean active = true;
246
                                Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById("enabled");
247
                                if ((param != null) &&
248
                                        param.getDefaultValue() instanceof Boolean &&
249
                                        ((((Boolean)param.getDefaultValue()).booleanValue()) == false))
250
                                        active = false;
251
                                if (active) {
252
                                        if (((ParamStruct) paramsList.get(j)).getFilterName().equals(hastTable.get(list.getElementAt(i)))) {
253
                                                try {
254
                                                        Params params = (Params) ((ParamStruct) paramsList.get(j)).getFilterParam().clone();
255
                                                        // A?ado el parametro RenderBands a los parametros del filtro
256
                                                        String rgb = layerRaster.getRender().getRenderBands()[0] + " " + layerRaster.getRender().getRenderBands()[1] + " " + layerRaster.getRender().getRenderBands()[2];
257
                                                        params.setParam("RenderBands", rgb, 0, null);
258
                                                        params.setParam("alphaBand", new Integer(layerRaster.getAlphaBandNumber()), 0, null);
259

    
260
                                                        ParamStruct newParam = new ParamStruct();
261
                                                        newParam.setFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
262
                                                        newParam.setFilterName(((ParamStruct) paramsList.get(j)).getFilterName());
263
                                                        newParam.setFilterParam(params);
264
                                                        listFilterUsed.add(newParam);
265
                                                } catch (CloneNotSupportedException e) {
266
                                                }
267
                                        }
268
                                }
269
                        }
270
                }
271
                return listFilterUsed;
272
        }
273

    
274
        public void drawImage(FLyrRaster rendering) {
275
                rendering.getRender().getFilterList().clear();
276

    
277
                if (getFilterPanel().getCBShowFilters().isSelected()) {
278
                        RasterFilterList filterList = rendering.getRender().getFilterList();
279

    
280
                        ArrayList<ParamStruct> listFilterUsed = applyFilters(rendering);
281
                        ArrayList<Exception> exc = new ArrayList<Exception>();
282
                        for (int i = 0; i < listFilterUsed.size(); i++) {
283
                                try {
284
                                        RasterFilterListManager filterManager = filterList.getManagerByFilterClass(((ParamStruct) listFilterUsed.get(i)).getFilterClass());
285
                                        filterManager.addFilter(((ParamStruct) listFilterUsed.get(i)).getFilterClass(), ((ParamStruct) listFilterUsed.get(i)).getFilterParam());
286
                                } catch (FilterTypeException e) {
287
                                        exc.add(e);
288
                                } catch (FilterManagerException e1) {
289
                                        exc.add(e1);
290
                                }
291
                        }
292
                        if(exc.size() != 0) {
293
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, exc);
294
                                exc.clear();
295
                        }
296
                }
297
        }
298

    
299
        /**
300
         * Que acciones se ejecutaran al haber presionado el bot?n aceptar o aplicar
301
         */
302
        public void accept() {
303
                RasterDataStore raster = ((FLyrRaster) getFilterPanel().getLayer()).getDataStore();
304
                if (raster == null)
305
                        return;
306

    
307
                String path = null;
308
                if (!getFilterPanel().getNewLayerPanel().isOnlyViewSelected()) {
309
                        path = getFilterPanel().getNewLayerPanel().getFileSelected();
310
                        if (path == null)
311
                                return;
312
                }
313

    
314
                //Rendering rendering = ((FLyrRaster) getFilterPanel().getLayer()).getRender();
315
                FLyrRaster rendering = (FLyrRaster) getFilterPanel().getLayer();
316

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

    
320
                if (filterPanel.getNewLayerPanel().isOnlyViewSelected()) {
321
                        try {
322
                                ParamStruct.addSelectedFilters(rendering.getRender().getFilterList(), listFilterUsed);
323
                                ((FLyrRaster) getFilterPanel().getLayer()).getRender().setFilterList(rendering.getRender().getFilterList());
324
                                getFilterPanel().getLayer().getMapContext().invalidate();
325
                        } catch (FilterTypeException e) {
326
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
327
                        } catch (FilterManagerException e) {
328
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
329
                        }
330
                } else {
331
                        FilterProcess filterProcess = new FilterProcess();
332
                        filterProcess.setActions(this);
333
                        filterProcess.addParam("rendering", rendering);
334
                        filterProcess.addParam("filename", path);
335
                        filterProcess.addParam("rasterdatasource", raster);
336
                        filterProcess.addParam("layer", ((FLyrRaster) getFilterPanel().getLayer()));
337
                        filterProcess.addParam("listfilterused", listFilterUsed);
338
                        filterProcess.start();
339
                        filterProcess = null;
340
                }
341
        }
342

    
343
        /**
344
         * Devuelve el FilterPanel asociado al FilterListener
345
         * @return
346
         */
347
        public FilterPanel getFilterPanel() {
348
                return filterPanel;
349
        }
350

    
351
        /**
352
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
353
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
354
         */
355
        public void loadLayerInToc(String fileName) {
356
                if (!getFilterPanel().getNewLayerPanel().isNewLayerSelected())
357
                        return;
358
                if(!new File(fileName).exists())
359
                        return;
360
                try {
361
                        RasterToolsUtil.loadLayer(getFilterPanel().getViewName(), fileName, null);
362
                } catch (RasterNotLoadException e) {
363
                        RasterToolsUtil.messageBoxError("error_cargar_capa", this, e);
364
                }
365

    
366
                if(filterPanel != null)
367
                        filterPanel.updateNewLayerText();
368
        }
369

    
370
        public void actionValuesCompleted(EventObject e) {
371
                actionChangeProperties(e);
372
        }
373

    
374
        public void end(Object param) {
375
                loadLayerInToc((String) param);
376
        }
377

    
378
        public void interrupted() {}
379
}