Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / colortable / ui / ColorTableListener.java @ 20808

History | View | Annotate | Download (11.7 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.colortable.ui;
20

    
21
import java.util.ArrayList;
22

    
23
import javax.swing.JComponent;
24

    
25
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
26
import org.gvsig.raster.beans.previewbase.IPreviewRenderProcess;
27
import org.gvsig.raster.datastruct.ColorItem;
28
import org.gvsig.raster.datastruct.ColorTable;
29
import org.gvsig.raster.grid.GridPalette;
30
import org.gvsig.raster.grid.filter.FilterTypeException;
31
import org.gvsig.raster.grid.filter.RasterFilter;
32
import org.gvsig.raster.grid.filter.RasterFilterList;
33
import org.gvsig.raster.grid.filter.RasterFilterListManager;
34
import org.gvsig.raster.grid.filter.bands.ColorTableFilter;
35
import org.gvsig.raster.grid.filter.bands.ColorTableListManager;
36
import org.gvsig.raster.grid.filter.enhancement.LinearStretchEnhancementFilter;
37
import org.gvsig.raster.grid.filter.statistics.TailTrimFilter;
38
import org.gvsig.raster.hierarchy.IRasterRendering;
39
import org.gvsig.raster.util.PropertyEvent;
40
import org.gvsig.raster.util.PropertyListener;
41
import org.gvsig.raster.util.RasterToolsUtil;
42
import org.gvsig.rastertools.colortable.data.ColorTableData;
43
import org.gvsig.rastertools.colortable.ui.tabs.ColorTableUIListener;
44
import org.gvsig.rastertools.colortable.ui.tabs.IColorTableUI;
45

    
46
import com.iver.andami.PluginServices;
47
import com.iver.cit.gvsig.fmap.layers.FLayer;
48
/**
49
 * Listener generico para el panel de tablas de color, en el controlaremos el
50
 * refresco de la vista previa, los cambios en las tablas de color y la
51
 * finalizacion del panel.
52
 * 
53
 * @version 27/06/2007
54
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
55
 */
56
public class ColorTableListener implements PropertyListener, ColorTableUIListener, IPreviewRenderProcess {
57
        private ColorTablePanel colorTablePanel  = null;
58
        private FLyrRasterSE    previewLayer     = null;
59
        private ColorTableData  colorTableData   = null;
60
        private ArrayList       statusList       = new ArrayList();
61
        private IColorTableUI   lastColorTableUI = null;
62

    
63
        /**
64
         * Construye un ColorTableListener
65
         * @param colorTablePanel
66
         */
67
        public ColorTableListener(ColorTablePanel colorTablePanel, ColorTableData colorTableData) {
68
                this.colorTablePanel = colorTablePanel;
69
                this.colorTableData = colorTableData;
70
                getColorTableData().addValueChangedListener(this);
71
        }
72

    
73
        /**
74
         * Devuelve el panel de ColorTable
75
         * @return
76
         */
77
        private ColorTablePanel getColorTablePanel() {
78
                return colorTablePanel;
79
        }
80

    
81
        private ColorTableData getColorTableData() {
82
                return colorTableData;
83
        }
84

    
85
        /**
86
         * Asigna la capa raster de la vista
87
         * @param fLayer
88
         */
89
        public void setLayer(FLayer fLayer) {
90
                if (fLayer instanceof FLyrRasterSE) {
91
                        try {
92
                                previewLayer = (FLyrRasterSE) fLayer.cloneLayer();
93
                        } catch (Exception e) {
94
                                RasterToolsUtil.messageBoxError("preview_not_available", colorTablePanel, e);
95
                        }
96
                }
97
        }
98

    
99
        /**
100
         * Cierra la capa abierta para previsualizaci?n
101
         */
102
        public void closePreviewLayer() {
103
                if (previewLayer != null) {
104
                        previewLayer.getDataSource().close();
105
                        previewLayer.setRemoveRasterFlag(true);
106
                }
107
        }
108

    
109
        /**
110
         * Aqui se aplica el estado de las tablas de color al rendering pasado por
111
         * parametro
112
         * @param rendering
113
         * @return
114
         * @throws FilterTypeException
115
         */
116
        private void applyColorTable(IRasterRendering rendering, boolean isPreview) throws FilterTypeException {
117
                RasterFilterList filterList = rendering.getRenderFilterList();
118
                RasterFilterListManager manager = new RasterFilterListManager(filterList);
119
                ColorTableListManager cManager = (ColorTableListManager) manager.getManagerByClass(ColorTableListManager.class);
120

    
121
                filterList.remove(ColorTableFilter.class);
122

    
123
                ((FLyrRasterSE) getColorTablePanel().getLayer()).setLastLegend(null);
124

    
125
                if (getColorTableData().isEnabled()) {
126
                        filterList.remove(LinearStretchEnhancementFilter.class);
127
                        filterList.remove(TailTrimFilter.class);
128
                        GridPalette gridPalette = new GridPalette(getColorTableData().getColorTable());
129

    
130
                        // Asignamos la transparencia del render actual al filterList
131
                        filterList.addEnvParam("Transparency", rendering.getRender().getLastTransparency());
132

    
133
                        cManager.addColorTableFilter(gridPalette);
134

    
135
                        if (!isPreview) {
136
                                gridPalette.compressPalette();
137
                                ((FLyrRasterSE) getColorTablePanel().getLayer()).setLastLegend(gridPalette);
138
                        }
139
                }
140
                for (int i = 0; i< filterList.lenght(); i++) {
141
                        ((RasterFilter) filterList.get(i)).setEnv(filterList.getEnv());
142
                }
143

    
144
                rendering.setRenderFilterList(filterList);
145
        }
146

    
147
        /**
148
         * Acciones que se ejecutaran al haber presionado el bot?n aceptar o aplicar
149
         */
150
        public void accept() {
151
                if (getColorTablePanel().getLayer() instanceof IRasterRendering) {
152
                        try {
153
                                applyColorTable(((IRasterRendering) getColorTablePanel().getLayer()), false);
154
                                getColorTablePanel().getLayer().getMapContext().invalidate();
155
                        } catch (FilterTypeException e) {
156
                                RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e);
157
                        }
158

    
159
                }
160
        }
161
        
162
        public class StatusComponent {
163
                private JComponent object;
164
                private boolean enabled;
165

    
166
                public boolean isEnabled() {
167
                        return enabled;
168
                }
169

    
170
                public void setEnabled(boolean enabled) {
171
                        this.enabled = enabled;
172
                }
173

    
174
                public JComponent getObject() {
175
                        return object;
176
                }
177

    
178
                public void setObject(JComponent object) {
179
                        this.object = object;
180
                }
181
        }
182
        
183
        private void saveComponentsStatus(JComponent component) {
184
                // Guardar estado
185
                StatusComponent auxStatus = new StatusComponent();
186
                auxStatus.setEnabled(component.isEnabled());
187
                auxStatus.setObject(component);
188
                statusList.add(auxStatus);
189

    
190
                for (int i = 0; i < component.getComponentCount(); i++)
191
                        if (component.getComponent(i) instanceof JComponent)
192
                                saveComponentsStatus((JComponent) component.getComponent(i));
193
        }
194

    
195
        private void setEnabledRecursive(JComponent component, boolean enabled, int level) {
196
                if (enabled == true) {
197
                        boolean auxEnabled = false;
198
                        boolean finded = false;
199
                        // Buscar estado de dicho componente
200
                        for (int i = 0; i < statusList.size(); i++) {
201
                                StatusComponent auxStatus = (StatusComponent) statusList.get(i);
202
                                if (auxStatus.getObject() == component) {
203
                                        auxEnabled = auxStatus.isEnabled();
204
                                        statusList.remove(i);
205
                                        i--;
206
                                        finded = true;
207
                                        break;
208
                                }
209
                        }
210

    
211
                        // Asignar su estado
212
                        if (finded)
213
                                component.setEnabled(auxEnabled);
214
                } else {
215
                        // Si es la primera llamada, guardamos el estado de todos los componentes
216
                        if (level == 0)
217
                                saveComponentsStatus(component);
218

    
219
                        // Desactivar componente
220
                        component.setEnabled(false);
221
                }
222

    
223
                for (int i = 0; i < component.getComponentCount(); i++)
224
                        if (component.getComponent(i) instanceof JComponent)
225
                                setEnabledRecursive((JComponent) component.getComponent(i), enabled, level + 1);
226
        }        
227
        
228
        /**
229
         * Activa/Desactiva los componentes de las pesta?as segun la pesta?a selecionada
230
         * @param enabled
231
         */
232
        private void setEnabledPanel(boolean enabled) {
233
                colorTablePanel.getGeneralPanel().setEnabledPanel(enabled);
234
                colorTablePanel.getPreviewBasePanel().getTabbedPane().setEnabled(enabled);
235
                setEnabledRecursive(getLastColorTableUI().getPanel(), enabled, 0);
236
                setEnabledRecursive(colorTablePanel.getPreviewBasePanel().getImageNavigator(), enabled, 0);
237
                setEnabledRecursive(colorTablePanel.getPanelListView(), enabled, 0);
238
        }
239

    
240
        /*
241
         * (non-Javadoc)
242
         * @see org.gvsig.rastertools.PropertyListener#actionValueChanged(org.gvsig.rastertools.PropertyEvent)
243
         */
244
        public void actionValueChanged(PropertyEvent e) {
245
                if (e.getName().equals("refreshPreview")) {
246
                        colorTablePanel.getPreviewBasePanel().refreshPreview();
247
                        return;
248
                }
249
                if (e.getName().equals("interpolated")) {
250
                        colorTablePanel.getColorTableLibraryPanel().setInterpolated(((Boolean) e.getValue()).booleanValue());
251
                        getColorTableData().getColorTable().setInterpolated(((Boolean) e.getValue()).booleanValue());
252
                        getColorTableData().refreshPreview();
253
                        getLastColorTableUI().setColorTable(getColorTableData().getColorTable());
254
                        return;
255
                }
256
                
257
                if (e.getName().equals("enabled")) {
258
                        setEnabledPanel(((Boolean) e.getValue()).booleanValue());
259
                        return;
260
                }
261

    
262
                if (e.getName().equals("limits") ||
263
                                e.getName().equals("maxim") ||
264
                                e.getName().equals("minim")) {
265
                        if (getColorTableData().isLimitsEnabled()) {
266
                                double min = getColorTableData().getMinim();
267
                                double max = getColorTableData().getMaxim();
268
                                getLastColorTableUI().getColorTable().createColorTableInRange(min, max, false);
269
                                getLastColorTableUI().setColorTable(getLastColorTableUI().getColorTable());
270
                                getColorTableData().refreshPreview();
271
                        } else {
272
                                colorTablePanel.reloadPanelsFromLibraryPanel();
273
                        }
274
                        return;
275
                }
276
        }
277
        
278
        /**
279
         * Recarga la tabla de elementos
280
         * @param isNewSelection
281
         */
282
        public void refreshItems(boolean isNewSelection) {
283
                if (getColorTableData().getColorTable() == null)
284
                        return;
285

    
286
                if (isNewSelection)
287
                        getColorTableData().getColorTable().removeDuplicatedValues();
288

    
289
                getLastColorTableUI().setColorTable(getColorTableData().getColorTable());
290
        }
291

    
292
        /**
293
         * Pone en separaciones iguales todos los valores de la tabla seleccionada
294
         */
295
        public void equidistar() {
296
                ColorTable colorTable = getColorTableData().getColorTable();
297
                if (colorTable == null)
298
                        return;
299
                colorTable.removeDuplicatedValues();
300
                ArrayList list = colorTable.getColorItems();
301
                double min2 = Double.POSITIVE_INFINITY;
302
                double max2 = Double.NEGATIVE_INFINITY;
303
                for (int i = 0; i < list.size(); i++) {
304
                        ColorItem colorItem = (ColorItem) list.get(i);
305
                        if (min2 > colorItem.getValue())
306
                                min2 = colorItem.getValue();
307
                        if (max2 < colorItem.getValue())
308
                                max2 = colorItem.getValue();
309
                }
310
                for (int i = 0; i < list.size(); i++) {
311
                        ColorItem colorItem = (ColorItem) list.get(i);
312
                        colorItem.setValue(min2 + (((max2 - min2) / (list.size() - 1)) * i));
313
                }
314
                refreshItems(true);
315
                getColorTableData().refreshPreview();
316
        }
317
        
318
        /**
319
         * @return the lastColorTableUI
320
         */
321
        private IColorTableUI getLastColorTableUI() {
322
                return lastColorTableUI;
323
        }
324

    
325
        /**
326
         * @param lastColorTableUI the lastColorTableUI to set
327
         */
328
        public void setLastColorTableUI(IColorTableUI lastColorTableUI) {
329
                this.lastColorTableUI = lastColorTableUI;
330
        }
331

    
332
        /*
333
         * (non-Javadoc)
334
         * @see org.gvsig.rastertools.colortable.panels.ColorTableUIListener#actionColorTableUIChanged(org.gvsig.rastertools.colortable.panels.IColorTableUI)
335
         */
336
        public void actionColorTableUIChanged(IColorTableUI colorTableUI) {
337
                ColorTable colorTable = colorTablePanel.getColorTableLibraryPanel().getColorTableSelected();
338
                colorTable.createPaletteFromColorItems(colorTableUI.getColorTable().getColorItems(), true);
339
                colorTablePanel.getColorTableLibraryPanel().setColorTableSelected(colorTable);
340

    
341
                getColorTableData().setColorTable((ColorTable) colorTableUI.getColorTable().clone());
342
                getColorTableData().refreshPreview();
343
        }
344

    
345
        public void process(IRasterRendering rendering) throws FilterTypeException {
346
//                rendering.getRenderFilterList().pushStatus();
347
                try {
348
                        applyColorTable(rendering, true);
349
                } catch (FilterTypeException e1) {
350
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_adding_filters"), this, e1);
351
                }
352
//                rendering.getRenderFilterList().popStatus();
353
        }
354
}