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 / enhanced / ui / PreviewFiltering.java @ 1425

History | View | Annotate | Download (9.93 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.tools.app.basic.tool.enhanced.ui;
23

    
24
import java.util.ArrayList;
25
import java.util.List;
26

    
27
import org.gvsig.andami.PluginServices;
28
import org.gvsig.fmap.dal.coverage.RasterLocator;
29
import org.gvsig.fmap.dal.coverage.datastruct.Params;
30
import org.gvsig.fmap.dal.coverage.exception.FilterManagerException;
31
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
32
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
33
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
34
import org.gvsig.fmap.dal.coverage.grid.RasterFilterListManager;
35
import org.gvsig.gui.beans.imagenavigator.ImageUnavailableException;
36
import org.gvsig.raster.fmap.layers.FLyrRaster;
37
import org.gvsig.raster.swing.preview.DataSourcePreview;
38
import org.gvsig.raster.swing.preview.PreviewRenderProcess;
39
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
40
import org.gvsig.raster.tools.app.basic.raster.bean.previewbase.ParamStruct;
41

    
42
/**
43
 * Procesado de la imagen para la previsualizaci?n. Para poder usar esta clase despu?s de instanciarla
44
 * habr? que asignarle un valor a showFiltersSelected aunque por defecto est? a true por lo que se
45
 * visualizaran los cambios sin problemas, asigna una lista de filtros inicial (que ya tenga el raster
46
 * aplicado) con setFilterStatus y asignar los filtros que queramos aplicar con addNewParam (una llamada
47
 * por cada filtro).
48
 * 
49
 * 19/02/2008
50
 * @author Nacho Brodin nachobrodin@gmail.com
51
 */
52
public class PreviewFiltering implements PreviewRenderProcess {
53

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

    
124
        /**
125
         * Procesa la imagen con la lista de filtros si el flag showFilterSelected est? a true.
126
         * Esta funci?n llama a addFilter por cada filtro a?adido pero es applyFilters la encargada
127
         * de construir la lista. 
128
         */
129
        @SuppressWarnings("unchecked")
130
        public void process(DataSourcePreview rendering) throws ImageUnavailableException {
131
                if(!showPreview)
132
                        throw new ImageUnavailableException(RasterToolsUtil.getText(this, "panel_preview_not_available"));
133
                
134
                if(!(rendering.getSource() instanceof FLyrRaster))
135
                        return;
136
                FLyrRaster lyr = (FLyrRaster)rendering.getSource();
137
                        
138
                lyr.getRender().getFilterList().clear();
139

    
140
                if (showFiltersSelected) {
141
                        RasterFilterList filterList = lyr.getRender().getFilterList();
142
                        filterList.setInitDataType(lyr.getDataStore().getDataType()[0]);
143

    
144
                        List<ParamStruct> listFilterUsed = null;
145
                        if(saveLayerFilters)
146
                                listFilterUsed = applyAllFilters(lyr);
147
                        else
148
                                listFilterUsed = applySelectedFilters(null);
149
                        ArrayList<Exception> exc = new ArrayList<Exception>();
150
                        for (int i = 0; i < listFilterUsed.size(); i++) {
151
                                try {
152
                                        RasterFilterListManager filterManager = filterList.getManagerByFilterClass(((ParamStruct) listFilterUsed.get(i)).getFilterClass());
153
                                        Class c = ((ParamStruct) listFilterUsed.get(i)).getFilterClass();
154
                                        Params p = ((ParamStruct) listFilterUsed.get(i)).getFilterParam();
155
                                        filterManager.addFilter(c, p);
156
                                } catch (FilterTypeException e) {
157
                                        exc.add(e);
158
                                } catch (FilterManagerException e) {
159
                                        exc.add(e);
160
                                }
161
                        }
162
                        if(exc.size() != 0) {
163
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, exc);
164
                                exc.clear();
165
                        }
166
                }
167
        }
168
        
169
        /**
170
         * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma
171
         * de ArrayList tanto para el dibujado como cuando aceptan o aplican el panel.
172
         * @param layerRaster
173
         * @return
174
         */
175
        @SuppressWarnings("unchecked")
176
        public List<ParamStruct> applyAllFilters(FLyrRaster layerRaster) {
177
                List<ParamStruct> listFilterUsed = new ArrayList<ParamStruct>();
178
                
179
                int initDataType = layerRaster.getRender().getFilterList().getInitDataType();
180
                RasterFilterList filterList = RasterLocator.getManager().createEmptyFilterList(initDataType);
181
                filterList.setEnv(layerRaster.getRender().getFilterList().getEnv());
182
                filterList.setInitDataType(initDataType);
183
                ArrayList<Class> registeredFilters = filterList.getRegisteredFilterList();
184

    
185
                if(filtersInit == null)
186
                        return listFilterUsed;
187
                
188
                // Conservamos filtros ya existentes
189
                for (int i = 0; i < filtersInit.size(); i++) {
190
                        
191
                        RasterFilter obj = null;
192
                        for (int j = 0; j < registeredFilters.size(); j++) {
193
                                Class classFilter = (Class) registeredFilters.get(j);
194
                                try {
195
                                        obj = (RasterFilter) classFilter.newInstance();
196
                                        if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName()))
197
                                                break;
198
                                } catch (InstantiationException e) {
199
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
200
                                } catch (IllegalAccessException e) {
201
                                        RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
202
                                }
203
                        }
204

    
205
                        // Si no encontramos el filtro apropiado, nos olvidamos de el
206
                        if (obj == null)
207
                                continue;
208

    
209
                        // Si no es visible tenemos que conservar el filtro
210
                        try {
211
                                Params params = (Params) ((RasterFilter) filtersInit.get(i)).getUIParams(((RasterFilter) filtersInit.get(i)).getName()).clone();
212
                                // A?ado el parametro RenderBands a los parametros del filtro
213
                                String rgb = layerRaster.getRender().getRenderBands()[0] + " " + layerRaster.getRender().getRenderBands()[1] + " " + layerRaster.getRender().getRenderBands()[2];
214
                                params.setParam("RenderBands", rgb, 0, null);
215
                        
216
                                ParamStruct newParam = new ParamStruct();
217
                                newParam.setFilterClass(obj.getClass());
218
                                newParam.setFilterName(((RasterFilter) filtersInit.get(i)).getName());
219
                                newParam.setFilterParam(params);
220
                                listFilterUsed.add(newParam);
221
                        } catch (CloneNotSupportedException e) {
222
                        }
223
                }
