/* * Copyright (C) 2011 Peransin Nicolas. * Use is subject to license terms. */ package org.mypsycho.swing.tree; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JTree; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; public class CheckTree extends JTree { private static final long serialVersionUID = -1508143876759040614L; public CheckTree(CheckTreeNode root) { this(root, false); } /** * Returns a <code>JTree</code> with the specified <code>TreeNode</code> * as its root, which * displays the root node and which decides whether a node is a * leaf node in the specified manner. * * @param root a <code>TreeNode</code> object * @param asksAllowsChildren if false, any node without children is a * leaf node; if true, only nodes that do not allow * children are leaf nodes * @see DefaultTreeModel#asksAllowsChildren */ public CheckTree(CheckTreeNode root, boolean asksAllowsChildren) { this(new DefaultCheckTreeModel(root, asksAllowsChildren)); } /** * Returns an instance of <code>JTree</code> which displays the root node * -- the tree is created using the specified data model. * * @param newModel the <code>TreeModel</code> to use as the data model */ public CheckTree(CheckTreeModel newModel) { super(newModel); setCellRenderer(new DefaultCheckTreeCellRenderer()); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { handleCellSelection(event); } }); } protected void handleCellSelection(MouseEvent event) { int selRow = getRowForLocation(event.getX(), event.getY()); /* TreeCellRenderer r = getCellRenderer(); if ((selRow == -1) || !(r instanceof DefaultCheckTreeCellRenderer)) { return; } DefaultCheckTreeCellRenderer renderer = (DefaultCheckTreeCellRenderer) r; */ if (selRow == -1) { return; } CheckTreeCellRenderer renderer = (CheckTreeCellRenderer) getCellRenderer(); TreePath path = getPathForRow(selRow); Object node = path.getLastPathComponent(); renderer.getTreeCellRendererComponent(CheckTree.this, node, isRowSelected(selRow), isExpanded(selRow), getModel().isLeaf(node), selRow, true); int position = event.getX() - (int) getPathBounds(path).getX(); if (renderer.isInSelect(position)) { // Swap selection ! boolean sel = getCheckModel().isAllSelected(node) || getCheckModel().isSomeSelected(node); getCheckModel().setSelected(node, !sel); } } public void setModel(TreeModel newModel) { super.setModel((CheckTreeModel) newModel); } public CheckTreeModel getCheckModel() { return (CheckTreeModel) getModel(); } }