1 19 20 package edu.umd.cs.findbugs.gui2; 21 22 import java.lang.management.ManagementFactory ; 23 import java.lang.management.ThreadMXBean ; 24 import java.lang.reflect.InvocationTargetException ; 25 import java.lang.reflect.Method ; 26 import java.util.ArrayList ; 27 import java.util.Arrays ; 28 import java.util.Collections ; 29 import java.util.List ; 30 import java.util.Vector ; 31 32 import javax.swing.JTree ; 33 import javax.swing.SwingUtilities ; 34 import javax.swing.event.ChangeEvent ; 35 import javax.swing.event.ListSelectionEvent ; 36 import javax.swing.event.TableColumnModelEvent ; 37 import javax.swing.event.TableColumnModelListener ; 38 import javax.swing.event.TreeExpansionEvent ; 39 import javax.swing.event.TreeExpansionListener ; 40 import javax.swing.event.TreeModelEvent ; 41 import javax.swing.event.TreeModelListener ; 42 import javax.swing.tree.DefaultTreeModel ; 43 import javax.swing.tree.TreeModel ; 44 import javax.swing.tree.TreeNode ; 45 import javax.swing.tree.TreePath ; 46 47 48 import edu.umd.cs.findbugs.BugInstance; 49 import edu.umd.cs.findbugs.gui2.BugAspects.StringPair; 50 51 89 90 93 public class BugTreeModel implements TreeModel , TableColumnModelListener , FilterListener, TreeExpansionListener 94 { 95 private BugAspects root = new BugAspects(); 96 private SorterTableColumnModel st; 97 private BugSet data; 98 private ArrayList <TreeModelListener > listeners = new ArrayList <TreeModelListener >(); 99 private JTree tree; 100 static Vector <BugLeafNode> selectedBugLeafNodes = new Vector <BugLeafNode>(); 101 102 103 private volatile Thread rebuildingThread; 104 private boolean sortOrderChanged; 105 private boolean sortsAddedOrRemoved; 106 107 108 public BugTreeModel(JTree tree, SorterTableColumnModel st, BugSet data) 109 { 110 st.addColumnModelListener(this); 111 this.tree = tree; 112 this.st = st; 113 this.data = data; 114 BugSet.setAsRootAndCache(this.data); 115 root.setCount(data.size()); 116 FilterMatcher.addFilterListener(this); 117 tree.addTreeExpansionListener(this); 118 } 119 120 public BugTreeModel(BugTreeModel other) 121 { 122 this.root = new BugAspects(other.root); 123 this.st = other.st; 124 this.data = new BugSet(other.data); 125 this.tree = other.tree; 127 } 128 129 public void getOffListenerList() 130 { 131 FilterMatcher.removeFilterListener(this); 132 st.removeColumnModelListener(this); 133 tree.removeTreeExpansionListener(this); 134 } 135 136 public Object getRoot() 137 { 138 return root; 139 } 140 141 public Object getChild(Object o, int index) 142 { 143 BugAspects a = (BugAspects) o; 144 if (st.getOrderBeforeDivider().size()==0 && a.size()==0) return data.get(index); 146 147 if ((a.size() == 0) || (a.last().key != st.getOrderBeforeDivider().get(st.getOrderBeforeDivider().size() - 1))) 148 { 149 BugAspects child=a.addToNew(enumsThatExist(a).get(index)); 150 child.setCount(data.query(child).size()); 151 return child; 152 } 153 else 154 return data.query(a).get(index); 155 } 156 157 public int getChildCount(Object o) 158 { 159 BugAspects a = (BugAspects) o; 165 166 if (st.getOrderBeforeDivider().size()==0 && a.size() == 0) return data.size(); 168 169 if ((a.size() == 0) || (a.last().key != st.getOrderBeforeDivider().get(st.getOrderBeforeDivider().size() - 1))) 170 return enumsThatExist(a).size(); 173 else 175 return data.query(a).size(); 178 } 185 186 187 188 189 private HashList<StringPair> enumsThatExist(BugAspects a) 190 { 191 if (st.getOrderBeforeDivider().size()==0) 197 return null; 198 199 213 Sortables key = (a.size() == 0 ? 214 st.getOrderBeforeDivider().get(0) : 215 st.getOrderBeforeDivider().get(st.getOrderBeforeDivider().indexOf(a.last().key) + 1)); 216 217 String [] all = key.getAll(data.query(a)); 218 ArrayList <StringPair> result = new ArrayList <StringPair>(); 219 for (String i : all) 220 result.add(new StringPair(key, i)); 221 return new HashList<StringPair>(result); 225 } 231 232 public boolean isLeaf(Object o) 233 { 234 return (o instanceof BugLeafNode); 235 } 236 237 public void valueForPathChanged(TreePath arg0, Object arg1) {} 238 239 public int getIndexOfChild(Object parent, Object child) 240 { 241 if (parent == null || child == null || isLeaf(parent)) 242 return -1; 243 244 if (isLeaf(child)) 245 { 246 return data.query((BugAspects) parent).indexOf((BugLeafNode) child); 247 } 248 else 249 { 250 HashList<StringPair> stringPairs = enumsThatExist((BugAspects) parent); 251 if (stringPairs==null) 252 { 253 assert(false); 255 return -1; 256 } 257 258 return stringPairs.indexOf(((BugAspects)child).last()); 259 } 267 } 268 269 public void addTreeModelListener(TreeModelListener listener) 270 { 271 listeners.add(listener); 272 } 273 274 public void removeTreeModelListener(TreeModelListener listener) 275 { 276 listeners.remove(listener); 277 } 278 279 305 private static StringPair[] getValues(Sortables key) 306 { 307 String [] values= key.getAllSorted(); 308 StringPair[] result = new StringPair[values.length]; 309 for (int i = 0; i < values.length; i++) 310 { 311 result[i] = new StringPair(key, values[i]); 312 } 313 return result; 314 315 341 342 } 343 344 public void columnAdded(TableColumnModelEvent e) 345 { 346 sortsAddedOrRemoved=true; 347 } 349 350 public void columnRemoved(TableColumnModelEvent e) 351 { 352 sortsAddedOrRemoved=true; 353 } 355 356 public void columnMoved(final TableColumnModelEvent evt) 357 { 358 if (evt.getFromIndex() == evt.getToIndex()) 359 return; 360 sortOrderChanged=true; 361 } 363 364 365 void changeSet(BugSet set) 366 { 367 BugSet.setAsRootAndCache(set); 368 data=new BugSet(set); 369 root.setCount(data.size()); 370 rebuild(); 371 } 372 373 374 378 private void rebuild() 379 { 380 PreferencesFrame.getInstance().freeze(); 381 st.freezeOrder(); 382 MainFrame.getInstance().setRebuilding(true); 383 NewFilterFromBug.closeAll(); 384 385 388 if (rebuildingThread==null) 390 setOldSelectedBugs(); 391 392 Debug.println("Please Wait called right before starting rebuild thread"); 406 pleaseWait(); 407 rebuildingThread = new Thread () 408 { 409 public void run() 410 { 411 try 412 { 413 414 415 416 Debug.println(Thread.currentThread() + " start"); 417 BugTreeModel newModel = new BugTreeModel(BugTreeModel.this); 419 420 newModel.listeners = listeners; 421 newModel.resetData(); 422 newModel.data.sortList(); 423 424 JTree newTree = new JTree (newModel); 430 431 newModel.tree = newTree; 437 Debug.println("Making new tree from Rebuild, this happens in swing thread"); 438 MainFrame.getInstance().newTree(newTree,newModel); 439 440 rebuildingThread = null; 441 } 443 catch(NullPointerException e) 444 { 445 if (rebuildingThread==this) 446 { 447 Debug.println(e); 451 } 452 else 453 { 454 Debug.println("Interrupted Thread " + this + " encountered exception, exception was consumed. However, this thread should never have been interrupted"); 456 } 457 } 458 catch(ArrayIndexOutOfBoundsException e) 459 { 460 if (rebuildingThread==this) 461 { 462 Debug.println(e); 465 } 466 else 467 { 468 Debug.println("Interrupted Thread " + this + " encountered exception, exception was consumed. However, this thread should never have been interrupted"); 470 } 471 } 472 finally 485 { 486 getOffListenerList(); 487 MainFrame.getInstance().setRebuilding(false); 488 PreferencesFrame.getInstance().thaw(); 489 st.thawOrder(); 491 Debug.println(Thread.currentThread() + " finally"); 492 } 493 } 494 }; 495 rebuildingThread.start(); 496 } 497 498 public void crawl(final ArrayList <BugAspects> path, final int depth) 499 { 500 for (int i = 0; i < getChildCount(path.get(path.size() - 1)); i++) 501 if (depth > 0) 502 { 503 ArrayList <BugAspects> newPath = new ArrayList <BugAspects>(path); 504 newPath.add((BugAspects) getChild(path.get(path.size() - 1), i)); 505 crawl(newPath, depth - 1); 506 } 507 else 508 { 509 for (TreeModelListener l : listeners) 510 l.treeStructureChanged(new TreeModelEvent (this, path.toArray())); 511 } 512 } 513 514 515 516 517 void openPreviouslySelected(List <BugLeafNode> selected) 518 { 519 BugInstance bug=null; 520 TreePath path=null; 521 Debug.println("Starting Open Previously Selected"); 522 for (BugLeafNode b: selected) 523 { 524 try 525 { 526 bug=b.getBug(); 527 path=getPathToBug(bug); 528 tree.expandPath(path.getParentPath()); 529 tree.addSelectionPath(path); 530 } 531 catch(NullPointerException e) 532 { 533 if (MainFrame.DEBUG) System.err.println("Failure opening a selected node, node will not be opened in new tree"); 535 continue; 540 } 541 catch(ArrayIndexOutOfBoundsException e) 542 { 543 if (MainFrame.DEBUG) System.err.println("Failure opening a selected node, node will not be opened in new tree"); 548 continue; 550 } 551 } 552 553 } 554 555 560 561 public void crawlToOpen(TreePath path, ArrayList <BugLeafNode> bugLeafNodes, ArrayList <TreePath > treePaths) 562 { 563 for (int i = 0; i < getChildCount(path.getLastPathComponent()); i++) 564 { 565 if (!isLeaf(getChild(path.getLastPathComponent(), i))) 566 for (BugLeafNode p : bugLeafNodes) 567 { 568 if (p.matches((BugAspects) getChild(path.getLastPathComponent(), i))) 569 { 570 tree.expandPath(path); 571 crawlToOpen(path.pathByAddingChild(getChild(path.getLastPathComponent(), i)), bugLeafNodes, treePaths); 572 break; 573 } 574 } 575 else 576 { 577 for (BugLeafNode b: bugLeafNodes) 578 { 579 if (getChild(path.getLastPathComponent(),i).equals(b) ) 580 { 581 tree.expandPath(path); 582 treePaths.add(path.pathByAddingChild(getChild(path.getLastPathComponent(), i))); 583 } 584 } 585 } 586 } 587 } 588 589 public void resetData() { 591 data=new BugSet(data); 592 } 593 594 public void clearCache() 595 { 596 resetData(); 597 BugSet.setAsRootAndCache(data); root.setCount(data.size()); 599 600 rebuild(); 603 } 604 605 public void unsuppressBug(TreePath path) 606 { 607 if (path==null) 608 return; 609 TreePath pathToFirstDeleted=null; 610 Object [] objPath=path.getParentPath().getPath(); 611 ArrayList <Object > reconstruct=new ArrayList <Object >(); 612 boolean earlyStop=false; 613 for (int x=0; x<objPath.length;x++) 614 { 615 Object o=objPath[x]; 616 reconstruct.add(o); 617 if (o instanceof BugAspects) 618 { 619 pathToFirstDeleted=new TreePath (reconstruct.toArray()); 620 ((BugAspects)o).setCount(((BugAspects)o).getCount()+1); 621 622 if (((BugAspects)o).getCount()==2 && reconstruct.size() >1) 623 { 624 earlyStop=true; 625 break; 626 } 627 628 for (TreeModelListener l: listeners) 629 { 630 if (pathToFirstDeleted.getParentPath()!=null) 631 l.treeNodesChanged(new TreeModelEvent (this, pathToFirstDeleted.getParentPath(),new int[]{getIndexOfChild(pathToFirstDeleted.getParentPath().getLastPathComponent(),pathToFirstDeleted.getLastPathComponent())}, new Object []{pathToFirstDeleted.getLastPathComponent()})); 632 } 633 } 634 } 635 636 637 if (path.getParentPath()==null) { 639 throw new RuntimeException (); 640 } 641 642 if (pathToFirstDeleted==null) 643 { 644 pathToFirstDeleted=path; 645 } 646 647 if (earlyStop==false) 648 { 649 pathToFirstDeleted=pathToFirstDeleted.pathByAddingChild(path.getLastPathComponent()); 650 } 651 652 Object parent=pathToFirstDeleted.getParentPath().getLastPathComponent(); 653 Object child=pathToFirstDeleted.getLastPathComponent(); 654 655 TreeModelEvent insertionEvent=new TreeModelEvent (this, pathToFirstDeleted.getParentPath(),new int[]{getIndexOfChild(parent,child)}, new Object []{child}); 656 for (TreeModelListener l: listeners) 657 { 658 l.treeNodesInserted(insertionEvent); 659 } 660 if (!isLeaf(child)) 661 { 662 TreeModelEvent structureEvent=new TreeModelEvent (this, pathToFirstDeleted,new int[0], new Object [0]); 663 for (TreeModelListener l: listeners) 664 { 665 l.treeStructureChanged(structureEvent); 666 } 667 } 668 } 669 670 public void suppressBug(TreePath path) 671 { 672 Debug.println(path); 673 Object [] objPath=path.getParentPath().getPath(); 674 ArrayList <Object > reconstruct=new ArrayList <Object >(); 675 for (int x=0; x< objPath.length;x++) 676 { 677 Object o=objPath[x]; 678 ((BugAspects)o).setCount(((BugAspects)o).getCount()-1); 679 } 680 681 for (int x=0; x< objPath.length;x++) 682 { 683 Object o=objPath[x]; 684 reconstruct.add(o); 685 if (o instanceof BugAspects) 686 { 687 if (((BugAspects)o).getCount()==0) 688 { 689 path=new TreePath (reconstruct.toArray()); 690 break; 691 } 692 } 693 } 694 695 TreeModelEvent event; 696 697 if (path.getParentPath()==null) { 699 event=new TreeModelEvent (this,path,new int[]{0},new Object []{this.getChild(root,0)}); 700 root.setCount(0); 701 } 702 else 703 { 704 Object parent = path.getParentPath().getLastPathComponent(); 705 Object child = path.getLastPathComponent(); 706 int indexOfChild=getIndexOfChild(parent,child); 707 if (indexOfChild!=-1) 708 { 709 event=new TreeModelEvent (this, path.getParentPath(),new int[]{indexOfChild}, new Object []{child}); 710 resetData(); 711 } 712 else { 714 resetData(); 715 for (TreeModelListener l: listeners) 716 { 717 l.treeStructureChanged(new TreeModelEvent (this, path.getParentPath())); 718 } 719 return; 720 } 721 } 722 723 for (TreeModelListener l: listeners) 724 { 725 l.treeNodesRemoved(event); 726 } 727 } 728 729 void treeNodeChanged(TreePath path) 730 { 731 Debug.println("Tree Node Changed: " + path); 732 if (path.getParentPath()==null) 733 { 734 TreeModelEvent event=new TreeModelEvent (this,path,null,null); 735 for (TreeModelListener l:listeners) 736 { 737 l.treeNodesChanged(event); 738 } 739 return; 740 } 741 742 TreeModelEvent event=new TreeModelEvent (this,path.getParentPath(),new int[]{getIndexOfChild(path.getParentPath().getLastPathComponent(),path.getLastPathComponent())},new Object [] {path.getLastPathComponent()}); 743 for (TreeModelListener l: listeners) 744 { 745 l.treeNodesChanged(event); 746 } 747 } 748 749 public TreePath getPathToBug(BugInstance b) 750 { 751 List <Sortables> order=st.getOrderBeforeDivider(); 753 BugAspects[] toBug=new BugAspects[order.size()]; 755 for (int i=0; i < order.size(); i++) 756 toBug[i]=new BugAspects(); 757 758 for (int x=0; x< order.size();x++) 759 { 760 for (int y=0; y<=x;y++) 761 { 762 Sortables s = order.get(y); 763 toBug[x].add(new StringPair(s,s.getFrom(b))); 764 } 765 } 766 TreePath pathToBug=new TreePath (root); 768 for (int x=0;x<order.size();x++) 769 { 770 int index=getIndexOfChild(pathToBug.getLastPathComponent(),toBug[x]); 771 772 if (index==-1) 773 { 774 if (MainFrame.DEBUG) System.err.println("Node does not exist in the tree"); return null; 776 } 777 778 pathToBug=pathToBug.pathByAddingChild(getChild(pathToBug.getLastPathComponent(),index)); 779 } 780 int index=getIndexOfChild(pathToBug.getLastPathComponent(),new BugLeafNode(b)); 782 if(index == -1) 783 return null; 784 pathToBug=pathToBug.pathByAddingChild(getChild(pathToBug.getLastPathComponent(),index)); 785 return pathToBug; 786 787 } 788 789 public TreePath getPathToNewlyUnsuppressedBug(BugInstance b) 790 { 791 resetData(); 792 return getPathToBug(b); 793 } 794 795 protected void finalize() throws Throwable 796 { 797 super.finalize(); 798 799 Debug.println("The BugTreeModel has been DELETED! This means there are no more references to it, and its finally off all of the stupid listener lists"); 801 } 802 803 public void columnMarginChanged(ChangeEvent arg0) {} 804 public void columnSelectionChanged(ListSelectionEvent arg0) {} 805 806 public void treeExpanded(TreeExpansionEvent event) { 807 TreePath path=event.getPath(); 808 809 if (getChildCount((BugAspects)(path.getLastPathComponent()))==1) 814 tree.expandPath(path.pathByAddingChild(getChild(path.getLastPathComponent(),0))); 815 816 if (((BugAspects)path.getLastPathComponent()).getCount()==1 && isLeaf(getChild(path.getLastPathComponent(),0))) 819 { 820 tree.setSelectionPath(path.pathByAddingChild(getChild(path.getLastPathComponent(),0))); 821 } 822 827 else if (((BugAspects)path.getLastPathComponent()).getCount()==1 && tree.isExpanded(path.pathByAddingChild(getChild(path.getLastPathComponent(),0)))) 828 { 829 TreePath fullPath=path; 830 while (!isLeaf(fullPath.getLastPathComponent())) 831 fullPath=fullPath.pathByAddingChild(getChild(fullPath.getLastPathComponent(),0)); 832 tree.setSelectionPath(fullPath); 833 } 834 } 835 836 public void treeCollapsed(TreeExpansionEvent event) { 837 } 838 839 private void setOldSelectedBugs() 840 { 841 selectedBugLeafNodes.clear(); 842 if (tree.getSelectionPaths() != null) for (TreePath path : tree.getSelectionPaths()) 844 if (isLeaf(path.getLastPathComponent())) 845 selectedBugLeafNodes.add((BugLeafNode) path.getLastPathComponent()); 846 } 847 Vector <BugLeafNode> getOldSelectedBugs() 848 { 849 return selectedBugLeafNodes; 850 } 851 852 public static class PleaseWaitTreeModel implements TreeModel 853 { 854 private String root = "Please wait..."; 855 public PleaseWaitTreeModel() {} 856 public PleaseWaitTreeModel(String message) {if (message!=null) root=message;} 857 858 public void addTreeModelListener(TreeModelListener l) {} 859 public Object getChild(Object parent, int index) {return null;} 860 public int getChildCount(Object parent) {return 0;} 861 public int getIndexOfChild(Object parent, Object child) {return -1;} 862 public Object getRoot() {return root;} 863 public boolean isLeaf(Object node) {return true;} 864 public void removeTreeModelListener(TreeModelListener l) {} 865 public void valueForPathChanged(TreePath path, Object newValue) {} 866 } 867 868 void checkSorter() 869 { 870 if (sortOrderChanged==true) 871 { 872 sortOrderChanged=false; 873 rebuild(); 874 } 875 if (sortsAddedOrRemoved==true) 876 { 877 sortsAddedOrRemoved=false; 878 rebuild(); 879 } 880 } 881 882 static void pleaseWait() 883 { 884 pleaseWait(null); 885 } 886 static void pleaseWait(final String message) 887 { 888 SwingUtilities.invokeLater(new Runnable () 889 { 890 public void run() 891 { 892 MainFrame.getInstance().pleaseWait = true; 893 Debug.println("Please Wait! " + (message==null?"":message)); 894 MainFrame.getInstance().getTree().setModel(new PleaseWaitTreeModel(message)); 895 MainFrame.getInstance().pleaseWait = false; 896 Debug.println("Please Stop Waiting"); 898 } 899 }); 900 } 901 902 public TreeModelEvent restructureBranch(ArrayList <String > stringsToBranch, boolean removing) throws BranchOperationException 903 { 904 if (removing) 905 return branchOperations(stringsToBranch, 2); 906 else 907 return branchOperations(stringsToBranch, 3); 908 } 909 910 public TreeModelEvent insertBranch(ArrayList <String > stringsToBranch) throws BranchOperationException 911 { 912 return branchOperations(stringsToBranch, 1); 913 } 914 915 public TreeModelEvent removeBranch(ArrayList <String > stringsToBranch) throws BranchOperationException 916 { 917 return branchOperations(stringsToBranch, 0); 918 } 919 920 public void sortBranch(TreePath pathToBranch) 921 { 922 BugSet bs=data.query((BugAspects)pathToBranch.getLastPathComponent()); 923 bs.sortList(); 924 Debug.println("Data in sorted branch: " + pathToBranch.getLastPathComponent()); 925 for (BugLeafNode b: bs) 926 { 927 Debug.println(b); 928 } 929 930 Object [] children=new Object [getChildCount(pathToBranch.getLastPathComponent())]; 931 int[] childIndices=new int[children.length]; 932 for (int x=0; x<children.length; x++) 933 { 934 children[x]=getChild(pathToBranch.getLastPathComponent(),x); 935 childIndices[x]=x; 936 } 937 for (TreeModelListener l: listeners) 938 { 939 TreeModelEvent event=new TreeModelEvent (this,pathToBranch,childIndices,children); 940 l.treeNodesChanged(event); 941 } 942 943 } 944 945 @SuppressWarnings ("serial") 946 static class BranchOperationException extends Exception 947 { 948 public BranchOperationException(String s) 949 { 950 super(s); 951 } 952 } 953 954 private TreeModelEvent branchOperations(ArrayList <String > stringsToBranch, int whatToDo) throws BranchOperationException 955 { 956 TreeModelEvent event=null; 957 final int REMOVE=0; 958 final int INSERT=1; 959 final int REMOVERESTRUCTURE=2; 960 final int INSERTRESTRUCTURE=3; 961 if (whatToDo==REMOVE) 962 Debug.println("Removing a branch......"); 963 else if (whatToDo==INSERT) 964 Debug.println("Inserting a branch......"); 965 else if (whatToDo==REMOVERESTRUCTURE) 966 Debug.println("Restructuring from branch to remove......"); 967 else if (whatToDo==INSERTRESTRUCTURE) 968 Debug.println("Restructuring from branch to insert......"); 969 else 970 throw new UnsupportedOperationException ("BranchOperations can only take 0 to remove, 1 to insert, or 2 or 3 to restructure... It spits on your integer, the pathetic little " + whatToDo); 971 Debug.println(stringsToBranch); 972 973 if (whatToDo==INSERT || whatToDo==INSERTRESTRUCTURE) 974 { 975 resetData(); 976 } 977 List <Sortables> order=st.getOrderBeforeDivider(); 979 BugAspects[] toBug=new BugAspects[stringsToBranch.size()]; 981 for (int x=0; x < stringsToBranch.size(); x++) { 982 toBug[x]=new BugAspects(); 983 984 for (int y=0; y<=x;y++) 985 { 986 Sortables s = order.get(y); 987 toBug[x].add(new StringPair(s,stringsToBranch.get(y))); 988 } 989 } 990 991 TreePath pathToBranch=new TreePath (root); 993 for (int x=0;x<stringsToBranch.size();x++) 994 { 995 BugAspects child=toBug[x]; 996 BugAspects parent=(BugAspects) pathToBranch.getLastPathComponent(); 997 if (getIndexOfChild(parent,child)!=-1) 998 { 999 pathToBranch=pathToBranch.pathByAddingChild(child); 1000 } 1001 else 1002 { 1003 Debug.println(parent + " does not contain " + child); 1004 throw new BranchOperationException("Branch has been filtered out by another filter."); 1005 } 1007 } 1008 if (pathToBranch.getParentPath()!=null) 1009 while (getChildCount(pathToBranch.getParentPath().getLastPathComponent())==1) 1010 { 1011 if (pathToBranch.getParentPath().getLastPathComponent().equals(root)) 1012 break; 1013 pathToBranch=pathToBranch.getParentPath(); 1014 } 1015 Debug.println(pathToBranch); 1016 1017 1018 if (whatToDo==INSERT) 1019 { 1020 event=new TreeModelEvent (this,pathToBranch.getParentPath(),new int[]{getIndexOfChild(pathToBranch.getParentPath().getLastPathComponent(),pathToBranch.getLastPathComponent())}, new Object []{pathToBranch.getLastPathComponent()}); 1021 } 1022 else if (whatToDo==INSERTRESTRUCTURE) 1023 { 1024 event=new TreeModelEvent (this,pathToBranch); 1025 } 1026 1027 if (whatToDo==REMOVE) 1028 { 1029 event=new TreeModelEvent (this,pathToBranch.getParentPath(),new int[]{getIndexOfChild(pathToBranch.getParentPath().getLastPathComponent(),pathToBranch.getLastPathComponent())}, new Object []{pathToBranch.getLastPathComponent()}); 1030 1031 } 1032 else if (whatToDo==REMOVERESTRUCTURE) 1033 { 1034 event=new TreeModelEvent (this,pathToBranch); 1035 } 1036 1037 if (whatToDo==REMOVE || whatToDo==REMOVERESTRUCTURE) 1038 resetData(); 1039 1040 return event; 1041 } 1042 1043 void sendEvent(TreeModelEvent event, int whatToDo) 1044 { 1045 final int REMOVE=0; 1046 final int INSERT=1; 1047 final int RESTRUCTURE=2; 1048 if (event==null) 1049 { 1050 throw new IllegalStateException ("Dont throw null events."); 1051 } 1052 resetData(); 1053 for (TreeModelListener l: listeners) 1054 { 1055 if (whatToDo==REMOVE) 1056 l.treeNodesRemoved(event); 1057 else if (whatToDo==INSERT) 1058 { 1059 l.treeNodesInserted(event); 1060 l.treeStructureChanged(new TreeModelEvent (this,new TreePath (event.getPath()).pathByAddingChild(event.getChildren()[0]))); 1061 } 1062 else if (whatToDo==RESTRUCTURE) 1063 { 1064 l.treeStructureChanged(event); 1065 } 1066 } 1067 1068 root.setCount(data.size()); 1069 TreePath changedPath=new TreePath (root); 1070 treeNodeChanged(changedPath); 1071 changedPath=new TreePath (event.getPath()); 1072 while (changedPath.getParentPath()!=null) 1073 { 1074 treeNodeChanged(changedPath); 1075 changedPath=changedPath.getParentPath(); 1076 } 1077 } 1078 } | Popular Tags |