Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_0_Build_2057 / extensions / org.gvsig.hyperlink.app / org.gvsig.hyperlink.app.extension / src / main / java / org / gvsig / hyperlink / app / extension / config / gui / ConfigTab.java @ 39185

History | View | Annotate | Download (17.3 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

    
23
package org.gvsig.hyperlink.app.extension.config.gui;
24

    
25
import java.awt.GridBagConstraints;
26
import java.awt.GridBagLayout;
27
import java.awt.Insets;
28
import java.awt.event.ActionEvent;
29
import java.awt.event.ActionListener;
30
import java.awt.event.ItemEvent;
31
import java.awt.event.ItemListener;
32
import java.util.ArrayList;
33

    
34
import javax.swing.BorderFactory;
35
import javax.swing.JButton;
36
import javax.swing.JCheckBox;
37
import javax.swing.JPanel;
38
import javax.swing.JScrollPane;
39
import javax.swing.border.EtchedBorder;
40
import javax.swing.border.TitledBorder;
41

    
42
import org.gvsig.andami.PluginServices;
43
import org.gvsig.andami.ui.mdiManager.IWindow;
44
import org.gvsig.andami.ui.mdiManager.WindowInfo;
45
import org.gvsig.app.project.documents.view.legend.gui.AbstractThemeManagerPage;
46
import org.gvsig.fmap.mapcontext.layers.FLayer;
47
import org.gvsig.hyperlink.app.extension.AbstractActionManager;
48
import org.gvsig.hyperlink.app.extension.HyperlinkExtension;
49
import org.gvsig.hyperlink.app.extension.config.LayerLinkConfig;
50
import org.gvsig.hyperlink.app.extension.config.LinkConfig;
51
import org.gvsig.hyperlink.app.extension.layers.ILinkLayerManager;
52
import org.gvsig.hyperlink.app.extension.layers.IncompatibleLayerException;
53
import org.gvsig.hyperlink.app.extension.layers.ManagerRegistry;
54
import org.gvsig.tools.ToolsLocator;
55
import org.gvsig.tools.extensionpoint.ExtensionPoint;
56

    
57
public class ConfigTab extends AbstractThemeManagerPage implements IWindow,
58
    ActionListener, ItemListener {
59

    
60
    FLayer layer;
61
    ArrayList rows = new ArrayList();
62
    JPanel rowList = null;
63
    GridBagLayout listLayout = null;
64
    private String[] actionCodes = null;
65
    private String[] actionNames = null;
66
    WindowInfo _windowInfo = null;
67
    JButton jbt_accept = null, jbt_cancel = null;
68
    JPanel emptyRow;
69
    JCheckBox jcb_enabled = null;
70
    JPanel borderPanel = null;
71
    JButton jbt_addAction = null, jbt_removeAction = null;
72

    
73
    public ConfigTab() {
74
        super();
75
        initialize();
76
    }
77

    
78
    private void initialize() {
79
        this.setLayout(new GridBagLayout());
80

    
81
        Insets insets = new Insets(8, 8, 8, 8);
82
        GridBagConstraints constraints = new GridBagConstraints();
83
        constraints.gridx = 0;
84
        constraints.gridy = 0;
85
        constraints.weightx = 1.0;
86
        constraints.fill = GridBagConstraints.NONE;
87
        constraints.insets = insets;
88
        constraints.anchor = GridBagConstraints.NORTHWEST;
89
        this.add(getEnabledCheckBox(), constraints);
90

    
91
        borderPanel = new JPanel(new GridBagLayout());
92
        borderPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED),
93
            PluginServices.getText(this, "Actions"),
94
            TitledBorder.DEFAULT_JUSTIFICATION,
95
            TitledBorder.DEFAULT_POSITION,
96
            null,
97
            null));
98

    
99
        insets = new Insets(8, 8, 8, 8);
100
        constraints = new GridBagConstraints();
101
        constraints.gridx = 0;
102
        constraints.gridy = 0;
103
        constraints.weightx = 1.0;
104
        constraints.fill = GridBagConstraints.NONE;
105
        constraints.insets = insets;
106
        constraints.anchor = GridBagConstraints.NORTHWEST;
107
        borderPanel.add(getAddRemoveActionsPanel(), constraints);
108

    
109
        listLayout = new GridBagLayout();
110
        rowList = new JPanel(listLayout);
111

    
112
        constraints.gridx = 0;
113
        constraints.gridy = 0;
114
        constraints.weightx = 1.0;
115
        constraints.weighty = 1.0;
116
        constraints.fill = GridBagConstraints.NONE;
117
        constraints.insets = insets;
118
        constraints.anchor = GridBagConstraints.SOUTH;
119
        emptyRow = new JPanel();
