home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / javax / swing / JTree.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  23.9 KB  |  1,427 lines

  1. package javax.swing;
  2.  
  3. import java.awt.AWTEvent;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.LayoutManager;
  8. import java.awt.Point;
  9. import java.awt.Rectangle;
  10. import java.awt.event.InputEvent;
  11. import java.awt.event.MouseEvent;
  12. import java.io.IOException;
  13. import java.io.ObjectInputStream;
  14. import java.io.ObjectOutputStream;
  15. import java.io.Serializable;
  16. import java.util.Enumeration;
  17. import java.util.Hashtable;
  18. import java.util.Stack;
  19. import java.util.Vector;
  20. import javax.accessibility.Accessible;
  21. import javax.accessibility.AccessibleContext;
  22. import javax.accessibility.AccessibleState;
  23. import javax.swing.event.TreeExpansionEvent;
  24. import javax.swing.event.TreeExpansionListener;
  25. import javax.swing.event.TreeModelEvent;
  26. import javax.swing.event.TreeModelListener;
  27. import javax.swing.event.TreeSelectionEvent;
  28. import javax.swing.event.TreeSelectionListener;
  29. import javax.swing.event.TreeWillExpandListener;
  30. import javax.swing.plaf.TreeUI;
  31. import javax.swing.tree.DefaultMutableTreeNode;
  32. import javax.swing.tree.DefaultTreeModel;
  33. import javax.swing.tree.DefaultTreeSelectionModel;
  34. import javax.swing.tree.ExpandVetoException;
  35. import javax.swing.tree.TreeCellEditor;
  36. import javax.swing.tree.TreeCellRenderer;
  37. import javax.swing.tree.TreeModel;
  38. import javax.swing.tree.TreeNode;
  39. import javax.swing.tree.TreePath;
  40. import javax.swing.tree.TreeSelectionModel;
  41.  
  42. public class JTree extends JComponent implements Scrollable, Accessible {
  43.    private static final String uiClassID = "TreeUI";
  44.    protected transient TreeModel treeModel;
  45.    protected transient TreeSelectionModel selectionModel;
  46.    protected boolean rootVisible;
  47.    protected transient TreeCellRenderer cellRenderer;
  48.    protected int rowHeight;
  49.    private transient Hashtable expandedState;
  50.    protected boolean showsRootHandles;
  51.    protected transient TreeSelectionRedirector selectionRedirector;
  52.    protected transient TreeCellEditor cellEditor;
  53.    protected boolean editable;
  54.    protected boolean largeModel;
  55.    protected int visibleRowCount;
  56.    protected boolean invokesStopCellEditing;
  57.    protected boolean scrollsOnExpand;
  58.    protected int toggleClickCount;
  59.    protected transient TreeModelListener treeModelListener;
  60.    private transient Stack expandedStack;
  61.    private TreePath leadPath;
  62.    private TreePath anchorPath;
  63.    private boolean expandsSelectedPaths;
  64.    private boolean settingUI;
  65.    private transient TreeExpansionListener uiTreeExpansionListener;
  66.    private static int TEMP_STACK_SIZE = 11;
  67.    public static final String CELL_RENDERER_PROPERTY = "cellRenderer";
  68.    public static final String TREE_MODEL_PROPERTY = "model";
  69.    public static final String ROOT_VISIBLE_PROPERTY = "rootVisible";
  70.    public static final String SHOWS_ROOT_HANDLES_PROPERTY = "showsRootHandles";
  71.    public static final String ROW_HEIGHT_PROPERTY = "rowHeight";
  72.    public static final String CELL_EDITOR_PROPERTY = "cellEditor";
  73.    public static final String EDITABLE_PROPERTY = "editable";
  74.    public static final String LARGE_MODEL_PROPERTY = "largeModel";
  75.    public static final String SELECTION_MODEL_PROPERTY = "selectionModel";
  76.    public static final String VISIBLE_ROW_COUNT_PROPERTY = "visibleRowCount";
  77.    public static final String INVOKES_STOP_CELL_EDITING_PROPERTY = "invokesStopCellEditing";
  78.    public static final String SCROLLS_ON_EXPAND_PROPERTY = "scrollsOnExpand";
  79.    public static final String TOGGLE_CLICK_COUNT_PROPERTY = "toggleClickCount";
  80.    public static final String LEAD_SELECTION_PATH_PROPERTY = "leadSelectionPath";
  81.    public static final String ANCHOR_SELECTION_PATH_PROPERTY = "anchorSelectionPath";
  82.    public static final String EXPANDS_SELECTED_PATHS_PROPERTY = "expandsSelectedPaths";
  83.    // $FF: synthetic field
  84.    static Class class$javax$swing$event$TreeExpansionListener;
  85.    // $FF: synthetic field
  86.    static Class class$javax$swing$event$TreeWillExpandListener;
  87.    // $FF: synthetic field
  88.    static Class class$javax$swing$event$TreeSelectionListener;
  89.  
  90.    protected static TreeModel getDefaultTreeModel() {
  91.       DefaultMutableTreeNode var0 = new DefaultMutableTreeNode("JTree");
  92.       DefaultMutableTreeNode var1 = new DefaultMutableTreeNode("colors");
  93.       var0.add(var1);
  94.       var1.add(new DefaultMutableTreeNode("blue"));
  95.       var1.add(new DefaultMutableTreeNode("violet"));
  96.       var1.add(new DefaultMutableTreeNode("red"));
  97.       var1.add(new DefaultMutableTreeNode("yellow"));
  98.       var1 = new DefaultMutableTreeNode("sports");
  99.       var0.add(var1);
  100.       var1.add(new DefaultMutableTreeNode("basketball"));
  101.       var1.add(new DefaultMutableTreeNode("soccer"));
  102.       var1.add(new DefaultMutableTreeNode("football"));
  103.       var1.add(new DefaultMutableTreeNode("hockey"));
  104.       var1 = new DefaultMutableTreeNode("food");
  105.       var0.add(var1);
  106.       var1.add(new DefaultMutableTreeNode("hot dogs"));
  107.       var1.add(new DefaultMutableTreeNode("pizza"));
  108.       var1.add(new DefaultMutableTreeNode("ravioli"));
  109.       var1.add(new DefaultMutableTreeNode("bananas"));
  110.       return new DefaultTreeModel(var0);
  111.    }
  112.  
  113.    protected static TreeModel createTreeModel(Object var0) {
  114.       Object var1;
  115.       if (!(var0 instanceof Object[]) && !(var0 instanceof Hashtable) && !(var0 instanceof Vector)) {
  116.          var1 = new DynamicUtilTreeNode("root", var0);
  117.       } else {
  118.          var1 = new DefaultMutableTreeNode("root");
  119.          javax.swing.JTree.DynamicUtilTreeNode.createChildren((DefaultMutableTreeNode)var1, var0);
  120.       }
  121.  
  122.       return new DefaultTreeModel((TreeNode)var1, false);
  123.    }
  124.  
  125.    public JTree() {
  126.       this(getDefaultTreeModel());
  127.    }
  128.  
  129.    public JTree(Object[] var1) {
  130.       this(createTreeModel(var1));
  131.       this.setRootVisible(false);
  132.       this.setShowsRootHandles(true);
  133.    }
  134.  
  135.    public JTree(Vector var1) {
  136.       this(createTreeModel(var1));
  137.       this.setRootVisible(false);
  138.       this.setShowsRootHandles(true);
  139.    }
  140.  
  141.    public JTree(Hashtable var1) {
  142.       this(createTreeModel(var1));
  143.       this.setRootVisible(false);
  144.       this.setShowsRootHandles(true);
  145.    }
  146.  
  147.    public JTree(TreeNode var1) {
  148.       this(var1, false);
  149.    }
  150.  
  151.    public JTree(TreeNode var1, boolean var2) {
  152.       this((TreeModel)(new DefaultTreeModel(var1, var2)));
  153.    }
  154.  
  155.    public JTree(TreeModel var1) {
  156.       this.expandedStack = new Stack();
  157.       this.toggleClickCount = 2;
  158.       this.expandedState = new Hashtable();
  159.       ((Container)this).setLayout((LayoutManager)null);
  160.       this.rowHeight = 16;
  161.       this.visibleRowCount = 20;
  162.       this.rootVisible = true;
  163.       this.selectionModel = new DefaultTreeSelectionModel();
  164.       this.cellRenderer = null;
  165.       this.scrollsOnExpand = true;
  166.       ((JComponent)this).setOpaque(true);
  167.       this.expandsSelectedPaths = true;
  168.       this.updateUI();
  169.       this.setModel(var1);
  170.    }
  171.  
  172.    public TreeUI getUI() {
  173.       return (TreeUI)super.ui;
  174.    }
  175.  
  176.    public void setUI(TreeUI var1) {
  177.       if ((TreeUI)super.ui != var1) {
  178.          this.settingUI = true;
  179.          this.uiTreeExpansionListener = null;
  180.  
  181.          try {
  182.             super.setUI(var1);
  183.          } finally {
  184.             this.settingUI = false;
  185.          }
  186.       }
  187.  
  188.    }
  189.  
  190.    public void updateUI() {
  191.       this.setUI((TreeUI)UIManager.getUI(this));
  192.       ((Container)this).invalidate();
  193.    }
  194.  
  195.    public String getUIClassID() {
  196.       return "TreeUI";
  197.    }
  198.  
  199.    public TreeCellRenderer getCellRenderer() {
  200.       return this.cellRenderer;
  201.    }
  202.  
  203.    public void setCellRenderer(TreeCellRenderer var1) {
  204.       TreeCellRenderer var2 = this.cellRenderer;
  205.       this.cellRenderer = var1;
  206.       ((JComponent)this).firePropertyChange("cellRenderer", var2, this.cellRenderer);
  207.       ((Container)this).invalidate();
  208.    }
  209.  
  210.    public void setEditable(boolean var1) {
  211.       boolean var2 = this.editable;
  212.       this.editable = var1;
  213.       ((JComponent)this).firePropertyChange("editable", var2, var1);
  214.       if (super.accessibleContext != null) {
  215.          super.accessibleContext.firePropertyChange("AccessibleState", var2 ? AccessibleState.EDITABLE : null, var1 ? AccessibleState.EDITABLE : null);
  216.       }
  217.  
  218.    }
  219.  
  220.    public boolean isEditable() {
  221.       return this.editable;
  222.    }
  223.  
  224.    public void setCellEditor(TreeCellEditor var1) {
  225.       TreeCellEditor var2 = this.cellEditor;
  226.       this.cellEditor = var1;
  227.       ((JComponent)this).firePropertyChange("cellEditor", var2, var1);
  228.       ((Container)this).invalidate();
  229.    }
  230.  
  231.    public TreeCellEditor getCellEditor() {
  232.       return this.cellEditor;
  233.    }
  234.  
  235.    public TreeModel getModel() {
  236.       return this.treeModel;
  237.    }
  238.  
  239.    public void setModel(TreeModel var1) {
  240.       TreeModel var2 = this.treeModel;
  241.       if (this.treeModel != null && this.treeModelListener != null) {
  242.          this.treeModel.removeTreeModelListener(this.treeModelListener);
  243.       }
  244.  
  245.       if (super.accessibleContext != null) {
  246.          if (this.treeModel != null) {
  247.             this.treeModel.removeTreeModelListener((TreeModelListener)super.accessibleContext);
  248.          }
  249.  
  250.          if (var1 != null) {
  251.             var1.addTreeModelListener((TreeModelListener)super.accessibleContext);
  252.          }
  253.       }
  254.  
  255.       this.treeModel = var1;
  256.       this.clearToggledPaths();
  257.       if (this.treeModel != null) {
  258.          if (this.treeModelListener == null) {
  259.             this.treeModelListener = this.createTreeModelListener();
  260.          }
  261.  
  262.          if (this.treeModelListener != null) {
  263.             this.treeModel.addTreeModelListener(this.treeModelListener);
  264.          }
  265.  
  266.          if (!this.treeModel.isLeaf(this.treeModel.getRoot())) {
  267.             this.expandedState.put(new TreePath(this.treeModel.getRoot()), Boolean.TRUE);
  268.          }
  269.       }
  270.  
  271.       ((JComponent)this).firePropertyChange("model", var2, this.treeModel);
  272.       ((Container)this).invalidate();
  273.    }
  274.  
  275.    public boolean isRootVisible() {
  276.       return this.rootVisible;
  277.    }
  278.  
  279.    public void setRootVisible(boolean var1) {
  280.       boolean var2 = this.rootVisible;
  281.       this.rootVisible = var1;
  282.       ((JComponent)this).firePropertyChange("rootVisible", var2, this.rootVisible);
  283.       if (super.accessibleContext != null) {
  284.          ((AccessibleJTree)super.accessibleContext).fireVisibleDataPropertyChange();
  285.       }
  286.  
  287.    }
  288.  
  289.    public void setShowsRootHandles(boolean var1) {
  290.       boolean var2 = this.showsRootHandles;
  291.       TreeModel var3 = this.getModel();
  292.       this.showsRootHandles = var1;
  293.       ((JComponent)this).firePropertyChange("showsRootHandles", var2, this.showsRootHandles);
  294.       if (super.accessibleContext != null) {
  295.          ((AccessibleJTree)super.accessibleContext).fireVisibleDataPropertyChange();
  296.       }
  297.  
  298.       if (var3 != null) {
  299.          this.expandPath(new TreePath(var3.getRoot()));
  300.       }
  301.  
  302.       ((Container)this).invalidate();
  303.    }
  304.  
  305.    public boolean getShowsRootHandles() {
  306.       return this.showsRootHandles;
  307.    }
  308.  
  309.    public void setRowHeight(int var1) {
  310.       int var2 = this.rowHeight;
  311.       this.rowHeight = var1;
  312.       ((JComponent)this).firePropertyChange("rowHeight", var2, this.rowHeight);
  313.       ((Container)this).invalidate();
  314.    }
  315.  
  316.    public int getRowHeight() {
  317.       return this.rowHeight;
  318.    }
  319.  
  320.    public boolean isFixedRowHeight() {
  321.       return this.rowHeight > 0;
  322.    }
  323.  
  324.    public void setLargeModel(boolean var1) {
  325.       boolean var2 = this.largeModel;
  326.       this.largeModel = var1;
  327.       ((JComponent)this).firePropertyChange("largeModel", var2, var1);
  328.    }
  329.  
  330.    public boolean isLargeModel() {
  331.       return this.largeModel;
  332.    }
  333.  
  334.    public void setInvokesStopCellEditing(boolean var1) {
  335.       boolean var2 = this.invokesStopCellEditing;
  336.       this.invokesStopCellEditing = var1;
  337.       ((JComponent)this).firePropertyChange("invokesStopCellEditing", var2, var1);
  338.    }
  339.  
  340.    public boolean getInvokesStopCellEditing() {
  341.       return this.invokesStopCellEditing;
  342.    }
  343.  
  344.    public void setScrollsOnExpand(boolean var1) {
  345.       boolean var2 = this.scrollsOnExpand;
  346.       this.scrollsOnExpand = var1;
  347.       ((JComponent)this).firePropertyChange("scrollsOnExpand", var2, var1);
  348.    }
  349.  
  350.    public boolean getScrollsOnExpand() {
  351.       return this.scrollsOnExpand;
  352.    }
  353.  
  354.    public void setToggleClickCount(int var1) {
  355.       int var2 = this.toggleClickCount;
  356.       this.toggleClickCount = var1;
  357.       ((JComponent)this).firePropertyChange("toggleClickCount", var2, var1);
  358.    }
  359.  
  360.    public int getToggleClickCount() {
  361.       return this.toggleClickCount;
  362.    }
  363.  
  364.    public void setExpandsSelectedPaths(boolean var1) {
  365.       boolean var2 = this.expandsSelectedPaths;
  366.       this.expandsSelectedPaths = var1;
  367.       ((JComponent)this).firePropertyChange("expandsSelectedPaths", var2, var1);
  368.    }
  369.  
  370.    public boolean getExpandsSelectedPaths() {
  371.       return this.expandsSelectedPaths;
  372.    }
  373.  
  374.    public boolean isPathEditable(TreePath var1) {
  375.       return this.isEditable();
  376.    }
  377.  
  378.    public String getToolTipText(MouseEvent var1) {
  379.       if (var1 != null) {
  380.          Point var2 = var1.getPoint();
  381.          int var3 = this.getRowForLocation(var2.x, var2.y);
  382.          TreeCellRenderer var4 = this.getCellRenderer();
  383.          if (var3 != -1 && var4 != null) {
  384.             TreePath var5 = this.getPathForRow(var3);
  385.             Object var6 = var5.getLastPathComponent();
  386.             Component var7 = var4.getTreeCellRendererComponent(this, var6, this.isRowSelected(var3), this.isExpanded(var3), this.getModel().isLeaf(var6), var3, true);
  387.             if (var7 instanceof JComponent) {
  388.                Rectangle var9 = this.getPathBounds(var5);
  389.                var2.translate(-var9.x, -var9.y);
  390.                MouseEvent var8 = new MouseEvent(var7, ((AWTEvent)var1).getID(), ((InputEvent)var1).getWhen(), ((InputEvent)var1).getModifiers(), var2.x, var2.y, var1.getClickCount(), var1.isPopupTrigger());
  391.                return ((JComponent)var7).getToolTipText(var8);
  392.             }
  393.          }
  394.       }
  395.  
  396.       return null;
  397.    }
  398.  
  399.    public String convertValueToText(Object var1, boolean var2, boolean var3, boolean var4, int var5, boolean var6) {
  400.       return var1 != null ? var1.toString() : "";
  401.    }
  402.  
  403.    public int getRowCount() {
  404.       TreeUI var1 = this.getUI();
  405.       return var1 != null ? var1.getRowCount(this) : 0;
  406.    }
  407.  
  408.    public void setSelectionPath(TreePath var1) {
  409.       this.getSelectionModel().setSelectionPath(var1);
  410.    }
  411.  
  412.    public void setSelectionPaths(TreePath[] var1) {
  413.       this.getSelectionModel().setSelectionPaths(var1);
  414.    }
  415.  
  416.    public void setLeadSelectionPath(TreePath var1) {
  417.       TreePath var2 = this.leadPath;
  418.       this.leadPath = var1;
  419.       ((JComponent)this).firePropertyChange("leadSelectionPath", var2, var1);
  420.    }
  421.  
  422.    public void setAnchorSelectionPath(TreePath var1) {
  423.       TreePath var2 = this.anchorPath;
  424.       this.anchorPath = var1;
  425.       ((JComponent)this).firePropertyChange("anchorSelectionPath", var2, var1);
  426.    }
  427.  
  428.    public void setSelectionRow(int var1) {
  429.       int[] var2 = new int[]{var1};
  430.       this.setSelectionRows(var2);
  431.    }
  432.  
  433.    public void setSelectionRows(int[] var1) {
  434.       TreeUI var2 = this.getUI();
  435.       if (var2 != null && var1 != null) {
  436.          int var3 = var1.length;
  437.          TreePath[] var4 = new TreePath[var3];
  438.  
  439.          for(int var5 = 0; var5 < var3; ++var5) {
  440.             var4[var5] = var2.getPathForRow(this, var1[var5]);
  441.          }
  442.  
  443.          this.setSelectionPaths(var4);
  444.       }
  445.  
  446.    }
  447.  
  448.    public void addSelectionPath(TreePath var1) {
  449.       this.getSelectionModel().addSelectionPath(var1);
  450.    }
  451.  
  452.    public void addSelectionPaths(TreePath[] var1) {
  453.       this.getSelectionModel().addSelectionPaths(var1);
  454.    }
  455.  
  456.    public void addSelectionRow(int var1) {
  457.       int[] var2 = new int[]{var1};
  458.       this.addSelectionRows(var2);
  459.    }
  460.  
  461.    public void addSelectionRows(int[] var1) {
  462.       TreeUI var2 = this.getUI();
  463.       if (var2 != null && var1 != null) {
  464.          int var3 = var1.length;
  465.          TreePath[] var4 = new TreePath[var3];
  466.  
  467.          for(int var5 = 0; var5 < var3; ++var5) {
  468.             var4[var5] = var2.getPathForRow(this, var1[var5]);
  469.          }
  470.  
  471.          this.addSelectionPaths(var4);
  472.       }
  473.  
  474.    }
  475.  
  476.    public Object getLastSelectedPathComponent() {
  477.       TreePath var1 = this.getSelectionModel().getSelectionPath();
  478.       return var1 != null ? var1.getLastPathComponent() : null;
  479.    }
  480.  
  481.    public TreePath getLeadSelectionPath() {
  482.       return this.leadPath;
  483.    }
  484.  
  485.    public TreePath getAnchorSelectionPath() {
  486.       return this.anchorPath;
  487.    }
  488.  
  489.    public TreePath getSelectionPath() {
  490.       return this.getSelectionModel().getSelectionPath();
  491.    }
  492.  
  493.    public TreePath[] getSelectionPaths() {
  494.       return this.getSelectionModel().getSelectionPaths();
  495.    }
  496.  
  497.    public int[] getSelectionRows() {
  498.       return this.getSelectionModel().getSelectionRows();
  499.    }
  500.  
  501.    public int getSelectionCount() {
  502.       return this.selectionModel.getSelectionCount();
  503.    }
  504.  
  505.    public int getMinSelectionRow() {
  506.       return this.getSelectionModel().getMinSelectionRow();
  507.    }
  508.  
  509.    public int getMaxSelectionRow() {
  510.       return this.getSelectionModel().getMaxSelectionRow();
  511.    }
  512.  
  513.    public int getLeadSelectionRow() {
  514.       TreePath var1 = this.getLeadSelectionPath();
  515.       return var1 != null ? this.getRowForPath(var1) : -1;
  516.    }
  517.  
  518.    public boolean isPathSelected(TreePath var1) {
  519.       return this.getSelectionModel().isPathSelected(var1);
  520.    }
  521.  
  522.    public boolean isRowSelected(int var1) {
  523.       return this.getSelectionModel().isRowSelected(var1);
  524.    }
  525.  
  526.    public Enumeration getExpandedDescendants(TreePath var1) {
  527.       if (!this.isExpanded(var1)) {
  528.          return null;
  529.       } else {
  530.          Enumeration var2 = this.expandedState.keys();
  531.          Vector var3 = null;
  532.          if (var2 != null) {
  533.             while(var2.hasMoreElements()) {
  534.                TreePath var4 = (TreePath)var2.nextElement();
  535.                Object var5 = this.expandedState.get(var4);
  536.                if (var4 != var1 && var5 != null && (Boolean)var5 && var1.isDescendant(var4) && this.isVisible(var4)) {
  537.                   if (var3 == null) {
  538.                      var3 = new Vector();
  539.                   }
  540.  
  541.                   var3.addElement(var4);
  542.                }
  543.             }
  544.          }
  545.  
  546.          return var3 == null ? DefaultMutableTreeNode.EMPTY_ENUMERATION : var3.elements();
  547.       }
  548.    }
  549.  
  550.    public boolean hasBeenExpanded(TreePath var1) {
  551.       return var1 != null && this.expandedState.get(var1) != null;
  552.    }
  553.  
  554.    public boolean isExpanded(TreePath var1) {
  555.       if (var1 == null) {
  556.          return false;
  557.       } else {
  558.          Object var2 = this.expandedState.get(var1);
  559.          if (var2 != null && (Boolean)var2) {
  560.             TreePath var3 = var1.getParentPath();
  561.             return var3 != null ? this.isExpanded(var3) : true;
  562.          } else {
  563.             return false;
  564.          }
  565.       }
  566.    }
  567.  
  568.    public boolean isExpanded(int var1) {
  569.       TreeUI var2 = this.getUI();
  570.       if (var2 != null) {
  571.          TreePath var3 = var2.getPathForRow(this, var1);
  572.          if (var3 != null) {
  573.             return this.isExpanded(var3);
  574.          }
  575.       }
  576.  
  577.       return false;
  578.    }
  579.  
  580.    public boolean isCollapsed(TreePath var1) {
  581.       return !this.isExpanded(var1);
  582.    }
  583.  
  584.    public boolean isCollapsed(int var1) {
  585.       return !this.isExpanded(var1);
  586.    }
  587.  
  588.    public void makeVisible(TreePath var1) {
  589.       if (var1 != null) {
  590.          TreePath var2 = var1.getParentPath();
  591.          if (var2 != null) {
  592.             this.expandPath(var2);
  593.          }
  594.       }
  595.  
  596.    }
  597.  
  598.    public boolean isVisible(TreePath var1) {
  599.       if (var1 != null) {
  600.          TreePath var2 = var1.getParentPath();
  601.          return var2 != null ? this.isExpanded(var2) : true;
  602.       } else {
  603.          return false;
  604.       }
  605.    }
  606.  
  607.    public Rectangle getPathBounds(TreePath var1) {
  608.       TreeUI var2 = this.getUI();
  609.       return var2 != null ? var2.getPathBounds(this, var1) : null;
  610.    }
  611.  
  612.    public Rectangle getRowBounds(int var1) {
  613.       this.getPathForRow(var1);
  614.       return this.getPathBounds(this.getPathForRow(var1));
  615.    }
  616.  
  617.    public void scrollPathToVisible(TreePath var1) {
  618.       if (var1 != null) {
  619.          this.makeVisible(var1);
  620.          Rectangle var2 = this.getPathBounds(var1);
  621.          if (var2 != null) {
  622.             ((JComponent)this).scrollRectToVisible(var2);
  623.             if (super.accessibleContext != null) {
  624.                ((AccessibleJTree)super.accessibleContext).fireVisibleDataPropertyChange();
  625.             }
  626.          }
  627.       }
  628.  
  629.    }
  630.  
  631.    public void scrollRowToVisible(int var1) {
  632.       this.scrollPathToVisible(this.getPathForRow(var1));
  633.    }
  634.  
  635.    public TreePath getPathForRow(int var1) {
  636.       TreeUI var2 = this.getUI();
  637.       return var2 != null ? var2.getPathForRow(this, var1) : null;
  638.    }
  639.  
  640.    public int getRowForPath(TreePath var1) {
  641.       TreeUI var2 = this.getUI();
  642.       return var2 != null ? var2.getRowForPath(this, var1) : -1;
  643.    }
  644.  
  645.    public void expandPath(TreePath var1) {
  646.       TreeModel var2 = this.getModel();
  647.       if (var1 != null && var2 != null && !var2.isLeaf(var1.getLastPathComponent())) {
  648.          this.setExpandedState(var1, true);
  649.       }
  650.  
  651.    }
  652.  
  653.    public void expandRow(int var1) {
  654.       this.expandPath(this.getPathForRow(var1));
  655.    }
  656.  
  657.    public void collapsePath(TreePath var1) {
  658.       this.setExpandedState(var1, false);
  659.    }
  660.  
  661.    public void collapseRow(int var1) {
  662.       this.collapsePath(this.getPathForRow(var1));
  663.    }
  664.  
  665.    public TreePath getPathForLocation(int var1, int var2) {
  666.       TreePath var3 = this.getClosestPathForLocation(var1, var2);
  667.       if (var3 != null) {
  668.          Rectangle var4 = this.getPathBounds(var3);
  669.          if (var1 >= var4.x && var1 < var4.x + var4.width && var2 >= var4.y && var2 < var4.y + var4.height) {
  670.             return var3;
  671.          }
  672.       }
  673.  
  674.       return null;
  675.    }
  676.  
  677.    public int getRowForLocation(int var1, int var2) {
  678.       return this.getRowForPath(this.getPathForLocation(var1, var2));
  679.    }
  680.  
  681.    public TreePath getClosestPathForLocation(int var1, int var2) {
  682.       TreeUI var3 = this.getUI();
  683.       return var3 != null ? var3.getClosestPathForLocation(this, var1, var2) : null;
  684.    }
  685.  
  686.    public int getClosestRowForLocation(int var1, int var2) {
  687.       return this.getRowForPath(this.getClosestPathForLocation(var1, var2));
  688.    }
  689.  
  690.    public boolean isEditing() {
  691.       TreeUI var1 = this.getUI();
  692.       return var1 != null ? var1.isEditing(this) : false;
  693.    }
  694.  
  695.    public boolean stopEditing() {
  696.       TreeUI var1 = this.getUI();
  697.       return var1 != null ? var1.stopEditing(this) : false;
  698.    }
  699.  
  700.    public void cancelEditing() {
  701.       TreeUI var1 = this.getUI();
  702.       if (var1 != null) {
  703.          var1.cancelEditing(this);
  704.       }
  705.  
  706.    }
  707.  
  708.    public void startEditingAtPath(TreePath var1) {
  709.       TreeUI var2 = this.getUI();
  710.       if (var2 != null) {
  711.          var2.startEditingAtPath(this, var1);
  712.       }
  713.  
  714.    }
  715.  
  716.    public TreePath getEditingPath() {
  717.       TreeUI var1 = this.getUI();
  718.       return var1 != null ? var1.getEditingPath(this) : null;
  719.    }
  720.  
  721.    public void setSelectionModel(TreeSelectionModel var1) {
  722.       if (var1 == null) {
  723.          var1 = javax.swing.JTree.EmptySelectionModel.sharedInstance();
  724.       }
  725.  
  726.       TreeSelectionModel var2 = this.selectionModel;
  727.       if (this.selectionModel != null && this.selectionRedirector != null) {
  728.          this.selectionModel.removeTreeSelectionListener(this.selectionRedirector);
  729.       }
  730.  
  731.       if (super.accessibleContext != null) {
  732.          this.selectionModel.removeTreeSelectionListener((TreeSelectionListener)super.accessibleContext);
  733.          ((TreeSelectionModel)var1).addTreeSelectionListener((TreeSelectionListener)super.accessibleContext);
  734.       }
  735.  
  736.       this.selectionModel = (TreeSelectionModel)var1;
  737.       if (this.selectionRedirector != null) {
  738.          this.selectionModel.addTreeSelectionListener(this.selectionRedirector);
  739.       }
  740.  
  741.       ((JComponent)this).firePropertyChange("selectionModel", var2, this.selectionModel);
  742.       if (super.accessibleContext != null) {
  743.          super.accessibleContext.firePropertyChange("AccessibleSelection", new Boolean(false), new Boolean(true));
  744.       }
  745.  
  746.    }
  747.  
  748.    public TreeSelectionModel getSelectionModel() {
  749.       return this.selectionModel;
  750.    }
  751.  
  752.    protected TreePath[] getPathBetweenRows(int var1, int var2) {
  753.       TreeUI var5 = this.getUI();
  754.       int var3 = Math.min(var1, var2);
  755.       int var4 = Math.max(var1, var2);
  756.       if (var5 == null) {
  757.          return null;
  758.       } else {
  759.          TreePath[] var6 = new TreePath[var4 - var3 + 1];
  760.  
  761.          for(int var7 = var3; var7 <= var4; ++var7) {
  762.             var6[var7 - var3] = var5.getPathForRow(this, var7);
  763.          }
  764.  
  765.          return var6;
  766.       }
  767.    }
  768.  
  769.    public void setSelectionInterval(int var1, int var2) {
  770.       TreePath[] var3 = this.getPathBetweenRows(var1, var2);
  771.       this.getSelectionModel().setSelectionPaths(var3);
  772.    }
  773.  
  774.    public void addSelectionInterval(int var1, int var2) {
  775.       TreePath[] var3 = this.getPathBetweenRows(var1, var2);
  776.       this.getSelectionModel().addSelectionPaths(var3);
  777.    }
  778.  
  779.    public void removeSelectionInterval(int var1, int var2) {
  780.       TreePath[] var3 = this.getPathBetweenRows(var1, var2);
  781.       this.getSelectionModel().removeSelectionPaths(var3);
  782.    }
  783.  
  784.    public void removeSelectionPath(TreePath var1) {
  785.       this.getSelectionModel().removeSelectionPath(var1);
  786.    }
  787.  
  788.    public void removeSelectionPaths(TreePath[] var1) {
  789.       this.getSelectionModel().removeSelectionPaths(var1);
  790.    }
  791.  
  792.    public void removeSelectionRow(int var1) {
  793.       int[] var2 = new int[]{var1};
  794.       this.removeSelectionRows(var2);
  795.    }
  796.  
  797.    public void removeSelectionRows(int[] var1) {
  798.       TreeUI var2 = this.getUI();
  799.       if (var2 != null && var1 != null) {
  800.          int var3 = var1.length;
  801.          TreePath[] var4 = new TreePath[var3];
  802.  
  803.          for(int var5 = 0; var5 < var3; ++var5) {
  804.             var4[var5] = var2.getPathForRow(this, var1[var5]);
  805.          }
  806.  
  807.          this.removeSelectionPaths(var4);
  808.       }
  809.  
  810.    }
  811.  
  812.    public void clearSelection() {
  813.       this.getSelectionModel().clearSelection();
  814.    }
  815.  
  816.    public boolean isSelectionEmpty() {
  817.       return this.getSelectionModel().isSelectionEmpty();
  818.    }
  819.  
  820.    public void addTreeExpansionListener(TreeExpansionListener var1) {
  821.       if (this.settingUI) {
  822.          this.uiTreeExpansionListener = var1;
  823.       }
  824.  
  825.       super.listenerList.add(class$javax$swing$event$TreeExpansionListener == null ? (class$javax$swing$event$TreeExpansionListener = class$("javax.swing.event.TreeExpansionListener")) : class$javax$swing$event$TreeExpansionListener, var1);
  826.    }
  827.  
  828.    public void removeTreeExpansionListener(TreeExpansionListener var1) {
  829.       super.listenerList.remove(class$javax$swing$event$TreeExpansionListener == null ? (class$javax$swing$event$TreeExpansionListener = class$("javax.swing.event.TreeExpansionListener")) : class$javax$swing$event$TreeExpansionListener, var1);
  830.       if (this.uiTreeExpansionListener == var1) {
  831.          this.uiTreeExpansionListener = null;
  832.       }
  833.  
  834.    }
  835.  
  836.    public void addTreeWillExpandListener(TreeWillExpandListener var1) {
  837.       super.listenerList.add(class$javax$swing$event$TreeWillExpandListener == null ? (class$javax$swing$event$TreeWillExpandListener = class$("javax.swing.event.TreeWillExpandListener")) : class$javax$swing$event$TreeWillExpandListener, var1);
  838.    }
  839.  
  840.    public void removeTreeWillExpandListener(TreeWillExpandListener var1) {
  841.       super.listenerList.remove(class$javax$swing$event$TreeWillExpandListener == null ? (class$javax$swing$event$TreeWillExpandListener = class$("javax.swing.event.TreeWillExpandListener")) : class$javax$swing$event$TreeWillExpandListener, var1);
  842.    }
  843.  
  844.    public void fireTreeExpanded(TreePath var1) {
  845.       Object[] var2 = super.listenerList.getListenerList();
  846.       TreeExpansionEvent var3 = null;
  847.       if (this.uiTreeExpansionListener != null) {
  848.          var3 = new TreeExpansionEvent(this, var1);
  849.          this.uiTreeExpansionListener.treeExpanded(var3);
  850.       }
  851.  
  852.       for(int var4 = var2.length - 2; var4 >= 0; var4 -= 2) {
  853.          if (var2[var4] == (class$javax$swing$event$TreeExpansionListener == null ? (class$javax$swing$event$TreeExpansionListener = class$("javax.swing.event.TreeExpansionListener")) : class$javax$swing$event$TreeExpansionListener) && var2[var4 + 1] != this.uiTreeExpansionListener) {
  854.             if (var3 == null) {
  855.                var3 = new TreeExpansionEvent(this, var1);
  856.             }
  857.  
  858.             ((TreeExpansionListener)var2[var4 + 1]).treeExpanded(var3);
  859.          }
  860.       }
  861.  
  862.    }
  863.  
  864.    public void fireTreeCollapsed(TreePath var1) {
  865.       Object[] var2 = super.listenerList.getListenerList();
  866.       TreeExpansionEvent var3 = null;
  867.       if (this.uiTreeExpansionListener != null) {
  868.          var3 = new TreeExpansionEvent(this, var1);
  869.          this.uiTreeExpansionListener.treeCollapsed(var3);
  870.       }
  871.  
  872.       for(int var4 = var2.length - 2; var4 >= 0; var4 -= 2) {
  873.          if (var2[var4] == (class$javax$swing$event$TreeExpansionListener == null ? (class$javax$swing$event$TreeExpansionListener = class$("javax.swing.event.TreeExpansionListener")) : class$javax$swing$event$TreeExpansionListener) && var2[var4 + 1] != this.uiTreeExpansionListener) {
  874.             if (var3 == null) {
  875.                var3 = new TreeExpansionEvent(this, var1);
  876.             }
  877.  
  878.             ((TreeExpansionListener)var2[var4 + 1]).treeCollapsed(var3);
  879.          }
  880.       }
  881.  
  882.    }
  883.  
  884.    public void fireTreeWillExpand(TreePath var1) throws ExpandVetoException {
  885.       Object[] var2 = super.listenerList.getListenerList();
  886.       TreeExpansionEvent var3 = null;
  887.  
  888.       for(int var4 = var2.length - 2; var4 >= 0; var4 -= 2) {
  889.          if (var2[var4] == (class$javax$swing$event$TreeWillExpandListener == null ? (class$javax$swing$event$TreeWillExpandListener = class$("javax.swing.event.TreeWillExpandListener")) : class$javax$swing$event$TreeWillExpandListener)) {
  890.             if (var3 == null) {
  891.                var3 = new TreeExpansionEvent(this, var1);
  892.             }
  893.  
  894.             ((TreeWillExpandListener)var2[var4 + 1]).treeWillExpand(var3);
  895.          }
  896.       }
  897.  
  898.    }
  899.  
  900.    public void fireTreeWillCollapse(TreePath var1) throws ExpandVetoException {
  901.       Object[] var2 = super.listenerList.getListenerList();
  902.       TreeExpansionEvent var3 = null;
  903.  
  904.       for(int var4 = var2.length - 2; var4 >= 0; var4 -= 2) {
  905.          if (var2[var4] == (class$javax$swing$event$TreeWillExpandListener == null ? (class$javax$swing$event$TreeWillExpandListener = class$("javax.swing.event.TreeWillExpandListener")) : class$javax$swing$event$TreeWillExpandListener)) {
  906.             if (var3 == null) {
  907.                var3 = new TreeExpansionEvent(this, var1);
  908.             }
  909.  
  910.             ((TreeWillExpandListener)var2[var4 + 1]).treeWillCollapse(var3);
  911.          }
  912.       }
  913.  
  914.    }
  915.  
  916.    public void addTreeSelectionListener(TreeSelectionListener var1) {
  917.       super.listenerList.add(class$javax$swing$event$TreeSelectionListener == null ? (class$javax$swing$event$TreeSelectionListener = class$("javax.swing.event.TreeSelectionListener")) : class$javax$swing$event$TreeSelectionListener, var1);
  918.       if (super.listenerList.getListenerCount(class$javax$swing$event$TreeSelectionListener == null ? (class$javax$swing$event$TreeSelectionListener = class$("javax.swing.event.TreeSelectionListener")) : class$javax$swing$event$TreeSelectionListener) != 0 && this.selectionRedirector == null) {
  919.          this.selectionRedirector = new TreeSelectionRedirector(this);
  920.          this.selectionModel.addTreeSelectionListener(this.selectionRedirector);
  921.       }
  922.  
  923.    }
  924.  
  925.    public void removeTreeSelectionListener(TreeSelectionListener var1) {
  926.       super.listenerList.remove(class$javax$swing$event$TreeSelectionListener == null ? (class$javax$swing$event$TreeSelectionListener = class$("javax.swing.event.TreeSelectionListener")) : class$javax$swing$event$TreeSelectionListener, var1);
  927.       if (super.listenerList.getListenerCount(class$javax$swing$event$TreeSelectionListener == null ? (class$javax$swing$event$TreeSelectionListener = class$("javax.swing.event.TreeSelectionListener")) : class$javax$swing$event$TreeSelectionListener) == 0 && this.selectionRedirector != null) {
  928.          this.selectionModel.removeTreeSelectionListener(this.selectionRedirector);
  929.          this.selectionRedirector = null;
  930.       }
  931.  
  932.    }
  933.  
  934.    protected void fireValueChanged(TreeSelectionEvent var1) {
  935.       Object[] var2 = super.listenerList.getListenerList();
  936.  
  937.       for(int var3 = var2.length - 2; var3 >= 0; var3 -= 2) {
  938.          if (var2[var3] == (class$javax$swing$event$TreeSelectionListener == null ? (class$javax$swing$event$TreeSelectionListener = class$("javax.swing.event.TreeSelectionListener")) : class$javax$swing$event$TreeSelectionListener)) {
  939.             ((TreeSelectionListener)var2[var3 + 1]).valueChanged(var1);
  940.          }
  941.       }
  942.  
  943.    }
  944.  
  945.    public void treeDidChange() {
  946.       ((JComponent)this).revalidate();
  947.       ((Component)this).repaint();
  948.    }
  949.  
  950.    public void setVisibleRowCount(int var1) {
  951.       int var2 = this.visibleRowCount;
  952.       this.visibleRowCount = var1;
  953.       ((JComponent)this).firePropertyChange("visibleRowCount", var2, this.visibleRowCount);
  954.       ((Container)this).invalidate();
  955.       if (super.accessibleContext != null) {
  956.          ((AccessibleJTree)super.accessibleContext).fireVisibleDataPropertyChange();
  957.       }
  958.  
  959.    }
  960.  
  961.    public int getVisibleRowCount() {
  962.       return this.visibleRowCount;
  963.    }
  964.  
  965.    private void writeObject(ObjectOutputStream var1) throws IOException {
  966.       Vector var2 = new Vector();
  967.       var1.defaultWriteObject();
  968.       if (this.cellRenderer != null && this.cellRenderer instanceof Serializable) {
  969.          var2.addElement("cellRenderer");
  970.          var2.addElement(this.cellRenderer);
  971.       }
  972.  
  973.       if (this.cellEditor != null && this.cellEditor instanceof Serializable) {
  974.          var2.addElement("cellEditor");
  975.          var2.addElement(this.cellEditor);
  976.       }
  977.  
  978.       if (this.treeModel != null && this.treeModel instanceof Serializable) {
  979.          var2.addElement("treeModel");
  980.          var2.addElement(this.treeModel);
  981.       }
  982.  
  983.       if (this.selectionModel != null && this.selectionModel instanceof Serializable) {
  984.          var2.addElement("selectionModel");
  985.          var2.addElement(this.selectionModel);
  986.       }
  987.  
  988.       Object var3 = this.getArchivableExpandedState();
  989.       if (var3 != null) {
  990.          var2.addElement("expandedState");
  991.          var2.addElement(var3);
  992.       }
  993.  
  994.       var1.writeObject(var2);
  995.       if (super.ui != null && this.getUIClassID().equals("TreeUI")) {
  996.          super.ui.installUI(this);
  997.       }
  998.  
  999.    }
  1000.  
  1001.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  1002.       var1.defaultReadObject();
  1003.       this.expandedState = new Hashtable();
  1004.       this.expandedStack = new Stack();
  1005.       Vector var2 = (Vector)var1.readObject();
  1006.       int var3 = 0;
  1007.       int var4 = var2.size();
  1008.       if (var3 < var4 && var2.elementAt(var3).equals("cellRenderer")) {
  1009.          ++var3;
  1010.          this.cellRenderer = (TreeCellRenderer)var2.elementAt(var3);
  1011.          ++var3;
  1012.       }
  1013.  
  1014.       if (var3 < var4 && var2.elementAt(var3).equals("cellEditor")) {
  1015.          ++var3;
  1016.          this.cellEditor = (TreeCellEditor)var2.elementAt(var3);
  1017.          ++var3;
  1018.       }
  1019.  
  1020.       if (var3 < var4 && var2.elementAt(var3).equals("treeModel")) {
  1021.          ++var3;
  1022.          this.treeModel = (TreeModel)var2.elementAt(var3);
  1023.          ++var3;
  1024.       }
  1025.  
  1026.       if (var3 < var4 && var2.elementAt(var3).equals("selectionModel")) {
  1027.          ++var3;
  1028.          this.selectionModel = (TreeSelectionModel)var2.elementAt(var3);
  1029.          ++var3;
  1030.       }
  1031.  
  1032.       if (var3 < var4 && var2.elementAt(var3).equals("expandedState")) {
  1033.          ++var3;
  1034.          this.unarchiveExpandedState(var2.elementAt(var3));
  1035.          ++var3;
  1036.       }
  1037.  
  1038.       if (super.listenerList.getListenerCount(class$javax$swing$event$TreeSelectionListener == null ? (class$javax$swing$event$TreeSelectionListener = class$("javax.swing.event.TreeSelectionListener")) : class$javax$swing$event$TreeSelectionListener) != 0) {
  1039.          this.selectionRedirector = new TreeSelectionRedirector(this);
  1040.          this.selectionModel.addTreeSelectionListener(this.selectionRedirector);
  1041.       }
  1042.  
  1043.       if (this.treeModel != null) {
  1044.          this.treeModelListener = this.createTreeModelListener();
  1045.          if (this.treeModelListener != null) {
  1046.             this.treeModel.addTreeModelListener(this.treeModelListener);
  1047.          }
  1048.       }
  1049.  
  1050.    }
  1051.  
  1052.    private Object getArchivableExpandedState() {
  1053.       TreeModel var1 = this.getModel();
  1054.       if (var1 != null) {
  1055.          Enumeration var2 = this.expandedState.keys();
  1056.          if (var2 != null) {
  1057.             Vector var3 = new Vector();
  1058.  
  1059.             while(var2.hasMoreElements()) {
  1060.                TreePath var4 = (TreePath)var2.nextElement();
  1061.  
  1062.                int[] var5;
  1063.                try {
  1064.                   var5 = this.getModelIndexsForPath(var4);
  1065.                } catch (Error var7) {
  1066.                   var5 = null;
  1067.                }
  1068.  
  1069.                if (var5 != null) {
  1070.                   var3.addElement(var5);
  1071.                   var3.addElement(this.expandedState.get(var4));
  1072.                }
  1073.             }
  1074.  
  1075.             return var3;
  1076.          }
  1077.       }
  1078.  
  1079.       return null;
  1080.    }
  1081.  
  1082.    private void unarchiveExpandedState(Object var1) {
  1083.       if (var1 instanceof Vector) {
  1084.          Vector var2 = (Vector)var1;
  1085.  
  1086.          for(int var3 = var2.size() - 1; var3 >= 0; --var3) {
  1087.             Boolean var4 = (Boolean)var2.elementAt(var3--);
  1088.  
  1089.             try {
  1090.                TreePath var5 = this.getPathForIndexs((int[])var2.elementAt(var3));
  1091.                if (var5 != null) {
  1092.                   this.expandedState.put(var5, var4);
  1093.                }
  1094.             } catch (Error var7) {
  1095.             }
  1096.          }
  1097.       }
  1098.  
  1099.    }
  1100.  
  1101.    private int[] getModelIndexsForPath(TreePath var1) {
  1102.       if (var1 == null) {
  1103.          return null;
  1104.       } else {
  1105.          TreeModel var2 = this.getModel();
  1106.          int var3 = var1.getPathCount();
  1107.          int[] var4 = new int[var3 - 1];
  1108.          Object var5 = var2.getRoot();
  1109.  
  1110.          for(int var6 = 1; var6 < var3; ++var6) {
  1111.             var4[var6 - 1] = var2.getIndexOfChild(var5, var1.getPathComponent(var6));
  1112.             var5 = var1.getPathComponent(var6);
  1113.             if (var4[var6 - 1] < 0) {
  1114.                return null;
  1115.             }
  1116.          }
  1117.  
  1118.          return var4;
  1119.       }
  1120.    }
  1121.  
  1122.    private TreePath getPathForIndexs(int[] var1) {
  1123.       if (var1 == null) {
  1124.          return null;
  1125.       } else {
  1126.          TreeModel var2 = this.getModel();
  1127.          if (var2 == null) {
  1128.             return null;
  1129.          } else {
  1130.             int var3 = var1.length;
  1131.             Object var4 = var2.getRoot();
  1132.             TreePath var5 = new TreePath(var4);
  1133.  
  1134.             for(int var6 = 0; var6 < var3; ++var6) {
  1135.                var4 = var2.getChild(var4, var1[var6]);
  1136.                if (var4 == null) {
  1137.                   return null;
  1138.                }
  1139.  
  1140.                var5 = var5.pathByAddingChild(var4);
  1141.             }
  1142.  
  1143.             return var5;
  1144.          }
  1145.       }
  1146.    }
  1147.  
  1148.    public Dimension getPreferredScrollableViewportSize() {
  1149.       int var1 = ((JComponent)this).getPreferredSize().width;
  1150.       int var2 = this.getVisibleRowCount();
  1151.       int var3;
  1152.       if (this.isFixedRowHeight()) {
  1153.          var3 = var2 * this.getRowHeight();
  1154.       } else {
  1155.          TreeUI var4 = this.getUI();
  1156.          if (var4 != null && var4.getRowCount(this) > 0) {
  1157.             var3 = this.getRowBounds(0).height * var2;
  1158.          } else {
  1159.             var3 = 16 * var2;
  1160.          }
  1161.       }
  1162.  
  1163.       return new Dimension(var1, var3);
  1164.    }
  1165.  
  1166.    public int getScrollableUnitIncrement(Rectangle var1, int var2, int var3) {
  1167.       if (var2 == 1) {
  1168.          int var5 = this.getClosestRowForLocation(0, var1.y);
  1169.          if (var5 != -1) {
  1170.             Rectangle var4 = this.getRowBounds(var5);
  1171.             if (var4.y != var1.y) {
  1172.                if (var3 < 0) {
  1173.                   return var1.y - var4.y;
  1174.                }
  1175.  
  1176.                return var4.y + var4.height - var1.y;
  1177.             }
  1178.  
  1179.             if (var3 >= 0) {
  1180.                return var4.height;
  1181.             }
  1182.  
  1183.             if (var5 != 0) {
  1184.                var4 = this.getRowBounds(var5 - 1);
  1185.                return var4.height;
  1186.             }
  1187.          }
  1188.  
  1189.          return 0;
  1190.       } else {
  1191.          return 4;
  1192.       }
  1193.    }
  1194.  
  1195.    public int getScrollableBlockIncrement(Rectangle var1, int var2, int var3) {
  1196.       return var2 == 1 ? var1.height : var1.width;
  1197.    }
  1198.  
  1199.    public boolean getScrollableTracksViewportWidth() {
  1200.       if (((Component)this).getParent() instanceof JViewport) {
  1201.          return ((JViewport)((Component)this).getParent()).getWidth() > ((JComponent)this).getPreferredSize().width;
  1202.       } else {
  1203.          return false;
  1204.       }
  1205.    }
  1206.  
  1207.    public boolean getScrollableTracksViewportHeight() {
  1208.       if (((Component)this).getParent() instanceof JViewport) {
  1209.          return ((JViewport)((Component)this).getParent()).getHeight() > ((JComponent)this).getPreferredSize().height;
  1210.       } else {
  1211.          return false;
  1212.       }
  1213.    }
  1214.  
  1215.    protected void setExpandedState(TreePath var1, boolean var2) {
  1216.       if (var1 != null) {
  1217.          TreePath var4 = var1.getParentPath();
  1218.          Stack var3;
  1219.          if (this.expandedStack.size() == 0) {
  1220.             var3 = new Stack();
  1221.          } else {
  1222.             var3 = (Stack)this.expandedStack.pop();
  1223.          }
  1224.  
  1225.          try {
  1226.             label194:
  1227.             while(true) {
  1228.                if (var4 == null) {
  1229.                   int var5 = ((Vector)var3).size() - 1;
  1230.  
  1231.                   while(true) {
  1232.                      if (var5 < 0) {
  1233.                         break label194;
  1234.                      }
  1235.  
  1236.                      var4 = (TreePath)var3.pop();
  1237.                      if (!this.isExpanded(var4)) {
  1238.                         try {
  1239.                            this.fireTreeWillExpand(var4);
  1240.                         } catch (ExpandVetoException var15) {
  1241.                            return;
  1242.                         }
  1243.  
  1244.                         this.expandedState.put(var4, Boolean.TRUE);
  1245.                         this.fireTreeExpanded(var4);
  1246.                         if (super.accessibleContext != null) {
  1247.                            ((AccessibleJTree)super.accessibleContext).fireVisibleDataPropertyChange();
  1248.                         }
  1249.                      }
  1250.  
  1251.                      --var5;
  1252.                   }
  1253.                }
  1254.  
  1255.                if (this.isExpanded(var4)) {
  1256.                   var4 = null;
  1257.                } else {
  1258.                   var3.push(var4);
  1259.                   var4 = var4.getParentPath();
  1260.                }
  1261.             }
  1262.          } finally {
  1263.             if (this.expandedStack.size() < TEMP_STACK_SIZE) {
  1264.                ((Vector)var3).removeAllElements();
  1265.                this.expandedStack.push(var3);
  1266.             }
  1267.  
  1268.          }
  1269.  
  1270.          if (!var2) {
  1271.             Object var18 = this.expandedState.get(var1);
  1272.             if (var18 != null && (Boolean)var18) {
  1273.                try {
  1274.                   this.fireTreeWillCollapse(var1);
  1275.                } catch (ExpandVetoException var14) {
  1276.                   return;
  1277.                }
  1278.  
  1279.                this.expandedState.put(var1, Boolean.FALSE);
  1280.                this.fireTreeCollapsed(var1);
  1281.                if (this.removeDescendantSelectedPaths(var1, false) && !this.isPathSelected(var1)) {
  1282.                   this.addSelectionPath(var1);
  1283.                }
  1284.  
  1285.                if (super.accessibleContext != null) {
  1286.                   ((AccessibleJTree)super.accessibleContext).fireVisibleDataPropertyChange();
  1287.                }
  1288.             }
  1289.          } else {
  1290.             Object var19 = this.expandedState.get(var1);
  1291.             if (var19 == null || !(Boolean)var19) {
  1292.                try {
  1293.                   this.fireTreeWillExpand(var1);
  1294.                } catch (ExpandVetoException var13) {
  1295.                   return;
  1296.                }
  1297.  
  1298.                this.expandedState.put(var1, Boolean.TRUE);
  1299.                this.fireTreeExpanded(var1);
  1300.                if (super.accessibleContext != null) {
  1301.                   ((AccessibleJTree)super.accessibleContext).fireVisibleDataPropertyChange();
  1302.                }
  1303.             }
  1304.          }
  1305.       }
  1306.  
  1307.    }
  1308.  
  1309.    protected Enumeration getDescendantToggledPaths(TreePath var1) {
  1310.       if (var1 == null) {
  1311.          return null;
  1312.       } else {
  1313.          Vector var2 = new Vector();
  1314.          Enumeration var3 = this.expandedState.keys();
  1315.  
  1316.          while(var3.hasMoreElements()) {
  1317.             TreePath var4 = (TreePath)var3.nextElement();
  1318.             if (var1.isDescendant(var4)) {
  1319.                var2.addElement(var4);
  1320.             }
  1321.          }
  1322.  
  1323.          return var2.elements();
  1324.       }
  1325.    }
  1326.  
  1327.    protected void removeDescendantToggledPaths(Enumeration var1) {
  1328.       if (var1 != null) {
  1329.          while(var1.hasMoreElements()) {
  1330.             Enumeration var2 = this.getDescendantToggledPaths((TreePath)var1.nextElement());
  1331.             if (var2 != null) {
  1332.                while(var2.hasMoreElements()) {
  1333.                   this.expandedState.remove(var2.nextElement());
  1334.                }
  1335.             }
  1336.          }
  1337.       }
  1338.  
  1339.    }
  1340.  
  1341.    protected void clearToggledPaths() {
  1342.       this.expandedState.clear();
  1343.    }
  1344.  
  1345.    protected TreeModelListener createTreeModelListener() {
  1346.       return new TreeModelHandler(this);
  1347.    }
  1348.  
  1349.    protected boolean removeDescendantSelectedPaths(TreePath var1, boolean var2) {
  1350.       TreePath[] var3 = this.getDescendantSelectedPaths(var1, var2);
  1351.       if (var3 != null) {
  1352.          this.getSelectionModel().removeSelectionPaths(var3);
  1353.          return true;
  1354.       } else {
  1355.          return false;
  1356.       }
  1357.    }
  1358.  
  1359.    private TreePath[] getDescendantSelectedPaths(TreePath var1, boolean var2) {
  1360.       TreeSelectionModel var3 = this.getSelectionModel();
  1361.       TreePath[] var4 = var3 != null ? var3.getSelectionPaths() : null;
  1362.       if (var4 == null) {
  1363.          return null;
  1364.       } else {
  1365.          boolean var5 = false;
  1366.  
  1367.          for(int var6 = var4.length - 1; var6 >= 0; --var6) {
  1368.             if (var4[var6] == null || !var1.isDescendant(var4[var6]) || var1.equals(var4[var6]) && !var2) {
  1369.                var4[var6] = null;
  1370.             } else {
  1371.                var5 = true;
  1372.             }
  1373.          }
  1374.  
  1375.          if (!var5) {
  1376.             var4 = null;
  1377.          }
  1378.  
  1379.          return var4;
  1380.       }
  1381.    }
  1382.  
  1383.    void removeDescendantSelectedPaths(TreeModelEvent var1) {
  1384.       TreePath var2 = var1.getTreePath();
  1385.       Object[] var3 = var1.getChildren();
  1386.       TreeSelectionModel var4 = this.getSelectionModel();
  1387.       if (var4 != null && var2 != null && var3 != null && var3.length > 0) {
  1388.          for(int var5 = var3.length - 1; var5 >= 0; --var5) {
  1389.             this.removeDescendantSelectedPaths(var2.pathByAddingChild(var3[var5]), true);
  1390.          }
  1391.       }
  1392.  
  1393.    }
  1394.  
  1395.    protected String paramString() {
  1396.       String var1 = this.rootVisible ? "true" : "false";
  1397.       String var2 = this.showsRootHandles ? "true" : "false";
  1398.       String var3 = this.editable ? "true" : "false";
  1399.       String var4 = this.largeModel ? "true" : "false";
  1400.       String var5 = this.invokesStopCellEditing ? "true" : "false";
  1401.       String var6 = this.scrollsOnExpand ? "true" : "false";
  1402.       return super.paramString() + ",editable=" + var3 + ",invokesStopCellEditing=" + var5 + ",largeModel=" + var4 + ",rootVisible=" + var1 + ",rowHeight=" + this.rowHeight + ",scrollsOnExpand=" + var6 + ",showsRootHandles=" + var2 + ",toggleClickCount=" + this.toggleClickCount + ",visibleRowCount=" + this.visibleRowCount;
  1403.    }
  1404.  
  1405.    public AccessibleContext getAccessibleContext() {
  1406.       if (super.accessibleContext == null) {
  1407.          super.accessibleContext = new AccessibleJTree(this);
  1408.       }
  1409.  
  1410.       return super.accessibleContext;
  1411.    }
  1412.  
  1413.    // $FF: synthetic method
  1414.    static Class class$(String var0) {
  1415.       try {
  1416.          return Class.forName(var0);
  1417.       } catch (ClassNotFoundException var2) {
  1418.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  1419.       }
  1420.    }
  1421.  
  1422.    // $FF: synthetic method
  1423.    static Hashtable access$000(JTree var0) {
  1424.       return var0.expandedState;
  1425.    }
  1426. }
  1427.