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 / colortable / ui / ColorTablePanel.java @ 1324

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

    
24
import java.awt.BorderLayout;
25
import java.io.IOException;
26
import java.util.ArrayList;
27

    
28
import javax.swing.JPanel;
29
import javax.swing.event.ChangeEvent;
30
import javax.swing.event.ChangeListener;
31

    
32
import org.gvsig.andami.PluginServices;
33
import org.gvsig.fmap.dal.coverage.RasterLocator;
34
import org.gvsig.fmap.dal.coverage.RasterManager;
35
import org.gvsig.fmap.dal.coverage.exception.ColorTableException;
36
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
37
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
38
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
39
import org.gvsig.fmap.dal.coverage.grid.render.Render;
40
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
41
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
42
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
43
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
44
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
45
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
46
import org.gvsig.raster.fmap.layers.FLyrRaster;
47
import org.gvsig.raster.swing.RasterSwingLocator;
48
import org.gvsig.raster.swing.preview.PreviewBasePanelTab;
49
import org.gvsig.raster.swing.preview.PreviewPanel;
50
import org.gvsig.raster.swing.preview.PreviewRenderProcess;
51
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
52
import org.gvsig.raster.tools.app.basic.raster.bean.previewbase.RasterDataSourcePreview;
53
import org.gvsig.raster.tools.app.basic.tool.colortable.data.ColorTableData;
54
import org.gvsig.raster.tools.app.basic.tool.colortable.ui.library.ColorTableLibraryEvent;
55
import org.gvsig.raster.tools.app.basic.tool.colortable.ui.library.ColorTableLibraryListener;
56
import org.gvsig.raster.tools.app.basic.tool.colortable.ui.library.ColorTableLibraryPanel;
57
import org.gvsig.raster.tools.app.basic.tool.colortable.ui.tabs.IColorTableUI;
58
import org.gvsig.raster.tools.app.basic.tool.colortable.ui.tabs.TabInterpolated;
59
import org.gvsig.raster.tools.app.basic.tool.colortable.ui.tabs.TabTable;
60
/**
61
 * ColorTablePanel es el panel padre que contendra todos los paneles del interfaz
62
 * de tablas de color.
63
 *
64
 * @version 26/06/2007
65
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
66
 */
