PageRenderTime 32ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/jEdit/tags/jedit-4-3-pre5/org/gjt/sp/jedit/gui/FilesChangedDialog.java

#
Java | 417 lines | 311 code | 60 blank | 46 comment | 57 complexity | 3f73f4708891b930adc1e3e2fb0b9c8e 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. * FilesChangedDialog.java - Files changed on disk
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 2003 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.gui;
  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 org.gjt.sp.jedit.io.*;
  31. import org.gjt.sp.jedit.*;
  32. //}}}
  33. /**
  34. * Files changed on disk dialog.
  35. *
  36. * @author Slava Pestov
  37. * @version $Id: FilesChangedDialog.java 5067 2004-06-28 06:45:27Z spestov $
  38. */
  39. public class FilesChangedDialog extends EnhancedDialog
  40. {
  41. //{{{ FilesChangedDialog constructor
  42. public FilesChangedDialog(View view, int[] states,
  43. boolean alreadyReloaded)
  44. {
  45. super(view,jEdit.getProperty("files-changed.title"),false);
  46. this.view = view;
  47. JPanel content = new JPanel(new BorderLayout(12,12));
  48. content.setBorder(new EmptyBorder(12,12,12,12));
  49. setContentPane(content);
  50. Box iconBox = new Box(BoxLayout.Y_AXIS);
  51. iconBox.add(new JLabel(UIManager.getIcon("OptionPane.warningIcon")));
  52. iconBox.add(Box.createGlue());
  53. content.add(BorderLayout.WEST,iconBox);
  54. JPanel centerPanel = new JPanel(new BorderLayout());
  55. JLabel label = new JLabel(jEdit.getProperty("files-changed.caption"));
  56. label.setBorder(new EmptyBorder(0,0,6,0));
  57. centerPanel.add(BorderLayout.NORTH,label);
  58. DefaultMutableTreeNode deleted = new DefaultMutableTreeNode(
  59. jEdit.getProperty("files-changed.deleted"),true);
  60. DefaultMutableTreeNode changed = new DefaultMutableTreeNode(
  61. jEdit.getProperty("files-changed.changed"
  62. + (alreadyReloaded ? "-auto" : "")),true);
  63. DefaultMutableTreeNode changedDirty = new DefaultMutableTreeNode(
  64. jEdit.getProperty("files-changed.changed-dirty"
  65. + (alreadyReloaded ? "-auto" : "")),true);
  66. Buffer[] buffers = jEdit.getBuffers();
  67. for(int i = 0; i < states.length; i++)
  68. {
  69. Buffer buffer = buffers[i];
  70. DefaultMutableTreeNode addTo;
  71. switch(states[i])
  72. {
  73. case Buffer.FILE_DELETED:
  74. addTo = deleted;
  75. break;
  76. case Buffer.FILE_CHANGED:
  77. addTo = (buffer.isDirty() ? changedDirty : changed);
  78. break;
  79. default:
  80. addTo = null;
  81. break;
  82. }
  83. if(addTo != null)
  84. {
  85. addTo.add(new DefaultMutableTreeNode(
  86. buffer.getPath()));
  87. }
  88. }
  89. root = new DefaultMutableTreeNode("",true);
  90. if(deleted.getChildCount() != 0)
  91. {
  92. root.add(deleted);
  93. }
  94. if(changed.getChildCount() != 0)
  95. {
  96. root.add(changed);
  97. }
  98. if(changedDirty.getChildCount() != 0)
  99. {
  100. root.add(changedDirty);
  101. }
  102. bufferTreeModel = new DefaultTreeModel(root);
  103. bufferTree = new JTree(bufferTreeModel);
  104. bufferTree.setRootVisible(false);
  105. bufferTree.setVisibleRowCount(10);
  106. bufferTree.setCellRenderer(new Renderer());
  107. bufferTree.getSelectionModel().addTreeSelectionListener(new TreeHandler());
  108. bufferTree.getSelectionModel().setSelectionMode(
  109. TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
  110. centerPanel.add(BorderLayout.CENTER,new JScrollPane(bufferTree));
  111. content.add(BorderLayout.CENTER,centerPanel);
  112. Box buttons = new Box(BoxLayout.X_AXIS);
  113. buttons.add(Box.createGlue());
  114. if(!alreadyReloaded)
  115. {
  116. selectAll = new JButton(jEdit.getProperty(
  117. "files-changed.select-all"));
  118. selectAll.setMnemonic(jEdit.getProperty(
  119. "files-changed.select-all.mnemonic").charAt(0));
  120. buttons.add(selectAll);
  121. selectAll.addActionListener(new ActionHandler());
  122. buttons.add(Box.createHorizontalStrut(12));
  123. reload = new JButton(jEdit.getProperty(
  124. "files-changed.reload"));
  125. reload.setMnemonic(jEdit.getProperty(
  126. "files-changed.reload.mnemonic").charAt(0));
  127. buttons.add(reload);
  128. reload.addActionListener(new ActionHandler());
  129. buttons.add(Box.createHorizontalStrut(12));
  130. }
  131. close = new JButton(jEdit.getProperty("common.close"));
  132. getRootPane().setDefaultButton(close);
  133. buttons.add(close);
  134. close.addActionListener(new ActionHandler());
  135. buttons.add(Box.createGlue());
  136. content.add(BorderLayout.SOUTH,buttons);
  137. bufferTree.expandPath(new TreePath(
  138. new Object[] {
  139. root,
  140. deleted
  141. }));
  142. bufferTree.expandPath(new TreePath(
  143. new Object[] {
  144. root,
  145. changed
  146. }));
  147. bufferTree.expandPath(new TreePath(
  148. new Object[] {
  149. root,
  150. changedDirty
  151. }));
  152. GUIUtilities.requestFocus(this,bufferTree);
  153. updateEnabled();
  154. pack();
  155. setLocationRelativeTo(view);
  156. setVisible(true);
  157. } //}}}
  158. //{{{ ok() method
  159. public void ok()
  160. {
  161. dispose();
  162. } //}}}
  163. //{{{ cancel() method
  164. public void cancel()
  165. {
  166. dispose();
  167. } //}}}
  168. //{{{ Private members
  169. private View view;
  170. private JTree bufferTree;
  171. private DefaultTreeModel bufferTreeModel;
  172. private DefaultMutableTreeNode root;
  173. private JButton selectAll;
  174. // hack so that 'select all' does not change current buffer
  175. private boolean selectAllInProgress;
  176. private JButton reload;
  177. private JButton close;
  178. //{{{ updateEnabled() method
  179. private void updateEnabled()
  180. {
  181. TreePath[] paths = bufferTree
  182. .getSelectionPaths();
  183. boolean enabled = false;
  184. if(paths != null)
  185. {
  186. for(int i = 0; i < paths.length; i++)
  187. {
  188. Object[] path = paths[i].getPath();
  189. if(path.length == 3)
  190. enabled = true;
  191. }
  192. }
  193. if(reload != null)
  194. reload.setEnabled(enabled);
  195. } //}}}
  196. //{{{ selectAll() method
  197. private void selectAll()
  198. {
  199. selectAllInProgress = true;
  200. TreeNode[] path = new TreeNode[3];
  201. path[0] = root;
  202. for(int i = 0; i < root.getChildCount(); i++)
  203. {
  204. DefaultMutableTreeNode node =
  205. (DefaultMutableTreeNode)
  206. root.getChildAt(i);
  207. path[1] = node;
  208. for(int j = 0; j < node.getChildCount(); j++)
  209. {
  210. DefaultMutableTreeNode node2 =
  211. (DefaultMutableTreeNode)
  212. node.getChildAt(j);
  213. path[2] = node2;
  214. bufferTree.getSelectionModel()
  215. .addSelectionPath(
  216. new TreePath(path));
  217. }
  218. }
  219. selectAllInProgress = false;
  220. updateEnabled();
  221. } //}}}
  222. //{{{ reload() method
  223. private void reload()
  224. {
  225. TreePath[] paths = bufferTree
  226. .getSelectionPaths();
  227. if(paths == null || paths.length == 0)
  228. return;
  229. int row = bufferTree.getRowForPath(paths[0]);
  230. for(int i = 0; i < paths.length; i++)
  231. {
  232. TreePath path = paths[i];
  233. // is it a header?
  234. if(path.getPathCount() == 2)
  235. continue;
  236. DefaultMutableTreeNode node = (DefaultMutableTreeNode)
  237. path.getLastPathComponent();
  238. if(!(node.getUserObject() instanceof String))
  239. {
  240. return;
  241. }
  242. Buffer buffer = jEdit.getBuffer(
  243. (String)node.getUserObject());
  244. if(buffer == null)
  245. return;
  246. buffer.reload(view);
  247. DefaultMutableTreeNode parent =
  248. (DefaultMutableTreeNode)
  249. node.getParent();
  250. parent.remove(node);
  251. }
  252. bufferTreeModel.reload(root);
  253. // we expand those that are non-empty, and
  254. // remove those that are empty
  255. TreeNode[] nodes = { root, null };
  256. // remove empty category branches
  257. for(int j = 0; j < root.getChildCount(); j++)
  258. {
  259. DefaultMutableTreeNode node
  260. = (DefaultMutableTreeNode)
  261. root.getChildAt(j);
  262. if(root.getChildAt(j)
  263. .getChildCount() == 0)
  264. {
  265. root.remove(j);
  266. j--;
  267. }
  268. else
  269. {
  270. nodes[1] = node;
  271. bufferTree.expandPath(
  272. new TreePath(nodes));
  273. }
  274. }
  275. if(root.getChildCount() == 0)
  276. dispose();
  277. else
  278. {
  279. if(row >= bufferTree.getRowCount())
  280. row = bufferTree.getRowCount() - 1;
  281. TreePath path = bufferTree.getPathForRow(row);
  282. if(path.getPathCount() == 2)
  283. {
  284. // selected a header; skip to the next row
  285. bufferTree.setSelectionRow(row + 1);
  286. }
  287. else
  288. bufferTree.setSelectionPath(path);
  289. }
  290. } //}}}
  291. //}}}
  292. //{{{ ActionHandler class
  293. class ActionHandler implements ActionListener
  294. {
  295. public void actionPerformed(ActionEvent evt)
  296. {
  297. Object source = evt.getSource();
  298. if(source == selectAll)
  299. selectAll();
  300. else if(source == reload)
  301. reload();
  302. else if(source == close)
  303. dispose();
  304. }
  305. } //}}}
  306. //{{{ TreeHandler class
  307. class TreeHandler implements TreeSelectionListener
  308. {
  309. public void valueChanged(TreeSelectionEvent evt)
  310. {
  311. if(selectAllInProgress)
  312. return;
  313. updateEnabled();
  314. TreePath[] paths = bufferTree
  315. .getSelectionPaths();
  316. if(paths == null || paths.length == 0)
  317. return;
  318. TreePath path = paths[paths.length - 1];
  319. DefaultMutableTreeNode node = (DefaultMutableTreeNode)
  320. path.getLastPathComponent();
  321. if(node.getUserObject() instanceof String)
  322. {
  323. Buffer buffer = jEdit.getBuffer(
  324. (String)node.getUserObject());
  325. if(buffer != null)
  326. view.goToBuffer(buffer);
  327. }
  328. }
  329. } //}}}
  330. //{{{ Renderer class
  331. class Renderer extends DefaultTreeCellRenderer
  332. {
  333. public Renderer()
  334. {
  335. entryFont = UIManager.getFont("Tree.font");
  336. if(entryFont == null)
  337. entryFont = jEdit.getFontProperty("metal.secondary.font");
  338. groupFont = entryFont.deriveFont(Font.BOLD);
  339. }
  340. public Component getTreeCellRendererComponent(JTree tree,
  341. Object value, boolean selected, boolean expanded,
  342. boolean leaf, int row, boolean hasFocus)
  343. {
  344. super.getTreeCellRendererComponent(tree,value,
  345. selected,expanded,leaf,row,hasFocus);
  346. DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
  347. if(node.getParent() == tree.getModel().getRoot())
  348. this.setFont(groupFont);
  349. else
  350. this.setFont(entryFont);
  351. setIcon(null);
  352. return this;
  353. }
  354. private Font entryFont;
  355. private Font groupFont;
  356. } //}}}
  357. }