Statistics
| Revision:

root / trunk / libraries / libUI / src / org / gvsig / gui / beans / swing / GridBagLayoutPanel.java @ 6804

History | View | Annotate | Download (11.3 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 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
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41

    
42
/* CVS MESSAGES:
43
*
44
* $Id: GridBagLayoutPanel.java 6804 2006-08-22 07:38:58Z jaume $
45
* $Log$
46
* Revision 1.8  2006-08-22 07:38:58  jaume
47
* added support for detecting changes keyboard and mouse changes over the componenets added via addComponent methods
48
*
49
* Revision 1.7  2006/08/11 16:36:15  azabala
50
* *** empty log message ***
51
*
52
* Revision 1.6  2006/08/07 14:45:14  azabala
53
* added a convenience method to specify insets and gridbagconstraints
54
*
55
* Revision 1.5  2006/07/28 15:17:43  azabala
56
* added the posibility to customize insets of the panel which has each row
57
*
58
* Revision 1.4  2006/07/12 11:23:56  jaume
59
* *** empty log message ***
60
*
61
* Revision 1.3  2006/07/04 16:56:10  azabala
62
* new method to add three componentes
63
*
64
* Revision 1.2  2006/07/03 09:29:09  jaume
65
* javadoc
66
*
67
* Revision 1.1  2006/06/29 06:27:10  jaume
68
* *** empty log message ***
69
*
70
*
71
*/
72
package org.gvsig.gui.beans.swing;
73

    
74
import java.awt.Component;
75
import java.awt.GridBagConstraints;
76
import java.awt.GridBagLayout;
77
import java.awt.Insets;
78
import java.awt.event.KeyEvent;
79
import java.awt.event.KeyListener;
80
import java.awt.event.MouseEvent;
81
import java.awt.event.MouseListener;
82

    
83
import javax.swing.JComponent;
84
import javax.swing.JLabel;
85
import javax.swing.JPanel;
86
import javax.swing.border.EmptyBorder;
87

    
88
/**
89
 * A panel designed for make the production of forms easier and faster.<br><br>
90
 *
91
 * It is a JPanel with a GridBagLayout that allows easily adding new components
92
 * in rows that are automatically added and aligned by using the
93
 * addComponent(...) methods.
94
 *
95
 * @author jaume dominguez faus - jaume.dominguez@iver.es
96
 *
97
 */
98
public class GridBagLayoutPanel extends JPanel{
99
        private GridBagLayout gridBag;
100
        private boolean changed;
101
        /**
102
         * The number of components already added to the layout manager.
103
         */
104
        protected int y;
105
        private MyValueChangeListener lst;
106

    
107

    
108
        public GridBagLayoutPanel() {
109
                setLayout(gridBag = new GridBagLayout());
110
                lst = new MyValueChangeListener();
111
        }
112

    
113
        /**
114
         * Adds a labeled component to the option pane. Components are
115
         * added in a vertical fashion, one per row. The label is
116
         * displayed to the left of the component.
117
         * @param label The label
118
         * @param comp The component
119
         */
120
        public void addComponent(String label, Component comp)
121
        {
122
                JLabel l = newLabel(label, comp);
123
                l.setBorder(new EmptyBorder(0,0,0,12));
124
                addComponent(l,comp,GridBagConstraints.BOTH);
125
        }
126

    
127
        /**
128
         * Adds a labeled component to the option pane. Components are
129
         * added in a vertical fashion, one per row. The label is
130
         * displayed to the left of the component.
131
         * @param label The label
132
         * @param comp The component
133
         * @param fill Fill parameter to GridBagConstraints for the right
134
         * component
135
         */
136
        public void addComponent(String label, Component comp, int fill)
137
        {
138
                JLabel l = newLabel(label, comp);
139
                l.setBorder(new EmptyBorder(0,0,0,12));
140
                addComponent(l,comp,fill);
141
        }
142

    
143

    
144
        public void addComponent(String label, Component comp, Insets insets)
145
        {
146
                addComponent(label, comp, GridBagConstraints.BOTH, insets);
147
        }
148

    
149
        public void addComponent(String label, Component comp, int fill, Insets insets){
150
                JLabel l = newLabel(label, comp);
151
                l.setBorder(new EmptyBorder(0,0,0,12));
152
                addComponent(l,comp, fill, insets);
153
        }
154

    
155

    
156
        /**
157
         * Adds a labeled component to the option pane. Components are
158
         * added in a vertical fashion, one per row. The label is
159
         * displayed to the left of the component.
160
         * @param comp1 The label
161
         * @param comp2 The component
162
         *
163
         * @since jEdit 4.1pre3
164
         */
165
        public void addComponent(Component comp1, Component comp2)
166
        {
167
                addComponent(comp1,comp2,GridBagConstraints.BOTH);
168
        }
169

    
170
        /**
171
         * Adds two components in a single line using the default inset (borders of margin)
172
         * @param comp1
173
         * @param comp2
174
         * @param fill
175
         */
176
        public void addComponent(Component comp1, Component comp2, int fill){
177
                addComponent(comp1, comp2, fill, new Insets(1,0,1,0));
178
        }
179
        /**
180
         * Adds a labeled component to the option pane. Components are
181
         * added in a vertical fashion, one per row. The label is
182
         * displayed to the left of the component.
183
         * @param comp1 The label
184
         * @param comp2 The component
185
         * @param fill Fill parameter to GridBagConstraints for the right
186
         * component
187
         *
188
         * @since jEdit 4.1pre3
189
         */
190
        public void addComponent(Component comp1, Component comp2, int fill, Insets insets)
191
        {
192
                copyToolTips(comp1, comp2);
193
                GridBagConstraints cons = new GridBagConstraints();
194
                cons.gridy = y++;
195
                cons.gridheight = 1;
196
                cons.gridwidth = 1;
197
                cons.weightx = 0.0f;
198
                cons.insets = insets;
199
                cons.fill = GridBagConstraints.BOTH;
200

    
201
                gridBag.setConstraints(comp1,cons);
202
                add(comp1);
203

    
204
                cons.fill = fill;
205
                cons.gridx = 1;
206
                cons.weightx = 1.0f;
207
                gridBag.setConstraints(comp2,cons);
208
                add(comp2);
209
                comp1.addKeyListener(lst);
210
                comp1.addMouseListener(lst);
211
                comp2.addKeyListener(lst);
212
                comp2.addMouseListener(lst);
213
        }
214

    
215
        /**
216
         * Adds three components in a line using the default insets
217
         * @param comp1
218
         * @param comp2
219
         * @param comp3
220
         * @param fill
221
         */
222
        public void addComponent(Component comp1,
223
                        Component comp2,
224
                        Component comp3,
225
                        int fill){
226
                addComponent(comp1, comp2, comp3, fill, new Insets(1, 0, 1, 0));
227
        }
228
        /**
229
         * Adds three components (azabala)
230
         *
231
         * @param comp1
232
         * @param comp2
233
         * @param comp3
234
         * @param fill
235
         */
236
        public void addComponent(Component comp1,
237
                        Component comp2,
238
                        Component comp3,
239
                        int fill,
240
                        Insets insets)
241
        {
242
                copyToolTips(comp1, comp2);
243
                copyToolTips(comp1, comp3);
244

    
245
                GridBagConstraints cons = new GridBagConstraints();
246
                cons.gridy = y++;
247
                cons.gridheight = 1;
248
                cons.gridwidth = 1;
249
                cons.weightx = 0.0f;
250
                cons.insets = insets;
251
                cons.fill = GridBagConstraints.BOTH;
252

    
253
                gridBag.setConstraints(comp1,cons);
254
                add(comp1);
255

    
256
                cons.gridx = 1;
257
                cons.weightx = 1.0f;
258
                gridBag.setConstraints(comp2,cons);
259
                add(comp2);
260

    
261
                //FIXME. REVISAR ESTO QUE SEGURAMENTE ESTE MAL (AZABALA)
262
                cons.fill = GridBagConstraints.NONE;
263
                cons.gridx = 2;
264
                cons.weightx = 1.0f;
265
                gridBag.setConstraints(comp3, cons);
266
                add(comp3);
267
                comp1.addKeyListener(lst);
268
                comp1.addMouseListener(lst);
269
                comp2.addKeyListener(lst);
270
                comp2.addMouseListener(lst);
271
        }
272

    
273
        /**
274
         * Adds three components in a single line using the default BOTH fill constraint
275
         * @param comp1
276
         * @param comp2
277
         * @param comp3
278
         */
279
        public void addComponent(Component comp1,
280
                        Component comp2,
281
                        Component comp3) {
282
                addComponent(comp1, comp2, comp3, GridBagConstraints.BOTH);
283
        }
284

    
285

    
286

    
287
        public void addComponent(Component comp){
288
                addComponent(comp, new Insets(1, 0, 1, 0));
289
        }
290
        /**
291
         * Adds a component to the option pane. Components are
292
         * added in a vertical fashion, one per row.
293
         * @param comp The component
294
         */
295
        public void addComponent(Component comp, Insets insets)
296
        {
297
                GridBagConstraints cons = new GridBagConstraints();
298
                cons.gridy = y++;
299
                cons.gridheight = 1;
300
                cons.gridwidth = GridBagConstraints.REMAINDER;
301
                cons.fill = GridBagConstraints.NONE;
302
                cons.anchor = GridBagConstraints.WEST;
303
                cons.weightx = 1.0f;
304
                cons.insets = insets;
305

    
306
                gridBag.setConstraints(comp,cons);
307
                add(comp);
308
                comp.addKeyListener(lst);
309
                comp.addMouseListener(lst);
310
                comp.addKeyListener(lst);
311
                comp.addMouseListener(lst);
312

    
313
        }
314

    
315
        /**
316
         * (azabala)
317
         * Adds a component which is going to fill many rows of the grid
318
         * (useful to add scrollpanes with list, etc.)
319
         *
320
         * */
321
        public void addComponent(Component comp, Insets insets, int numRows){
322
                GridBagConstraints cons = new GridBagConstraints();
323
                cons.gridy = y++;
324
                cons.gridheight = numRows;
325
                //REVISAR
326
                y += numRows;
327
                cons.gridwidth = GridBagConstraints.REMAINDER;
328
                cons.fill = GridBagConstraints.HORIZONTAL;
329
                cons.anchor = GridBagConstraints.WEST;
330
                cons.weightx = 1.0f;
331
                cons.insets = insets;
332
                cons.weighty = 0.0f;
333

    
334
                gridBag.setConstraints(comp,cons);
335
                add(comp);
336
                comp.addKeyListener(lst);
337
                comp.addMouseListener(lst);
338

    
339
        }
340

    
341

    
342
        ///////ADDING SEPARATORS
343

    
344

    
345

    
346

    
347

    
348

    
349

    
350

    
351

    
352

    
353

    
354
        public void addComponent(Component comp, int fill){
355
                addComponent(comp, fill, new Insets(1, 0, 1, 0));
356
        }
357

    
358
        /**
359
         * Adds a component to the option pane. Components are
360
         * added in a vertical fashion, one per row.
361
         * @param comp The component
362
         * @param fill Fill parameter to GridBagConstraints
363
         */
364
        public void addComponent(Component comp, int fill, Insets insets)
365
        {
366
                GridBagConstraints cons = new GridBagConstraints();
367
                cons.gridy = y++;
368
                cons.gridheight = 1;
369
                cons.gridwidth = GridBagConstraints.REMAINDER;
370
                cons.fill = fill;
371
                cons.anchor = GridBagConstraints.WEST;
372
                cons.weightx = 1.0f;
373
                cons.insets = insets;
374

    
375
                gridBag.setConstraints(comp,cons);
376
                add(comp);
377
                comp.addKeyListener(lst);
378
                comp.addMouseListener(lst);
379
        }
380

    
381
        private void copyToolTips (Component c1, Component c2) {
382
                int tooltips = 0;
383
                int jc=0;
384
                String text = null;
385
                JComponent jc1 = null, jc2 = null;
386
                try {
387
                        jc1 = (JComponent) c1;
388
                        text = jc1.getToolTipText();
389
                        ++jc;
390
                        if (text != null && text.length() > 0) tooltips++;
391
                }
392
                catch (Exception e) {}
393
                try {
394
                        jc2 = (JComponent) c2;
395
                        String text2 = jc2.getToolTipText();
396
                        ++jc;
397
                        if (text2 != null && text2.length() > 0) {
398
                                text = text2;
399
                                tooltips++;
400
                        }
401
                }
402
                catch (Exception e) {}
403
                if (tooltips == 1 && jc == 2) {
404
                        jc1.setToolTipText(text);
405
                        jc2.setToolTipText(text);
406
                }
407
        }
408

    
409
        /**
410
         *        @return a label which has the same tooltiptext as the Component
411
         *    that it is a label for. This is used to create labels from inside
412
         *    AbstractPreferencePage.
413
         */
414
        public JLabel newLabel(String label, Component comp)
415
        {
416
                JLabel retval = new JLabel(label);
417
                try /* to get the tooltip of the component */
418
                {
419
                        JComponent jc = (JComponent) comp;
420
                        String tttext = jc.getToolTipText();
421
                        retval.setToolTipText(tttext);
422
                }
423
                catch (Exception e)
424
                {
425
                        /* There probably wasn't a tooltip,
426
                         * or it wasn't a JComponent.
427
                           We don't care. */
428
                }
429
                return retval;
430
        }
431

    
432
        public boolean hasChanged() {
433
                return changed;
434
        }
435

    
436
        private class MyValueChangeListener implements KeyListener, MouseListener {
437
                public void keyPressed(KeyEvent e)      { changed = true; }
438
                public void keyReleased(KeyEvent e)     { changed = true; }
439
                public void keyTyped(KeyEvent e)        { changed = true; }
440
                public void mouseClicked(MouseEvent e)  { changed = true; }
441
                public void mouseEntered(MouseEvent e)  { changed = true; }
442
                public void mouseExited(MouseEvent e)   { changed = true; }
443
                public void mousePressed(MouseEvent e)  { changed = true; }
444
                public void mouseReleased(MouseEvent e) { changed = true; }
445
        }
446
}