Statistics
| Revision:

root / trunk / frameworks / _fwAndami / src / com / iver / andami / preferences / GenericDlgPreferences.java @ 7911

History | View | Annotate | Download (16.6 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
 * 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
package com.iver.andami.preferences;
42

    
43
import java.awt.BorderLayout;
44
import java.awt.Component;
45
import java.awt.Dimension;
46
import java.awt.event.ActionEvent;
47
import java.awt.event.ActionListener;
48
import java.util.ArrayList;
49
import java.util.Collection;
50
import java.util.Enumeration;
51
import java.util.Hashtable;
52
import java.util.Iterator;
53

    
54
import javax.swing.JButton;
55
import javax.swing.JLabel;
56
import javax.swing.JOptionPane;
57
import javax.swing.JPanel;
58
import javax.swing.JScrollPane;
59
import javax.swing.JSeparator;
60
import javax.swing.JSplitPane;
61
import javax.swing.JTree;
62
import javax.swing.tree.DefaultMutableTreeNode;
63
import javax.swing.tree.DefaultTreeCellRenderer;
64
import javax.swing.tree.DefaultTreeModel;
65
import javax.swing.tree.TreeModel;
66

    
67
import com.iver.andami.PluginServices;
68
import com.iver.andami.ui.mdiManager.IWindow;
69
import com.iver.andami.ui.mdiManager.WindowInfo;
70
import com.iver.utiles.extensionPoints.ExtensionPoint;
71
import com.iver.utiles.extensionPoints.ExtensionPoints;
72
import com.iver.utiles.extensionPoints.ExtensionPointsSingleton;
73

    
74
/**
75
 * @author fjp
76
 *
77
 * The reason behind this class is to have the opportunity of use a DlgPreferences
78
 * in a local way. Then, you don't need to be a SingletonView.
79
 */
80
public class GenericDlgPreferences extends JPanel implements IWindow {
81
        private WindowInfo viewInfo = null;
82
        private IPreference activePreference;
83

    
84
        private Hashtable preferences = new Hashtable();
85
        DefaultTreeModel treeModel = null;
86

    
87
        private JTree jTreePlugins = null;
88

    
89
        private JPanel jPanelButtons = null;
90

    
91
        private JButton jButtonOK = null;
92

    
93
        private JButton jButtonCancel = null;
94
        private DefaultMutableTreeNode root = new DefaultMutableTreeNode();
95

    
96
        private JPanel jPanelCenter = null;
97

    
98
        private JLabel jLabelBigTitle = null;
99

    
100
        private JScrollPane jScrollPane = null;
101

    
102
        private JSplitPane jSplitPaneCenter = null;
103

    
104
        private JPanel jPanelContainer = null;
105
        private JButton jButtonRestore;
106
        private ActionListener action;
107
        private boolean dirtyTree = false;
108

    
109
        private class MyTreeCellRenderer extends DefaultTreeCellRenderer
110
        {
111
            public MyTreeCellRenderer() {
112
            }
113

    
114
            public Component getTreeCellRendererComponent(
115
                                JTree tree,
116
                                Object value,
117
                                boolean sel,
118
                                boolean expanded,
119
                                boolean leaf,
120
                                int row,
121
                                boolean hasFocus) {
122

    
123
                super.getTreeCellRendererComponent(
124
                                tree, value, sel,
125
                                expanded, leaf, row,
126
                                hasFocus);
127
                if (value instanceof DefaultMutableTreeNode)
128
                {
129
                        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
130
                        if (node.getUserObject() instanceof IPreference)
131
                        {
132
                                IPreference pref = (IPreference) node.getUserObject();
133
                                this.setText(pref.getTitle());
134
                        }
135
                }
136
                return this;
137
            }
138

    
139
        }
140

    
141

    
142
        public GenericDlgPreferences() {
143
                super();
144
                this.action = new ActionListener() {
145
                        public void actionPerformed(ActionEvent e) {
146
                                PluginServices.getMDIManager().setWaitCursor();
147
                                String actionCommand = e.getActionCommand();
148
                                if ("RESTORE".equals(actionCommand)) {
149
                                        // Restore default values in current page
150
                                        if (activePreference!=null) {
151
                                                activePreference.initializeDefaults();
152
                                                try {
153
                                                        activePreference.saveValues();
154
                                                } catch (StoreException sEx) {
155
                                                        /*
156
                                                         * If you reach this code you coded your page
157
                                                         * with wrong factory default values.
158
                                                         * Check them out.
159
                                                         */
160
                                                        PluginServices.getMDIManager().restoreCursor();
161

    
162
                                                        // Show error message
163
                                                        JOptionPane.showMessageDialog((Component) PluginServices.
164
                                                                        getMainFrame(),sEx.getMessage());
165

    
166
                                                }
167
                                        }
168
                                } else {
169
                                        Iterator it = preferences.keySet().iterator();
170

    
171
                                        if ("CANCEL".equals(actionCommand)) {
172
                                                // Restore previous values in all pages
173
                                                while (it.hasNext()) {
174
                                                        IPreference pref = (IPreference) preferences.get(it.next());
175
                                                        if (pref.isValueChanged())
176
                                                                pref.initializeValues(); //
177
                                                }
178
                                                closeView();
179
                                        } else if ("OK".equals(actionCommand)) {
180
                                                // Apply values in all pages
181
                                                boolean shouldClose = true;
182
                                                while (it.hasNext()) {
183
                                                        IPreference preference = (IPreference) preferences.get(it.next());
184
                                                        try{
185
                                                                if (preference.isValueChanged()) {
186
                                                                        preference.saveValues();
187
                                                                        preference.initializeValues();
188
                                                                }
189
                                                        }catch (StoreException ex) {
190
                                                                // Reach this code should mean that the page has wrong values
191
                                                                shouldClose = false;
192
                                                                PluginServices.getMDIManager().restoreCursor();
193

    
194
                                                                // Show error message
195
                                                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),ex.getMessage());
196

    
197
                                                                // Focus on error page
198
                                                                setActivePage(preference);
199
                                                        }
200
                                                }
201
                                                if (shouldClose)
202
                                                        closeView();
203
                                        }
204
                                }
205
                                PluginServices.getMDIManager().restoreCursor();
206
                        }
207
                };
208
                initialize();
209
        }
