Statistics
| Revision:

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

History | View | Annotate | Download (17.8 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.Component;
22
import java.awt.Dimension;
23
import java.awt.Graphics2D;
24
import java.awt.event.ActionEvent;
25
import java.awt.event.ActionListener;
26
import java.awt.geom.AffineTransform;
27
import java.awt.geom.Dimension2D;
28
import java.io.File;
29
import java.util.ArrayList;
30
import java.util.EventObject;
31
import java.util.Hashtable;
32

    
33
import javax.swing.JFileChooser;
34
import javax.swing.JOptionPane;
35
import javax.swing.ListModel;
36

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

    
60
import com.iver.andami.PluginServices;
61
import com.iver.andami.Utilities;
62
import com.iver.andami.ui.mdiManager.IWindow;
63
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
64
import com.iver.cit.gvsig.fmap.ViewPort;
65
import com.iver.cit.gvsig.fmap.layers.FLayer;
66
import com.iver.cit.gvsig.project.documents.view.gui.View;
67
/**
68
 * <code>FilterListener</code> es la clase donde se procesar? gran parte del
69
 * c?digo que controla el panel para el manejo de un layer en la aplicaci?n de
70
 * filtros.
71
 *
72
 * @version 24/05/2007
73
 * @author Borja S?nchez Zamorano (borja.sanchez@iver.es)
74
 */
75
public class FilterListener implements ActionListener, IClientImageNavigator, TreeListComponentListener, TreeListChangeListener, PropertiesComponentListener {
76
        FilterPanel                                filterPanel = null;
77
        public int                                actualParam = -1;
78
        public ArrayList        paramsList = new ArrayList();
79
        static int                                filecount = 1;
80

    
81
        public class ParamStruct {
82
                String filterName = null;
83
                Params filterParam = null;
84
                Class filterClass = null;
85

    
86
                /**
87
                 * @return the filterName
88
                 */
89
                public String getFilterName() {
90
                        return filterName;
91
                }
92

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

    
100
                /**
101
                 * @return the filterParam
102
                 */
103
                public Params getFilterParam() {
104
                        return filterParam;
105
                }
106

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

    
114
                /**
115
                 * @return the filterClass
116
                 */
117
                public Class getFilterClass() {
118
                        return filterClass;
119
                }
120

    
121
                /**
122
                 * @param filterClass the filterClass to set
123
                 */
124
                public void setFilterClass(Class filterClass) {
125
                        this.filterClass = filterClass;
126
                }
127
        }
128

    
129
        /**
130
         * Construye un FilterListener especificando el FilterPanel asociado
131
         * @param fp
132
         */
133
        public FilterListener(FilterPanel fp) {
134
                filterPanel = fp;
135
        }
136

    
137
        /**
138
         * Asignamos los valores del PropertiesComponent al Params seleccionado
139
         */
140
        public void RefreshDataProperties() {
141
                if (actualParam == -1) return;
142

    
143
                ArrayList listValues = getFilterPanel().getPropertiesComponent().getValues();
144

    
145
                Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
146
                for (int j=0; j<listValues.size(); j++) {
147
                        PropertyStruct ps = (PropertyStruct) listValues.get(j);
148
                        params.changeParamValue(ps.getKey(), ps.getNewValue().toString());
149
                }
150
        }
151

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

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

    
173
                RefreshDataProperties();
174
                actualParam = posParam;
175

    
176
                PropertiesComponent propertiesComponent = new PropertiesComponent();
177

    
178
                if (posParam != -1) {
179

    
180
                        Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
181
                        if (params != null) {
182
                                for (int i = 0; i < params.getNumParams(); i++) {
183
                                        Param p = params.getParam(i);
184
                                        String name = p.id;
185
                                        String key = p.id;
186
                                        Object[] types = null;
187
                                        int selectedValue = 0;
188

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

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

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

    
242
                Rendering rendering = ((FLyrRasterSE) getFilterPanel().getLayer()).getRender();
243

    
244
                if ((rendering == null) || ((x2 - x1) == 0.0) || ((y2 - y1) == 0.0))
245
                        return;
246

    
247
                rendering.getFilterList().pushStatus();
248

    
249
                rendering.getFilterList().clear();
250

    
251
                RasterFilterList filterList = rendering.getFilterList();
252
                RasterFilterListManager stackManager = new RasterFilterListManager(filterList);
253

    
254
                if (getFilterPanel().getCBShowFilters().isSelected()) {
255
                        ListModel list = getFilterPanel().getTreeListContainer().getListModel();
256
                        for (int i = 0; i < list.getSize(); i++) {
257
                                Hashtable hastTable = getFilterPanel().getTreeListContainer().getMap();
258
                                for (int j = 0; j < paramsList.size(); j++) {
259
                                        boolean active = true;
260
                                        Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById(PluginServices.getText(this, "enabled"));
261
                                        if ((param != null) && ((new Boolean(param.defaultValue).booleanValue()) == false))
262
                                                active = false;
263
                                        if (active) {
264
                                                if (((ParamStruct) paramsList.get(j)).getFilterName().equals(hastTable.get(list.getElementAt(i)))) {
265
                                                        IRasterFilterListManager filterManager = stackManager.getManagerByFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
266

    
267
                                                        Params params  = ((ParamStruct) paramsList.get(j)).getFilterParam();
268
                                                        String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
269
                                                        params.setParam("RenderBands", rgb, 0, null);
270

    
271
                                                        filterManager.addFilter(((ParamStruct) paramsList.get(j)).getFilterClass(), params);
272

    
273
                                                        params.removeParam("RenderBands");
274
                                                }
275
                                        }
276
                                }
277
                        }
278
                }
279

    
280
                ViewPort vp = new ViewPort(null);
281

    
282
                Dimension2D dimension = new Dimension(width, height);
283
                Extent extent = new Extent(x1, y1, x2, y2);
284

    
285
                ViewPortData vp2 = new ViewPortData(vp.getProjection(), extent, dimension);
286
                vp2.setMat(new AffineTransform(zoom, 0.0, 0.0, zoom, -x1*zoom, -y1*zoom));
287

    
288
                Extent extent2 = ((FLyrRasterSE) getFilterPanel().getLayer()).getDatasource().getExtent();
289

    
290
                AffineTransform trans = g.getTransform();
291
                // Calcular cuanto sobresale la imagen y rectificar ese desplazamiento
292
                if (y1 > extent2.maxY()) {
293
                        g.translate(0.0, (-(extent2.maxY() - y1) * zoom)*2.0);
294
                }
295

    
296
                rendering.draw(g, vp2);
297
                g.setTransform(trans);
298

    
299
                rendering.getFilterList().popStatus();
300
        }
301

    
302
        /*
303
         * (non-Javadoc)
304
         * @see org.gvsig.gui.beans.propertiespanel.PropertiesComponentListener#actionChangeProperties(java.util.EventObject)
305
         */
306
        public void actionChangeProperties(EventObject e) {
307
                RefreshDataProperties();
308
                getFilterPanel().refreshPreview();
309
        }
310

    
311
        /*
312
         * (non-Javadoc)
313
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListChangeListener#actionChangeSelection(org.gvsig.gui.beans.treelist.event.TreeListChangeEvent)
314
         */
315
        public void actionChangeSelection(TreeListChangeEvent e) {
316
                changePanel(e.getItem());
317
        }
318

    
319
        /*
320
         * (non-Javadoc)
321
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
322
         */
323
        public void actionPerformed(ActionEvent e) {
324
                getFilterPanel().refreshPreview();
325
        }
326

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

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

    
343
        /*
344
         * (non-Javadoc)
345
         * @see org.gvsig.gui.beans.treelist.listeners.TreeListComponentListener#elementRemoved(org.gvsig.gui.beans.treelist.event.TreeListEvent)
346
         */
347
        public void elementRemoved(TreeListEvent e) {
348
                getFilterPanel().refreshPreview();
349
        }
350

    
351
        /**
352
         * @return the paramsList
353
         */
354
        public ArrayList getParamsList() {
355
                return paramsList;
356
        }
357

    
358
        /**
359
         * Devuelve la ruta del fichero donde se va a guardar, en caso de guardarse
360
         * en memoria, calcula el nombre sin preguntar y devuelve la ruta.
361
         * @return
362
         */
363
        public String getFileSelected() {
364
                String path = "";
365
                if (getFilterPanel().getRadioFileGenerate().isSelected()) {
366
                        JFileChooser chooser = new JFileChooser(RasterModule.getPath());
367
                        chooser.setDialogTitle(PluginServices.getText(this, "seleccionar_fichero"));
368

    
369
                        //A?adimos las extensiones que hayan sido registradas en el driver
370
                        String[] extList = GeoRasterWriter.getDriversExtensions();
371
                        for(int i=0;i<extList.length;i++)
372
                                chooser.addChoosableFileFilter(new WriterFilter(extList[i]));
373

    
374
                        if (chooser.showOpenDialog(getFilterPanel()) != JFileChooser.APPROVE_OPTION)
375
                                return null;
376

    
377
                        String fName = chooser.getSelectedFile().toString();
378
                        String ext = ((WriterFilter)chooser.getFileFilter()).getDescription();
379

    
380
                        ext = ext.toLowerCase().substring(ext.lastIndexOf(".") + 1, ext.length());
381

    
382
                        if ((fName != null) && !fName.equals(""))
383
                                if (!fName.endsWith("." + ext))
384
                                        fName = fName + "." + ext;
385

    
386
                        RasterModule.setPath(chooser.getSelectedFile().getPath().substring(0, chooser.getSelectedFile().getPath().lastIndexOf(File.separator)));
387
                        path = fName;
388
                } else {
389
                        path = Utilities.createTempDirectory() + File.separator + "filter_new_" + filecount + ".tif";
390
                        filecount++;
391
                }
392
                return path;
393
        }
394

    
395
        public void accept() {
396
                MultiRasterDataset multiRasterDataset = (MultiRasterDataset)((FLyrRasterSE) getFilterPanel().getLayer()).getGeoRasterMultiDataset();
397
                if (multiRasterDataset == null)
398
                        return;
399

    
400
                String path = getFileSelected();
401
                if (path == null)
402
                        return;
403

    
404
                // Array para guardar los filtros que se van a usar en forma de ParamStruct
405
                ArrayList listFilterUsed = new ArrayList();
406

    
407
                Rendering rendering = ((FLyrRasterSE) getFilterPanel().getLayer()).getRender();
408

    
409
                ListModel list = getFilterPanel().getTreeListContainer().getListModel();
410
                for (int i = 0; i < list.getSize(); i++) {
411
                        Hashtable hastTable = getFilterPanel().getTreeListContainer().getMap();
412
                        for (int j = 0; j < paramsList.size(); j++) {
413
                                boolean active = true;
414
                                Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById(PluginServices.getText(this, "enabled"));
415
                                if ((param != null) && ((new Boolean(param.defaultValue).booleanValue()) == false))
416
                                        active = false;
417
                                if (active) {
418
                                        if (((ParamStruct) paramsList.get(j)).getFilterName().equals(hastTable.get(list.getElementAt(i)))) {
419
                                                try {
420
                                                        Params params = (Params) ((ParamStruct) paramsList.get(j)).getFilterParam().clone();
421

    
422
                                                        // A?ado el parametro RenderBands a los parametros del filtro
423
                                                        String rgb = rendering.getRenderBands()[0] + " " + rendering.getRenderBands()[1] + " " + rendering.getRenderBands()[2];
424
                                                        params.setParam("RenderBands", rgb, 0, null);
425

    
426
                                                        ParamStruct newParam = new ParamStruct();
427
                                                        newParam.setFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
428
                                                        newParam.setFilterName(((ParamStruct) paramsList.get(j)).getFilterName());
429
                                                        newParam.setFilterParam(params);
430
                                                        listFilterUsed.add(newParam);
431

    
432
                                                } catch (CloneNotSupportedException e) {
433
                                                        // TODO Auto-generated catch block
434
                                                }
435
                                        }
436
                                }
437
                        }
438
                }
439

    
440
                if (filterPanel.getRadioOnlyView().isSelected()) {
441
                        FilterProcess.addSelectedFilters(rendering.getFilterList(), listFilterUsed);
442
                        getFilterPanel().getLayer().getMapContext().invalidate();
443
                } else {
444
                        FilterProcess filterProcess = new FilterProcess(this, path, multiRasterDataset, listFilterUsed);
445
                        IncrementableTask incrementableTask = new IncrementableTask(filterProcess);
446
                        filterProcess.setIncrementableTask(incrementableTask);
447
                        incrementableTask.showWindow();
448

    
449
                        filterProcess.start();
450
                        incrementableTask.start();
451
                }
452
        }
453

    
454
        public FilterPanel getFilterPanel() {
455
                return filterPanel;
456
        }
457

    
458
        /**
459
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
460
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
461
         */
462
        public void loadLayerInToc(String fileName) {
463
                if (!getFilterPanel().getRadioNewLayer().isSelected())
464
                        return;
465
                if(!new File(fileName).exists())
466
                        return;
467
                // seleccionamos la vista de gvSIG
468
                com.iver.cit.gvsig.project.documents.view.gui.View theView = null;
469
                try {
470
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
471
                        for (int i = 0; i < allViews.length; i++) {
472
                                if (allViews[i] instanceof com.iver.cit.gvsig.project.documents.view.gui.View
473
                                                && PluginServices.getMDIManager().getWindowInfo((View) allViews[i])
474
                                                                .getTitle().equals(getFilterPanel().getViewName()))
475
                                        theView = (com.iver.cit.gvsig.project.documents.view.gui.View) allViews[i];
476
                        }
477
                        if (theView == null)
478
                                return;
479
                } catch (ClassCastException ex) {
480
                        // logger.error(PluginServices.getText(this,"cant_get_view "), ex);
481
                        return;
482
                }
483

    
484
                // Cargamos las capas
485
                theView.getMapControl().getMapContext().beginAtomicEvent();
486

    
487
                //Driver driver = LayerFactory.getDM().getDriver("gvSIG Raster Driver");
488
                int endIndex = fileName.lastIndexOf(".");
489
                if (endIndex < 0)
490
                        endIndex = fileName.length();
491
                FLayer lyr = null;
492
                try {
493
                        lyr = FLyrRasterSE.createLayer(fileName.substring(
494
                                        fileName.lastIndexOf(File.separator) + 1, endIndex),
495
                                        new File(fileName), theView.getMapControl().getProjection());
496
                } catch (LoadLayerException e) {
497
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
498
                                        PluginServices.getText(this, "error_cargar_capa"));
499
                }
500
                theView.getMapControl().getMapContext().getLayers().addLayer(lyr);
501
                theView.getMapControl().getMapContext().endAtomicEvent();
502

    
503
                theView.getMapControl().getMapContext().invalidate();
504

    
505
                getFilterPanel().getLayer().getMapContext().invalidate();
506
        }
507
}
508

    
509
/**
510
 * @author Nacho Brodin <brodin_ign@gva.es>
511
 * Filtro para el selector de formatos de escritura
512
 */
513
class WriterFilter extends javax.swing.filechooser.FileFilter {
514
        private String                                filter;
515

    
516
        public WriterFilter(String fil) {
517
                this.filter = fil;
518
        }
519

    
520
        public boolean accept(File f) {
521
                return f.isDirectory() || f.getName().toLowerCase().endsWith("." + filter);
522
        }
523

    
524
        public String getDescription() {
525
                return "." + filter;
526
        }
527
}