From 72573da4d7d70471d9205f4972bb23b124edc826 Mon Sep 17 00:00:00 2001 From: benfry Date: Mon, 3 Sep 2012 04:20:10 +0000 Subject: [PATCH] save example browser state (issue #827) --- app/src/processing/app/Mode.java | 127 +++++++++++++++++++++++++++---- todo.txt | 2 + 2 files changed, 116 insertions(+), 13 deletions(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 5e2f5bab4..a6295fd84 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -7,10 +7,12 @@ import java.util.*; import javax.swing.*; import javax.swing.border.EmptyBorder; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeExpansionListener; import javax.swing.tree.*; import processing.app.syntax.*; -//import processing.app.tools.Tool; + public abstract class Mode { protected Base base; @@ -576,6 +578,18 @@ public abstract class Mode { } }); + tree.addTreeExpansionListener(new TreeExpansionListener() { + @Override + public void treeExpanded(TreeExpansionEvent event) { + updateExpanded(tree); + } + + @Override + public void treeCollapsed(TreeExpansionEvent event) { + updateExpanded(tree); + } + }); + tree.setBorder(new EmptyBorder(5, 5, 5, 5)); tree.setToggleClickCount(1); JScrollPane treePane = new JScrollPane(tree); @@ -583,7 +597,10 @@ public abstract class Mode { treePane.setBorder(new EmptyBorder(0, 0, 0, 0)); examplesFrame.getContentPane().add(treePane); examplesFrame.pack(); + + restoreExpanded(tree); } + // Space for the editor plus a li'l gap int roughWidth = examplesFrame.getWidth() + 20; Point p = null; @@ -600,24 +617,108 @@ public abstract class Mode { } -// public void handleActivated(Editor editor) { -// //// re-add the sub-menus that are shared by all windows -// fileMenu.insert(Base.sketchbookMenu, 2); -// fileMenu.insert(mode.examplesMenu, 3); -// sketchMenu.insert(mode.importMenu, 4); + protected void updateExpanded(JTree tree) { + Enumeration en = tree.getExpandedDescendants(new TreePath(tree.getModel().getRoot())); + //en.nextElement(); // skip the root "Examples" node + + StringBuilder s = new StringBuilder(); + while (en.hasMoreElements()) { + //System.out.println(en.nextElement()); + TreePath tp = (TreePath) en.nextElement(); + Object[] path = tp.getPath(); + for (Object o : path) { + DefaultMutableTreeNode p = (DefaultMutableTreeNode) o; + String name = (String) p.getUserObject(); + //System.out.print(p.getUserObject().getClass().getName() + ":" + p.getUserObject() + " -> "); + //System.out.print(name + " -> "); + s.append(name); + s.append(File.separatorChar); + } + //System.out.println(); + s.setCharAt(s.length() - 1, File.pathSeparatorChar); + } + s.setLength(s.length() - 1); // nix that last separator + String pref = "examples." + getClass().getName() + ".visible"; + Preferences.set(pref, s.toString()); + Preferences.save(); +// System.out.println(s); +// System.out.println(); + } + + + protected void restoreExpanded(JTree tree) { + String pref = "examples." + getClass().getName() + ".visible"; + String value = Preferences.get(pref); + if (value != null) { + String[] paths = value.split(File.pathSeparator); + for (String path : paths) { +// System.out.println("trying to expand " + path); + String[] items = path.split(File.separator); + DefaultMutableTreeNode[] nodes = new DefaultMutableTreeNode[items.length]; + expandTree(tree, null, items, nodes, 0); + } + } + } + + + void expandTree(JTree tree, Object object, String[] items, DefaultMutableTreeNode[] nodes, int index) { +// if (object == null) { +// object = model.getRoot(); +// } + TreeModel model = tree.getModel(); + + if (index == 0) { + nodes[0] = (DefaultMutableTreeNode) model.getRoot(); + expandTree(tree, nodes[0], items, nodes, 1); + + } else if (index < items.length) { +// String item = items[0]; +// TreeModel model = object.getModel(); +// System.out.println(object.getClass().getName()); + DefaultMutableTreeNode node = (DefaultMutableTreeNode) object; + int count = model.getChildCount(node); +// System.out.println("child count is " + count); + for (int i = 0; i < count; i++) { + DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(node, i); + if (items[index].equals(child.getUserObject())) { + nodes[index] = child; + expandTree(tree, child, items, nodes, index+1); + } + } + } else { // last one +// PApplet.println(nodes); + tree.expandPath(new TreePath(nodes)); + } + } + + +// void + +// protected TreePath findPath(FileItem item) { +// ArrayList items = new ArrayList(); +//// FileItem which = item.isDirectory() ? item : (FileItem) item.getParent(); +//// FileItem which = item; +// FileItem which = (FileItem) item.getParent(); +// while (which != null) { +// items.add(0, which); +// which = (FileItem) which.getParent(); +// } +// return new TreePath(items.toArray()); +//// FileItem[] array = items.toArray(); +//// return new TreePath(array); // } -// public void handleDeactivated(Editor editor) { -// fileMenu.remove(Base.sketchbookMenu); -// fileMenu.remove(examplesMenu); -// sketchMenu.remove(importMenu); +// public static void loadExpansionState(JTree tree, Enumeration enumeration) { +// if (enumeration != null) { +// while (enumeration.hasMoreElements()) { +// TreePath treePath = (TreePath) enumeration.nextElement(); +// tree.expandPath(treePath); +// } +// } // } -// abstract public void internalCloseRunner(Editor editor); - - // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . diff --git a/todo.txt b/todo.txt index a44dcebea..0ab3ef59b 100644 --- a/todo.txt +++ b/todo.txt @@ -5,6 +5,8 @@ X i.e. hitting 'replace' multiple times causes weirdness X and replace/replace+find buttons shouldn't be active until after a find X http://code.google.com/p/processing/issues/detail?id=1056 X change "Standard" to "Java" mode +X Any double-click inside Examples window opening the last selection on Windows +X http://code.google.com/p/processing/issues/detail?id=1201 _ example browser state (from Casey) _ http://code.google.com/p/processing/issues/detail?id=827