KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > core > gui > plugin > PluginManagerDialog


1 //The contents of this file are subject to the Mozilla Public License Version 1.1
2
//(the "License"); you may not use this file except in compliance with the
3
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
4
//
5
//Software distributed under the License is distributed on an "AS IS" basis,
6
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
7
//for the specific language governing rights and
8
//limitations under the License.
9
//
10
//The Original Code is "The Columba Project"
11
//
12
//The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
13
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
14
//
15
//All Rights Reserved.
16

17 package org.columba.core.gui.plugin;
18
19 import java.awt.BorderLayout JavaDoc;
20 import java.awt.Color JavaDoc;
21 import java.awt.Component JavaDoc;
22 import java.awt.Dimension JavaDoc;
23 import java.awt.GridBagConstraints JavaDoc;
24 import java.awt.GridBagLayout JavaDoc;
25 import java.awt.GridLayout JavaDoc;
26 import java.awt.event.ActionEvent JavaDoc;
27 import java.awt.event.ActionListener JavaDoc;
28 import java.awt.event.KeyEvent JavaDoc;
29 import java.io.File JavaDoc;
30 import java.io.IOException JavaDoc;
31 import java.net.URL JavaDoc;
32 import java.util.logging.Logger JavaDoc;
33
34 import javax.swing.BorderFactory JavaDoc;
35 import javax.swing.Box JavaDoc;
36 import javax.swing.BoxLayout JavaDoc;
37 import javax.swing.JButton JavaDoc;
38 import javax.swing.JComponent JavaDoc;
39 import javax.swing.JDialog JavaDoc;
40 import javax.swing.JFileChooser JavaDoc;
41 import javax.swing.JFrame JavaDoc;
42 import javax.swing.JLabel JavaDoc;
43 import javax.swing.JOptionPane JavaDoc;
44 import javax.swing.JPanel JavaDoc;
45 import javax.swing.JScrollPane JavaDoc;
46 import javax.swing.KeyStroke JavaDoc;
47 import javax.swing.SwingConstants JavaDoc;
48 import javax.swing.event.TreeSelectionEvent JavaDoc;
49 import javax.swing.event.TreeSelectionListener JavaDoc;
50 import javax.swing.filechooser.FileFilter JavaDoc;
51
52 import org.columba.api.plugin.IExtensionHandler;
53 import org.columba.api.plugin.IExtensionHandlerKeys;
54 import org.columba.api.plugin.PluginHandlerNotFoundException;
55 import org.columba.api.plugin.PluginLoadingFailedException;
56 import org.columba.api.plugin.PluginMetadata;
57 import org.columba.core.config.DefaultConfigDirectory;
58 import org.columba.core.gui.base.ButtonWithMnemonic;
59 import org.columba.core.gui.base.InfoViewerDialog;
60 import org.columba.core.gui.base.SingleSideEtchedBorder;
61 import org.columba.core.help.HelpManager;
62 import org.columba.core.io.DirectoryIO;
63 import org.columba.core.io.ZipFileIO;
64 import org.columba.core.plugin.PluginManager;
65 import org.columba.core.resourceloader.GlobalResourceLoader;
66
67 /**
68  * @author fdietz
69  *
70  * This dialog lets you view all installed plugins in a categorized tree view.
71  *
72  * There are buttons which let you: - install new plugins - remove plugins -
73  * enable/disable plugins - view plugin info (readme.txt in plugin folder)
74  */

