Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.coreplugin.app / org.gvsig.coreplugin.app.mainplugin / src / main / java / org / gvsig / coreplugin / mdiManager / FrameWindowSupport.java @ 42601

History | View | Annotate | Download (9.94 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
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 3
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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.coreplugin.mdiManager;
25

    
26
import java.awt.Component;
27
import java.awt.Dimension;
28
import java.awt.Image;
29
import java.awt.event.ComponentEvent;
30
import java.awt.event.ComponentListener;
31
import java.util.Hashtable;
32
import java.util.Iterator;
33

    
34
import javax.swing.ImageIcon;
35
import javax.swing.JComponent;
36
import javax.swing.JDialog;
37
import javax.swing.JFrame;
38
import javax.swing.JInternalFrame;
39
import javax.swing.JPanel;
40
import org.gvsig.andami.PluginServices;
41

    
42
import org.gvsig.andami.ui.mdiFrame.MDIFrame;
43
import org.gvsig.andami.ui.mdiManager.IWindow;
44
import org.gvsig.andami.ui.mdiManager.WindowInfo;
45
import org.gvsig.coreplugin.mdiManager.frames.ExternalFrame;
46
import org.gvsig.coreplugin.mdiManager.frames.IFrame;
47
import org.gvsig.coreplugin.mdiManager.frames.InternalFrame;
48
import org.gvsig.i18n.Messages;
49

    
50

    
51

    
52
/**
53
 *
54
 */
55
public class FrameWindowSupport {
56
    private Hashtable frameView = new Hashtable();
57
    private Hashtable viewFrame = new Hashtable();
58
    private Image icon;
59
    private WindowInfoSupport vis;
60
        private JFrame mainFrame;
61

    
62
    /**
63
     * Creates a new FrameViewSupport object.
64
     *
65
     * @param i DOCUMENT ME!
66
     */
67
    public FrameWindowSupport(MDIFrame mainFrame) {
68
            this.mainFrame = mainFrame;
69
        icon = mainFrame.getIconImage();
70
    }
71

    
72
    public Iterator getWindowIterator(){
73
            return viewFrame.keySet().iterator();
74
    }
75

    
76
    public boolean contains(IWindow v){
77
            return viewFrame.containsKey(v);
78
    }
79

    
80
        /**
81
         * @param wnd
82
         * @return
83
         */
84
        public boolean contains(JInternalFrame wnd) {
85
                return frameView.contains(wnd);
86
        }
87

    
88
    /**
89
     * DOCUMENT ME!
90
     *
91
     * @param p DOCUMENT ME!
92
     *
93
     * @return DOCUMENT ME!
94
     */
95
    public JDialog getJDialog(IWindow p) {
96
        JDialog dlg = (JDialog) viewFrame.get(p);
97

    
98
        if (dlg == null) {
99
            ExternalFrame nuevo = new ExternalFrame(mainFrame);
100

    
101
            nuevo.getContentPane().add((JPanel) p);
102
            
103
            WindowInfo vi = vis.getWindowInfo(p);
104
            nuevo.setSize(getWidth(p, vi), getHeight(p, vi) + 30);
105
            nuevo.setTitle(vi.getTitle());
106
            nuevo.setResizable(vi.isResizable());
107
            nuevo.setMinimumSize(vi.getMinimumSize());
108
            if( vi.needPack() ) {
109
                nuevo.pack();
110
            }
111
            viewFrame.put(p, nuevo);
112
            frameView.put(nuevo, p);
113

    
114
            nuevo.setModal(vi.isModal());
115
            closeOnHide(p);
116
            return nuevo;
117
        } else {
118
            return dlg;
119
        }
120
    }
121

    
122
    /**
123
     * DOCUMENT ME!
124
     *
125
     * @param p DOCUMENT ME!
126
     *
127
     * @return DOCUMENT ME!
128
     */
129
    public JInternalFrame getJInternalFrame(IWindow p) {
130
            JInternalFrame frame = (JInternalFrame) viewFrame.get(p);
131

    
132
        if (frame == null) {
133
                //ViewInfo vi = vis.getViewInfo(p);
134
            JInternalFrame nuevo = createJInternalFrame(p);
135
            viewFrame.put(p, nuevo);
136
            frameView.put(nuevo, p);
137

    
138
            return nuevo;
139
        } else {
140
            return frame;
141
        }
142
    }
143
    
144
    /**
145
     * Gets the frame associated to the provided IWindow panel.
146
     * The frame will usually be a JInternalFrame or a JDialog.
147
     *
148
     * @param panel The IWindow panel whose frame wants to be retrieved.
149
     *
150
     * @return The associated frame, it will usually be a JInternalFrame or
151
     * a JDialog.
152
     */
153
    public Component getFrame(IWindow panel) {
154
            Object object = viewFrame.get(panel);
155
            if (object!=null && object instanceof Component) {
156
                    return (Component) object;
157
            }
158
            else {
159
            throw new RuntimeException(Messages.getText("window_not_found")
160
                + ": " + panel.getWindowInfo().getTitle());
161
            }
162
    }
163

    
164
    public JInternalFrame createJInternalFrame(IWindow p)
165
    {
166
        WindowInfo wi = vis.getWindowInfo(p);
167
        JInternalFrame nuevo = new InternalFrame();
168
        if (icon != null){
169
            nuevo.setFrameIcon(new ImageIcon(icon));
170
        }
171
        
172
        nuevo.getContentPane().add((JPanel) p);
173
        nuevo.setClosable(!wi.isNotClosable());
174
        nuevo.setSize(getWidth(p, wi), getHeight(p, wi));
175
        nuevo.setTitle(wi.getTitle());
176
        nuevo.setVisible(wi.isVisible());
177
        nuevo.setResizable(wi.isResizable());
178
        nuevo.setIconifiable(wi.isIconifiable());
179
        nuevo.setMaximizable(wi.isMaximizable());
180
        nuevo.setLocation(wi.getX(), wi.getY());
181
        nuevo.setMinimumSize(wi.getMinimumSize());
182
        closeOnHide(p);
183
        nuevo.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
184
        return nuevo;
185
    }
186

    
187
    private void closeOnHide(final IWindow p) {
188
        ((JPanel)p).addComponentListener(new ComponentListener() {
189

    
190
            @Override
191
            public void componentResized(ComponentEvent ce) {
192
            }
193

    
194
            @Override
195
            public void componentMoved(ComponentEvent ce) {
196
            }
197

    
198
            @Override
199
            public void componentShown(ComponentEvent ce) {
200
            }
201

    
202
            @Override
203
            public void componentHidden(ComponentEvent ce) {
204
                PluginServices.getMDIManager().closeWindow(p);
205
            }
206
        });
207
        
208
    }
209
    
210
    public IWindow getWindow(Component dlg){
211
            return (IWindow) frameView.get(dlg);
212
    }
213

    
214
    public void closeWindow(IWindow v){
215
            Object c = viewFrame.remove(v);
216
            frameView.remove(c);
217
    }
218

    
219
    /**
220
     * DOCUMENT ME!
221
     *
222
     * @param v DOCUMENT ME!
223
     * @param x DOCUMENT ME!
224
     */
225
    public void setX(IWindow win, int x) {
226
            IFrame frame = (IFrame) viewFrame.get(win);
227
            if (frame != null) {
228
                frame.setX(x);
229
            }
230
            
231
    }
232

    
233
    /**
234
     * DOCUMENT ME!
235
     *
236
     * @param v DOCUMENT ME!
237
     * @param y DOCUMENT ME!
238
     */
239
    public void setY(IWindow win, int y) {
240
            IFrame frame = (IFrame) viewFrame.get(win);
241
        if (frame != null) {
242
            frame.setY(y);
243
        }
244
    }
245

    
246
    /**
247
     * DOCUMENT ME!
248
     *
249
     * @param v DOCUMENT ME!
250
     * @param height DOCUMENT ME!
251
     */
252
    public void setHeight(IWindow win, int height) {
253
            IFrame frame = (IFrame) viewFrame.get(win);
254
            frame.setHeight(height);
255
    }
256

    
257
    /**
258
     * DOCUMENT ME!
259
     *
260
     * @param v DOCUMENT ME!
261
     * @param width DOCUMENT ME!
262
     */
263
    public void setWidth(IWindow win, int width) {
264
            IFrame frame = (IFrame) viewFrame.get(win);
265
            frame.setWidth(width);
266
    }
267

    
268
    /**
269
     * DOCUMENT ME!
270
     *
271
     * @param v DOCUMENT ME!
272
     * @param title DOCUMENT ME!
273
     */
274
    public void setTitle(IWindow win, String title) {
275
            IFrame frame = (IFrame) viewFrame.get(win);
276
            frame.setTitle(title);
277
    }
278
    
279
        /**
280
         * Sets the minimum allowed size for the provided window.
281
         * 
282
         * @param sw
283
         * @param minSize
284
         */
285
        public void setMinimumSize(IWindow win, Dimension minSize) {
286
            IFrame frame = (IFrame) viewFrame.get(win);
287
            frame.setMinimumSize(minSize);
288
        }
289

    
290
    /**
291
     * DOCUMENT ME!
292
     *
293
     * @param vis The vis to set.
294
     */
295
    public void setVis(WindowInfoSupport vis) {
296
        this.vis = vis;
297
    }
298

    
299
    /**
300
     * DOCUMENT ME!
301
     *
302
     * @param v DOCUMENT ME!
303
     *
304
     * @return DOCUMENT ME!
305
     */
306
    private int getWidth(IWindow v) {
307
        WindowInfo vi = vis.getWindowInfo(v);
308

    
309
        if (vi.getWidth() == -1) {
310
            JPanel p = (JPanel) v;
311

    
312
            return p.getSize().width;
313
        } else {
314
            return vi.getWidth();
315
        }
316
    }
317

    
318
    /**
319
     * DOCUMENT ME!
320
     *
321
     * @param v DOCUMENT ME!
322
     *
323
     * @return DOCUMENT ME!
324
     */
325
    private int getWidth(IWindow v, WindowInfo wi) {
326
        if (wi.getWidth() == -1) {
327
            JPanel p = (JPanel) v;
328

    
329
            return p.getSize().width;
330
        } else {
331
            return wi.getWidth();
332
        }
333
    }
334

    
335
    /**
336
     * DOCUMENT ME!
337
     *
338
     * @param v DOCUMENT ME!
339
     *
340
     * @return DOCUMENT ME!
341
     */
342
    private int getHeight(IWindow v) {
343
        WindowInfo vi = vis.getWindowInfo(v);
344

    
345
        if (vi.getHeight() == -1) {
346
            JPanel p = (JPanel) v;
347

    
348
            return p.getSize().height;
349
        } else {
350
            return vi.getHeight();
351
        }
352
    }
353

    
354
    /**
355
     * DOCUMENT ME!
356
     *
357
     * @param v DOCUMENT ME!
358
     *
359
     * @return DOCUMENT ME!
360
     */
361
    private int getHeight(IWindow v, WindowInfo wi) {
362
        if (wi.getHeight() == -1) {
363
            JPanel p = (JPanel) v;
364

    
365
            return p.getSize().height;
366
        } else {
367
            return wi.getHeight();
368
        }
369
    }
370

    
371
    public void updateWindowInfo(IWindow win, WindowInfo windowInfo) {
372
            Object o = viewFrame.get(win);
373
            if (windowInfo!=null && o!=null) {
374
                    if (o instanceof JComponent) {
375
                        JComponent component = (JComponent) o;
376
                        windowInfo.updateWidth(component.getWidth());
377
                                windowInfo.updateHeight(component.getHeight());
378
                                windowInfo.updateX(component.getX());
379
                                windowInfo.updateY(component.getY());
380
                                windowInfo.updateClosed(!component.isShowing());
381
                                if (component instanceof JInternalFrame) {
382
                                        JInternalFrame iframe = (JInternalFrame) component;
383
                                        windowInfo.updateNormalBounds(iframe.getNormalBounds());
384
                                        windowInfo.updateMaximized(iframe.isMaximum());
385
                                }
386
                    }
387
            }
388
    }
389

    
390
}