210

    
211
        private void initialize() {
212
                setLayout(new BorderLayout());
213
                setSize(new java.awt.Dimension(750,479));
214
                super.add(getJPanelButtons(), BorderLayout.SOUTH);
215
                setPreferredSize(new java.awt.Dimension(390,369));
216
                super.add(getJSplitPaneCenter(), java.awt.BorderLayout.CENTER);
217
                getJSplitPaneCenter().setLeftComponent(getJScrollPane());
218
                getJSplitPaneCenter().setRightComponent(getJPanelNorth());
219

    
220

    
221

    
222
                treeModel = new DefaultTreeModel(root);
223
        }
224

    
225
        public void refreshExtensionPoints() {
226
                ExtensionPoints extensionPoints =
227
                        ExtensionPointsSingleton.getInstance();
228

    
229
                ExtensionPoint extensionPoint =(ExtensionPoint)extensionPoints.get("AplicationPreferences");
230

    
231
                Iterator iterator = extensionPoint.keySet().iterator();
232
                while (iterator.hasNext()) {
233
                        try {
234
                                IPreference obj = (IPreference)extensionPoint.create((String)iterator.next());
235
                                this.addPreferencePage(obj);
236
                        } catch (InstantiationException e) {
237
                                e.printStackTrace();
238
                        } catch (IllegalAccessException e) {
239
                                e.printStackTrace();
240
                        } catch (ClassCastException e) {
241
                                e.printStackTrace();
242
                        }
243
                }
244
        }
245

    
246

    
247
        /**
248
         * It is very common to be confused with this method. But
249
         * the one you are looking for is addPreferencePage(IPreference)
250
         */
251
        public Component add(Component c) {
252
                //throw new Error("Do not use com.iver.cit.gvsig.gui.preferences.DlgPreferences.add(Component) use com.iver.cit.gvsig.gui.preferences.DlgPreferences.addPreferencePage(IPreference) instead");
253
                throw new Error("Do not use com.iver.cit.gvsig.gui.preferences.DlgPreferences.add(Component) register an extension point instead");
254
        }
255

    
256
        public Component add(Component c, int i) {
257
                return add(c);
258
        }
