/* * Copyright (c) 2014 tabletoptool.com team. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * rptools.com team - initial implementation * tabletoptool.com team - further development */ package com.t3.swing.preference; import java.awt.EventQueue; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.prefs.Preferences; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreePath; public class TreePreferences implements TreeSelectionListener { private JTree tree; private Preferences prefs; private static final String PREF_PATH_KEY = "path"; private static final String PATH_DELIMITER = "|"; public TreePreferences(String appName, String controlName, JTree tree) { this.tree = tree; prefs = Preferences.userRoot().node(appName + "/control/" + controlName); tree.getSelectionModel().addTreeSelectionListener(this); // Wait until the UI has been built to do this EventQueue.invokeLater(new Runnable() { @Override public void run() { restorePreferences(); } }); } private void restorePreferences() { String path = prefs.get(PREF_PATH_KEY, ""); if (path == null || path.length() == 0) { // First time usage return; } StringTokenizer strtok = new StringTokenizer(path, PATH_DELIMITER); List<Object> pathList = new ArrayList<Object>(); pathList.add(tree.getModel().getRoot()); Object currentStep = tree.getModel().getRoot(); while (strtok.hasMoreElements()) { boolean found = false; String nextStep = strtok.nextToken(); for (int i = 0; i < tree.getModel().getChildCount(currentStep); i++) { Object element = tree.getModel().getChild(currentStep, i); if (element != null && element.toString().equals(nextStep)) { pathList.add(element); currentStep = element; found = true; break; } } if (!found) { break; } } if (pathList.size() > 0) { TreePath treePath = new TreePath(pathList.toArray()); tree.expandPath(treePath); tree.setSelectionPath(treePath); } } private void savePreferences() { StringBuilder builder = new StringBuilder(); TreePath path = tree.getSelectionPath(); if (path == null) { return; } for (int i = 0; i < path.getPathCount(); i++) { Object o = path.getPathComponent(i); builder.append(o).append(PATH_DELIMITER); } if (builder.length() > 0) { // Kill the last delimiter builder.setLength(builder.length() - 1); } String composedPath = builder.toString(); if (composedPath.startsWith(PATH_DELIMITER)) { composedPath = composedPath.substring(1); } prefs.put(PREF_PATH_KEY, composedPath); } //// // TREE SELECTION LISTENER @Override public void valueChanged(TreeSelectionEvent e) { savePreferences(); } }