224
                
225
                // Metemos los filtros seleccionados en listFilterUsed
226
                listFilterUsed = applySelectedFilters(listFilterUsed);
227
                
228
                return listFilterUsed;
229
        }
230
        
231
        /**
232
         * Gets the list of filters selected for the preview (without the layer filters). If a list of filters is
233
         * assigned, this method will replace the filter if exists in the list. 
234
         * @param listFilterUsed
235
         * @return
236
         */
237
        public List<ParamStruct> applySelectedFilters(List<ParamStruct> listFilterUsed) {
238
                if(listFilterUsed == null)
239
                        return paramsList;
240
                
241
                for (int i = 0; i < paramsList.size(); i++) {
242
                        // En caso de existir el filtro, lo reemplazamos
243
                        boolean finded = false;
244
                        for (int j = 0; j < listFilterUsed.size(); j++) {
245
                                if (((ParamStruct) listFilterUsed.get(j)).getFilterName().equals(((ParamStruct) paramsList.get(i)).getFilterName())) {
246
                                        listFilterUsed.set(j, paramsList.get(i));
247
                                        finded = true;
248
                                        break;
249
                                }
250
                        }
251
                        if (!finded)
252
                                listFilterUsed.add(paramsList.get(i));
253
                }
254
                
255
                return listFilterUsed;
256
        }
257
        
258
        /**
259
         * Obtiene el flag que informa de si se est? mostrando la previsualizaci?n o no.
260
         * En caso de no mostrarse se lanza una excepci?n ImageUnavailableExcepcion con el 
261
         * mensaje "La previsualizaci?n no est? disponible para este panel"
262
         * @return
263
         */
264
        public boolean isShowPreview() {
265
                return showPreview;
266
        }
267
        
268
        /**
269
         * Asigna el flag para mostrar u ocultar la preview. En caso de no mostrarse se lanza una 
270
         * excepci?n ImageUnavailableExcepcion con el mensaje "La previsualizaci?n no est? disponible para
271
         * este panel"
272
         * @param showPreview
273
         */
274
        public void setShowPreview(boolean showPreview) {
275
                this.showPreview = showPreview;
276
        }
277
}