259

    
260
        public void add(Component c, Object o) {
261
                add(c);
262
        }
263

    
264
        public void add(Component c, Object o, int i) {
265
                add(c);
266
        }
267

    
268
        public WindowInfo getWindowInfo() {
269
                if (viewInfo == null) {
270
                        viewInfo = new WindowInfo(WindowInfo.MODALDIALOG | WindowInfo.RESIZABLE | WindowInfo.PALETTE);
271
                        viewInfo.setTitle(PluginServices.getText(this,
272
                                        "Preferences"));
273
                        viewInfo.setWidth(this.getWidth()+8);
274
                        viewInfo.setHeight(this.getHeight());
275
                }
276
                return viewInfo;
277
        }
278

    
279
        /**
280
         * This method initializes jTreePlugins
281
         *
282
         * @return javax.swing.JTree
283
         */
284
        private JTree getJTreePlugins() {
285
                if (jTreePlugins == null) {
286
                        jTreePlugins = new JTree() {
287
                                public void repaint() {
288
                                        if (dirtyTree) {
289
                                                // rebuild page tree
290
                                                ArrayList prefList = new ArrayList(preferences.values());
291
                                                ArrayList alreadyAdded = new ArrayList();
292
                                                DefaultTreeModel model = new DefaultTreeModel(root);
293
                                                while (prefList.size()>0) {
294
                                                        IPreference pref = (IPreference) prefList.get(0);
295
                                                        while (pref.getParentID() != null &&
296
                                                                        !alreadyAdded.contains(preferences.get(pref.getParentID()))) {
297
                                                                pref = (IPreference) preferences.get(pref.getParentID());
298
                                                        }
299
                                                        doInsertNode(model, pref);
300
                                                        prefList.remove(pref);
301
                                                        alreadyAdded.add(pref);
302
                                                }
303
                                                treeModel = model;
304
                                                jTreePlugins.setModel(model);
305
                                                dirtyTree = false;
306
                                        }
307

    
308
                                        super.repaint();
309
                                }
310
                        };
311
                        jTreePlugins.setRootVisible(false);
312
                        MyTreeCellRenderer treeCellRenderer = new MyTreeCellRenderer();
313
                        treeCellRenderer.setOpenIcon(null);
314
                        treeCellRenderer.setClosedIcon(null);
315
                        treeCellRenderer.setLeafIcon(null);
316

    
317

    
318

    
319
                        jTreePlugins.setCellRenderer(treeCellRenderer);
320
                        jTreePlugins.setShowsRootHandles(true);
321
                        jTreePlugins
322
                                        .addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
323
                                                public void valueChanged(javax.swing.event.TreeSelectionEvent e) {
324
                                                         DefaultMutableTreeNode node = (DefaultMutableTreeNode)
325
                                       jTreePlugins.getLastSelectedPathComponent();
326

    
327
                                                                 if (node == null) return;
328
                                                                 setActivePage((IPreference) node.getUserObject());
329
                                                }
330
                                        });
331
                        jTreePlugins.putClientProperty("JTree.linestyle", "Angled");
332
                }
333

    
334
                return jTreePlugins;
335
        }
336

    
337
        /**
338
         * It takes an IPreference page and adds it to the application's preferences
339
         * dialog. The preference page is added in alphabetical order within the
340
         * branch where the page is hanging on, and defined by its title.
341
         * @param page
342
         */
343
        public void addPreferencePage(IPreference page)
344
        {
345
                preferences.put(page.getID(), page);
346
                page.initializeValues(); // init values from the last settings
347
                //page.storeValues();                 // apply them
348
                doInsertNode(treeModel, page);
349
                getJTreePlugins().setModel(treeModel);
350
                dirtyTree = true;
351
        }
352

    
353
        private DefaultMutableTreeNode findNode(String searchID)
354
        {
355
                Enumeration e = root.breadthFirstEnumeration();
356
                while (e.hasMoreElements())
357
                {
358
                        DefaultMutableTreeNode nodeAux = (DefaultMutableTreeNode) e.nextElement();
359
                        if (nodeAux != null)
360
                        {
361
                                IPreference pref = (IPreference) nodeAux.getUserObject();
362
                                if (pref == null) continue; // Root node
363
                                if (pref.getID().equals(searchID))
364
                                {
365
                                        return nodeAux;
366
                                }
367
                        }
368
                }
369
                return null;
370

    
371
        }