75 public class PluginManagerDialog extends JDialog JavaDoc implements ActionListener JavaDoc,
76         TreeSelectionListener JavaDoc {
77     private static final String JavaDoc RESOURCE_PATH = "org.columba.core.i18n.dialog";
78
79     private static final Logger JavaDoc LOG = Logger
80     .getLogger("org.columba.core.gui.plugin");
81
82     protected JButton JavaDoc installButton;
83
84     protected JButton JavaDoc removeButton;
85
86     protected JButton JavaDoc optionsButton;
87
88     protected JButton JavaDoc infoButton;
89
90     protected JButton JavaDoc helpButton;
91
92     protected JButton JavaDoc closeButton;
93
94     protected PluginTree table;
95
96     protected IExtensionHandler configHandler;
97
98     protected PluginNode selectedNode;
99
100     private static PluginManagerDialog instance;
101
102     private PluginManagerDialog() {
103         // modal JDialog
104
super((JFrame JavaDoc) null, GlobalResourceLoader.getString(RESOURCE_PATH,
105                 "pluginmanager", "title"), true);
106
107         try {
108             configHandler = PluginManager.getInstance()
109                     .getExtensionHandler(IExtensionHandlerKeys.ORG_COLUMBA_CORE_CONFIG);
110         } catch (Exception JavaDoc ex) {
111             ex.printStackTrace();
112         }
113
114         initComponents();
115         pack();
116         setLocationRelativeTo(null);
117         setVisible(true);
118     }
119
120     public static PluginManagerDialog getInstance() {
121         if ( instance == null) {
122             instance = new PluginManagerDialog();
123         }
124
125         return instance;
126     }
127
128     protected void initComponents() {
129         JPanel JavaDoc mainPanel = new JPanel JavaDoc();
130         mainPanel.setLayout(new BorderLayout JavaDoc());
131         mainPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
132         getContentPane().add(mainPanel);
133
134         installButton = new ButtonWithMnemonic(GlobalResourceLoader.getString(
135                 RESOURCE_PATH, "pluginmanager", "install"));
136         installButton.setActionCommand("INSTALL");
137         installButton.addActionListener(this);
138
139         removeButton = new ButtonWithMnemonic(GlobalResourceLoader.getString(
140                 RESOURCE_PATH, "pluginmanager", "remove"));
141         removeButton.setActionCommand("REMOVE");
142         removeButton.setEnabled(false);
143         removeButton.addActionListener(this);
144
145         optionsButton = new ButtonWithMnemonic(GlobalResourceLoader.getString(
146                 RESOURCE_PATH, "pluginmanager", "options"));
147         optionsButton.setActionCommand("OPTIONS");
148         optionsButton.setEnabled(false);
149         optionsButton.addActionListener(this);
150
151         infoButton = new ButtonWithMnemonic(GlobalResourceLoader.getString(
152                 RESOURCE_PATH, "pluginmanager", "info"));
153         infoButton.setActionCommand("INFO");
154         infoButton.setEnabled(false);
155         infoButton.addActionListener(this);
156
157         // top panel
158
JPanel JavaDoc topPanel = new JPanel JavaDoc();
159         topPanel.setLayout(new BoxLayout JavaDoc(topPanel, BoxLayout.X_AXIS));
160
161         GridBagLayout JavaDoc gridBagLayout = new GridBagLayout JavaDoc();
162         GridBagConstraints JavaDoc c = new GridBagConstraints JavaDoc();
163
164         // topPanel.setLayout( );
165
JPanel JavaDoc topBorderPanel = new JPanel JavaDoc();
166         topBorderPanel.setLayout(new BorderLayout JavaDoc());
167
168         // topBorderPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5,
169
// 0));
170
topBorderPanel.add(topPanel);
171
172         // mainPanel.add( topBorderPanel, BorderLayout.NORTH );
173
JLabel JavaDoc nameLabel = new JLabel JavaDoc("name");
174         nameLabel.setEnabled(false);
175         topPanel.add(nameLabel);
176
177         topPanel.add(Box.createRigidArea(new Dimension JavaDoc(10, 0)));
178         topPanel.add(Box.createHorizontalGlue());
179
180         Component JavaDoc glue = Box.createVerticalGlue();
181         c.anchor = GridBagConstraints.EAST;
182         c.gridwidth = GridBagConstraints.REMAINDER;
183
184         // c.fill = GridBagConstraints.HORIZONTAL;
185
gridBagLayout.setConstraints(glue, c);
186
187         gridBagLayout = new GridBagLayout JavaDoc();
188         c = new GridBagConstraints JavaDoc();
189
190         JPanel JavaDoc eastPanel = new JPanel JavaDoc(gridBagLayout);
191         mainPanel.add(eastPanel, BorderLayout.EAST);
192
193         c.fill = GridBagConstraints.HORIZONTAL;
194         c.weightx = 1.0;
195         c.gridwidth = GridBagConstraints.REMAINDER;
196         gridBagLayout.setConstraints(installButton, c);
197         eastPanel.add(installButton);
198
199         Component JavaDoc strut1 = Box.createRigidArea(new Dimension JavaDoc(30, 5));
200         gridBagLayout.setConstraints(strut1, c);
201         eastPanel.add(strut1);
202
203         gridBagLayout.setConstraints(removeButton, c);
204         eastPanel.add(removeButton);
205
206         Component JavaDoc strut = Box.createRigidArea(new Dimension JavaDoc(30, 5));
207         gridBagLayout.setConstraints(strut, c);
208         eastPanel.add(strut);
209
210         gridBagLayout.setConstraints(optionsButton, c);
211         eastPanel.add(optionsButton);
212
213         Component JavaDoc strut3 = Box.createRigidArea(new Dimension JavaDoc(30, 5));
214         gridBagLayout.setConstraints(strut3, c);
215         eastPanel.add(strut3);
216
217         gridBagLayout.setConstraints(infoButton, c);
218         eastPanel.add(infoButton);
219
220         strut = Box.createRigidArea(new Dimension JavaDoc(30, 20));
221         gridBagLayout.setConstraints(strut, c);
222         eastPanel.add(strut);
223
224         glue = Box.createVerticalGlue();
225         c.fill = GridBagConstraints.BOTH;
226         c.weighty = 1.0;
227         gridBagLayout.setConstraints(glue, c);
228         eastPanel.add(glue);
229
230         // centerpanel
231
JPanel JavaDoc centerPanel = new JPanel JavaDoc(new BorderLayout JavaDoc());
232         centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
233
234         /*
235          * listView = new FilterListTable(filterList, this);
236          * listView.getSelectionModel().addListSelectionListener(this);
237          * JScrollPane scrollPane = new JScrollPane(listView);
238          * scrollPane.setPreferredSize(new Dimension(300, 250));
239          * scrollPane.getViewport().setBackground(Color.white);
240          * centerPanel.add(scrollPane);
241          */

242         table = new PluginTree();
243         table.getTree().addTreeSelectionListener(this);
244
245         JScrollPane JavaDoc scrollPane = new JScrollPane JavaDoc(table);
246         scrollPane.setPreferredSize(new Dimension JavaDoc(350, 300));
247         scrollPane.getViewport().setBackground(Color.white);
248         centerPanel.add(scrollPane);
249
250         mainPanel.add(centerPanel);
251
252         JPanel JavaDoc bottomPanel = new JPanel JavaDoc(new BorderLayout JavaDoc());
253         bottomPanel.setBorder(new SingleSideEtchedBorder(SwingConstants.TOP));
254
255         JPanel JavaDoc buttonPanel = new JPanel JavaDoc(new GridLayout JavaDoc(1, 3, 6, 0));
256         buttonPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
257
258         JButton JavaDoc closeButton = new ButtonWithMnemonic(GlobalResourceLoader
259                 .getString("global", "global", "close"));
260         closeButton.setActionCommand("CLOSE");
261         closeButton.addActionListener(this);
262         buttonPanel.add(closeButton);
263
264         ButtonWithMnemonic helpButton = new ButtonWithMnemonic(
265                 GlobalResourceLoader.getString("global", "global", "help"));
266         buttonPanel.add(helpButton);
267         bottomPanel.add(buttonPanel, BorderLayout.EAST);
268         getContentPane().add(bottomPanel, BorderLayout.SOUTH);
269         getRootPane().setDefaultButton(closeButton);
270         getRootPane().registerKeyboardAction(this, "CLOSE",
271                 KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
272                 JComponent.WHEN_IN_FOCUSED_WINDOW);
273
274         // associate with JavaHelp
275
HelpManager.getInstance().enableHelpOnButton(helpButton,
276                 "extending_columba_1");
277         HelpManager.getInstance().enableHelpKey(getRootPane(),
278                 "extending_columba_1");
279     }
280
281     public void actionPerformed(ActionEvent JavaDoc e) {
282         String JavaDoc action = e.getActionCommand();
283
284         if (action.equals("CLOSE")) {
285             setVisible(false);
286         } else if (action.equals("INFO")) {
287             String JavaDoc id = selectedNode.getId();
288
289             URL JavaDoc url = PluginManager.getInstance().getInfoURL(id);
290             if (url != null) {
291                 try {
292                     new InfoViewerDialog(url);
293                 } catch (IOException JavaDoc ioe) {
294                 }
295             }
296         } else if (action.equals("OPTIONS")) {
297             String JavaDoc id = selectedNode.getId();
298             id = id.substring(id.lastIndexOf(".") + 1, id.length());
299
300             try {
301                 ConfigurationDialog dialog = new ConfigurationDialog(id);
302                 dialog.setVisible(true);
303             } catch (PluginHandlerNotFoundException phnfe) {
304             } catch (PluginLoadingFailedException plfe) {
305             }
306         } else if (action.equals("REMOVE")) {
307             // get plugin directory
308
File JavaDoc directory = PluginManager.getInstance().getPluginMetadata(
309                     selectedNode.getId()).getDirectory();
310
311             // delete plugin from disk
312
DirectoryIO.delete(directory);
313
314             // remove plugin from view
315
table.removePluginNode(selectedNode);
316         } else if (action.equals("INSTALL")) {
317             JFileChooser JavaDoc chooser = new JFileChooser JavaDoc();
318             chooser.addChoosableFileFilter(new FileFilter JavaDoc() {
319                 public boolean accept(File JavaDoc file) {
320                     return file.isDirectory()
321                             || file.getName().toLowerCase().endsWith(".zip");
322                 }
323
324                 public String JavaDoc getDescription() {
325                     return GlobalResourceLoader.getString(RESOURCE_PATH,
326                             "pluginmanager", "filefilter");
327                 }
328             });
329             chooser.setAcceptAllFileFilterUsed(false);
330
331             int result = chooser.showOpenDialog(this);
332
333             if (result == JFileChooser.APPROVE_OPTION) {
334                 File JavaDoc file = chooser.getSelectedFile();
335
336                 installPlugin(file);
337             }
338         }
339     }
340
341     public void valueChanged(TreeSelectionEvent JavaDoc arg0) {
342         selectedNode = (PluginNode) arg0.getPath().getLastPathComponent();
343
344         if (selectedNode == null) {
345             return;
346         }
347
348         boolean isCategoryFolder = selectedNode.isCategory();
349
350         if (isCategoryFolder) {
351             // this is just a folder
352
// ->disable all actions
353
removeButton.setEnabled(false);
354             infoButton.setEnabled(false);
355
356             optionsButton.setEnabled(false);
357         } else {
358             removeButton.setEnabled(true);
359             infoButton.setEnabled(selectedNode.hasInfo());
360
361             if (selectedNode == null) {
362                 return;
363             }
364
365             // if plugin has config extension point
366
String JavaDoc id = selectedNode.getId();
367             id = id.substring(id.lastIndexOf(".") + 1, id.length());
368             optionsButton.setEnabled(configHandler.exists(id));
369         }
370     }
371
372     /**
373      * Returns the currently selected node or null if none is selected.
374      */

375     public PluginNode getSelectedNode() {
376         return selectedNode;
377     }
378
379     /**
380      * TODO @author fdietz: move some logic out of this ui class and into plugin package
381      */

382     protected void installPlugin(File JavaDoc file) {
383         // use user's config folder in his/her home-folder
384
// all plugins reside in "<config-folder>/plugins"
385
File JavaDoc destination = new File JavaDoc(DefaultConfigDirectory.getInstance().getCurrentPath(),
386                 "plugins");
387
388         LOG.info("extract "+file.getName()+" to "+ destination.getAbsolutePath());
389
390         File JavaDoc pluginDirectory;
391         try {
392             // extract plugin
393
ZipFileIO.extract(file, destination);
394
395             pluginDirectory = ZipFileIO.getFirstFile(file);
396         } catch (IOException JavaDoc ioe) {
397             JOptionPane.showMessageDialog(this, GlobalResourceLoader.getString(
398                     RESOURCE_PATH, "pluginmanager", "errExtract.msg"),
399                     GlobalResourceLoader.getString(RESOURCE_PATH,
400                             "pluginmanager", "errExtract.title"),
401                     JOptionPane.ERROR_MESSAGE);
402             return;
403         }
404
405         if (pluginDirectory != null) {
406             // the plugin directory is "<config-folder>/plugins/<plugin-id>"
407
pluginDirectory = new File JavaDoc(destination, pluginDirectory.getName());
408             LOG.info("plugin directory="+pluginDirectory.getAbsolutePath());
409
410             // the path to the plugin.xml descriptor file is:
411
// "<config-folder>/plugins/<plugin-id>/plugin.xml
412
pluginDirectory = new File JavaDoc(pluginDirectory, "plugin.xml");
413
414             String JavaDoc id = PluginManager.getInstance().addPlugin(pluginDirectory);
415             PluginMetadata metadata = PluginManager.getInstance()
416                     .getPluginMetadata(id);
417
418             table.addPlugin(metadata);
419
420             JOptionPane.showMessageDialog(this, GlobalResourceLoader.getString(
421                     RESOURCE_PATH, "pluginmanager", "installSuccess.msg"),
422                     GlobalResourceLoader.getString(RESOURCE_PATH,
423                             "pluginmanager", "installSuccess.title"),
424                     JOptionPane.INFORMATION_MESSAGE);
425         }
426     }
427 }
428
Popular Tags