Statistics
| Revision:

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

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.swing.RasterSwingLibrary;
52
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
53
import org.gvsig.raster.tools.app.basic.raster.bean.previewbase.ParamStruct;
54
import org.gvsig.raster.tools.app.basic.raster.process.FilterProcess;
55
import org.gvsig.raster.tools.app.basic.raster.process.IProcessActions;
56
import org.gvsig.raster.tools.app.basic.tool.filter.ui.FilterPanel;
57
import org.gvsig.raster.util.RasterNotLoadException;
58

    
59
/**
60
 * <code>FilterListener</code> es la clase donde se procesar? gran parte del
61
 * c?digo que controla el panel para el manejo de un layer en la aplicaci?n de
62
 * filtros.
63
 *
64
 * @author BorSanZa - Borja S?nchez Zamorano 
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
        public void addNewParam(String name, Params params, Class<?> classFilter) {
145
                ParamStruct param = new ParamStruct();
146
                param.setFilterName(name);
147
                param.setFilterParam(params);
148
                param.setFilterClass(classFilter);
149
                paramsList.add(param);
150
        }
151

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
277
        public void drawImage(FLyrRaster rendering) {
278
                rendering.getRender().getFilterList().clear();
279

    
280
                if (getFilterPanel().getCBShowFilters().isSelected()) {
281
                        RasterFilterList filterList = rendering.getRender().getFilterList();
282

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

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

    
310
                String path = null;
311
                if (!getFilterPanel().getNewLayerPanel().isOnlyViewSelected()) {
312
                        path = getFilterPanel().getNewLayerPanel().getFileSelected();
313
                        if (path == null)
314
                                return;
315
                }
316

    
317
                FLyrRaster rendering = (FLyrRaster) getFilterPanel().getLayer();
318

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

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

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

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

    
368
                if(filterPanel != null)
369
                        filterPanel.updateNewLayerText();
370
        }
371

    
372
        public void actionValuesCompleted(EventObject e) {
373
                actionChangeProperties(e);
374
        }
375

    
376
        public void end(Object param) {
377
                loadLayerInToc((String) param);
378
        }
379

    
380
        public void interrupted() {}
381
}