/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.spark.component;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Enumeration;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
/**
* UI to show CheckBox trees.
*
* @author Derek DeMoro
*/
public class CheckTree extends JPanel {
private static final long serialVersionUID = 8452107824029515678L;
private JTree tree;
/**
* Constructs a new CheckBox tree.
*
* @param rootNode Node that is the root of this tree.
*/
public CheckTree(CheckNode rootNode) {
tree = new JTree(rootNode);
tree.setCellRenderer(new CheckRenderer());
tree.setRowHeight(18);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setToggleClickCount(1000);
tree.putClientProperty("JTree.lineStyle", "Angled");
tree.addMouseListener(new NodeSelectionListener(tree));
setLayout(new BorderLayout());
add(tree, BorderLayout.CENTER);
}
class NodeSelectionListener extends MouseAdapter {
JTree tree;
NodeSelectionListener(JTree tree) {
this.tree = tree;
}
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
int row = tree.getRowForLocation(x, y);
TreePath path = tree.getPathForRow(row);
if (path != null) {
CheckNode node = (CheckNode)path.getLastPathComponent();
boolean isSelected = !node.isSelected();
node.setSelected(isSelected);
if (node.getSelectionMode() == CheckNode.DIG_IN_SELECTION) {
if (isSelected) {
//tree.expandPath(path);
}
else {
//tree.collapsePath(path);
}
}
((DefaultTreeModel)tree.getModel()).nodeChanged(node);
// I need revalidate if node is root. but why?
tree.revalidate();
tree.repaint();
}
}
}
/**
* Closes the CheckTree.
*/
public void close() {
}
class ButtonActionListener implements ActionListener {
CheckNode root;
JTextArea textArea;
ButtonActionListener(CheckNode root, JTextArea textArea) {
this.root = root;
this.textArea = textArea;
}
public void actionPerformed(ActionEvent e) {
Enumeration<CheckNode> nodeEnum = root.breadthFirstEnumeration();
while (nodeEnum.hasMoreElements()) {
CheckNode node = nodeEnum.nextElement();
if (node.isSelected()) {
TreeNode[] nodes = node.getPath();
textArea.append("\n" + nodes[0].toString());
for (int i = 1; i < nodes.length; i++) {
textArea.append("/" + nodes[i].toString());
}
}
}
}
}
public JTree getTree() {
return tree;
}
/**
* Call to expand the entire tree.
*/
public void expandTree() {
for (int i = 0; i <= tree.getRowCount(); i++) {
tree.expandPath(tree.getPathForRow(i));
}
}
}