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

History | View | Annotate | Download (10.1 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.RasterSwingLibrary;
38
import org.gvsig.raster.swing.preview.DataSourcePreview;
39
import org.gvsig.raster.swing.preview.PreviewRenderProcess;
40
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
41
import org.gvsig.raster.tools.app.basic.raster.bean.previewbase.ParamStruct;
42

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

    
55
        private boolean                  showFiltersSelected     = true;
56
        private List<ParamStruct>        paramsList              = new ArrayList<ParamStruct>();
57
        private List<RasterFilter>       filtersInit             = new ArrayList<RasterFilter>();
58
        private boolean                  showPreview             = true;        
59
        private boolean                  saveLayerFilters        = true;
60
        
61
        public PreviewFiltering(boolean saveLayerFilters) {
62
                this.saveLayerFilters = saveLayerFilters;
63
        }
64
        
65
        /**
66
         * Flag de selecci?n de activaci?n y desactivaci?n
67
         * @param show
68
         */
69
        public void showFiltersSelected(boolean show) {
70
                this.showFiltersSelected = show;
71
        }
72
        
73
        /**
74
         * Obtiene la lista de par?metros
75
         * @return the paramsList
76
         */
77
        public List<ParamStruct> getParamsList() {
78
                return paramsList;
79
        }
80
        
81
        /**
82
         * Asigna la lista de par?metros
83
         * @param params
84
         */
85
        public void setParamsList(List<ParamStruct> params) {
86
                this.paramsList = params;
87
        }
88
        
89
        /**
90
         * Asigna el arrayList de filtros inicial. Esto hace que aplique los filtros que ya
91
         * existen en el raster. Estos pueden ser obtenidos del render de la capa de la forma
92
         * lyr.getRender().getFilterList().getStatusCloned().  
93
         * @param params Lista de filtros aplicados.
94
         */
95
        public void setFilterStatus(List<RasterFilter> filtersInit) {
96
                this.filtersInit = filtersInit;
97
        }
98
        
99
        /**
100
         * Devuelve el arrayList de filtros inicial
101
         * @return
102
         */
103
        public List<RasterFilter> getFilterStatus() {
104
                return filtersInit;
105
        }
106
        
107
        /**
108
         * A?adir un nuevo Params a la lista de Params que podemos manejar. Un Params
109
         * equivale a un filtro cargado. El hecho de trabajar con Params y no con
110
         * filtros, simplifica totalmente el panel. Sin tener que depender de los
111
         * filtros nada m?s que para el momento de dibujado o guardado.
112
         * @param name
113
         * @param params
114
         * @param classFilter
115
         */
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
        public void process(DataSourcePreview rendering) throws ImageUnavailableException {
130
                if(!showPreview)
131
                        throw new ImageUnavailableException(RasterToolsUtil.getText(this, "panel_preview_not_available"));
132
                
133
                if(!(rendering.getSource() instanceof FLyrRaster))
134
                        return;
135
                FLyrRaster lyr = (FLyrRaster)rendering.getSource();
136
                        
137
                lyr.getRender().getFilterList().clear();
138

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

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

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

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

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