PageRenderTime 56ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/jEdit/tags/jedit-4-0-pre3/org/gjt/sp/jedit/pluginmgr/PluginManager.java

#
Java | 431 lines | 345 code | 66 blank | 20 comment | 67 complexity | 39c21dd647c54fee07449707cf3c8920 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. * Copyright (C) 2000, 2001 Slava Pestov
  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 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. package org.gjt.sp.jedit.pluginmgr;
  20. import javax.swing.border.*;
  21. import javax.swing.event.*;
  22. import javax.swing.tree.*;
  23. import javax.swing.*;
  24. import java.awt.event.*;
  25. import java.awt.*;
  26. import java.io.File;
  27. import java.util.*;
  28. import org.gjt.sp.jedit.gui.*;
  29. import org.gjt.sp.jedit.*;
  30. import org.gjt.sp.util.Log;
  31. public class PluginManager extends JDialog
  32. {
  33. public PluginManager(Frame frame)
  34. {
  35. super(frame,jEdit.getProperty("plugin-manager.title"),true);
  36. JPanel content = new JPanel(new BorderLayout());
  37. content.setBorder(new EmptyBorder(12,12,12,12));
  38. setContentPane(content);
  39. JLabel caption = new JLabel(jEdit.getProperty(
  40. "plugin-manager.caption"));
  41. caption.setBorder(new EmptyBorder(0,0,6,0));
  42. content.add(BorderLayout.NORTH,caption);
  43. tree = new JTree();
  44. tree.setCellRenderer(new Renderer());
  45. tree.setRootVisible(false);
  46. tree.setVisibleRowCount(16);
  47. tree.addTreeSelectionListener(new TreeHandler());
  48. JPanel panel = new JPanel(new BorderLayout());
  49. panel.add(BorderLayout.CENTER,new JScrollPane(tree));
  50. JPanel panel2 = new JPanel(new BorderLayout());
  51. panel2.setBorder(new EmptyBorder(6,0,0,0));
  52. JPanel labelBox = new JPanel(new GridLayout(3,1,0,3));
  53. labelBox.setBorder(new EmptyBorder(0,0,0,12));
  54. labelBox.add(new JLabel(jEdit.getProperty("plugin-manager"
  55. + ".info.name"),SwingConstants.RIGHT));
  56. labelBox.add(new JLabel(jEdit.getProperty("plugin-manager"
  57. + ".info.author"),SwingConstants.RIGHT));
  58. labelBox.add(new JLabel(jEdit.getProperty("plugin-manager"
  59. + ".info.version"),SwingConstants.RIGHT));
  60. panel2.add(BorderLayout.WEST,labelBox);
  61. JPanel valueBox = new JPanel(new GridLayout(3,1,0,3));
  62. valueBox.add(name = new JLabel());
  63. valueBox.add(author = new JLabel());
  64. valueBox.add(version = new JLabel());
  65. panel2.add(BorderLayout.CENTER,valueBox);
  66. panel.add(BorderLayout.SOUTH,panel2);
  67. content.add(BorderLayout.CENTER,panel);
  68. JPanel buttons = new JPanel();
  69. buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
  70. buttons.setBorder(new EmptyBorder(12,0,0,0));
  71. buttons.add(Box.createGlue());
  72. remove = new JButton(jEdit.getProperty("plugin-manager"
  73. + ".remove"));
  74. remove.addActionListener(new ActionHandler());
  75. buttons.add(remove);
  76. buttons.add(Box.createHorizontalStrut(6));
  77. update = new JButton(jEdit.getProperty("plugin-manager"
  78. + ".update"));
  79. update.addActionListener(new ActionHandler());
  80. buttons.add(update);
  81. buttons.add(Box.createHorizontalStrut(6));
  82. install = new JButton(jEdit.getProperty("plugin-manager"
  83. + ".install"));
  84. install.addActionListener(new ActionHandler());
  85. buttons.add(install);
  86. buttons.add(Box.createHorizontalStrut(6));
  87. close = new JButton(jEdit.getProperty("common.close"));
  88. close.addActionListener(new ActionHandler());
  89. buttons.add(close);
  90. buttons.add(Box.createGlue());
  91. content.add(BorderLayout.SOUTH,buttons);
  92. updateTree();
  93. setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  94. pack();
  95. setLocationRelativeTo(frame);
  96. show();
  97. }
  98. // private members
  99. private JTree tree;
  100. private JLabel name;
  101. private JLabel author;
  102. private JLabel version;
  103. private JButton remove;
  104. private JButton update;
  105. private JButton install;
  106. private JButton close;
  107. private void updateTree()
  108. {
  109. DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode();
  110. DefaultTreeModel treeModel = new DefaultTreeModel(treeRoot);
  111. DefaultMutableTreeNode loadedTree = new DefaultMutableTreeNode(
  112. jEdit.getProperty("plugin-manager.loaded"),true);
  113. DefaultMutableTreeNode notLoadedTree = new DefaultMutableTreeNode(
  114. jEdit.getProperty("plugin-manager.not-loaded"),true);
  115. DefaultMutableTreeNode newTree = new DefaultMutableTreeNode(
  116. jEdit.getProperty("plugin-manager.new"),true);
  117. EditPlugin[] plugins = jEdit.getPlugins();
  118. for(int i = 0; i < plugins.length; i++)
  119. {
  120. EditPlugin plugin = plugins[i];
  121. String path = plugin.getJAR().getPath();
  122. if(!new File(path).exists())
  123. {
  124. // plugin was deleted
  125. continue;
  126. }
  127. if(plugin instanceof EditPlugin.Broken)
  128. {
  129. Entry entry = new Entry(path,plugin.getClassName(),true);
  130. notLoadedTree.add(new DefaultMutableTreeNode(entry));
  131. }
  132. else
  133. {
  134. Entry entry = new Entry(path,plugin.getClassName(),false);
  135. loadedTree.add(new DefaultMutableTreeNode(entry));
  136. }
  137. }
  138. if(notLoadedTree.getChildCount() != 0)
  139. treeRoot.add(notLoadedTree);
  140. if(loadedTree.getChildCount() != 0)
  141. treeRoot.add(loadedTree);
  142. String[] newPlugins = jEdit.getNotLoadedPluginJARs();
  143. for(int i = 0; i < newPlugins.length; i++)
  144. {
  145. Entry entry = new Entry(newPlugins[i],null,false);
  146. newTree.add(new DefaultMutableTreeNode(entry));
  147. }
  148. if(newTree.getChildCount() != 0)
  149. treeRoot.add(newTree);
  150. tree.setModel(treeModel);
  151. for(int i = 0; i < tree.getRowCount(); i++)
  152. tree.expandRow(i);
  153. remove.setEnabled(false);
  154. name.setText(null);
  155. author.setText(null);
  156. version.setText(null);
  157. }
  158. class Entry
  159. {
  160. String clazz;
  161. String name, version, author;
  162. Vector jars;
  163. boolean broken;
  164. Entry(String path, String clazz, boolean broken)
  165. {
  166. Entry.this.clazz = clazz;
  167. Entry.this.broken = broken;
  168. jars = new Vector();
  169. jars.addElement(path);
  170. if(clazz == null)
  171. Entry.this.name = path;
  172. else
  173. {
  174. Entry.this.name = jEdit.getProperty("plugin." + clazz + ".name");
  175. if(name == null)
  176. name = clazz;
  177. Entry.this.version = jEdit.getProperty("plugin." + clazz
  178. + ".version");
  179. Entry.this.author = jEdit.getProperty("plugin." + clazz
  180. + ".author");
  181. String jarsProp = jEdit.getProperty("plugin." + clazz
  182. + ".jars");
  183. if(jarsProp != null)
  184. {
  185. String directory = MiscUtilities.getParentOfPath(path);
  186. StringTokenizer st = new StringTokenizer(jarsProp);
  187. while(st.hasMoreElements())
  188. {
  189. jars.addElement(MiscUtilities.constructPath(
  190. directory,st.nextToken()));
  191. }
  192. }
  193. }
  194. }
  195. public String toString()
  196. {
  197. return Entry.this.name;
  198. }
  199. }
  200. class ActionHandler implements ActionListener
  201. {
  202. public void actionPerformed(ActionEvent evt)
  203. {
  204. Object source = evt.getSource();
  205. if(source == close)
  206. dispose();
  207. else if(source == remove)
  208. {
  209. TreePath[] selected = tree.getSelectionModel()
  210. .getSelectionPaths();
  211. StringBuffer buf = new StringBuffer();
  212. Roster roster = new Roster();
  213. for(int i = 0; i < selected.length; i++)
  214. {
  215. Object last = ((DefaultMutableTreeNode)
  216. selected[i].getLastPathComponent())
  217. .getUserObject();
  218. if(last instanceof Entry)
  219. {
  220. Entry entry = (Entry)last;
  221. for(int j = 0; j < entry.jars.size(); j++)
  222. {
  223. String jar = (String)entry.jars.elementAt(j);
  224. if(buf.length() != 0)
  225. buf.append('\n');
  226. buf.append(jar);
  227. roster.addOperation(new Roster.Remove(jar));
  228. }
  229. }
  230. }
  231. String[] args = { buf.toString() };
  232. if(GUIUtilities.confirm(PluginManager.this,
  233. "plugin-manager.remove-confirm",args,
  234. JOptionPane.YES_NO_OPTION,
  235. JOptionPane.QUESTION_MESSAGE)
  236. == JOptionPane.YES_OPTION)
  237. {
  238. new PluginManagerProgress(PluginManager.this,
  239. jEdit.getProperty("plugin-manager.progress"
  240. + ".removing-task"),roster);
  241. updateTree();
  242. }
  243. }
  244. else if(source == update)
  245. {
  246. PluginList list = new PluginListDownloadProgress(PluginManager.this)
  247. .getPluginList();
  248. if(list == null)
  249. return;
  250. if(jEdit.getSettingsDirectory() == null)
  251. {
  252. GUIUtilities.error(PluginManager.this,
  253. "no-settings",null);
  254. return;
  255. }
  256. Vector plugins = new Vector();
  257. for(int i = 0; i < list.plugins.size(); i++)
  258. {
  259. PluginList.Plugin plugin = (PluginList.Plugin)list
  260. .plugins.elementAt(i);
  261. PluginList.Branch branch = plugin.getCompatibleBranch();
  262. if(branch != null
  263. && plugin.installedVersion != null
  264. && MiscUtilities.compareStrings(branch.version,
  265. plugin.installedVersion,false) > 0)
  266. plugins.addElement(plugin);
  267. }
  268. if(plugins.size() == 0)
  269. {
  270. GUIUtilities.message(PluginManager.this,
  271. "plugin-manager.up-to-date",null);
  272. return;
  273. }
  274. Roster roster = new Roster();
  275. new InstallPluginsDialog(PluginManager.this,plugins,
  276. InstallPluginsDialog.UPDATE)
  277. .installPlugins(roster);
  278. if(roster.isEmpty())
  279. return;
  280. new PluginManagerProgress(PluginManager.this,
  281. jEdit.getProperty("plugin-manager.progress"
  282. + ".updating-task"),roster);
  283. updateTree();
  284. }
  285. else if(source == install)
  286. {
  287. PluginList list = new PluginListDownloadProgress(PluginManager.this)
  288. .getPluginList();
  289. if(list == null)
  290. return;
  291. if(jEdit.getSettingsDirectory() == null
  292. && jEdit.getJEditHome() == null)
  293. {
  294. GUIUtilities.error(PluginManager.this,"no-settings",null);
  295. return;
  296. }
  297. Vector plugins = new Vector();
  298. for(int i = 0; i < list.plugins.size(); i++)
  299. {
  300. PluginList.Plugin plugin = (PluginList.Plugin)list
  301. .plugins.elementAt(i);
  302. if(plugin.installed == null
  303. && plugin.canBeInstalled())
  304. plugins.addElement(plugin);
  305. }
  306. Roster roster = new Roster();
  307. new InstallPluginsDialog(PluginManager.this,plugins,
  308. InstallPluginsDialog.INSTALL)
  309. .installPlugins(roster);
  310. if(roster.isEmpty())
  311. return;
  312. new PluginManagerProgress(PluginManager.this,
  313. jEdit.getProperty("plugin-manager.progress"
  314. + ".installing-task"),roster);
  315. updateTree();
  316. }
  317. }
  318. }
  319. class TreeHandler implements TreeSelectionListener
  320. {
  321. public void valueChanged(TreeSelectionEvent evt)
  322. {
  323. TreePath selection = evt.getPath();
  324. DefaultMutableTreeNode node;
  325. if(selection == null)
  326. {
  327. node = null;
  328. }
  329. else
  330. {
  331. node = (DefaultMutableTreeNode)
  332. selection.getLastPathComponent();
  333. }
  334. name.setText(null);
  335. author.setText(null);
  336. version.setText(null);
  337. if(node != null && node.isLeaf()
  338. && node.getUserObject() instanceof Entry)
  339. {
  340. remove.setEnabled(true);
  341. Entry entry = (Entry)node.getUserObject();
  342. if(entry.clazz != null)
  343. {
  344. name.setText(entry.name);
  345. author.setText(entry.author);
  346. version.setText(entry.version);
  347. }
  348. }
  349. else
  350. remove.setEnabled(false);
  351. }
  352. }
  353. class Renderer extends DefaultTreeCellRenderer
  354. {
  355. public Component getTreeCellRendererComponent(JTree tree,
  356. Object value, boolean selected, boolean expanded,
  357. boolean leaf, int row, boolean hasFocus)
  358. {
  359. super.getTreeCellRendererComponent(tree,value,
  360. selected,expanded,leaf,row,hasFocus);
  361. setIcon(null);
  362. return this;
  363. }
  364. }
  365. }