| 1 7 8 package javax.swing; 9 10 import java.awt.*; 11 import java.awt.event.*; 12 import java.beans.*; 13 import java.io.*; 14 import java.util.*; 15 import javax.swing.event.*; 16 import javax.swing.plaf.TreeUI ; 17 import javax.swing.tree.*; 18 import javax.swing.text.Position ; 19 import javax.accessibility.*; 20 21 22 120 public class JTree extends JComponent implements Scrollable , Accessible 121 { 122 126 private static final String uiClassID = "TreeUI"; 127 128 131 transient protected TreeModel treeModel; 132 133 136 transient protected TreeSelectionModel selectionModel; 137 138 142 protected boolean rootVisible; 143 144 148 transient protected TreeCellRenderer cellRenderer; 149 150 154 protected int rowHeight; 155 private boolean rowHeightSet = false; 156 157 165 transient private Hashtable expandedState; 166 167 168 190 protected boolean showsRootHandles; 191 private boolean showsRootHandlesSet = false; 192 193 197 protected transient TreeSelectionRedirector selectionRedirector; 198 199 203 transient protected TreeCellEditor cellEditor; 204 205 208 protected boolean editable; 209 210 220 protected boolean largeModel; 221 222 227 protected int visibleRowCount; 228 229 236 protected boolean invokesStopCellEditing; 237 238 242 protected boolean scrollsOnExpand; 243 private boolean scrollsOnExpandSet = false; 244 245 248 protected int toggleClickCount; 249 250 253 transient protected TreeModelListener treeModelListener; 254 255 259 transient private Stack expandedStack; 260 261 264 private TreePath leadPath; 265 266 269 private TreePath anchorPath; 270 271 274 private boolean expandsSelectedPaths; 275 276 279 private boolean settingUI; 280 281 282 private boolean dragEnabled; 283 284 292 private transient TreeExpansionListener uiTreeExpansionListener; 293 294 297 private static int TEMP_STACK_SIZE = 11; 298 299 303 public final static String CELL_RENDERER_PROPERTY = "cellRenderer"; 304 305 public final static String TREE_MODEL_PROPERTY = "model"; 306 307 public final static String ROOT_VISIBLE_PROPERTY = "rootVisible"; 308 309 public final static String SHOWS_ROOT_HANDLES_PROPERTY = "showsRootHandles"; 310 311 public final static String ROW_HEIGHT_PROPERTY = "rowHeight"; 312 313 public final static String CELL_EDITOR_PROPERTY = "cellEditor"; 314 315 public final static String EDITABLE_PROPERTY = "editable"; 316 317 public final static String LARGE_MODEL_PROPERTY = "largeModel"; 318 319 public final static String SELECTION_MODEL_PROPERTY = "selectionModel"; 320 321 public final static String VISIBLE_ROW_COUNT_PROPERTY = "visibleRowCount"; 322 323 public final static String INVOKES_STOP_CELL_EDITING_PROPERTY = "invokesStopCellEditing"; 324 325 public final static String SCROLLS_ON_EXPAND_PROPERTY = "scrollsOnExpand"; 326 327 public final static String TOGGLE_CLICK_COUNT_PROPERTY = "toggleClickCount"; 328 330 public final static String LEAD_SELECTION_PATH_PROPERTY = "leadSelectionPath"; 331 333 public final static String ANCHOR_SELECTION_PATH_PROPERTY = "anchorSelectionPath"; 334 336 public final static String EXPANDS_SELECTED_PATHS_PROPERTY = "expandsSelectedPaths"; 337 338 339 345 protected static TreeModel getDefaultTreeModel() { 346 DefaultMutableTreeNode root = new DefaultMutableTreeNode("JTree"); 347 DefaultMutableTreeNode parent; 348 349 parent = new DefaultMutableTreeNode("colors"); 350 root.add(parent); 351 parent.add(new DefaultMutableTreeNode("blue")); 352 parent.add(new DefaultMutableTreeNode("violet")); 353 parent.add(new DefaultMutableTreeNode("red")); 354 parent.add(new DefaultMutableTreeNode("yellow")); 355 356 parent = new DefaultMutableTreeNode("sports"); 357 root.add(parent); 358 parent.add(new DefaultMutableTreeNode("basketball")); 359 parent.add(new DefaultMutableTreeNode("soccer")); 360 parent.add(new DefaultMutableTreeNode("football")); 361 parent.add(new DefaultMutableTreeNode("hockey")); 362 363 parent = new DefaultMutableTreeNode("food"); 364 root.add(parent); 365 parent.add(new DefaultMutableTreeNode("hot dogs")); 366 parent.add(new DefaultMutableTreeNode("pizza")); 367 parent.add(new DefaultMutableTreeNode("ravioli")); 368 parent.add(new DefaultMutableTreeNode("bananas")); 369 return new DefaultTreeModel(root); 370 } 371 372 386 protected static TreeModel createTreeModel(Object value) { 387 DefaultMutableTreeNode root; 388 389 if((value instanceof Object []) || (value instanceof Hashtable) || 390 (value instanceof Vector)) { 391 root = new DefaultMutableTreeNode("root"); 392 DynamicUtilTreeNode.createChildren(root, value); 393 } 394 else { 395 root = new DynamicUtilTreeNode("root", value); 396 } 397 return new DefaultTreeModel(root, false); 398 } 399 400 407 public JTree() { 408 this(getDefaultTreeModel()); 409 } 410 411 421 public JTree(Object [] value) { 422 this(createTreeModel(value)); 423 this.setRootVisible(false); 424 this.setShowsRootHandles(true); 425 expandRoot(); 426 } 427 428 437 public JTree(Vector<?> value) { 438 this(createTreeModel(value)); 439 this.setRootVisible(false); 440 this.setShowsRootHandles(true); 441 expandRoot(); 442 } 443 444 454 public JTree(Hashtable<?,?> value) { 455 this(createTreeModel(value)); 456 this.setRootVisible(false); 457 this.setShowsRootHandles(true); 458 expandRoot(); 459 } 460 461 470 public JTree(TreeNode root) { 471 this(root, false); 472 } 473 474 486 public JTree(TreeNode root, boolean asksAllowsChildren) { 487 this(new DefaultTreeModel(root, asksAllowsChildren)); 488 } 489 490 496 public JTree(TreeModel newModel) { 497 super(); 498 expandedStack = new Stack(); 499 toggleClickCount = 2; 500 expandedState = new Hashtable(); 501 setLayout(null); 502 rowHeight = 16; 503 visibleRowCount = 20; 504 rootVisible = true; 505 selectionModel = new DefaultTreeSelectionModel(); 506 cellRenderer = null; 507 scrollsOnExpand = true; 508 setOpaque(true); 509 expandsSelectedPaths = true; 510 updateUI(); 511 setModel(newModel); 512 } 513 514 519 public TreeUI getUI() { 520 return (TreeUI )ui; 521 } 522 523 534 public void setUI(TreeUI ui) { 535 if ((TreeUI )this.ui != ui) { 536 settingUI = true; 537 uiTreeExpansionListener = null; 538 try { 539 super.setUI(ui); 540 } 541 finally { 542 settingUI = false; 543 } 544 } 545 } 546 547 554 public void updateUI() { 555 setUI((TreeUI )UIManager.getUI(this)); 556 invalidate(); 557 } 558 559 560 567 public String getUIClassID() { 568 return uiClassID; 569 } 570 571 572 578 public TreeCellRenderer getCellRenderer() { 579 return cellRenderer; 580 } 581 582 592 public void setCellRenderer(TreeCellRenderer x) { 593 TreeCellRenderer oldValue = cellRenderer; 594 595 cellRenderer = x; 596 firePropertyChange(CELL_RENDERER_PROPERTY, oldValue, cellRenderer); 597 invalidate(); 598 } 599 600 610 public void setEditable(boolean flag) { 611 boolean oldValue = this.editable; 612 613 this.editable = flag; 614 firePropertyChange(EDITABLE_PROPERTY, oldValue, flag); 615 if (accessibleContext != null) { 616 accessibleContext.firePropertyChange( 617 AccessibleContext.ACCESSIBLE_STATE_PROPERTY, 618 (oldValue ? AccessibleState.EDITABLE : null), 619 (flag ? AccessibleState.EDITABLE : null)); 620 } 621 } 622 623 628 public boolean isEditable() { 629 return editable; 630 } 631 632 644 public void setCellEditor(TreeCellEditor cellEditor) { 645 TreeCellEditor oldEditor = this.cellEditor; 646 647 this.cellEditor = cellEditor; 648 firePropertyChange(CELL_EDITOR_PROPERTY, oldEditor, cellEditor); 649 invalidate(); 650 } 651 652 658 public TreeCellEditor getCellEditor() { 659 return cellEditor; 660 } 661 662 667 public TreeModel getModel() { 668 return treeModel; 669 } 670 671 679 public void setModel(TreeModel newModel) { 680 clearSelection(); 681 682 TreeModel oldModel = treeModel; 683 684 if(treeModel != null && treeModelListener != null) 685 treeModel.removeTreeModelListener(treeModelListener); 686 687 if (accessibleContext != null) { 688 if (treeModel != null) { 689 treeModel.removeTreeModelListener((TreeModelListener)accessibleContext); 690 } 691 if (newModel != null) { 692 newModel.addTreeModelListener((TreeModelListener)accessibleContext); 693 } 694 } 695 696 treeModel = newModel; 697 clearToggledPaths(); 698 if(treeModel != null) { 699 if(treeModelListener == null) 700 treeModelListener = createTreeModelListener(); 701 if(treeModelListener != null) 702 treeModel.addTreeModelListener(treeModelListener); 703 if(treeModel.getRoot() != null && 705 !treeModel.isLeaf(treeModel.getRoot())) { 706 expandedState.put(new TreePath(treeModel.getRoot()), 707 Boolean.TRUE); 708 } 709 } 710 firePropertyChange(TREE_MODEL_PROPERTY, oldModel, treeModel); 711 invalidate(); 712 } 713 714 720 public boolean isRootVisible() { 721 return rootVisible; 722 } 723 724 735 public void setRootVisible(boolean rootVisible) { 736 boolean oldValue = this.rootVisible; 737 738 this.rootVisible = rootVisible; 739 firePropertyChange(ROOT_VISIBLE_PROPERTY, oldValue, this.rootVisible); 740 if (accessibleContext != null) { 741 ((AccessibleJTree)accessibleContext).fireVisibleDataPropertyChange(); 742 } 743 } 744 745 762 public void setShowsRootHandles(boolean newValue) { 763 boolean oldValue = showsRootHandles; 764 TreeModel model = getModel(); 765 766 showsRootHandles = newValue; 767 showsRootHandlesSet = true; 768 firePropertyChange(SHOWS_ROOT_HANDLES_PROPERTY, oldValue, 769 showsRootHandles); 770 if (accessibleContext != null) { 771 ((AccessibleJTree)accessibleContext).fireVisibleDataPropertyChange(); 772 } 773 invalidate(); 774 } 775 776 782 public boolean getShowsRootHandles() 783 { 784 return showsRootHandles; 785 } 786 787 797 public void setRowHeight(int rowHeight) 798 { 799 int oldValue = this.rowHeight; 800 801 this.rowHeight = rowHeight; 802 rowHeightSet = true; 803 firePropertyChange(ROW_HEIGHT_PROPERTY, oldValue, this.rowHeight); 804 invalidate(); 805 } 806 807 813 public int getRowHeight() 814 { 815 return rowHeight; 816 } 817 818 823 public boolean isFixedRowHeight() 824 { 825 return (rowHeight > 0); 826 } 827 828 840 public void setLargeModel(boolean newValue) { 841 boolean oldValue = largeModel; 842 843 largeModel = newValue; 844 firePropertyChange(LARGE_MODEL_PROPERTY, oldValue, newValue); 845 } 846 847 853 public boolean isLargeModel() { 854 return largeModel; 855 } 856 857 874 public void setInvokesStopCellEditing(boolean newValue) { 875 boolean oldValue = invokesStopCellEditing; 876 877 invokesStopCellEditing = newValue; 878 firePropertyChange(INVOKES_STOP_CELL_EDITING_PROPERTY, oldValue, 879 newValue); 880 } 881 882 890 public boolean getInvokesStopCellEditing() { 891 return invokesStopCellEditing; 892 } 893 894 913 public void setScrollsOnExpand(boolean newValue) { 914 boolean oldValue = scrollsOnExpand; 915 916 scrollsOnExpand = newValue; 917 scrollsOnExpandSet = true; 918 firePropertyChange(SCROLLS_ON_EXPAND_PROPERTY, oldValue, 919 newValue); 920 } 921 922 927 public boolean getScrollsOnExpand() { 928 return scrollsOnExpand; 929 } 930 931 940 public void setToggleClickCount(int clickCount) { 941 int oldCount = toggleClickCount; 942 943 toggleClickCount = clickCount; 944 firePropertyChange(TOGGLE_CLICK_COUNT_PROPERTY, oldCount, 945 clickCount); 946 } 947 948 954 public int getToggleClickCount() { 955 return toggleClickCount; 956 } 957 958 978 public void setExpandsSelectedPaths(boolean newValue) { 979 boolean oldValue = expandsSelectedPaths; 980 981 expandsSelectedPaths = newValue; 982 firePropertyChange(EXPANDS_SELECTED_PATHS_PROPERTY, oldValue, 983 newValue); 984 } 985 986 993 public boolean getExpandsSelectedPaths() { 994 return expandsSelectedPaths; 995 } 996 997 1041 public void setDragEnabled(boolean b) { 1042 if (b && GraphicsEnvironment.isHeadless()) { 1043 throw new HeadlessException(); 1044 } 1045 dragEnabled = b; 1046 } 1047 1048 |