/*
* Open Source Physics software is free software as described near the bottom of this code file.
*
* For additional information and documentation on Open Source Physics please see:
* <http://www.opensourcephysics.org/>
*/
package org.opensourcephysics.controls;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Enumeration;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
/**
* This is an XML tree in a scroller.
*
* @author Douglas Brown
*/
public class XMLTree {
// static fields
protected static Icon hiliteIcon;
// instance fields
protected XMLTreeNode root;
protected JTree tree;
protected JScrollPane scroller;
protected XMLControl control;
protected java.util.List<XMLProperty> selectedProps = new java.util.ArrayList<XMLProperty>();
protected Class<?> hilite = Object.class;
/**
* Constructs a tree view of an XMLControl
*
* @param control the XMLControl
*/
public XMLTree(XMLControl control) {
this.control = control;
createGUI();
}
/**
* Gets the tree.
*
* @return the tree
*/
public JTree getTree() {
return tree;
}
/**
* Gets the selected xml properties.
*
* @return a list of currently selected properties
*/
public java.util.List<XMLProperty> getSelectedProperties() {
selectedProps.clear();
TreePath[] paths = tree.getSelectionPaths();
if(paths!=null) {
for(int i = 0; i<paths.length; i++) {
XMLTreeNode node = (XMLTreeNode) paths[i].getLastPathComponent();
selectedProps.add(node.getProperty());
}
}
return selectedProps;
}
/**
* Gets the scroll pane with view of the tree
*
* @return the scroll pane
*/
public JScrollPane getScrollPane() {
return scroller;
}
/**
* Sets the highlighted class.
*
* @param type the class to highlight
*/
public void setHighlightedClass(Class<?> type) {
if(type!=null) {
hilite = type;
scroller.repaint();
}
}
/**
* Gets the highlighted class.
*
* @return the highlighted class
*/
public Class<?> getHighlightedClass() {
return hilite;
}
/**
* Selects the highlighted properties.
*/
public void selectHighlightedProperties() {
Enumeration<?> e = root.breadthFirstEnumeration();
while(e.hasMoreElements()) {
XMLTreeNode node = (XMLTreeNode) e.nextElement();
XMLProperty prop = node.getProperty();
Class<?> type = prop.getPropertyClass();
if((type!=null)&&hilite.isAssignableFrom(type)) {
TreePath path = new TreePath(node.getPath());
tree.addSelectionPath(path);
tree.scrollPathToVisible(path);
}
}
}
/**
* Shows the highlighted properties.
*/
public void showHighlightedProperties() {
Enumeration<?> e = root.breadthFirstEnumeration();
while(e.hasMoreElements()) {
XMLTreeNode node = (XMLTreeNode) e.nextElement();
XMLProperty prop = node.getProperty();
Class<?> type = prop.getPropertyClass();
if((type!=null)&&hilite.isAssignableFrom(type)) {
TreePath path = new TreePath(node.getPath());
tree.scrollPathToVisible(path);
}
}
}
/**
* Creates the GUI and listeners.
*/
protected void createGUI() {
// create icons
String imageFile = "/org/opensourcephysics/resources/controls/images/hilite.gif"; //$NON-NLS-1$
hiliteIcon = new ImageIcon(XMLTree.class.getResource(imageFile));
// create root and tree
root = new XMLTreeNode(control);
tree = new JTree(root);
tree.setCellRenderer(new HighlightRenderer());
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
// put tree in a scroller
scroller = new JScrollPane(tree);
scroller.setPreferredSize(new Dimension(200, 200));
}
/**
* A cell renderer to show launchable nodes.
*/
private class HighlightRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
XMLTreeNode node = (XMLTreeNode) value;
XMLProperty prop = node.getProperty();
Class<?> type = prop.getPropertyClass();
if((type!=null)&&hilite.isAssignableFrom(type)) {
setIcon(hiliteIcon);
}
return this;
}
}
}
/*
* Open Source Physics software is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public License (GPL) as
* published by the Free Software Foundation; either version 2 of the License,
* or(at your option) any later version.
* Code that uses any portion of the code in the org.opensourcephysics package
* or any subpackage (subdirectory) of this package must must also be be released
* under the GNU GPL license.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA
* or view the license online at http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2007 The Open Source Physics project
* http://www.opensourcephysics.org
*/