67
public class ColorTablePanel extends JPanel implements ChangeListener, ButtonsPanelListener, ColorTableLibraryListener {
68
        private static final long serialVersionUID = 6028780107787443656L;
69

    
70
        private ColorTableListener      colorTableListener = null;
71
        private FLyrRaster              fLayer             = null;
72
        private ArrayList<RasterFilter> filterStatus       = null;
73
        private ColorTableData          colorTableData     = null;
74

    
75
        private IColorTableUI           tabTable           = null;
76
        private IColorTableUI           tabInterpolated    = null;
77
        
78
        private ColorTableLibraryPanel  colorTableLibraryPanel = null;
79

    
80
        private JPanel                  jPanelListView     = null;
81
        private ColorTableGlobalPanel   panelGeneral       = null;
82
        private ColorTableDialog        colorTableDialog   = null;
83
        private PreviewPanel            previewBasePanel   = null;
84

    
85
        /**
86
         * Controla si se ha presionado el boton aceptar para el cerrado de la ventana
87
         */
88
        boolean accepted = false;
89

    
90
        /**
91
         * Construir un nuevo ColorTablePanel
92
         * @throws ColorTableException 
93
         */
94
        public ColorTablePanel(FLyrRaster layer, ColorTableDialog colorTableDialog) throws ColorTableException {
95
                this.colorTableDialog = colorTableDialog;
96
                fLayer = layer;
97
                initialize();
98
                setLayer(layer);
99
        }
100
        
101
        public PreviewPanel getPreviewBasePanel() {
102
                if (previewBasePanel == null) {
103
                        ArrayList<PreviewBasePanelTab> list = new ArrayList<PreviewBasePanelTab>();
104
                        list.add((PreviewBasePanelTab)getTabTable());
105
                        list.add((PreviewBasePanelTab)getTabInterpolated());
106
                        getColorTableListener().setLastColorTableUI(getTabTable());
107
                        RasterDataSourcePreview previewDataSource = new RasterDataSourcePreview(fLayer);
108
                        
109
                        previewBasePanel = RasterSwingLocator.getSwingManager().createPreviewPanel(
110
                                        ButtonsPanel.BUTTONS_NONE, 
111
                                        list, 
112
                                        (JPanel) getGeneralPanel(), 
113
                                        getPanelListView(), 
114
                                        (PreviewRenderProcess)getColorTableListener(), 
115
                                        previewDataSource);
116
                        previewBasePanel.getTabbedPane().addChangeListener(this);
117
                        previewBasePanel.getButtonsPanel().addButton(RasterToolsUtil.getText(this, "equidistar"), ButtonsPanel.BUTTON_LAST + 3);
118
                        previewBasePanel.getButtonsPanel().addButton(RasterToolsUtil.getText(this, "guardar_predeterminado"), ButtonsPanel.BUTTON_LAST + 2);
119
                        previewBasePanel.getButtonsPanel().addApply();
120
                        previewBasePanel.getButtonsPanel().addAccept();
121
                        previewBasePanel.getButtonsPanel().addCancel();
122
                        previewBasePanel.addButtonPressedListener(this);
123
                }
124
                return previewBasePanel;
125
        }
126
        
127

    
128
        private void initialize() {
129
                setLayout(new BorderLayout());
130
                add((JPanel)getPreviewBasePanel(), BorderLayout.CENTER);
131
        }
132

    
133
        private IColorTableUI getTabTable() {
134
                if (tabTable == null) {
135
                        tabTable = new TabTable();
136
                        tabTable.addColorTableUIChangedListener(getColorTableListener());
137
                }
138
                return tabTable;
139
        }
140

    
141

    
142
        private IColorTableUI getTabInterpolated() {
143
                if (tabInterpolated == null) {
144
                        tabInterpolated = new TabInterpolated();
145
                        tabInterpolated.addColorTableUIChangedListener(getColorTableListener());
146
                }
147
                return tabInterpolated;
148
        }
149

    
150
        public JPanel getPanelListView() {
151
                if (jPanelListView == null) {
152
                        jPanelListView = new JPanel();
153
                        jPanelListView.setBorder(javax.swing.BorderFactory.createTitledBorder(null, RasterToolsUtil.getText(this, "libreria"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
154
                        jPanelListView.setLayout(new BorderLayout());
155
                        
156
                        jPanelListView.add(getColorTableLibraryPanel());
157
                }
158
                return jPanelListView;
159
        }
160
        
161
        public ColorTableLibraryPanel getColorTableLibraryPanel() {
162
                if (colorTableLibraryPanel == null) {
163
                        colorTableLibraryPanel = new ColorTableLibraryPanel(getColorTableData());
164
                        colorTableLibraryPanel.addColorTableLibraryListener(this);
165
                        colorTableLibraryPanel.selectDefault();
166
                }
167
                return colorTableLibraryPanel;
168
        }
169

    
170
        /**
171
         * Obtener el componente que hara la carga pesada de los listeners
172
         * @return
173
         */
174
        private ColorTableListener getColorTableListener() {
175
                if (colorTableListener == null) {
176
                        colorTableListener = new ColorTableListener(this, getColorTableData());
177
                }
178
                return colorTableListener;
179
        }
180

    
181
        public ColorTableGlobalPanel getGeneralPanel() {
182
                if (panelGeneral == null) {
183
                        panelGeneral = new ColorTableGlobalPanel(getColorTableData());
184
                }
185
                return panelGeneral;
186
        }
187

    
188
        /**
189
         * Volvemos todo a la normalidad cuando se cancela
190
         */
191
        private boolean restoreFilters() {
192
                if (getLayer() != null) {
193
                        Render rendering = getLayer().getRender();
194
                        if(rendering.getFilterList() == null)
195
                                return false;
196
                        rendering.getFilterList().setStatus(getFilterStatus());
197
                        getLayer().getRender().setFilterList(rendering.getFilterList());
198
                }
199
                return true;
200
        }
201

    
202
        /**
203
         * Devuelve el arrayList de filtros inicial
204
         * @return
205
         */
206
        private ArrayList<RasterFilter> getFilterStatus() {
207
                return filterStatus;
208
        }
209

    
210
        /**
211
         * Carga la tabla de color que hay seleccionada en el componente
212
         * ListViewComponent
213
         * @throws ColorTableException 
214
         */
215
        public void reloadPanelsFromLibraryPanel() throws ColorTableException {
216
                ColorTable colorTable = getColorTableLibraryPanel().getColorTableSelected();
217
                if(colorTable == null)
218
                        throw new ColorTableException(ColorTableException.MESSAGE_NOTLOADED);
219
                getColorTableData().setColorTable((ColorTable) colorTable.clone());
220
                if (colorTableData.isLimitsEnabled()) {
221
                        double min = getColorTableData().getMinim();
222
                        double max = getColorTableData().getMaxim();
223
                        getColorTableData().getColorTable().createColorTableInRange(min, max, false);
224
                }
225
                getColorTableListener().refreshItems(true);
226
                getColorTableData().refreshPreview();
227
        }
228

    
229
        /**
230
         * Salva la tabla de color al fichero rmf.
231
         * @param fName
232
         * @throws IOException
233
         */
234
        private void saveColorTable() {
235
                RasterDataStore dataset = getLayer().getDataStore();
236
                try {
237
                        if (getColorTableData().isEnabled())
238
                                dataset.saveColorTableToRmf(getColorTableData().getColorTable());
239
                        else
240
                                dataset.saveColorTableToRmf(null);
241
                } catch (RmfSerializerException e) {
242
                        RasterToolsUtil.messageBoxError("error_salvando_rmf", this, e);
243
                }
244
        }
245

    
246
        /**
247
         * Restaura el estado de los filtros como estaban al abrir la ventana y quita
248
         * la leyenda del TOC
249
         */
250
        private void restoreSettings() {
251
                if (getLayer() == null)
252
                        return;
253

    
254
                // Restauramos la vista con los filtros originales antes de cualquier acci?n
255
                if(!restoreFilters())
256
                        return;
257

    
258
                getLayer().setLastLegend(null);
259

    
260
                RasterFilterList rasterFilterList = getLayer().getRender().getFilterList();
261
                RasterFilter colorTableFilter = rasterFilterList.getByName("colortable");
262
                if (colorTableFilter != null) {
263
                        ColorTable colorTable = (ColorTable)colorTableFilter.getParam("colorTable");
264
                        getLayer().setLastLegend(colorTable);
265
                }
266

    
267
                // Quitamos la banda de transparencia por si el filtro de color la ha activado
268
                try {
269
                        Transparency transparency = getLayer().getRender().getLastTransparency();
270
                        transparency.setTransparencyBand(-1);
271
                        //transparency.activeTransparency();
272
                        transparency.setAlphaBand(null);
273
                } catch (NullPointerException ex) {
274
                        //No quitamos la banda de transparencia
275
                }
276
        }
277

    
278
        /**
279
         * Devuelve el componente que trata los datos
280
         * @return
281
         */
282
        private ColorTableData getColorTableData() {
283
                if (colorTableData == null) {
284
                        colorTableData = new ColorTableData();
285
                }
286
                return colorTableData;
287
        }
288

    
289
        /**
290
         * Especificar el layer para la tabla de color
291
         * @param layer
292
         * @throws ColorTableException 
293
         */
294
        private void setLayer(FLyrRaster fLayer) throws ColorTableException {
295
                try {
296
                        this.fLayer = fLayer;
297
                        RasterManager rManager = RasterLocator.getManager();
298

    
299
                        getGeneralPanel().setLayer(fLayer);
300

    
301
                        getColorTableListener().setLayer(fLayer);
302

    
303
                        RasterFilterList rasterFilterList = getLayer().getRender().getFilterList();
304

    
305
                        filterStatus = rasterFilterList.getStatusCloned();
306

    
307
                        RasterFilter colorTableFilter = rasterFilterList.getByName("colortable");
308
                        if (colorTableFilter != null) {
309
                                ColorTable colorTable = (ColorTable)colorTableFilter.getParam("colorTable");
310
                                if (colorTable.isCompressible()) {
311
                                        if (RasterToolsUtil.messageBoxYesOrNot("comprimir_paleta", this)) {
312
                                                colorTable.compressPalette();
313
                                                colorTable.setInterpolated(true);
314
                                        }
315
                                }
316

    
317
                                ColorTable ct = rManager.getDataStructFactory().getColorTableLibrary().createColorTable();
318
                                ct.setName(RasterToolsUtil.getText(this, "tabla_actual"));
319
                                ct.createPaletteFromColorItems(colorTable.getColorItems(), false);
320
                                ct.setInterpolated(colorTable.isInterpolated());
321
                                getGeneralPanel().setCheckBoxInterpolated(colorTable.isInterpolated());
322

    
323
                                getColorTableLibraryPanel().addColorTable(0, ct);
324

    
325
                                getGeneralPanel().setLimitsEnabled(false);
326
                                getGeneralPanel().setCheckBoxEnabled(true);
327
                        } else {
328
                                getColorTableLibraryPanel().selectDefault();
329

    
330
                                getGeneralPanel().setLimitsEnabled(true);
331
                                getGeneralPanel().setCheckBoxEnabled(false);
332
                        }
333
                        reloadPanelsFromLibraryPanel();
334
                }catch (Exception e) {
335
                        throw new ColorTableException(ColorTableException.MESSAGE_NOTLOADED);
336
                }
337
                getPreviewBasePanel().refreshPreview();
338
        }
339

    
340
        /**
341
         * Especificar el layer para el recorte
342
         * @param layer
343
         */
344
        public FLyrRaster getLayer() {
345
                return fLayer;
346
        }
347

    
348
        /**
349
         * Cuando se aceptan los cambios en el panel ejecutaremos el aceptar del
350
         * listener
351
         */
352
        private void accept() {
353
                if(!getGeneralPanel().getCheckBoxEnabled().isSelected()) {
354
                        boolean ok = RasterToolsUtil.messageBoxYesOrNot("colortable_not_active", this);
355
                        if(ok)
356
                                getColorTableListener().accept();
357
                        else
358
                                return;
359
                }
360
                getColorTableListener().accept();
361
        }
362

    
363
        /**
364
         * Volvemos todo a la normalidad cuando se cancela
365
         */
366
        private void cancel() {
367
                getColorTableListener().closePreviewLayer();
368
                getLayer().getMapContext().invalidate();
369
        }
370

    
371
        /**
372
         * Se dispara cuando se selecciona una pesta?a en el panel
373
         */
374
        public void stateChanged(ChangeEvent e) {
375
                switch (getPreviewBasePanel().getTabbedPane().getSelectedIndex()) {
376
                        case 1:
377
                                getColorTableListener().setLastColorTableUI(getTabInterpolated());
378
                                break;
379
                        default:
380
                                getColorTableListener().setLastColorTableUI(getTabTable());
381
                                break;
382
                }
383

    
384
                getColorTableListener().refreshItems(true);
385
        }
386

    
387
        /*
388
         * (non-Javadoc)
389
         * @see org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener#actionButtonPressed(org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent)
390
         */
391
        public void actionButtonPressed(ButtonsPanelEvent e) {
392
                restoreSettings();
393

    
394
                // Al pulsar Aceptar o Aplicar se ejecuta el aceptar del panel
395
                if (e.getButton() == ButtonsPanel.BUTTON_APPLY || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
396
                        accept();
397
                }
398

    
399
                // Al pulsar Cancelar la ventana se cierra y se refresca la vista
400
                if (e.getButton() == ButtonsPanel.BUTTON_CANCEL) {
401
                        cancel();
402
                        close();
403
                }
404

    
405
                // Al pulsar Aceptar simplemente la ventana se cierra
406
                if (e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
407
                        accepted = true;
408
                        close();
409
                }
410

    
411
                if (e.getButton() == (ButtonsPanel.BUTTON_LAST + 2)) {
412
                        if (RasterToolsUtil.messageBoxYesOrNot("guardar_como_predeterminado", this)) {
413
                                saveColorTable();
414
                                accept();
415
                        }
416
                }
417

    
418
                if (e.getButton() == (ButtonsPanel.BUTTON_LAST + 3)) {
419
                        getColorTableListener().equidistar();
420
                }
421
        }
422

    
423
        /**
424
         * Acciones a ejecutar cuando se cancela
425
         */
426
        private void close() {
427
                if (colorTableDialog == null)
428
                        return;
429
                try {
430
                        PluginServices.getMDIManager().closeWindow(colorTableDialog);
431
                } catch (ArrayIndexOutOfBoundsException e) {
432
                        // Si la ventana no se puede eliminar no hacemos nada
433
                }
434
        }
435

    
436
        public void windowClosed() {
437
                if (!accepted) {
438
                        restoreSettings();
439
                        cancel();
440
                }
441
        }
442

    
443
        /*
444
         * (non-Javadoc)
445
         * @see org.gvsig.rastertools.colortable.library.ColorTableLibraryListener#actionColorTableChanged(org.gvsig.rastertools.colortable.library.ColorTableLibraryEvent)
446
         */
447
        public void actionColorTableChanged(ColorTableLibraryEvent e) {
448
                try {
449
                        reloadPanelsFromLibraryPanel();
450
                } catch (ColorTableException e1) {
451
                        //Esta excepci?n ya se ha debido capturar en la carga del dialogo por lo que no deber?a darse
452
                }
453
        }
454
}