PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/jEdit/tags/jedit-4-1-pre5/org/gjt/sp/jedit/pluginmgr/PluginManager.java

#
Java | 467 lines | 358 code | 71 blank | 38 comment | 70 complexity | e2a982937b32cbac0bc91f746325e11d MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * PluginManager.java - Plugin manager window
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 2000, 2001, 2002 Slava Pestov
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version 2
  11. * of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. package org.gjt.sp.jedit.pluginmgr;
  23. //{{{ Imports
  24. import javax.swing.border.*;
  25. import javax.swing.event.*;
  26. import javax.swing.tree.*;
  27. import javax.swing.*;
  28. import java.awt.event.*;
  29. import java.awt.*;
  30. import java.io.File;
  31. import java.util.*;
  32. import org.gjt.sp.jedit.gui.*;
  33. import org.gjt.sp.jedit.*;
  34. import org.gjt.sp.util.Log;
  35. //}}}
  36. public class PluginManager extends EnhancedDialog
  37. {
  38. //{{{ PluginManager constructor
  39. public PluginManager(Frame frame)
  40. {
  41. super(frame,jEdit.getProperty("plugin-manager.title"),true);
  42. JPanel content = new JPanel(new BorderLayout());
  43. content.setBorder(new EmptyBorder(12,12,12,12));
  44. setContentPane(content);
  45. JLabel caption = new JLabel(jEdit.getProperty(
  46. "plugin-manager.caption"));
  47. caption.setBorder(new EmptyBorder(0,0,6,0));
  48. content.add(BorderLayout.NORTH,caption);
  49. tree = new JTree();
  50. tree.setCellRenderer(new Renderer());
  51. tree.setRootVisible(false);
  52. tree.setVisibleRowCount(16);
  53. tree.addTreeSelectionListener(new TreeHandler());
  54. JPanel panel = new JPanel(new BorderLayout());
  55. panel.add(BorderLayout.CENTER,new JScrollPane(tree));
  56. JPanel panel2 = new JPanel(new BorderLayout());
  57. panel2.setBorder(new EmptyBorder(6,0,0,0));
  58. JPanel labelBox = new JPanel(new GridLayout(3,1,0,3));
  59. labelBox.setBorder(new EmptyBorder(0,0,0,12));
  60. labelBox.add(new JLabel(jEdit.getProperty("plugin-manager"
  61. + ".info.name"),SwingConstants.RIGHT));
  62. labelBox.add(new JLabel(jEdit.getProperty("plugin-manager"
  63. + ".info.author"),SwingConstants.RIGHT));
  64. labelBox.add(new JLabel(jEdit.getProperty("plugin-manager"
  65. + ".info.version"),SwingConstants.RIGHT));
  66. panel2.add(BorderLayout.WEST,labelBox);
  67. JPanel valueBox = new JPanel(new GridLayout(3,1,0,3));
  68. valueBox.add(name = new JLabel());
  69. valueBox.add(author = new JLabel());
  70. valueBox.add(version = new JLabel());
  71. panel2.add(BorderLayout.CENTER,valueBox);
  72. panel.add(BorderLayout.SOUTH,panel2);
  73. content.add(BorderLayout.CENTER,panel);
  74. JPanel buttons = new JPanel();
  75. buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
  76. buttons.setBorder(new EmptyBorder(12,0,0,0));
  77. buttons.add(Box.createGlue());
  78. remove = new JButton(jEdit.getProperty("plugin-manager"
  79. + ".remove"));
  80. remove.addActionListener(new ActionHandler());
  81. buttons.add(remove);
  82. buttons.add(Box.createHorizontalStrut(6));
  83. update = new JButton(jEdit.getProperty("plugin-manager"
  84. + ".update"));
  85. update.addActionListener(new ActionHandler());
  86. buttons.add(update);
  87. buttons.add(Box.createHorizontalStrut(6));
  88. install = new JButton(jEdit.getProperty("plugin-manager"
  89. + ".install"));
  90. install.addActionListener(new ActionHandler());
  91. buttons.add(install);
  92. buttons.add(Box.createHorizontalStrut(6));
  93. close = new JButton(jEdit.getProperty("common.close"));
  94. close.addActionListener(new ActionHandler());
  95. buttons.add(close);
  96. buttons.add(Box.createGlue());
  97. content.add(BorderLayout.SOUTH,buttons);
  98. updateTree();
  99. setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  100. pack();
  101. setLocationRelativeTo(frame);
  102. show();
  103. } //}}}
  104. //{{{ ok() method
  105. public void ok()
  106. {
  107. // do nothing when Enter is pressed.
  108. } //}}}
  109. //{{{ cancel() method
  110. public void cancel()
  111. {
  112. dispose();
  113. } //}}}
  114. //{{{ Private members
  115. //{{{ Instance variables
  116. private JTree tree;
  117. private JLabel name;
  118. private JLabel author;
  119. private JLabel version;
  120. private JButton remove;
  121. private JButton update;
  122. private JButton install;
  123. private JButton close;
  124. private PluginList pluginList;
  125. //}}}
  126. //{{{ getPluginList() method
  127. private PluginList getPluginList()
  128. {
  129. if(pluginList == null)
  130. {
  131. pluginList = new PluginListDownloadProgress(PluginManager.this)
  132. .getPluginList();
  133. }
  134. return pluginList;
  135. }
  136. //{{{ updateTree() method
  137. private void updateTree()
  138. {
  139. DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode();
  140. DefaultTreeModel treeModel = new DefaultTreeModel(treeRoot);
  141. DefaultMutableTreeNode loadedTree = new DefaultMutableTreeNode(
  142. jEdit.getProperty("plugin-manager.loaded"),true);
  143. DefaultMutableTreeNode notLoadedTree = new DefaultMutableTreeNode(
  144. jEdit.getProperty("plugin-manager.not-loaded"),true);
  145. DefaultMutableTreeNode newTree = new DefaultMutableTreeNode(
  146. jEdit.getProperty("plugin-manager.new"),true);
  147. EditPlugin[] plugins = jEdit.getPlugins();
  148. for(int i = 0; i < plugins.length; i++)
  149. {
  150. EditPlugin plugin = plugins[i];
  151. String path = plugin.getJAR().getPath();
  152. if(!new File(path).exists())
  153. {
  154. // plugin was deleted
  155. continue;
  156. }
  157. if(plugin instanceof EditPlugin.Broken)
  158. {
  159. Entry entry = new Entry(path,plugin.getClassName(),true);
  160. notLoadedTree.add(new DefaultMutableTreeNode(entry));
  161. }
  162. else
  163. {
  164. Entry entry = new Entry(path,plugin.getClassName(),false);
  165. loadedTree.add(new DefaultMutableTreeNode(entry));
  166. }
  167. }
  168. if(notLoadedTree.getChildCount() != 0)
  169. treeRoot.add(notLoadedTree);
  170. if(loadedTree.getChildCount() != 0)
  171. treeRoot.add(loadedTree);
  172. String[] newPlugins = jEdit.getNotLoadedPluginJARs();
  173. for(int i = 0; i < newPlugins.length; i++)
  174. {
  175. Entry entry = new Entry(newPlugins[i],null,false);
  176. newTree.add(new DefaultMutableTreeNode(entry));
  177. }
  178. if(newTree.getChildCount() != 0)
  179. treeRoot.add(newTree);
  180. tree.setModel(treeModel);
  181. for(int i = 0; i < tree.getRowCount(); i++)
  182. tree.expandRow(i);
  183. remove.setEnabled(false);
  184. name.setText(null);
  185. author.setText(null);
  186. version.setText(null);
  187. } //}}}
  188. //}}}
  189. //{{{ Entry class
  190. class Entry
  191. {
  192. String clazz;
  193. String name, version, author;
  194. Vector jars;
  195. boolean broken;
  196. Entry(String path, String clazz, boolean broken)
  197. {
  198. Entry.this.clazz = clazz;
  199. Entry.this.broken = broken;
  200. jars = new Vector();
  201. jars.addElement(path);
  202. if(clazz == null)
  203. Entry.this.name = path;
  204. else
  205. {
  206. Entry.this.name = jEdit.getProperty("plugin." + clazz + ".name");
  207. if(name == null)
  208. name = clazz;
  209. Entry.this.version = jEdit.getProperty("plugin." + clazz
  210. + ".version");
  211. Entry.this.author = jEdit.getProperty("plugin." + clazz
  212. + ".author");
  213. String jarsProp = jEdit.getProperty("plugin." + clazz
  214. + ".jars");
  215. if(jarsProp != null)
  216. {
  217. String directory = MiscUtilities.getParentOfPath(path);
  218. StringTokenizer st = new StringTokenizer(jarsProp);
  219. while(st.hasMoreElements())
  220. {
  221. jars.addElement(MiscUtilities.constructPath(
  222. directory,st.nextToken()));
  223. }
  224. }
  225. }
  226. }
  227. public String toString()
  228. {
  229. return Entry.this.name;
  230. }
  231. } //}}}
  232. //{{{ ActionHandler class
  233. class ActionHandler implements ActionListener
  234. {
  235. public void actionPerformed(ActionEvent evt)
  236. {
  237. Object source = evt.getSource();
  238. if(source == close)
  239. dispose();
  240. else if(source == remove)
  241. {
  242. TreePath[] selected = tree.getSelectionModel()
  243. .getSelectionPaths();
  244. StringBuffer buf = new StringBuffer();
  245. Roster roster = new Roster();
  246. for(int i = 0; i < selected.length; i++)
  247. {
  248. Object last = ((DefaultMutableTreeNode)
  249. selected[i].getLastPathComponent())
  250. .getUserObject();
  251. if(last instanceof Entry)
  252. {
  253. Entry entry = (Entry)last;
  254. for(int j = 0; j < entry.jars.size(); j++)
  255. {
  256. String jar = (String)entry.jars.elementAt(j);
  257. if(buf.length() != 0)
  258. buf.append('\n');
  259. buf.append(jar);
  260. roster.addOperation(new Roster.Remove(jar));
  261. }
  262. }
  263. }
  264. String[] args = { buf.toString() };
  265. if(GUIUtilities.confirm(PluginManager.this,
  266. "plugin-manager.remove-confirm",args,
  267. JOptionPane.YES_NO_OPTION,
  268. JOptionPane.QUESTION_MESSAGE)
  269. == JOptionPane.YES_OPTION)
  270. {
  271. new PluginManagerProgress(PluginManager.this,
  272. "remove",roster);
  273. updateTree();
  274. }
  275. }
  276. else if(source == update)
  277. {
  278. if(jEdit.getSettingsDirectory() == null)
  279. {
  280. GUIUtilities.error(PluginManager.this,
  281. "no-settings",null);
  282. return;
  283. }
  284. PluginList list = getPluginList();
  285. if(list == null)
  286. return;
  287. Vector plugins = new Vector();
  288. for(int i = 0; i < list.plugins.size(); i++)
  289. {
  290. PluginList.Plugin plugin = (PluginList.Plugin)list
  291. .plugins.elementAt(i);
  292. PluginList.Branch branch = plugin.getCompatibleBranch();
  293. if(branch != null
  294. && branch.canSatisfyDependencies()
  295. && plugin.installedVersion != null
  296. && MiscUtilities.compareStrings(branch.version,
  297. plugin.installedVersion,false) > 0)
  298. plugins.addElement(plugin);
  299. }
  300. if(plugins.size() == 0)
  301. {
  302. GUIUtilities.message(PluginManager.this,
  303. "plugin-manager.up-to-date",null);
  304. return;
  305. }
  306. Roster roster = new Roster();
  307. new InstallPluginsDialog(PluginManager.this,
  308. plugins,InstallPluginsDialog.UPDATE)
  309. .installPlugins(roster);
  310. if(roster.isEmpty())
  311. return;
  312. new PluginManagerProgress(PluginManager.this,
  313. "update",roster);
  314. updateTree();
  315. }
  316. else if(source == install)
  317. {
  318. if(jEdit.getSettingsDirectory() == null
  319. && jEdit.getJEditHome() == null)
  320. {
  321. GUIUtilities.error(PluginManager.this,"no-settings",null);
  322. return;
  323. }
  324. PluginList list = getPluginList();
  325. if(list == null)
  326. return;
  327. Vector plugins = new Vector();
  328. for(int i = 0; i < list.plugins.size(); i++)
  329. {
  330. PluginList.Plugin plugin = (PluginList.Plugin)list
  331. .plugins.elementAt(i);
  332. if(plugin.installed == null
  333. && plugin.canBeInstalled())
  334. plugins.addElement(plugin);
  335. }
  336. Roster roster = new Roster();
  337. new InstallPluginsDialog(PluginManager.this,
  338. plugins,InstallPluginsDialog.INSTALL)
  339. .installPlugins(roster);
  340. if(roster.isEmpty())
  341. return;
  342. new PluginManagerProgress(PluginManager.this,
  343. "install",roster);
  344. updateTree();
  345. }
  346. }
  347. } //}}}
  348. //{{{ TreeHandler class
  349. class TreeHandler implements TreeSelectionListener
  350. {
  351. public void valueChanged(TreeSelectionEvent evt)
  352. {
  353. TreePath selection = evt.getPath();
  354. DefaultMutableTreeNode node;
  355. if(selection == null)
  356. {
  357. node = null;
  358. }
  359. else
  360. {
  361. node = (DefaultMutableTreeNode)
  362. selection.getLastPathComponent();
  363. }
  364. name.setText(null);
  365. author.setText(null);
  366. version.setText(null);
  367. if(node != null && node.isLeaf()
  368. && node.getUserObject() instanceof Entry)
  369. {
  370. remove.setEnabled(true);
  371. Entry entry = (Entry)node.getUserObject();
  372. if(entry.clazz != null)
  373. {
  374. name.setText(entry.name);
  375. author.setText(entry.author);
  376. version.setText(entry.version);
  377. }
  378. }
  379. else
  380. remove.setEnabled(false);
  381. }
  382. } //}}}
  383. //{{{ Renderer class
  384. class Renderer extends DefaultTreeCellRenderer
  385. {
  386. public Component getTreeCellRendererComponent(JTree tree,
  387. Object value, boolean selected, boolean expanded,
  388. boolean leaf, int row, boolean hasFocus)
  389. {
  390. super.getTreeCellRendererComponent(tree,value,
  391. selected,expanded,leaf,row,hasFocus);
  392. setIcon(null);
  393. return this;
  394. }
  395. } //}}}
  396. }