Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / raster / beans / previewbase / PreviewBasePanel.java @ 19284

History | View | Annotate | Download (9.93 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 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.raster.beans.previewbase;
20

    
21
import java.awt.BorderLayout;
22
import java.awt.Color;
23
import java.awt.Dimension;
24
import java.util.ArrayList;
25

    
26
import javax.swing.BorderFactory;
27
import javax.swing.JPanel;
28
import javax.swing.JSplitPane;
29
import javax.swing.JTabbedPane;
30
import javax.swing.border.Border;
31
import javax.swing.border.TitledBorder;
32
import javax.swing.plaf.basic.BasicSplitPaneDivider;
33
import javax.swing.plaf.basic.BasicSplitPaneUI;
34

    
35
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
36
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
37
import org.gvsig.gui.beans.defaultbuttonspanel.DefaultButtonsPanel;
38
import org.gvsig.gui.beans.imagenavigator.IClientImageNavigator;
39
import org.gvsig.gui.beans.imagenavigator.ImageNavigator;
40
import org.gvsig.raster.datastruct.Extent;
41
import org.gvsig.raster.util.RasterToolsUtil;
42

    
43
import com.iver.cit.gvsig.fmap.layers.FLayer;
44
/**
45
 * Panel base para componentes con previsualizaci?n.
46
 * 
47
 * 19/02/2008
48
 * @author Nacho Brodin nachobrodin@gmail.com
49
 */
50
public class PreviewBasePanel extends DefaultButtonsPanel {
51
        private static final long serialVersionUID = 6028780107787443656L;
52

    
53
        private ImageNavigator        imageNavigator        = null;
54
        private FLyrRasterSE          fLayer                = null;
55

    
56
        /**
57
         * Lista de paneles de usuario que son a?adidos a los tabs
58
         */
59
        private ArrayList             userPanel             = new ArrayList();
60
        /**
61
         * Panel de la base del cuadro con opciones comunes para todos los tabs
62
         */
63
        private JPanel                generalPanel          = null;
64
        /**
65
         * Panel de debajo de la vista previa
66
         */
67
        private JPanel                downPreviewPanel      = null;
68
        private IPreviewRenderProcess renderProcess         = null;
69

    
70
        /**
71
         * Panel central para el caso de que sea m?s de uno (con pesta?as)
72
         */
73
        private JTabbedPane           tabbedPane            = null;
74
        /**
75
         * Panel central para el caso de que sea solo uno (sin pesta?as)
76
         */
77
        private JPanel                mainPanel             = null;
78

    
79
        private JSplitPane            jPanelRight           = null;
80
        private JPanel                jPanelPreview         = null;
81

    
82
        private PreviewRequestManager previewRequestManager =  null;
83
        
84
        /**
85
         * Construir un nuevo PreviewBasePanel
86
         * @param userPanel. Lista de paneles de usuario para los tabs
87
         * @param generalPanel. Panel inferior global para todos los tabs
88
         * @param downPreviewPanel. Panel inferior al de la previsualizaci?n
89
         * @param renderProcess. Clase para procesar el raster antes del dibujado
90
         * @param lyr. Capa raster a mostrar en la previsualizaci?n
91
         */
92
        public PreviewBasePanel(ArrayList userPanel, 
93
                                                        JPanel generalPanel, 
94
                                                        JPanel downPreviewPanel, 
95
                                                        IPreviewRenderProcess renderProcess,
96
                                                        FLyrRasterSE lyr) {
97
                super(ButtonsPanel.BUTTONS_NONE);
98
                getButtonsPanel().addApply();
99
                getButtonsPanel().addAccept();
100
                getButtonsPanel().addCancel();
101
                this.userPanel = userPanel;
102
                this.generalPanel = generalPanel;
103
                this.downPreviewPanel = downPreviewPanel;
104
                this.renderProcess = renderProcess;
105
                setLayer(lyr);
106
                initialize();
107
        }
108

    
109
        /**
110
         * Inicializa los componentes gr?ficos
111
         */
112
        private void initialize() {
113
                setLayout(new BorderLayout(8, 8));
114

    
115
                JPanel panelLeft = new JPanel();
116
                panelLeft.setPreferredSize(new Dimension(390,0));
117
                panelLeft.setLayout(new BorderLayout(8, 8));
118
                if(userPanel != null) {
119
                        if(userPanel.size() == 1)
120
                                panelLeft.add(getPanelWithoutTabs(), BorderLayout.CENTER);
121
                        if(userPanel.size() > 1)
122
                                panelLeft.add(getTabbedPane(), BorderLayout.CENTER);
123
                }
124
                if(generalPanel != null)
125
                        panelLeft.add(getGeneralPanel(), BorderLayout.SOUTH);
126

    
127
                JSplitPane jSplitPane1 = new JSplitPane();
128
                jSplitPane1.setLeftComponent(panelLeft);
129
                jSplitPane1.setRightComponent(getPanelRight());
130
                jSplitPane1.setResizeWeight(1.0);
131
                jSplitPane1.setContinuousLayout(true);
132
                jSplitPane1.setUI(new BasicSplitPaneUI() {
133
                        public BasicSplitPaneDivider createDefaultDivider() {
134
                                return new BasicSplitPaneDivider(this) {
135
                                        private static final long serialVersionUID = 1L;
136

    
137
                                        public void setBorder(Border b) {
138
                                        }
139
                                };
140
                        }
141
                });
142
                jSplitPane1.setBorder(null);
143

    
144
                add(jSplitPane1, BorderLayout.CENTER);
145
        }
146

    
147
        /**
148
         * Obtiene el componente con los tabs donde se a?aden las pesta?as del usuario.
149
         * @return JTabbedPane
150
         */
151
        public JTabbedPane getTabbedPane() {
152
                if (tabbedPane == null) {
153
                        tabbedPane = new JTabbedPane();
154
                        for (int i = 0; i < userPanel.size(); i++) 
155
                                tabbedPane.addTab(((IUserPanelInterface)userPanel.get(i)).getTitle(), ((IUserPanelInterface)userPanel.get(i)).getPanel());
156
                }
157
                return tabbedPane;
158
        }
159
        
160
        /**
161
         * Obtiene el panel central sin tabs. Esto ocurre cuando el usuario solo quiere un
162
         * panel. En este caso no hacen falta pesta?as por lo que se incorpora solo un JPanel
163
         * @return JTabbedPane
164
         */
165
        public JPanel getPanelWithoutTabs() {
166
                if (mainPanel == null) {
167
                        if(((IUserPanelInterface)userPanel.get(0)) instanceof JPanel)
168
                                mainPanel = ((JPanel)userPanel.get(0));
169
                        else
170
                                mainPanel = new JPanel();
171
                }
172
                return mainPanel;
173
        }
174
        
175
        /**
176
         * Obtiene el panel con opciones comunes a todas las pesta?as.
177
         * @return JPanel
178
         */
179
        public JPanel getGeneralPanel() {
180
                return generalPanel;
181
        }
182
        
183
        /**
184
         * Obtiene el panel de debajo de la vista previa
185
         * @return JPanel
186
         */
187
        public JPanel getDownPreviewPanel() {
188
                return downPreviewPanel;
189
        }
190

    
191
        /**
192
         * Obtiene la lista de paneles de usuario
193
         * @return ArrayList de IUserPanelInterface
194
         */
195
        public ArrayList getUserPanels() {
196
                return userPanel;
197
        }
198
        
199
        /**
200
         * Obtiene el objeto IClientImageNavigator
201
         * @return
202
         */
203
        public IClientImageNavigator getPreviewManager() {
204
                return previewRequestManager;
205
        }
206

    
207
        /**
208
         * Devuelve el componente para la vista previa
209
         * @return
210
         */
211
        public ImageNavigator getImageNavigator() {
212
                if (imageNavigator == null) {
213
                        imageNavigator = new ImageNavigator(getPreviewManager());
214
                        imageNavigator.setFocusable(true);
215
                        imageNavigator.setBorder(BorderFactory.createLineBorder(Color.gray, 1));
216
                }
217
                return imageNavigator;
218
        }
219

    
220
        /**
221
         * Obtiene el panel con el componente con la vista previa
222
         * @return JPanel
223
         */
224
        public JPanel getPanelPreview() {
225
                if (jPanelPreview == null) {
226
                        jPanelPreview = new JPanel();
227
                        JPanel jsubpanel2 = new JPanel();
228
                        jPanelPreview.setBorder(BorderFactory.createTitledBorder(null, RasterToolsUtil.getText(this, "vista_previa"), TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
229
                        jPanelPreview.setLayout(new BorderLayout());
230
                        jsubpanel2.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
231
                        jsubpanel2.setLayout(new BorderLayout());
232

    
233
                        jsubpanel2.add(getImageNavigator(), BorderLayout.CENTER);
234
                        jPanelPreview.add(jsubpanel2, BorderLayout.CENTER);
235

    
236
                        jPanelPreview.setPreferredSize(new Dimension(237, 237));
237
                        jPanelPreview.setMinimumSize(new Dimension(237, 237));
238
                        jPanelPreview.setMaximumSize(new Dimension(237, 237));
239
                }
240
                return jPanelPreview;
241
        }
242

    
243
        /**
244
         * Devuelve el panel donde estar? el widget de preview
245
         * @return
246
         */
247
        private JSplitPane getPanelRight() {
248
                if (jPanelRight == null) {
249
                        jPanelRight = new JSplitPane();
250
                        jPanelRight.setOrientation(JSplitPane.VERTICAL_SPLIT);
251
                        jPanelRight.setContinuousLayout(true);
252
                        jPanelRight.setResizeWeight(0.0);
253
                        jPanelRight.setPreferredSize(new Dimension(220, 0));
254
                        jPanelRight.setMinimumSize(new Dimension(220, 0));
255

    
256
                        if(getPanelPreview() != null)
257
                                jPanelRight.setTopComponent(getPanelPreview());
258
                        else
259
                                jPanelRight.setTopComponent(new JPanel());
260
                        if(getDownPreviewPanel() != null)
261
                                jPanelRight.setBottomComponent(getDownPreviewPanel());
262
                        else
263
                                jPanelRight.setBottomComponent(new JPanel());
264
                        jPanelRight.setUI(new BasicSplitPaneUI() {
265
                                public BasicSplitPaneDivider createDefaultDivider() {
266
                                        return new BasicSplitPaneDivider(this) {
267
                                                private static final long serialVersionUID = 1L;
268

    
269
                                                public void setBorder(Border b) {
270
                                                }
271
                                        };
272
                                }
273
                        });
274
                        jPanelRight.setBorder(null);
275
                }
276
                return jPanelRight;
277
        }
278

    
279
        /**
280
         * Especificar el layer para la tabla de color
281
         * @param layer
282
         */
283
        public void setLayer(FLyrRasterSE fLayer) {
284
                this.fLayer = fLayer;
285
                previewRequestManager = new PreviewRequestManager(this, renderProcess, fLayer);
286

    
287
                // Util para ejecutar el test sin una capa de prueba
288
                if (fLayer == null)
289
                        return;
290

    
291
                // Especificar las dimensiones de la capa en la vista previa
292
                Extent extent2 = ((FLyrRasterSE) fLayer).getFullRasterExtent();//.getBufferFactory().getDataSource().getExtent();
293
                getImageNavigator().setViewDimensions(extent2.getMin().getX(), extent2.getMax().getY(), extent2.getMax().getX(), extent2.getMin().getY());
294
                getImageNavigator().setZoom(1.0/((FLyrRasterSE) fLayer).getBufferFactory().getDataSource().getCellSize());
295
                getImageNavigator().setAutoAdjusted();
296
        }
297

    
298
        /**
299
         * Especificar el layer para el recorte
300
         * @param layer
301
         */
302
        public FLayer getLayer() {
303
                return fLayer;
304
        }
305
        
306
        /**
307
         * Especifica el tama?o de la vista previa
308
         * @param dimension
309
         */
310
        public void setPreviewSize(Dimension dimension) {
311
                getPanelPreview().setPreferredSize(dimension);
312
                getPanelPreview().setMinimumSize(dimension);
313
                getPanelPreview().setMaximumSize(dimension);
314
        }
315
        
316
        /**
317
         * Actualizamos la vista previa
318
         */
319
        public void refreshPreview() {
320
                if (fLayer == null)
321
                        return;
322
                getImageNavigator().updateBuffer();
323
        }
324

    
325
}