372

    
373
        private void doInsertNode(DefaultTreeModel treeModel, IPreference page)
374
        {
375

    
376
                if (findNode(page.getID()) != null) // It is already added
377
                        return;
378
                if (page.getParentID() != null)
379
                {
380
                        if (preferences.containsKey(page.getParentID()))
381
                        {
382
                                IPreference parent = (IPreference) preferences.get(page.getParentID());
383
                                DefaultMutableTreeNode nodeParent = findNode(parent.getID());
384
                                if (nodeParent == null) // the parent is empty
385
                                {
386
                                        // Recursively add it
387
                                        doInsertNode(treeModel, parent);
388
                                }
389
                                else
390
                                {
391
                                        DefaultMutableTreeNode nodeValue = new DefaultMutableTreeNode(page);
392
                                        int children = nodeParent.getChildCount();
393
                                        int pos=0;
394
                                        for (int i = 0; i < children; i++) {
395
                                                DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeModel.getChild(nodeParent, i);
396
                                                if (node.getUserObject() instanceof IPreference) {
397
                                                        String pageTitle = ((IPreference) node.getUserObject()).getTitle();
398
                                                        if (pageTitle.compareTo(page.getTitle()) < 0) ++pos;
399
                                                }
400
                                        }
401
                                        treeModel.insertNodeInto(nodeValue, nodeParent, pos);
402
                                }
403
                        }
404
                }
405
                else // First level node ("General", "Edition")
406
                {
407
                        DefaultMutableTreeNode nodeValue = new DefaultMutableTreeNode(page);
408
                        int children = root.getChildCount();
409
                        int pos=0;
410
                        for (int i = 0; i < children; i++) {
411
                                DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeModel.getChild(root, i);
412
                                if (node.getUserObject() instanceof IPreference) {
413
                                        String pageTitle = ((IPreference) node.getUserObject()).getTitle();
414
                                        if (pageTitle.compareTo(page.getTitle()) < 0) ++pos;
415
                                }
416
                        }
417
                        treeModel.insertNodeInto(nodeValue, root, pos);
418
                }
419
        }
420

    
421
        /**
422
         * This method initializes jPanelButtons
423
         *
424
         * @return javax.swing.JPanel
425
         */
426
        private JPanel getJPanelButtons() {
427
                if (jPanelButtons == null) {
428
                        jPanelButtons = new JPanel(new BorderLayout());
429
                        JPanel jPanelAux = new JPanel();
430
                        JLabel l = new JLabel();
431
                        l.setPreferredSize(new Dimension(40, 20));
432
                        jPanelButtons.add(new JSeparator(JSeparator.HORIZONTAL), BorderLayout.NORTH);
433
                        jPanelAux.add(getJButtonRestore(), BorderLayout.WEST);
434
                        jPanelAux.add(l, BorderLayout.CENTER);
435
                        jPanelAux.add(getJButtonOK(), BorderLayout.EAST);
436
                        jPanelAux.add(getJButtonCancel(), BorderLayout.EAST);
437

    
438
                        jPanelButtons.add(jPanelAux);
439
                }
440
                return jPanelButtons;
441
        }
442

    
443
        /**
444
         * This method initializes jPanelButtons
445
         *
446
         * @return javax.swing.JPanel
447
         */
448

    
449

    
450
        /**
451
         * This method initializes jButtonOK
452
         *
453
         * @return JButton
454
         */
455
        private JButton getJButtonOK() {
456
                if (jButtonOK == null) {
457
                        jButtonOK = new JButton();
458
                        jButtonOK.setText(PluginServices.getText(this, "aceptar"));
459
                        jButtonOK.setActionCommand("OK");
460
                        jButtonOK.addActionListener(action);
461
                }
462
                return jButtonOK;
463
        }
464

    
465
        /**
466
         * This method initializes jButtonOK
467
         *
468
         * @return JButton
469
         */
