Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / filter / FilterListener.java @ 11838

History | View | Annotate | Download (13.4 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.rastertools.filter;
20

    
21
import java.awt.Dimension;
22
import java.awt.Graphics2D;
23
import java.awt.event.ActionEvent;
24
import java.awt.event.ActionListener;
25
import java.awt.geom.AffineTransform;
26
import java.awt.geom.Dimension2D;
27
import java.io.File;
28
import java.util.ArrayList;
29
import java.util.EventObject;
30
import java.util.Hashtable;
31

    
32
import javax.swing.JFileChooser;
33
import javax.swing.ListModel;
34

    
35
import org.cresques.io.GeoRasterWriter;
36
import org.gvsig.fmap.layers.FLyrRasterSE;
37
import org.gvsig.gui.beans.imagenavigator.IClientImageNavigator;
38
import org.gvsig.gui.beans.incrementabletask.IncrementableTask;
39
import org.gvsig.gui.beans.propertiespanel.PropertiesComponent;
40
import org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener;
41
import org.gvsig.gui.beans.propertiespanel.PropertyStruct;
42
import org.gvsig.gui.beans.treelist.event.TreeListChangeEvent;
43
import org.gvsig.gui.beans.treelist.event.TreeListEvent;
44
import org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener;
45
import org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener;
46
import org.gvsig.raster.dataset.Params;
47
import org.gvsig.raster.dataset.Params.Param;
48
import org.gvsig.raster.grid.filter.IRasterFilterListManager;
49
import org.gvsig.raster.grid.filter.RasterFilterList;
50
import org.gvsig.raster.grid.filter.RasterFilterListManager;
51
import org.gvsig.raster.grid.render.Rendering;
52
import org.gvsig.raster.shared.Extent;
53
import org.gvsig.raster.shared.ViewPortData;
54
import org.gvsig.rastertools.filter.ui.FilterPanel;
55

    
56
import com.iver.andami.PluginServices;
57
import com.iver.andami.Utilities;
58
import com.iver.cit.gvsig.fmap.ViewPort;
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
 * @version 24/05/2007
65
 * @author Borja S?nchez Zamorano (borja.sanchez@iver.es)
66
 */
67
public class FilterListener implements ActionListener, IClientImageNavigator, TreeListComponentListener, TreeListChangeListener, PropertiesComponentListener {
68
        FilterPanel                         filterPanel = null;
69
        public int                                 actualParam = -1;
70
        public ArrayList        paramsList = new ArrayList();
71
        static int                                filecount = 1;
72

    
73
        /**
74
         * Recuerda la ?ltima ruta seleccionada por el usuario
75
         */
76
        private static String        lastPath = "./";
77

    
78
        public class ParamStruct {
79
                String filterName = null;
80
                Params filterParam = null;
81
                Class filterClass = null;
82

    
83
                /**
84
                 * @return the filterName
85
                 */
86
                public String getFilterName() {
87
                        return filterName;
88
                }
89

    
90
                /**
91
                 * @param filterName the filterName to set
92
                 */
93
                public void setFilterName(String filterName) {
94
                        this.filterName = filterName;
95
                }
96

    
97
                /**
98
                 * @return the filterParam
99
                 */
100
                public Params getFilterParam() {
101
                        return filterParam;
102
                }
103

    
104
                /**
105
                 * @param filterParam the filterParam to set
106
                 */
107
                public void setFilterParam(Params filterParam) {
108
                        this.filterParam = filterParam;
109
                }
110

    
111
                /**
112
                 * @return the filterClass
113
                 */
114
                public Class getFilterClass() {
115
                        return filterClass;
116
                }
117

    
118
                /**
119
                 * @param filterClass the filterClass to set
120
                 */
121
                public void setFilterClass(Class filterClass) {
122
                        this.filterClass = filterClass;
123
                }
124
        }        
125
        
126
        /**
127
         * Construye un FilterListener especificando el FilterPanel asociado
128
         * @param fp
129
         */
130
        public FilterListener(FilterPanel fp) {
131
                filterPanel = fp;
132
        }
133

    
134
        /**
135
   * Asignamos los valores del PropertiesComponent al Params seleccionado
136
   */
137
  public void RefreshDataProperties() {
138
                if (actualParam == -1) return;
139
                
140
                ArrayList listValues = filterPanel.getPropertiesComponent().getValues();
141
        
142
                Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
143
                for (int j=0; j<listValues.size(); j++) {
144
                        PropertyStruct ps = (PropertyStruct) listValues.get(j);
145
                        params.changeParamValue(ps.getKey(), ps.getNewValue().toString());
146
                }
147
        }
148

    
149
  /**
150
   * Obtener la posici?n del Param seleccionado en el ArrayList
151
   * @param filterName
152
   * @return
153
   */
154
  private int getParamSelected(String filterName) {
155
          for (int i = 0; i < paramsList.size(); i++) {
156
                        if (((ParamStruct) paramsList.get(i)).getFilterName().equals(filterName))
157
                                return i;
158
                }
159
          return -1;
160
        }
161

    
162
  /**
163
   * Cambiar el panel de propiedades central por el nuevo panel, segun el filtro
164
   * seleccionado que se pasa por par?metro.
165
   * @param filter
166
   */
167
        public void changePanel(String filter) {
168
                int posParam = getParamSelected(filter);
169

    
170
                RefreshDataProperties();
171
                actualParam = posParam;
172
                
173
                PropertiesComponent propertiesComponent = new PropertiesComponent();
174
                
175
                if (posParam != -1) {
176
                        
177
                        Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
178
                        if (params != null) {
179
                                for (int i = 0; i < params.getNumParams(); i++) {
180
                                        Param p = params.getParam(i);
181
                                        String name = p.id;
182
                                        String key = p.id;
183
                                        Object[] types = null;
184
                                        int selectedValue = 0;
185

    
186
                                        switch (params.getParam(i).type) {
187
                                                case Params.CHECK:
188
                                                        propertiesComponent.addValue(name, key, new Boolean(p.defaultValue), types);
189
                                                        break;
190
                                                case Params.CHOICE:
191
                                                        ArrayList list = new ArrayList();
192
                                                        for (int j = 0; j < p.list.length; j++) {
193
                                                                list.add(p.list[j]);
194
                                                                if (p.defaultValue.compareTo(p.list[j]) == 0)
195
                                                                        selectedValue = j;
196
                                                        }
197
                                                        types = new Object[] { new Integer(PropertiesComponent.TYPE_COMBO), list };
198
                                                        propertiesComponent.addValue(name, key, new Integer(selectedValue), types);
199
                                                        break;
200
                                                case Params.SLIDER:
201
              types = new Object[]{new Integer(PropertiesComponent.TYPE_SLIDER), new Integer(p.list[0]), new Integer(p.list[1])};
202
              propertiesComponent.addValue(name, key, new Integer((int) Math.round(new Double(p.defaultValue).doubleValue())), types);
203
              break;
204
                                                default:
205
                                                        propertiesComponent.addValue(params.getParam(i).id, params.getParam(i).id, params.getParam(i).defaultValue, null);
206
                                                        break;
207
                                        }
208
                                }
209
                        }
210
                }
211
                filterPanel.setNewPropertiesComponent(propertiesComponent, filter);
212
        }
213

    
214
        /**
215
         * A?adir un nuevo Params a la lista de Params que podemos manejar. Un Params
216
         * equivale a un filtro cargado. El hecho de trabajar con Params y no con
217
         * filtros, simplifica totalmente el panel. Sin tener que depender de los
218
         * filtros nada m?s que para el momento de dibujado o guardado.
219
         * @param name
220
         * @param params
221
         * @param classFilter
222
         */
223
        public void addNewParam(String name, Params params, Class classFilter) {
224
                ParamStruct param = new ParamStruct();
225
                param.setFilterName(name);
226
                param.setFilterParam(params);
227
                param.setFilterClass(classFilter);
228
                paramsList.add(param);
229
        }
230

    
231
        /*
232
         * (non-Javadoc)
233
         * @see org.gvsig.gui.beans.imagenavigator.IClientImageNavigator#drawImage(java.awt.Graphics2D, double, double, double, double, double, int, int)
234
         */
235
        public void drawImage(Graphics2D g, double x1, double y1, double x2, double y2, double zoom, int width, int height) {
236
                if (filterPanel.getLayer() == null)
237
                        return;
238

    
239
                Rendering rendering = ((FLyrRasterSE) filterPanel.getLayer()).getRender();
240

    
241
                if ((rendering == null) || ((x2 - x1) == 0.0) || ((y2 - y1) == 0.0))
242
                        return;
243

    
244
                rendering.getFilterList().clear();
245

    
246
                RasterFilterList filterList = rendering.getFilterList();
247
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
248
                
249
                if (filterPanel.getCBShowFilters().isSelected()) {
250
                        ListModel list = filterPanel.getTreeListContainer().getListModel();
251
                        for (int i = 0; i < list.getSize(); i++) {
252
                                Hashtable hastTable = filterPanel.getTreeListContainer().getMap();
253
                                for (int j = 0; j < paramsList.size(); j++) {
254
                                        boolean active = true;
255
                                        Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById("Enabled");
256
                                        if ((param != null) && ((new Boolean(param.defaultValue).booleanValue()) == false))
257
                                                active = false;
258
                                        if (active) { 
259
                                                if (((ParamStruct) paramsList.get(j)).getFilterName().equals(hastTable.get(list.getElementAt(i)))) {
260
                                                        IRasterFilterListManager filterManager = stackManager.getManagerByFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
261
                                                        
262
                                                        Params params  = ((ParamStruct) paramsList.get(j)).getFilterParam();
263
                                                        String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
264
                                                        params.setParam("RenderBands", rgb, 0, null);
265
                                                        
266
                                                        filterManager.addFilter(((ParamStruct) paramsList.get(j)).getFilterClass(), params);
267
        
268
                                                        params.removeParam("RenderBands");
269
                                                }
270
                                        }
271
                                }
272
                        }
273
                }
274

    
275
                ViewPort vp = new ViewPort(null);
276

    
277
                Dimension2D dimension = new Dimension(width, height);
278
                Extent extent = new Extent(x1, y1, x2, y2);
279

    
280
                ViewPortData vp2 = new ViewPortData(vp.getProjection(), extent, dimension);
281
                vp2.setMat(new AffineTransform(zoom, 0.0, 0.0, zoom, -x1*zoom, -y1*zoom));
282

    
283
                Extent extent2 = ((FLyrRasterSE) filterPanel.getLayer()).getDatasource().getExtent();
284

    
285
                AffineTransform trans = g.getTransform();
286
                // Calcular cuanto sobresale la imagen y rectificar ese desplazamiento
287
                if (y1 > extent2.maxY()) {
288
                        g.translate(0.0, (-(extent2.maxY() - y1) * zoom)*2.0);
289
                }
290

    
291
                rendering.draw(g, vp2);
292
                g.setTransform(trans);
293
        }
294

    
295
        /*
296
         * (non-Javadoc)
297
         * @see org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener#actionChangeProperties(java.util.EventObject)
298
         */
299
        public void actionChangeProperties(EventObject e) {
300
                RefreshDataProperties();
301
                filterPanel.refreshPreview();
302
        }
303

    
304
        /*
305
         * (non-Javadoc)
306
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener#actionChangeSelection(org.gvsig.gui.beans.treelist.event.TreeListChangeEvent)
307
         */
308
        public void actionChangeSelection(TreeListChangeEvent e) {
309
                changePanel(e.getItem());
310
        }
311

    
312
        /*
313
         * (non-Javadoc)
314
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
315
         */
316
        public void actionPerformed(ActionEvent e) {
317
                filterPanel.refreshPreview();
318
        }
319

    
320
        /*
321
         * (non-Javadoc)
322
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementAdded(org.gvsig.gui.beans.treelist.event.TreeListEvent)
323
         */
324
        public void elementAdded(TreeListEvent e) {
325
                filterPanel.refreshPreview();
326
        }
327

    
328
        /*
329
         * (non-Javadoc)
330
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementMoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
331
         */
332
        public void elementMoved(TreeListEvent e) {
333
                filterPanel.refreshPreview();
334
        }
335

    
336
        /*
337
         * (non-Javadoc)
338
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementRemoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
339
         */
340
        public void elementRemoved(TreeListEvent e) {
341
                filterPanel.refreshPreview();
342
        }
343

    
344
        /**
345
         * @return the paramsList
346
         */
347
        public ArrayList getParamsList() {
348
                return paramsList;
349
        }
350
        
351
        public void accept() {
352
                /**
353
                 * Donde se va a guardar el fichero
354
                 */
355
                String path = "";
356
                if (filterPanel.getRadioFileGenerate().isSelected()) {
357
                        JFileChooser chooser = new JFileChooser(lastPath);
358
      chooser.setDialogTitle(PluginServices.getText(this, "seleccionar_fichero"));
359
        
360
      //A?adimos las extensiones que hayan sido registradas en el driver
361
      String[] extList = GeoRasterWriter.getDriversExtensions();
362
      for(int i=0;i<extList.length;i++)
363
              chooser.addChoosableFileFilter(new WriterFilter(extList[i]));
364
      
365
                        if (chooser.showOpenDialog(filterPanel) != JFileChooser.APPROVE_OPTION)
366
                                return;
367
                        
368
                        String fName = chooser.getSelectedFile().toString();
369
                        String ext = ((WriterFilter)chooser.getFileFilter()).getDescription();
370
                        
371
                        ext = ext.toLowerCase().substring(ext.lastIndexOf(".") + 1, ext.length());
372
                        
373
                        if ((fName != null) && !fName.equals(""))
374
              if(!fName.endsWith("." + ext))
375
                      fName = fName + "." + ext;
376
                        
377
                        lastPath = chooser.getSelectedFile().getPath().substring(0, chooser.getSelectedFile().getPath().lastIndexOf(File.separator));
378
                        path = fName;
379
                } else {
380
                        path = Utilities.createTempDirectory() + File.separator + "filter_new_" + filecount + ".tif";
381
                        filecount++;
382
                }
383

    
384
                Rendering rendering = ((FLyrRasterSE) filterPanel.getLayer()).getRender();
385
                RasterFilterList rfl = rendering.getFilterList();
386
                
387
                FilterProcess filterProcess = new FilterProcess(this, path, rfl);
388
                IncrementableTask incrementableTask = new IncrementableTask(filterProcess);
389
                filterProcess.setIncrementableTask(incrementableTask);
390
                incrementableTask.showWindow();
391

    
392
                rfl.resetPercent();
393

    
394
                filterProcess.start();
395
                incrementableTask.start();
396
        }
397
}
398

    
399
/**
400
 * @author Nacho Brodin <brodin_ign@gva.es>
401
 * Filtro para el selector de formatos de escritura
402
 */
403
class WriterFilter extends javax.swing.filechooser.FileFilter {
404
        private String                                filter;
405

    
406
        public WriterFilter(String fil) {
407
                this.filter = fil;
408
        }
409

    
410
        public boolean accept(File f) {
411
                return f.isDirectory() || f.getName().toLowerCase().endsWith("." + filter);
412
        }
413

    
414
        public String getDescription() {
415
                return "." + filter;
416
        }
417
}