120
        rowList.add(emptyRow, constraints);
121

    
122
        JScrollPane scrolledList = new JScrollPane();
123
        scrolledList.setBorder(null);
124
        scrolledList.setViewportView(rowList);
125

    
126
        constraints.gridx = 0;
127
        constraints.gridy = 1;
128
        constraints.weightx = 1.0;
129
        constraints.weighty = 1.0;
130
        constraints.fill = GridBagConstraints.BOTH;
131
        constraints.insets = insets;
132
        constraints.anchor = GridBagConstraints.CENTER;
133
        borderPanel.add(scrolledList, constraints);
134

    
135
        constraints.gridx = 0;
136
        constraints.gridy = 1;
137
        constraints.weightx = 1.0;
138
        constraints.weighty = 1.0;
139
        constraints.fill = GridBagConstraints.BOTH;
140
        constraints.insets = insets;
141
        constraints.anchor = GridBagConstraints.NORTHWEST;
142
        this.add(borderPanel, constraints);
143

    
144
        // initAcceptCancelButtons(); uncomment this if you want to use this
145
        // window outside the ThemeManager
146
    }
147

    
148
    private void initAcceptCancelButtons() {
149
        JPanel acceptCancelButtons = new JPanel(new GridBagLayout());
150
        Insets insets = new Insets(14, 4, 8, 8);
151
        GridBagConstraints constraints = new GridBagConstraints();
152
        constraints.gridx = 0;
153
        constraints.gridy = 0;
154
        constraints.weightx = 1.0;
155
        constraints.fill = GridBagConstraints.NONE;
156
        constraints.insets = insets;
157
        constraints.anchor = GridBagConstraints.EAST;
158
        acceptCancelButtons.add(getAcceptButton(), constraints);
159

    
160
        constraints.gridx = 1;
161
        constraints.gridy = 0;
162
        constraints.weightx = 0.0;
163
        constraints.fill = GridBagConstraints.NONE;
164
        constraints.insets = insets;
165
        constraints.anchor = GridBagConstraints.EAST;
166
        acceptCancelButtons.add(getCancelButton(), constraints);
167

    
168
        constraints.gridx = 0;
169
        constraints.gridy = 2;
170
        constraints.weightx = 0.0;
171
        constraints.fill = GridBagConstraints.NONE;
172
        constraints.insets = insets;
173
        constraints.anchor = GridBagConstraints.SOUTHEAST;
174
        this.add(acceptCancelButtons, constraints);
175
    }
176

    
177
    private String[] getActionNames() {
178
        if (actionNames == null) {
179
            ExtensionPoint actions =
180
                ToolsLocator.getExtensionPointManager()
181
                    .get(HyperlinkExtension.ACTIONSEXTENSIONPOINT);
182

    
183
            String[] actionArray = new String[actions.getCount()];
184
            String[] codes = getActionCodes();
185
            for (int i = 0; i < codes.length; i++) {
186
                try {
187
                    AbstractActionManager aam =
188
                        (AbstractActionManager) actions.get(codes[i])
189
                            .getExtension()
190
                            .newInstance();
191
                    actionArray[i] = aam.getName();
192
                } catch (InstantiationException e) {
193
                    // TODO Auto-generated catch block
194
                    e.printStackTrace();
195
                } catch (IllegalAccessException e) {
196
                    // TODO Auto-generated catch block
197
                    e.printStackTrace();
198
                }
199
            }
200
            actionNames = actionArray;
201
        }
202
        return actionNames;
203
    }
204

    
205
    private String[] getActionCodes() {
206
        if (actionCodes == null) {
207
            ExtensionPoint actions =
208
                ToolsLocator.getExtensionPointManager()
209
                    .get(HyperlinkExtension.ACTIONSEXTENSIONPOINT);
210
            String[] actionArray = new String[actions.getCount()];
211
            actionArray = (String[]) actions.getNames().toArray(actionArray);
212
            actionCodes = actionArray;
213
        }
214
        return actionCodes;
215
    }
216

    
217
    private String[] getCandidateFields() {
218
        HyperlinkExtension ext =
219
            (HyperlinkExtension) PluginServices.getExtension(HyperlinkExtension.class);
220
        ManagerRegistry registry = ext.getLayerManager();
221
        try {
222
            ILinkLayerManager manager;
223
            manager = registry.get(layer);
224
            manager.setLayer(layer);
225
            return manager.getFieldCandidates();
226
        } catch (InstantiationException e) {
227
            PluginServices.getLogger()
228
                .warn("Hyperlink: error getting candidate fields", e);
229
        } catch (IllegalAccessException e) {
230
            PluginServices.getLogger()
231
                .warn("Hyperlink: error getting candidate fields", e);
232
        } catch (ClassNotFoundException e) {
233
            PluginServices.getLogger()
234
                .warn("Hyperlink: error getting candidate fields", e);
235
        } catch (IncompatibleLayerException e) {
236
            PluginServices.getLogger()
237
                .warn("Hyperlink: error getting candidate fields", e);
238
        } catch (NullPointerException e) {
239
            PluginServices.getLogger().warn("Hyperlink: error getting manager", e);
240
        }
241
        return new String[0];
242
    }