470
        private JButton getJButtonRestore() {
471
                if (jButtonRestore == null) {
472
                        jButtonRestore = new JButton();
473
                        jButtonRestore.setText(PluginServices.getText(this, "restore_defaults"));
474
                        jButtonRestore.setActionCommand("RESTORE");
475
                        jButtonRestore.addActionListener(action);
476
                }
477
                return jButtonRestore;
478
        }
479

    
480
        private void closeView() {
481
                PluginServices.getMDIManager().closeWindow(this);
482
        }
483

    
484
        /**
485
         * This method initializes jButtonCancel
486
         *
487
         * @return JButton
488
         */
489
        private JButton getJButtonCancel() {
490
                if (jButtonCancel == null) {
491
                        jButtonCancel = new JButton();
492
                        jButtonCancel.setText(PluginServices.getText(this, "cancelar"));
493
                        jButtonCancel.setActionCommand("CANCEL");
494
                        jButtonCancel.addActionListener(action);
495
                }
496
                return jButtonCancel;
497
        }
498

    
499
        /**
500
         * This method initializes jPanelNorth
501
         *
502
         * @return javax.swing.JPanel
503
         */
504
        private JPanel getJPanelNorth() {
505
                if (jPanelCenter == null) {
506
                        jLabelBigTitle = new JLabel();
507
                        jLabelBigTitle.setText("General");
508
                        jLabelBigTitle.setFont(new java.awt.Font("MS Sans Serif", java.awt.Font.BOLD, 14));
509
                        jLabelBigTitle.setHorizontalTextPosition(javax.swing.SwingConstants.TRAILING);
510
                        jLabelBigTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
511
                        jPanelCenter = new JPanel();
512
                        JPanel jPanelPageTitle = new JPanel(new BorderLayout());
513
                        JPanel jPanelAux = new JPanel(new BorderLayout());
514
                        jPanelAux.add(jLabelBigTitle, java.awt.BorderLayout.NORTH);
515
                        jPanelPageTitle.add(jPanelAux, java.awt.BorderLayout.WEST);
516
                        jPanelPageTitle.add(new JSeparator(JSeparator.HORIZONTAL), BorderLayout.SOUTH);
517
                        jPanelCenter.setLayout(new BorderLayout());
518
                        jPanelCenter.add(jPanelPageTitle, BorderLayout.NORTH);
519
                        jPanelCenter.add(getJPanelContainer(), java.awt.BorderLayout.CENTER);
520

    
521
                }
522
                return jPanelCenter;
523
        }
524

    
525
        /**
526
         * This method initializes jScrollPane
527
         *
528
         * @return javax.swing.JScrollPane
529
         */
530
        private JScrollPane getJScrollPane() {
531
                if (jScrollPane == null) {
532
                        jScrollPane = new JScrollPane();
533
                        jScrollPane.setPreferredSize(new java.awt.Dimension(140,322));
534
                        jScrollPane.setViewportView(getJTreePlugins());
535
                }
536
                return jScrollPane;
537
        }
538

    
539
        /**
540
         * This method initializes jSplitPaneCenter
541
         *
542
         * @return javax.swing.JSplitPane
543
         */
544
        private JSplitPane getJSplitPaneCenter() {
545
                if (jSplitPaneCenter == null) {
546
                        jSplitPaneCenter = new JSplitPane();
547
                        jSplitPaneCenter.setResizeWeight(0.2);
548
                        jSplitPaneCenter.setDividerLocation(200);
549
                }
550
                return jSplitPaneCenter;
551
        }
552

    
553
        /**
554
         * This method initializes jPanelContainer
555
         *
556
         * @return javax.swing.JPanel
557
         */
558
        private JPanel getJPanelContainer() {
559
                if (jPanelContainer == null) {
560
                        jPanelContainer = new JPanel();
561
                }
562
                return jPanelContainer;
563
        }
564

    
565
        /**
566
         *
567
         */
568
        public void setActivePage(IPreference page) {
569
                activePreference = page;
570
                jLabelBigTitle.setText(activePreference.getTitle());
571
                JPanel prefPanel = activePreference.getPanel();
572
                jLabelBigTitle.setIcon(activePreference.getIcon());
573
                jPanelContainer.removeAll();
574
                jPanelContainer.add(prefPanel);
575
                prefPanel.setVisible(true);
576
                repaint();
577
        }
578
}