PageRenderTime 53ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/XInsert/tags/release-2_1/src/XTree.java

#
Java | 641 lines | 521 code | 47 blank | 73 comment | 138 complexity | 4561dbe1888815d44735aec85d95f8e0 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. * 20:47:04 04/06/00
  3. *
  4. * XTree.java - A tree used for XInsert system
  5. * Original Version Copyright (C) 1999 Romain Guy - guy.romain@bigfoot.com
  6. * Potion copyright (C) 2000 Richard Lowe
  7. * Copyright (C) 2000 Dominic Stolerman - dominic@sspd.org.uk
  8. * www.chez.com/powerteam/jext
  9. * Changes (c) 2005 Martin Raspe - raspe@biblhertz.it
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License
  13. * as published by the Free Software Foundation; either version 2
  14. * of the License, or any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24. */
  25. import java.io.*;
  26. import java.util.*;
  27. import java.awt.*;
  28. import java.awt.event.*;
  29. import javax.swing.*;
  30. import javax.swing.tree.*;
  31. import javax.swing.event.*;
  32. import org.gjt.sp.jedit.*;
  33. import org.gjt.sp.util.Log;
  34. import org.gjt.sp.jedit.textarea.*;
  35. public class XTree extends JPanel {
  36. // the following was replaced by a private class "TreeListener"
  37. // implements TreeSelectionListener, ActionListener
  38. private XTreeTree tree;
  39. private HashMap map;
  40. private TreeListener treeListener;
  41. private ActionListener escapeListener = new ActionListener() {
  42. public void actionPerformed(ActionEvent e) {
  43. parent.getTextArea().requestFocus();
  44. parent.toFront();
  45. }
  46. };
  47. private View parent;
  48. private static Vector inserts;
  49. private DefaultTreeModel treeModel;
  50. private JButton expand, collapse, reload;
  51. private JCheckBox carriageReturn, executeScript;
  52. private boolean treeJustCollapsed = false;
  53. // nested submenus
  54. private int rootIndex;
  55. private XTreeNode root;
  56. private Stack menuStack = null;
  57. private XTreeObject xtreeObj = null;
  58. //private int clicks;
  59. private int lineNo;
  60. // get access to tree widget (needed for XInsertActions)
  61. public XTreeTree getTree() {
  62. return tree;
  63. }
  64. public void addMenu(String nodeName) {
  65. xtreeObj = new XTreeObject(new XTreeNode(nodeName), 0);
  66. if (menuStack.empty()) {
  67. treeModel.insertNodeInto(xtreeObj.getXTreeNode(), root, rootIndex);
  68. rootIndex++;
  69. }
  70. else {
  71. //Log.log(Log.DEBUG, this, "Adding menu on menu stack: " + nodeName);
  72. XTreeObject obj = (XTreeObject) menuStack.peek();
  73. treeModel.insertNodeInto(xtreeObj.getXTreeNode(), obj.getXTreeNode(), obj.getIndex());
  74. obj.incrementIndex();
  75. }
  76. menuStack.push(xtreeObj);
  77. }
  78. public void closeMenu() {
  79. try {
  80. xtreeObj = (XTreeObject) menuStack.pop();
  81. }
  82. catch (Exception e) {
  83. xtreeObj = null;
  84. }
  85. }
  86. public void addVariable(String key, String value) {
  87. XTreeObject obj = (XTreeObject)menuStack.peek();
  88. XTreeNode node;
  89. if (obj != null)
  90. node = obj.getXTreeNode();
  91. else
  92. node = root;
  93. node.addVariable(key, value);
  94. }
  95. public void addInsert(String nodeName, String content, int script) {
  96. inserts.addElement(new XTreeItem(content, script));
  97. XTreeNode node = new XTreeNode(nodeName, inserts.size());
  98. if (xtreeObj == null) {
  99. treeModel.insertNodeInto(node, root, rootIndex);
  100. ++rootIndex;
  101. }
  102. else {
  103. XTreeObject obj = (XTreeObject) menuStack.peek();
  104. treeModel.insertNodeInto(node, obj.getXTreeNode(), obj.getIndex());
  105. obj.incrementIndex();
  106. }
  107. }
  108. public XTree(View parent) {
  109. super();
  110. this.parent = parent;
  111. setLayout(new BorderLayout());
  112. /* Use default icons
  113. UIManager.put("Tree.expandedIcon", Utilities.getIcon("images/down_arrow.gif"));
  114. UIManager.put("Tree.collapsedIcon", Utilities.getIcon("images/right_arrow.gif"));
  115. UIManager.put("Tree.leftChildIndent", new Integer(5));
  116. UIManager.put("Tree.rightChildIndent", new Integer(7));
  117. */
  118. root = new XTreeNode("XInsert");
  119. treeModel = new DefaultTreeModel(root);
  120. tree = new XTreeTree(treeModel);
  121. ToolTipManager.sharedInstance().registerComponent(tree);
  122. tree.putClientProperty("JTree.lineStyle", "Angled");
  123. // tree.addTreeSelectionListener(this);
  124. // add a special tree listener
  125. treeListener = new TreeListener();
  126. tree.addMouseListener(treeListener);
  127. // respond to keyboard events
  128. tree.registerKeyboardAction(
  129. treeListener,
  130. KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
  131. WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  132. );
  133. tree.registerKeyboardAction(
  134. treeListener,
  135. KeyStroke.getKeyStroke(' '),
  136. WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  137. );
  138. tree.registerKeyboardAction(
  139. escapeListener,
  140. KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
  141. WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  142. );
  143. tree.setCellRenderer(new XTreeCellRenderer());
  144. init();
  145. JPanel pane = new JPanel(new BorderLayout());
  146. //No mnemonics as they are confusing/ do not work when docked.
  147. pane.add(collapse = new JButton(Utilities.getIcon("images/button_collapse.gif")),BorderLayout.WEST);
  148. collapse.setToolTipText(jEdit.getProperty("xtree.collapse.button"));
  149. //collapse.setMnemonic(jEdit.getProperty("xtree.collapse.mnemonic").charAt(0));
  150. collapse.addActionListener(treeListener);
  151. pane.add(reload = new JButton(Utilities.getIcon("images/menu_reload.gif")),BorderLayout.CENTER);
  152. reload.setToolTipText(jEdit.getProperty("xtree.reload.button"));
  153. //reload.setMnemonic(jEdit.getProperty("xtree.reload.mnemonic").charAt(0));
  154. reload.addActionListener(treeListener);
  155. pane.add(expand = new JButton(Utilities.getIcon("images/button_expand.gif")),BorderLayout.EAST);
  156. expand.setToolTipText(jEdit.getProperty("xtree.expand.button"));
  157. //expand.setMnemonic(jEdit.getProperty("xtree.expand.mnemonic").charAt(0));
  158. expand.addActionListener(treeListener);
  159. add(pane, BorderLayout.NORTH);
  160. add(new JScrollPane(tree), BorderLayout.CENTER);
  161. JPanel optionPane = new JPanel(new BorderLayout());
  162. optionPane.add(carriageReturn = new JCheckBox(jEdit.getProperty("xtree.carriage.label")), BorderLayout.NORTH);
  163. carriageReturn.setSelected(jEdit.getBooleanProperty("xtree.carriage", false));
  164. carriageReturn.addActionListener(treeListener);
  165. optionPane.add(executeScript = new JCheckBox(jEdit.getProperty("xtree.execute.label")), BorderLayout.CENTER);
  166. executeScript.setSelected(jEdit.getBooleanProperty("xtree.execute", true));
  167. if (jEdit.getProperty("xtree.execute") == null)
  168. executeScript.setSelected(true);
  169. executeScript.addActionListener(treeListener);
  170. add(optionPane, BorderLayout.SOUTH);
  171. }
  172. private void init() {
  173. inserts = new Vector(200);
  174. menuStack = new Stack();
  175. rootIndex = 0;
  176. if(jEdit.getBooleanProperty("xinsert.display.all", true)) {
  177. int i =0;
  178. String current;
  179. while((current = jEdit.getProperty("xinsert.inserts." + i)) != null) {
  180. loadInternalInsert(current);
  181. i++;
  182. }
  183. }
  184. //Macros menu
  185. if(jEdit.getBooleanProperty("xinsert.display.macros", true)) {
  186. addMenu("Macros");
  187. Vector vec = Macros.getMacroHierarchy();
  188. Iterator iter = vec.iterator();
  189. while(iter.hasNext()) {
  190. Object o = iter.next();
  191. if(o instanceof Vector) {
  192. loadMacroVector((Vector)o);
  193. }
  194. else if(o instanceof String) {
  195. loadNamedMacro(Macros.getMacro((String)o));
  196. }
  197. else {
  198. loadNamedMacro((Macros.Macro)o);
  199. }
  200. }
  201. closeMenu();
  202. }
  203. build();
  204. fillMap();
  205. tree.expandRow(0);
  206. tree.setRootVisible(false);
  207. tree.setShowsRootHandles(true);
  208. }
  209. private void loadMacroVector(Vector v) {
  210. Iterator iter = v.iterator();
  211. addMenu(iter.next().toString());
  212. while(iter.hasNext()) {
  213. Object o = iter.next();
  214. if(o instanceof Vector) {
  215. loadMacroVector((Vector)o);
  216. }
  217. else {
  218. loadNamedMacro(Macros.getMacro(o.toString())); //NDT fix...
  219. }
  220. }
  221. closeMenu();
  222. }
  223. private void loadNamedMacro(Macros.Macro macro) {
  224. addInsert(macro.getLabel(), macro.getName(), XTreeItem.NAMED_MACRO_TYPE);
  225. }
  226. private void loadInternalInsert(String fileName) {
  227. try {
  228. if(jEdit.getBooleanProperty("xinsert.display." + fileName, true)) {
  229. if(!XInsertReader.read(
  230. this,
  231. XTree.class.getResourceAsStream("xml/" + fileName + ".insert.xml"),
  232. "xml/" + fileName + ".xinsert.xml"))
  233. Log.log(Log.ERROR,this,("Resource not found: " + fileName));
  234. else
  235. Log.log(Log.NOTICE,this,("Resource loaded: " + fileName));
  236. }
  237. }
  238. catch(NullPointerException e) {
  239. Log.log(Log.ERROR,this,("Resource not found: " + fileName));
  240. }
  241. }
  242. private void build() {
  243. String dir = jEdit.getProperty("xinsert.inserts-directory");
  244. if(!dir.endsWith(File.separator))
  245. dir = dir + File.separator;
  246. File f = new File(dir);
  247. if (!f.exists())
  248. f.mkdirs();
  249. String inserts[] = Utilities.getWildCardMatches(dir, "*.insert.xml", false);
  250. if (inserts == null)
  251. return;
  252. try {
  253. String fileName;
  254. for (int i = 0; i < inserts.length; i++) {
  255. fileName = dir + inserts[i];
  256. if (XInsertReader.read(this, new FileInputStream(fileName), fileName)) {
  257. String[] args = { inserts[i] };
  258. System.out.println(jEdit.getProperty("xtree.loaded", args));
  259. }
  260. }
  261. }
  262. catch (FileNotFoundException fnfe) {}
  263. }
  264. private void reload() {
  265. root.removeAllChildren();
  266. init();
  267. treeModel.reload();
  268. tree.repaint();
  269. }
  270. public void reload(DefaultTreeModel model) {
  271. tree.setModel(model);
  272. }
  273. // main action, called from treelistener.actionPerformed
  274. // insert selected item, shift focus to text area,
  275. // stay selected (for future keyboard inserts)
  276. public void treeAction() {
  277. if (tree.isSelectionEmpty()) return;
  278. XTreeNode node = (XTreeNode) tree.getSelectionPath().getLastPathComponent();
  279. if (node.getIndex() != -1) insert(node);
  280. parent.getTextArea().requestFocus();
  281. parent.toFront();
  282. // source.clearSelection();
  283. }
  284. private void insert(XTreeNode node) {
  285. if (!parent.getTextArea().isEditable()) {
  286. parent.getToolkit().beep();
  287. return;
  288. }
  289. XTreeItem item = (XTreeItem) inserts.elementAt(node.getIndex()-1);
  290. String data = item.getContent();
  291. int type = item.getType();
  292. if(type == XTreeItem.TEXT_TYPE || !executeScript.isSelected())
  293. insertText(node, false);
  294. else if(type == XTreeItem.MACRO_TYPE) {
  295. Log.log(Log.DEBUG, this, "Running Macro...");
  296. XScripter.runMacro(parent, (String)node.getUserObject(), data);
  297. return;
  298. }
  299. else if(type == XTreeItem.XINSERT_SCRIPT_TYPE) {
  300. Log.log(Log.DEBUG, this, "Running XInsert Script ...");
  301. XScripter.runXInsertScript(parent, data, node);
  302. }
  303. else if(type == XTreeItem.NAMED_MACRO_TYPE) {
  304. Log.log(Log.DEBUG, this, "Running Named Macro...");
  305. XScripter.runNamedMacro(parent, (String)node.getUserObject(), data);
  306. return;
  307. }
  308. else if(type == XTreeItem.REFERENCE_TYPE) {
  309. // new: lookup a referenced item by path [hertzhaft]
  310. Log.log(Log.DEBUG, this, "Resolving XInsert reference " + data + " ...");
  311. XTreeNode ref = getXTreeNodeByPath(data);
  312. if (ref == null) {
  313. Log.log(Log.DEBUG, this, "Could not resolve path: " + data);
  314. return;
  315. }
  316. // Log.log(Log.DEBUG, this, ref.toString());
  317. XTreeItem refitem = (XTreeItem) inserts.elementAt(ref.getIndex()-1);
  318. // Log.log(Log.DEBUG, this, refitem.toString());
  319. if (refitem.getType() == XTreeItem.REFERENCE_TYPE) {
  320. Log.log(Log.DEBUG, this, "Chained references are not allowed: " + data);
  321. return;
  322. }
  323. insert(ref);
  324. }
  325. else {
  326. insertText(node, true);
  327. Log.log(Log.DEBUG, this, node);
  328. }
  329. }
  330. public void insertText(XTreeNode node, boolean error)
  331. {
  332. String data = ((XTreeItem)inserts.elementAt(node.getIndex()-1)).getContent();
  333. JEditTextArea textArea = parent.getTextArea();
  334. Buffer buffer = parent.getBuffer();
  335. String selected;
  336. buffer.beginCompoundEdit();
  337. if(textArea.getSelectedText() != null)
  338. selected = textArea.getSelectedText();
  339. else
  340. selected = "";
  341. int j = 0;
  342. int pos = -1;
  343. char c = '\0';
  344. lineNo = 0;
  345. StringBuffer buf = new StringBuffer(data.length());
  346. for (int i = 0; i < data.length(); i++)
  347. {
  348. switch((c = data.charAt(i)))
  349. {
  350. case '|':
  351. if (i < data.length() - 1 && data.charAt(i + 1) == '|')
  352. {
  353. i++;
  354. buf.append(c);
  355. }
  356. else
  357. {
  358. buf.append(selected);
  359. pos = j;
  360. }
  361. break;
  362. case '\\':
  363. if (i < data.length() - 1 && data.charAt(i + 1) == 'n')
  364. {
  365. i++;
  366. lineNo++;
  367. buf.append('\n');
  368. }
  369. else if (i < data.length() - 1 && data.charAt(i + 1) == 't')
  370. {
  371. i++;
  372. int tabSize = buffer.getTabSize();
  373. if(jEdit.getBooleanProperty("buffer.noTabs", false))
  374. {
  375. for(int k = 0;k<tabSize;k++)
  376. buf.append(" ");
  377. }
  378. else
  379. buf.append("\t");
  380. }
  381. else if (i < data.length() -1 && data.charAt(i + 1) == '$')
  382. {
  383. i++;
  384. buf.append('$');
  385. }
  386. else if (i < data.length() -1 && data.charAt(i + 1) == '\\')
  387. {
  388. i++;
  389. buf.append(c);
  390. }
  391. else
  392. buf.append(c);
  393. break;
  394. case '\n':
  395. lineNo++;
  396. buf.append(c);
  397. break;
  398. case '$':
  399. i++;
  400. int tempi = i;
  401. while(i < data.length() && Character.isLetterOrDigit(data.charAt(i)))
  402. i++;
  403. Log.log(Log.DEBUG, this, "$ = " + data.substring(tempi, i));
  404. String val = XScripter.getSubstituteFor(parent, data.substring(tempi, i), node);
  405. if(val == null)
  406. buf.append(data.substring(tempi, i));
  407. else
  408. buf.append(val);
  409. i--;
  410. break;
  411. default:
  412. buf.append(c);
  413. break;
  414. }
  415. j++;
  416. }
  417. int tmp = textArea.getCaretPosition();
  418. if (carriageReturn.isSelected())
  419. buf.append('\n');
  420. if (error)
  421. {
  422. buf.insert(0,"\nError: unknown insert type\n");
  423. }
  424. textArea.setSelectedText(buf.toString());
  425. if (pos != -1)
  426. textArea.setCaretPosition(tmp + pos);
  427. buffer.endCompoundEdit();
  428. }
  429. // construct a reference lookup map for nodes by stringified tree paths
  430. public void fillMap() {
  431. map = new HashMap();
  432. fillItem("", root);
  433. }
  434. // visit all nodes and append their paths
  435. public void fillItem(String name, XTreeNode node) {
  436. String nodename = name + "/" + (String) node.getUserObject();
  437. // Log.log(Log.DEBUG, this, nodename + node.toString());
  438. map.put(nodename, node);
  439. Enumeration list = node.children();
  440. while (list.hasMoreElements())
  441. fillItem(nodename, (XTreeNode) list.nextElement());
  442. }
  443. // get a node by its path, needed for reference lookup
  444. public XTreeNode getXTreeNodeByPath(String path) {
  445. return (XTreeNode) map.get("/XInsert" + path);
  446. }
  447. private static final ImageIcon plainLeaf = Utilities.getIcon("images/tree_leaf.gif");
  448. private static final ImageIcon scriptLeaf = Utilities.getIcon("images/tree_leaf_script_x.gif");
  449. private static final ImageIcon macroLeaf = Utilities.getIcon("images/tree_leaf_macro.gif");
  450. private static final ImageIcon namedmacroLeaf = Utilities.getIcon("images/tree_leaf_namedmacro.gif");
  451. private static final ImageIcon referenceLeaf = Utilities.getIcon("images/tree_leaf_reference.gif");
  452. private static final ImageIcon errorLeaf = Utilities.getIcon("images/tree_leaf_error.gif");
  453. class XTreeCellRenderer extends DefaultTreeCellRenderer {
  454. XTreeCellRenderer() {
  455. super();
  456. /*openIcon = Utilities.getIcon("images/tree_open.gif");
  457. closedIcon = Utilities.getIcon("images/tree_close.gif");*/
  458. // commented out (MR): why change default behaviour here?
  459. // textSelectionColor = Color.red;
  460. // borderSelectionColor = tree.getBackground();
  461. // backgroundSelectionColor = tree.getBackground();
  462. }
  463. public Component getTreeCellRendererComponent(JTree source, Object value, boolean sel,
  464. boolean expanded, boolean leaf, int row,
  465. boolean hasFocus) {
  466. if (leaf) {
  467. TreePath path = source.getPathForRow(row);
  468. if (path != null) {
  469. XTreeNode node = (XTreeNode) path.getLastPathComponent();
  470. int index = node.getIndex();
  471. if (index != -1) {
  472. int type = ((XTreeItem) inserts.elementAt(index - 1)).getType();
  473. switch (type) {
  474. case XTreeItem.TEXT_TYPE:
  475. leafIcon = plainLeaf;
  476. break;
  477. case XTreeItem.XINSERT_SCRIPT_TYPE:
  478. leafIcon = scriptLeaf;
  479. break;
  480. case XTreeItem.MACRO_TYPE:
  481. leafIcon = macroLeaf;
  482. break;
  483. case XTreeItem.NAMED_MACRO_TYPE:
  484. leafIcon = namedmacroLeaf;
  485. break;
  486. case XTreeItem.REFERENCE_TYPE:
  487. leafIcon = referenceLeaf;
  488. break;
  489. default:
  490. leafIcon = errorLeaf;
  491. }
  492. }
  493. }
  494. }
  495. return super.getTreeCellRendererComponent(source, value, sel, expanded, leaf, row, hasFocus);
  496. }
  497. }
  498. private class XTreeTree extends JTree {
  499. public XTreeTree(TreeModel model) {
  500. super(model);
  501. }
  502. public String getToolTipText(MouseEvent e)
  503. {
  504. if(e == null)
  505. return null;
  506. TreePath tPath = tree.getPathForLocation(e.getX(), e.getY());
  507. if(tPath != null)
  508. {
  509. XTreeNode node = (XTreeNode) tPath.getLastPathComponent();
  510. if(!node.isLeaf())
  511. return null;
  512. try
  513. {
  514. XTreeItem item = (XTreeItem) inserts.elementAt(node.getIndex()-1);
  515. int type = item.getType();
  516. String content = item.getContent();
  517. if(type == XTreeItem.TEXT_TYPE)
  518. return (content.length() > 30) ? content.substring(0, 30) + " ..." : content;
  519. else if(type == XTreeItem.MACRO_TYPE)
  520. return "Macro";
  521. else if(type == XTreeItem.XINSERT_SCRIPT_TYPE)
  522. return "Script";
  523. else if(type == XTreeItem.NAMED_MACRO_TYPE)
  524. return "Named Macro";
  525. else if(type == XTreeItem.REFERENCE_TYPE)
  526. return "Ref => " + content;
  527. else
  528. return "Error: " + content;
  529. }
  530. catch( ArrayIndexOutOfBoundsException ex)
  531. {
  532. // Log.log(Log.ERROR, XTree.class, "getTreeToolTip() throws "
  533. // + ex.getClass().getName() + " exception.");
  534. // Log.log(Log.ERROR, XTree.class, "TreePath is " + tPath.toString());
  535. // Log.log(Log.ERROR, XTree.class, "TreeNode object is " +
  536. // node.toString());
  537. return null;
  538. }
  539. }
  540. else
  541. return null;
  542. }
  543. }
  544. /**
  545. * Private class that acts as a listener to the tree of clips.
  546. * Inserts a clip either on double-click or when space is hit.
  547. */
  548. private class TreeListener
  549. extends MouseAdapter
  550. implements ActionListener {
  551. public void mouseClicked(MouseEvent e) {
  552. // changed (MR): respond only to double clicks
  553. // todo: right click popup to add/change entries
  554. if ((e.getClickCount() == 2)
  555. && ((e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK)) {
  556. Log.log(Log.DEBUG, XTree.this, "Mouse Clicked");
  557. int selRow = tree.getRowForLocation(e.getX(), e.getY());
  558. if(selRow == -1) return;
  559. TreePath tPath = tree.getPathForLocation(e.getX(), e.getY());
  560. if(tPath == null) return;
  561. XTreeNode node = (XTreeNode) tPath.getLastPathComponent();
  562. if(!node.isLeaf()) return;
  563. if(node.getChildCount() != 0) return;
  564. if(node.getIndex() != -1) {
  565. insert(node);
  566. };
  567. parent.requestFocus();
  568. parent.toFront();
  569. }
  570. }
  571. public void actionPerformed(ActionEvent evt) {
  572. Object o = evt.getSource();
  573. if (o == tree) {
  574. treeAction();
  575. }
  576. else if (o == expand) {
  577. for (int i = 0; i < tree.getRowCount(); i++) tree.expandRow(i);
  578. }
  579. else if (o == collapse) {
  580. for (int i = tree.getRowCount(); i >= 0; i--) tree.collapseRow(i);
  581. }
  582. else if (o == reload) {
  583. reload();
  584. }
  585. else if (o == carriageReturn) {
  586. jEdit.setBooleanProperty("xtree.carriage", carriageReturn.isSelected());
  587. }
  588. else if (o == executeScript) {
  589. jEdit.setBooleanProperty("xtree.execute", executeScript.isSelected());
  590. }
  591. }
  592. }
  593. }
  594. // End of XTree.java