243

    
244
    public void acceptAction() {
245
        applyAction();
246
    }
247

    
248
    public void applyAction() {
249
        LayerLinkConfig config = new LayerLinkConfig();
250
        for (int i = 0; i < rows.size(); i++) {
251
            LinkRow row = (LinkRow) rows.get(i);
252
            
253
            if (row.getSelectedField() != null
254
                && row.getSelectedAction() != -1) {
255
                
256
                config.addLink(getActionCodes()[row.getSelectedAction()],
257
                    row.getSelectedField(),
258
                    row.getExtension());
259
            }
260
        }
261
        config.setEnabled(getEnabledCheckBox().isSelected());
262
        layer.setProperty(HyperlinkExtension.LAYERPROPERTYNAME, config);
263
    }
264

    
265
    public void cancelAction() {
266
    }
267

    
268
    public String getName() {
269
        return PluginServices.getText(this, "Hyperlink");
270
    }
271

    
272
    public void setModel(FLayer layer) {
273
        this.layer = layer;
274
        synchronized (rows) {
275
            HyperlinkExtension ext =
276
                (HyperlinkExtension) PluginServices.getExtension(HyperlinkExtension.class);
277
            LayerLinkConfig layerConfig = ext.loadLegacyConfig(layer);
278
            for (int i = rows.size() - 1; i >= 0; i--) { // clean rows
279
                LinkRow row = (LinkRow) rows.remove(i);
280
                rowList.remove(row);
281
            }
282

    
283
            if (layerConfig != null) {
284
                for (int i = 0; i < layerConfig.linkCount(); i++) {
285
                    LinkRow row = addRow();
286
                    LinkConfig config = layerConfig.getLink(i);
287
                    String selectedAction = config.getActionCode();
288
                    String[] actions = getActionCodes();
289
                    for (int j = 0; j < actions.length; j++) {
290
                        if (actions[j].equals(selectedAction)) {
291
                            row.setSelectedAction(j);
292
                        }
293
                    }
294
                    row.setSelectedField(config.getFieldName());
295
                    row.setExtension(config.getExtension());
296
                }
297
                if (layerConfig.linkCount() < 1) {
298
                    addRow(); // just one row by default
299
                }
300
                setLinkEnabled(layerConfig.isEnabled());
301
            } else {
302
                addRow(); // just one row by default
303
                setLinkEnabled(false);
304
            }
305
        }
306
    }
307

    
308
    protected JPanel getAddRemoveActionsPanel() {
309
        JPanel container = new JPanel();
310
        container.add(getAddActionButton());
311
        container.add(getRemoveActionButton());
312
        return container;
313
    }
314

    
315
    protected LinkRow addRow() {
316
        LinkRow row = new LinkRow();
317
        row.setFields(getCandidateFields());
318
        row.setActions(getActionNames());
319
        synchronized (rows) {
320
            rows.add(row);
321

    
322
            GridBagConstraints constraints = new GridBagConstraints();
323
            constraints.gridx = 0;
324
            constraints.gridy = rows.size() - 1;
325
            constraints.weightx = 1.0;
326
            constraints.weighty = 0.0;
327
            constraints.fill = GridBagConstraints.HORIZONTAL;
328
            constraints.insets = new Insets(2, 4, 2, 4);
329
            constraints.anchor = GridBagConstraints.NORTH;
330
            rowList.add(row, constraints);
331

    
332
            constraints = new GridBagConstraints();
333
            constraints.gridx = 0;
334
            constraints.gridy = rows.size();
335
            constraints.weightx = 1.0;
336
            constraints.weighty = 1.0;
337
            constraints.fill = GridBagConstraints.NONE;
338
            constraints.anchor = GridBagConstraints.CENTER;
339
            listLayout.setConstraints(emptyRow, constraints);
340
        }
341
        validate();
342
        return row;
343
    }
344

    
345
    protected boolean removeBottomRow() {
346
        LinkRow row;
347
        synchronized (rows) {
348
            if (rows.size() <= 1)
349
                return false;
350
            row = (LinkRow) rows.get(rows.size() - 1);
351
            rows.remove(rows.size() - 1);
352
        }
353
        rowList.remove(row);
354
        GridBagConstraints constraints = new GridBagConstraints();
355
        constraints.gridx = 0;
356
        constraints.gridy = rows.size();
357
        constraints.weightx = 1.0;
358
        constraints.weighty = 1.0;
359
        constraints.fill = GridBagConstraints.NONE;
360
        constraints.anchor = GridBagConstraints.CENTER;
361
        listLayout.setConstraints(emptyRow, constraints);
362

    
363
        validate();
364
        repaint();
365
        return true;
366
    }
