Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / enhanced / ui / PreviewFiltering.java @ 20947

History | View | Annotate | Download (7.44 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 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.enhanced.ui;
20

    
21
import java.util.ArrayList;
22

    
23
import org.gvsig.raster.beans.previewbase.IPreviewRenderProcess;
24
import org.gvsig.raster.beans.previewbase.ParamStruct;
25
import org.gvsig.raster.dataset.Params;
26
import org.gvsig.raster.grid.filter.FilterTypeException;
27
import org.gvsig.raster.grid.filter.IRasterFilterListManager;
28
import org.gvsig.raster.grid.filter.RasterFilter;
29
import org.gvsig.raster.grid.filter.RasterFilterList;
30
import org.gvsig.raster.grid.filter.RasterFilterListManager;
31
import org.gvsig.raster.hierarchy.IRasterRendering;
32
import org.gvsig.raster.util.RasterToolsUtil;
33

    
34
import com.iver.andami.PluginServices;
35
/**
36
 * Procesado de la imagen para la previsualizaci?n. Para poder usar esta clase despu?s de instanciarla
37
 * habr? que asignarle un valor a showFiltersSelected aunque por defecto est? a true por lo que se
38
 * visualizaran los cambios sin problemas, asigna una lista de filtros inicial (que ya tenga el raster
39
 * aplicado) con setFilterStatus y asignar los filtros que queramos aplicar con addNewParam (una llamada
40
 * por cada filtro).
41
 * 
42
 * 19/02/2008
43
 * @author Nacho Brodin nachobrodin@gmail.com
44
 */
45
public class PreviewFiltering implements IPreviewRenderProcess {
46

    
47
        private boolean          showFiltersSelected     = true;
48
        private ArrayList        paramsList              = new ArrayList();
49
        private ArrayList        filtersInit             = new ArrayList();
50
        
51
        /**
52
         * Flag de selecci?n de activaci?n y desactivaci?n
53
         * @param show
54
         */
55
        public void showFiltersSelected(boolean show) {
56
                this.showFiltersSelected = show;
57
        }
58
        
59
        /**
60
         * Obtiene la lista de par?metros
61
         * @return the paramsList
62
         */
63
        public ArrayList getParamsList() {
64
                return paramsList;
65
        }
66
        
67
        /**
68
         * Asigna la lista de par?metros
69
         * @param params
70
         */
71
        public void setParamsList(ArrayList params) {
72
                this.paramsList = params;
73
        }
74
        
75
        /**
76
         * Asigna el arrayList de filtros inicial. Esto hace que aplique los filtros que ya
77
         * existen en el raster. Estos pueden ser obtenidos del render de la capa de la forma
78
         * lyr.getRender().getFilterList().getStatusCloned().  
79
         * @param params Lista de filtros aplicados.
80
         */
81
        public void setFilterStatus(ArrayList filtersInit) {
82
                this.filtersInit = filtersInit;
83
        }
84
        
85
        /**
86
         * Devuelve el arrayList de filtros inicial
87
         * @return
88
         */
89
        public ArrayList getFilterStatus() {
90
                return filtersInit;
91
        }
92
        
93
        /**
94
         * A?adir un nuevo Params a la lista de Params que podemos manejar. Un Params
95
         * equivale a un filtro cargado. El hecho de trabajar con Params y no con
96
         * filtros, simplifica totalmente el panel. Sin tener que depender de los
97
         * filtros nada m?s que para el momento de dibujado o guardado.
98
         * @param name
99
         * @param params
100
         * @param classFilter
101
         */
102
        public void addNewParam(String name, Params params, Class classFilter) {
103
                ParamStruct param = new ParamStruct();
104
                param.setFilterName(name);
105
                param.setFilterParam(params);
106
                param.setFilterClass(classFilter);
107
                paramsList.add(param);
108
        }
109

    
110
        /**
111
         * Procesa la imagen con la lista de filtros si el flag showFilterSelected est? a true.
112
         * Esta funci?n llama a addFilter por cada filtro a?adido pero es applyFilters la encargada
113
         * de construir la lista. 
114
         */
115
        public void process(IRasterRendering rendering) throws FilterTypeException {
116
                rendering.getRenderFilterList().clear();
117

    
118
                if (showFiltersSelected) {
119
                        RasterFilterList filterList = rendering.getRenderFilterList();
120
                        RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
121

    
122
                        ArrayList listFilterUsed = applyFilters(rendering);
123
                        ArrayList exc = new ArrayList();
124
                        for (int i = 0; i < listFilterUsed.size(); i++) {
125
                                IRasterFilterListManager filterManager = stackManager.getManagerByFilterClass(((ParamStruct) listFilterUsed.get(i)).getFilterClass());
126
                                try {
127
                                        filterManager.addFilter(((ParamStruct) listFilterUsed.get(i)).getFilterClass(), ((ParamStruct) listFilterUsed.get(i)).getFilterParam());
128
                                } catch (FilterTypeException e) {
129
                                        exc.add(e);
130
                                }
131
                        }
132
                        if(exc.size() != 0) {
133
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, exc);
134
                                exc.clear();
135
                        }
136
                }
137
        }
138
        
139
        /**
140
         * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma
141
         * de ArrayList tanto para el dibujado como cuando aceptan o aplican el panel.
142
         * @param rendering
143
         * @return
144
         */
145
        public ArrayList applyFilters(IRasterRendering rendering) {
146
                ArrayList listFilterUsed = new ArrayList();
147

    
148
                RasterFilterList filterList = new RasterFilterList();
149
                filterList.setEnv(rendering.getRenderFilterList().getEnv());
150
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
151

    
152
                if(filtersInit == null)
153
                        return listFilterUsed;
154
                
155
                // Conservamos filtros ya existentes
156
                for (int i = 0; i < filtersInit.size(); i++) {
157
                        
158
                        RasterFilter obj = null;
159
                        for (int j = 0; j < stackManager.getRasterFilterList().size(); j++) {
160
                                Class classFilter = (Class) stackManager.getRasterFilterList().get(j);
161
                                try {
162
                                        obj = (RasterFilter) classFilter.newInstance();
163
                                        if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName()))
164
                                                break;
165
                                } catch (InstantiationException e) {
166
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
167
                                } catch (IllegalAccessException e) {
168
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
169
                                }
170
                        }
171

    
172
                        // Si no encontramos el filtro apropiado, nos olvidamos de el
173
                        if (obj == null)
174
                                continue;
175

    
176
                        // Si no es visible tenemos que conservar el filtro
177
                        try {
178
                                Params params = (Params) ((RasterFilter) filtersInit.get(i)).getUIParams(((RasterFilter) filtersInit.get(i)).getName()).clone();
179
                                // A?ado el parametro RenderBands a los parametros del filtro
180
                                String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
181
                                params.setParam("RenderBands", rgb, 0, null);
182
                        
183
                                ParamStruct newParam = new ParamStruct();
184
                                newParam.setFilterClass(obj.getClass());
185
                                newParam.setFilterName(((RasterFilter) filtersInit.get(i)).getName());
186
                                newParam.setFilterParam(params);
187
                                listFilterUsed.add(newParam);
188
                        } catch (CloneNotSupportedException e) {
189
                        }
190
                }
191
                
192
                // Metemos los filtros seleccionados en listFilterUsed
193
                for (int i = 0; i < paramsList.size(); i++) {
194
                        // En caso de existir el filtro, lo reemplazamos
195
                        boolean finded = false;
196
                        for (int j = 0; j < listFilterUsed.size(); j++) {
197
                                if (((ParamStruct) listFilterUsed.get(j)).getFilterName().equals(((ParamStruct) paramsList.get(i)).getFilterName())) {
198
                                        listFilterUsed.set(j, paramsList.get(i));
199
                                        finded = true;
200
                                        break;
201
                                }
202
                        }
203
                        if (!finded)
204
                                listFilterUsed.add(paramsList.get(i));
205
                }
206
                
207
                return listFilterUsed;
208
        }
209
}