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 @ 1426

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
import java.util.List;
28

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

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

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

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

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

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

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

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

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

    
142

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

    
151
        public JPanel getPanelListView() {
152
                if (jPanelListView == null) {
153
                        jPanelListView = new JPanel();
154
                        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));
155
                        jPanelListView.setLayout(new BorderLayout());
156
                        
157
                        jPanelListView.add(getColorTableLibraryPanel());
158
                }
159
                return jPanelListView;
160
        }
161
        
162
        public ColorTableLibraryPanel getColorTableLibraryPanel() {
163
                if (colorTableLibraryPanel == null) {
164
                        colorTableLibraryPanel = new ColorTableLibraryPanel(getColorTableData());
165
                        colorTableLibraryPanel.addColorTableLibraryListener(this);
166
                        colorTableLibraryPanel.selectDefault();
167
                }
168
                return colorTableLibraryPanel;
169
        }
170

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

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

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

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

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

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

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

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

    
259
                getLayer().setLastLegend(null);
260

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

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

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

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

    
300
                        getGeneralPanel().setLayer(fLayer);
301

    
302
                        getColorTableListener().setLayer(fLayer);
303

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

    
306
                        filterStatus = rasterFilterList.getStatusCloned();
307

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

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

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

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

    
331
                                getGeneralPanel().setLimitsEnabled(true);
332
                                getGeneralPanel().setCheckBoxEnabled(false);
333
                        }
334
                        reloadPanelsFromLibraryPanel();
335
                }catch (Exception e) {
336
                        throw new ColorTableException(ColorTableException.MESSAGE_NOTLOADED);
337
                }
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
}