367

    
368
    protected JButton getAddActionButton() {
369
        if (jbt_addAction == null) {
370
            jbt_addAction =
371
                new JButton(PluginServices.getText(this, "Add_action"));
372
            jbt_addAction.setSize(150, 70);
373
            jbt_addAction.setActionCommand("addButton");
374
            jbt_addAction.addActionListener(new ActionListener() {
375

    
376
                public void actionPerformed(ActionEvent e) {
377
                    if (e.getActionCommand().equals("addButton")) {
378
                        addRow();
379
                    }
380
                }
381
            });
382
        }
383
        return jbt_addAction;
384
    }
385

    
386
    protected JButton getRemoveActionButton() {
387
        if (jbt_removeAction == null) {
388
            jbt_removeAction =
389
                new JButton(PluginServices.getText(this, "Remove_action"));
390
            jbt_removeAction.setActionCommand("removeButton");
391
            jbt_removeAction.addActionListener(new ActionListener() {
392

    
393
                public void actionPerformed(ActionEvent e) {
394
                    if (e.getActionCommand().equals("removeButton")) {
395
                        removeBottomRow();
396
                    }
397
                }
398
            });
399
            return jbt_removeAction;
400
        }
401
        return jbt_removeAction;
402
    }
403

    
404
    public WindowInfo getWindowInfo() {
405
        if (_windowInfo == null) {
406
            _windowInfo =
407
                new WindowInfo(WindowInfo.ICONIFIABLE | WindowInfo.MAXIMIZABLE
408
                    | WindowInfo.RESIZABLE);
409
            _windowInfo.setWidth(680);
410
            _windowInfo.setHeight(500);
411
            _windowInfo.setTitle(PluginServices.getText(this,
412
                "Hyperlink_Settings"));
413
        }
414
        return _windowInfo;
415
    }
416

    
417
    protected JButton getAcceptButton() {
418
        if (jbt_accept == null) {
419
            jbt_accept =
420
                new org.gvsig.gui.beans.swing.JButton(PluginServices.getText(this,
421
                    "Aceptar"));
422
            jbt_accept.addActionListener(this);
423
        }
424
        return jbt_accept;
425
    }
426

    
427
    protected JButton getCancelButton() {
428
        if (jbt_cancel == null) {
429
            jbt_cancel =
430
                new org.gvsig.gui.beans.swing.JButton(PluginServices.getText(this,
431
                    "Cancel"));
432
            jbt_cancel.addActionListener(this);
433
        }
434
        return jbt_cancel;
435
    }
436

    
437
    protected JCheckBox getEnabledCheckBox() {
438
        if (jcb_enabled == null) {
439
            jcb_enabled =
440
                new JCheckBox(PluginServices.getText(this, "Enable_hyperlink"),
441
                    true);
442
            jcb_enabled.addItemListener(this);
443
        }
444
        return jcb_enabled;
445
    }
446

    
447
    public void actionPerformed(ActionEvent e) {
448
        if (e.getSource() == getAcceptButton()) {
449
            acceptAction();
450
            PluginServices.getMDIManager().closeWindow(this);
451

    
452
        } else
453
            if (e.getSource() == getCancelButton()) {
454
                cancelAction();
455
                PluginServices.getMDIManager().closeWindow(this);
456
            }
457
    }
458

    
459
    protected void setListEnabled(boolean enabled) {
460
        getAddActionButton().setEnabled(enabled);
461
        getRemoveActionButton().setEnabled(enabled);
462
        synchronized (rows) {
463
            for (int i = 0; i < rows.size(); i++) {
464
                LinkRow row = (LinkRow) rows.get(i);
465
                row.setEnabled(enabled);
466
            }
467
        }
468
    }
469

    
470
    protected void setLinkEnabled(boolean enabled) {
471
        getEnabledCheckBox().setSelected(enabled);
472
        setListEnabled(enabled);
473
    }
474

    
475
    public void itemStateChanged(ItemEvent e) {
476
        if (e.getSource() == getEnabledCheckBox()) {
477
            if (e.getStateChange() == ItemEvent.DESELECTED) {
478
                setListEnabled(false);
479
            } else {
480
                setListEnabled(true);
481
            }
482
        }
483
    }
484

    
485
    public Object getWindowProfile() {
486
        return WindowInfo.DIALOG_PROFILE;
487
    }
488
}