home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161a.iso / handson / files / copyjava.exe / com / sun / java / swing / plaf / basic / BasicTreeUI.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  30.3 KB  |  1,352 lines

  1. package com.sun.java.swing.plaf.basic;
  2.  
  3. import com.sun.java.swing.Action;
  4. import com.sun.java.swing.CellRendererPane;
  5. import com.sun.java.swing.Icon;
  6. import com.sun.java.swing.JComponent;
  7. import com.sun.java.swing.JTree;
  8. import com.sun.java.swing.KeyStroke;
  9. import com.sun.java.swing.SwingUtilities;
  10. import com.sun.java.swing.UIManager;
  11. import com.sun.java.swing.event.CellEditorListener;
  12. import com.sun.java.swing.event.ChangeEvent;
  13. import com.sun.java.swing.event.TreeSelectionEvent;
  14. import com.sun.java.swing.plaf.ComponentUI;
  15. import com.sun.java.swing.plaf.UIResource;
  16. import com.sun.java.swing.tree.DefaultMutableTreeNode;
  17. import com.sun.java.swing.tree.TreeCellEditor;
  18. import com.sun.java.swing.tree.TreeCellRenderer;
  19. import com.sun.java.swing.tree.TreeModel;
  20. import com.sun.java.swing.tree.TreePath;
  21. import com.sun.java.swing.tree.TreeSelectionModel;
  22. import java.awt.Color;
  23. import java.awt.Component;
  24. import java.awt.Dimension;
  25. import java.awt.Graphics;
  26. import java.awt.Insets;
  27. import java.awt.Point;
  28. import java.awt.Rectangle;
  29. import java.awt.event.ActionEvent;
  30. import java.awt.event.ActionListener;
  31. import java.awt.event.ComponentAdapter;
  32. import java.awt.event.FocusEvent;
  33. import java.awt.event.FocusListener;
  34. import java.awt.event.InputEvent;
  35. import java.awt.event.KeyEvent;
  36. import java.awt.event.KeyListener;
  37. import java.awt.event.MouseEvent;
  38. import java.awt.event.MouseListener;
  39. import java.beans.PropertyChangeEvent;
  40. import java.beans.PropertyChangeListener;
  41. import java.io.IOException;
  42. import java.io.ObjectInputStream;
  43. import java.io.ObjectOutputStream;
  44. import java.io.Serializable;
  45. import java.util.EventObject;
  46. import java.util.Vector;
  47.  
  48. public class BasicTreeUI extends AbstractTreeUI implements CellEditorListener, FocusListener, KeyListener, MouseListener, PropertyChangeListener {
  49.    private static final int LEFT_CHILD_INDENT = 7;
  50.    private static final int RIGHT_CHILD_INDENT = 13;
  51.    private static final Insets EMPTY_INSETS = new Insets(0, 0, 0, 0);
  52.    protected transient Icon collapsedIcon;
  53.    protected transient Icon expandedIcon;
  54.    private Color hashColor;
  55.    protected int leftChildIndent;
  56.    protected int rightChildIndent;
  57.    protected int totalChildIndent;
  58.    protected Dimension preferredMinSize;
  59.    protected int lastSelectedRow;
  60.    protected JTree tree;
  61.    protected transient TreeCellRenderer currentCellRenderer;
  62.    protected boolean createdRenderer;
  63.    protected transient TreeCellEditor cellEditor;
  64.    protected boolean createdCellEditor;
  65.    protected Component editingComponent;
  66.    protected TreePath editingPath;
  67.    protected Action repeatKeyAction;
  68.    protected boolean isKeyDown;
  69.    protected boolean stopEditingInCompleteEditing;
  70.    protected CellRendererPane rendererPane;
  71.    protected Dimension cPreferredSize;
  72.    protected boolean validCachedPreferredSize;
  73.    protected transient ComponentAdapter componentListener;
  74.    protected Vector drawingCache;
  75.    private PropertyChangeListener propertyChangeListener;
  76.    private MouseListener mouseListener;
  77.    private FocusListener focusListener;
  78.    private KeyListener keyListener;
  79.  
  80.    public static ComponentUI createUI(JComponent var0) {
  81.       return new BasicTreeUI();
  82.    }
  83.  
  84.    protected Color getHashColor() {
  85.       return this.hashColor;
  86.    }
  87.  
  88.    protected void setHashColor(Color var1) {
  89.       this.hashColor = var1;
  90.    }
  91.  
  92.    public void setLeftChildIndent(int var1) {
  93.       this.leftChildIndent = var1;
  94.       this.totalChildIndent = this.leftChildIndent + this.rightChildIndent;
  95.    }
  96.  
  97.    public int getLeftChildIndent() {
  98.       return this.leftChildIndent;
  99.    }
  100.  
  101.    public void setRightChildIndent(int var1) {
  102.       this.rightChildIndent = var1;
  103.       this.totalChildIndent = this.leftChildIndent + this.rightChildIndent;
  104.    }
  105.  
  106.    public int getRightChildIndent() {
  107.       return this.rightChildIndent;
  108.    }
  109.  
  110.    public void setExpandedIcon(Icon var1) {
  111.       this.expandedIcon = var1;
  112.    }
  113.  
  114.    public Icon getExpandedIcon() {
  115.       return this.expandedIcon;
  116.    }
  117.  
  118.    public void setCollapsedIcon(Icon var1) {
  119.       this.collapsedIcon = var1;
  120.    }
  121.  
  122.    public Icon getCollapsedIcon() {
  123.       return this.collapsedIcon;
  124.    }
  125.  
  126.    public void setLargeModel(boolean var1) {
  127.       if (var1 && this.tree != null && this.componentListener == null) {
  128.          this.componentListener = new 1(this);
  129.          this.tree.addComponentListener(this.componentListener);
  130.       } else if (!var1 && this.tree != null && this.componentListener != null) {
  131.          this.tree.removeComponentListener(this.componentListener);
  132.          this.componentListener = null;
  133.       }
  134.  
  135.       super.setLargeModel(var1);
  136.    }
  137.  
  138.    public void installUI(JComponent var1) {
  139.       if (var1 == null) {
  140.          throw new NullPointerException("null component passed to BasicTreeUI.installUI()");
  141.       } else {
  142.          this.tree = (JTree)var1;
  143.          this.drawingCache = new Vector();
  144.          this.stopEditingInCompleteEditing = true;
  145.          this.lastSelectedRow = -1;
  146.          this.setLeftChildIndent(7);
  147.          this.setRightChildIndent(13);
  148.          this.cPreferredSize = new Dimension();
  149.          if ((this.rendererPane = this.createCellRendererPane(var1)) != null) {
  150.             this.tree.add(this.rendererPane);
  151.          }
  152.  
  153.          this.installDefaults(var1);
  154.          this.installListeners(var1);
  155.          this.installKeyboardActions(var1);
  156.          ((AbstractTreeUI)this).setRowHeight(this.tree.getRowHeight());
  157.          ((AbstractTreeUI)this).setRootVisible(this.tree.isRootVisible());
  158.          ((AbstractTreeUI)this).setShowsRootHandles(this.tree.getShowsRootHandles());
  159.          this.setModel(this.tree.getModel());
  160.          this.setSelectionModel(this.tree.getSelectionModel());
  161.          this.setLargeModel(this.tree.isLargeModel());
  162.          this.updateRenderer();
  163.          this.validCachedPreferredSize = false;
  164.       }
  165.    }
  166.  
  167.    protected void installDefaults(JComponent var1) {
  168.       if (((Component)var1).getBackground() == null || ((Component)var1).getBackground() instanceof UIResource) {
  169.          ((Component)var1).setBackground(UIManager.getColor("Tree.background"));
  170.       }
  171.  
  172.       if (this.getHashColor() == null || this.getHashColor() instanceof UIResource) {
  173.          this.setHashColor(UIManager.getColor("Tree.hash"));
  174.       }
  175.  
  176.       this.setExpandedIcon((Icon)UIManager.get("Tree.expandedIcon"));
  177.       this.setCollapsedIcon((Icon)UIManager.get("Tree.collapsedIcon"));
  178.    }
  179.  
  180.    protected void installListeners(JComponent var1) {
  181.       if ((this.propertyChangeListener = this.createPropertyChangeListener(var1)) != null) {
  182.          var1.addPropertyChangeListener(this.propertyChangeListener);
  183.       }
  184.  
  185.       if ((this.mouseListener = this.createMouseListener(var1)) != null) {
  186.          ((Component)var1).addMouseListener(this.mouseListener);
  187.       }
  188.  
  189.       if ((this.focusListener = this.createFocusListener(var1)) != null) {
  190.          ((Component)var1).addFocusListener(this.focusListener);
  191.       }
  192.  
  193.       if ((this.keyListener = this.createKeyListener(var1)) != null) {
  194.          ((Component)var1).addKeyListener(this.keyListener);
  195.       }
  196.  
  197.    }
  198.  
  199.    protected PropertyChangeListener createPropertyChangeListener(JComponent var1) {
  200.       return this;
  201.    }
  202.  
  203.    protected MouseListener createMouseListener(JComponent var1) {
  204.       return this;
  205.    }
  206.  
  207.    protected FocusListener createFocusListener(JComponent var1) {
  208.       return this;
  209.    }
  210.  
  211.    protected KeyListener createKeyListener(JComponent var1) {
  212.       return this;
  213.    }
  214.  
  215.    protected CellRendererPane createCellRendererPane(JComponent var1) {
  216.       return new CellRendererPane();
  217.    }
  218.  
  219.    public void uninstallUI(JComponent var1) {
  220.       this.completeEditing();
  221.       this.tree.remove(this.rendererPane);
  222.       this.uninstallDefaults(var1);
  223.       this.uninstallListeners(var1);
  224.       this.uninstallKeyboardActions(var1);
  225.       this.checkConsistency();
  226.       if (this.createdRenderer) {
  227.          this.tree.setCellRenderer((TreeCellRenderer)null);
  228.       }
  229.  
  230.       if (this.createdCellEditor) {
  231.          this.tree.setCellEditor((TreeCellEditor)null);
  232.       }
  233.  
  234.       this.rendererPane = null;
  235.       this.componentListener = null;
  236.       this.propertyChangeListener = null;
  237.       this.mouseListener = null;
  238.       this.focusListener = null;
  239.       this.keyListener = null;
  240.       this.setSelectionModel((TreeSelectionModel)null);
  241.       this.setModel((TreeModel)null);
  242.       this.tree = null;
  243.       this.drawingCache = null;
  244.    }
  245.  
  246.    protected void uninstallDefaults(JComponent var1) {
  247.    }
  248.  
  249.    protected void uninstallListeners(JComponent var1) {
  250.       if (this.componentListener != null) {
  251.          this.tree.removeComponentListener(this.componentListener);
  252.       }
  253.  
  254.       if (this.propertyChangeListener != null) {
  255.          var1.removePropertyChangeListener(this.propertyChangeListener);
  256.       }
  257.  
  258.       if (this.mouseListener != null) {
  259.          ((Component)var1).removeMouseListener(this.mouseListener);
  260.       }
  261.  
  262.       if (this.focusListener != null) {
  263.          ((Component)var1).removeFocusListener(this.focusListener);
  264.       }
  265.  
  266.       if (this.keyListener != null) {
  267.          ((Component)var1).removeKeyListener(this.keyListener);
  268.       }
  269.  
  270.    }
  271.  
  272.    public void propertyChange(PropertyChangeEvent var1) {
  273.       if (((EventObject)var1).getSource() == this.tree) {
  274.          String var2 = var1.getPropertyName();
  275.          this.completeEditing();
  276.          if (var2.equals("cellRenderer")) {
  277.             this.updateRenderer();
  278.             this.tree.repaint();
  279.             return;
  280.          }
  281.  
  282.          if (var2.equals("treeModel")) {
  283.             this.setModel((TreeModel)var1.getNewValue());
  284.             return;
  285.          }
  286.  
  287.          if (var2.equals("rootVisible")) {
  288.             ((AbstractTreeUI)this).setRootVisible((Boolean)var1.getNewValue());
  289.             this.tree.repaint();
  290.             return;
  291.          }
  292.  
  293.          if (var2.equals("showsRootHandles")) {
  294.             ((AbstractTreeUI)this).setShowsRootHandles((Boolean)var1.getNewValue());
  295.             this.tree.repaint();
  296.             return;
  297.          }
  298.  
  299.          if (var2.equals("rowHeight")) {
  300.             ((AbstractTreeUI)this).setRowHeight((Integer)var1.getNewValue());
  301.             return;
  302.          }
  303.  
  304.          if (var2.equals("cellEditor")) {
  305.             this.updateCellEditor();
  306.             return;
  307.          }
  308.  
  309.          if (var2.equals("editable")) {
  310.             this.updateCellEditor();
  311.             return;
  312.          }
  313.  
  314.          if (var2.equals("largeModel")) {
  315.             this.setLargeModel(this.tree.isLargeModel());
  316.             return;
  317.          }
  318.  
  319.          if (var2.equals("selectionModel")) {
  320.             this.setSelectionModel(this.tree.getSelectionModel());
  321.             return;
  322.          }
  323.       } else if (((EventObject)var1).getSource() == super.treeSelectionModel) {
  324.          super.treeSelectionModel.resetRowSelection();
  325.       }
  326.  
  327.    }
  328.  
  329.    protected void installKeyboardActions(JComponent var1) {
  330.       var1.registerKeyboardAction(new TreeIncrementAction(this, -1, "UP"), KeyStroke.getKeyStroke(38, 0), 0);
  331.       var1.registerKeyboardAction(new TreeIncrementAction(this, 1, "DOWN"), KeyStroke.getKeyStroke(40, 0), 0);
  332.       var1.registerKeyboardAction(new TreeTraverseAction(this, 1, "RIGHT"), KeyStroke.getKeyStroke(39, 0), 0);
  333.       var1.registerKeyboardAction(new TreeTraverseAction(this, -1, "LEFT"), KeyStroke.getKeyStroke(37, 0), 0);
  334.       var1.registerKeyboardAction(new TreePageAction(this, -1, "P_UP"), KeyStroke.getKeyStroke(33, 0), 0);
  335.       var1.registerKeyboardAction(new TreePageAction(this, 1, "P_DOWN"), KeyStroke.getKeyStroke(34, 0), 0);
  336.       var1.registerKeyboardAction(new TreeHomeAction(this, -1, "HOME"), KeyStroke.getKeyStroke(36, 0), 0);
  337.       var1.registerKeyboardAction(new TreeHomeAction(this, 1, "END"), KeyStroke.getKeyStroke(35, 0), 0);
  338.       var1.registerKeyboardAction(new TreeToggleAction(this, "TOGGLE"), KeyStroke.getKeyStroke(10, 0), 0);
  339.    }
  340.  
  341.    protected void uninstallKeyboardActions(JComponent var1) {
  342.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(38, 0));
  343.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(40, 0));
  344.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(37, 0));
  345.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(39, 0));
  346.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(33, 0));
  347.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(34, 0));
  348.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(36, 0));
  349.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(35, 0));
  350.       var1.unregisterKeyboardAction(KeyStroke.getKeyStroke(10, 0));
  351.    }
  352.  
  353.    protected void updateCellEditor() {
  354.       this.completeEditing();
  355.       TreeCellEditor var1;
  356.       if (this.tree == null) {
  357.          var1 = null;
  358.       } else if (this.tree.isEditable()) {
  359.          var1 = this.tree.getCellEditor();
  360.          if (var1 == null) {
  361.             var1 = this.createDefaultCellEditor();
  362.             if (var1 != null) {
  363.                this.tree.setCellEditor(var1);
  364.                this.createdCellEditor = true;
  365.             }
  366.          }
  367.       } else {
  368.          var1 = null;
  369.       }
  370.  
  371.       if (var1 != this.cellEditor) {
  372.          if (this.cellEditor != null) {
  373.             this.cellEditor.removeCellEditorListener(this);
  374.          }
  375.  
  376.          this.cellEditor = var1;
  377.          if (var1 != null) {
  378.             var1.addCellEditorListener(this);
  379.          }
  380.  
  381.          this.createdCellEditor = false;
  382.       }
  383.  
  384.    }
  385.  
  386.    protected void updateRenderer() {
  387.       TreeCellRenderer var1 = this.tree.getCellRenderer();
  388.       if (var1 == null && this.tree != null) {
  389.          this.tree.setCellRenderer(this.createDefaultCellRenderer());
  390.          this.createdRenderer = true;
  391.       } else {
  392.          this.createdRenderer = false;
  393.          this.currentCellRenderer = var1;
  394.          if (!super.largeModel) {
  395.             this.updateNodeSizes(true);
  396.          }
  397.  
  398.          if (this.createdCellEditor && this.tree != null) {
  399.             this.tree.setCellEditor((TreeCellEditor)null);
  400.          }
  401.       }
  402.  
  403.       this.updateCellEditor();
  404.    }
  405.  
  406.    public boolean checkConsistency() {
  407.       if (this.tree != null && super.updateNodeSizes) {
  408.          if (!super.largeModel) {
  409.             this.updateNodeSizes(true);
  410.          }
  411.  
  412.          return true;
  413.       } else {
  414.          return false;
  415.       }
  416.    }
  417.  
  418.    public void updateNodeSizes(boolean var1) {
  419.       super.updateNodeSizes(var1);
  420.       this.validCachedPreferredSize = false;
  421.    }
  422.  
  423.    protected TreeCellEditor createDefaultCellEditor() {
  424.       return this.currentCellRenderer != null && this.currentCellRenderer instanceof BasicTreeCellRenderer ? new BasicTreeCellEditor((BasicTreeCellRenderer)this.currentCellRenderer) : new BasicTreeCellEditor((BasicTreeCellRenderer)null);
  425.    }
  426.  
  427.    public TreeCellRenderer createDefaultCellRenderer() {
  428.       return new BasicTreeCellRenderer();
  429.    }
  430.  
  431.    public int getXOriginOfNode(VisibleTreeNode var1) {
  432.       int var2 = var1.getVisibleLevel();
  433.       if (((AbstractTreeUI)this).getShowsRootHandles()) {
  434.          ++var2;
  435.       }
  436.  
  437.       return this.totalChildIndent * var2;
  438.    }
  439.  
  440.    public Dimension getSizeOfNode(VisibleTreeNode var1, int var2) {
  441.       Object var3 = null;
  442.       if (this.currentCellRenderer != null) {
  443.          Component var4 = this.currentCellRenderer.getTreeCellRendererComponent(this.tree, var1.getValue(), false, var1.isExpanded(), var1.isLeaf(), var2, false);
  444.          if (this.tree != null) {
  445.             this.rendererPane.add(var4);
  446.             var4.validate();
  447.             return var4.getPreferredSize();
  448.          } else {
  449.             return var4.getPreferredSize();
  450.          }
  451.       } else {
  452.          return new Dimension(0, 0);
  453.       }
  454.    }
  455.  
  456.    protected Rectangle getLargeBoundsOf(LargeTreeModelNode var1, int var2, Object var3) {
  457.       return this.getLargeBoundsOf(var1, var2, var3, (Component)null, (Rectangle[])null);
  458.    }
  459.  
  460.    protected Rectangle getLargeBoundsOf(LargeTreeModelNode var1, int var2, Object var3, Component var4, Rectangle[] var5) {
  461.       Rectangle var6;
  462.       if (var5 == null) {
  463.          var6 = new Rectangle();
  464.       } else {
  465.          var6 = var5[0];
  466.       }
  467.  
  468.       int var7;
  469.       if (var1 == null) {
  470.          var7 = 0;
  471.       } else {
  472.          var7 = var1.getVisibleLevel() + 1;
  473.          if (((AbstractTreeUI)this).getShowsRootHandles()) {
  474.             ++var7;
  475.          }
  476.       }
  477.  
  478.       var6.x = this.totalChildIndent * var7;
  479.       var6.y = var2 * super.rowHeight;
  480.       var6.height = super.rowHeight;
  481.       if (var4 == null) {
  482.          if (this.currentCellRenderer != null) {
  483.             Component var8 = this.currentCellRenderer.getTreeCellRendererComponent(this.tree, var3, false, false, false, var2, false);
  484.             if (this.tree != null) {
  485.                this.rendererPane.add(var8);
  486.                var8.validate();
  487.             }
  488.  
  489.             Dimension var9 = var8.getPreferredSize();
  490.             var6.width = var9.width;
  491.          } else {
  492.             var6.width = 0;
  493.          }
  494.       } else {
  495.          Dimension var10 = var4.getPreferredSize();
  496.          var6.width = var10.width;
  497.       }
  498.  
  499.       return var6;
  500.    }
  501.  
  502.    protected void updateCachedPreferredSize() {
  503.       if (!super.largeModel) {
  504.          int var1 = ((AbstractTreeUI)this).getRowCount();
  505.          int var2;
  506.          if (var1 > 0) {
  507.             if (!((AbstractTreeUI)this).isFixedRowHeight()) {
  508.                VisibleTreeNode var3 = ((AbstractTreeUI)this).getNode(var1 - 1);
  509.                var2 = var3.getYOrigin() + var3.getPreferredSize().height;
  510.             } else {
  511.                var2 = ((AbstractTreeUI)this).getRowHeight() * var1;
  512.             }
  513.          } else {
  514.             var2 = 0;
  515.          }
  516.  
  517.          this.cPreferredSize.height = var2;
  518.          this.cPreferredSize.width = ((AbstractTreeUI)this).getMaxNodeWidth();
  519.       } else if (this.tree != null) {
  520.          int var8 = 0;
  521.          Rectangle var4 = this.tree.getVisibleRect();
  522.          int var6 = ((AbstractTreeUI)this).getRowContainingYLocation(var4.y);
  523.          int var7 = ((AbstractTreeUI)this).getRowContainingYLocation(var4.y + var4.height);
  524.          if (var6 != -1 && var6 != -1) {
  525.             for(; var6 <= var7; ++var6) {
  526.                Rectangle var5 = ((AbstractTreeUI)this).getRowBounds(var6);
  527.                if (var5 != null) {
  528.                   var8 = Math.max(var8, var5.x + var5.width);
  529.                }
  530.             }
  531.          }
  532.  
  533.          this.cPreferredSize.width = var8;
  534.          this.cPreferredSize.height = ((AbstractTreeUI)this).getRowCount() * ((AbstractTreeUI)this).getRowHeight();
  535.       } else {
  536.          this.cPreferredSize.width = this.cPreferredSize.height = 0;
  537.       }
  538.  
  539.       this.validCachedPreferredSize = true;
  540.    }
  541.  
  542.    public void visibleNodesChanged() {
  543.       if (this.tree != null) {
  544.          this.validCachedPreferredSize = false;
  545.          this.tree.treeDidChange();
  546.       }
  547.  
  548.    }
  549.  
  550.    protected void pathWasExpanded(TreePath var1) {
  551.       if (this.tree != null) {
  552.          this.tree.fireTreeExpanded(var1);
  553.       }
  554.  
  555.    }
  556.  
  557.    protected void pathWasCollapsed(TreePath var1) {
  558.       if (this.tree != null) {
  559.          this.tree.fireTreeCollapsed(var1);
  560.       }
  561.  
  562.    }
  563.  
  564.    public void ensureRowsAreVisible(int var1, int var2) {
  565.       if (this.tree != null && var1 >= 0 && var2 < ((AbstractTreeUI)this).getRowCount()) {
  566.          if (var1 == var2) {
  567.             this.tree.scrollRectToVisible(((AbstractTreeUI)this).getRowBounds(var1));
  568.             return;
  569.          }
  570.  
  571.          Rectangle var3 = ((AbstractTreeUI)this).getRowBounds(var1);
  572.          Rectangle var4 = var3;
  573.          int var5 = var3.y;
  574.          int var6 = var3.x + var3.width;
  575.          int var7 = var3.x;
  576.          int var8 = this.tree.getVisibleRect().height;
  577.  
  578.          for(int var9 = var1 + 1; var9 < var2; ++var9) {
  579.             var4 = ((AbstractTreeUI)this).getRowBounds(var9);
  580.             if (var4.width + var4.x > var6) {
  581.                var6 = var4.width + var4.x;
  582.             }
  583.  
  584.             if (var4.x < var7) {
  585.                var7 = var4.x;
  586.             }
  587.  
  588.             if (var4.y + var4.height - var5 > var8) {
  589.                var9 = var2;
  590.             }
  591.          }
  592.  
  593.          this.tree.scrollRectToVisible(new Rectangle(var7, var5, var6 - var7, var4.y + var4.height - var5));
  594.       }
  595.  
  596.    }
  597.  
  598.    public void scrollPathToVisible(TreePath var1) {
  599.       ((AbstractTreeUI)this).makeVisible(var1);
  600.       Rectangle var2 = ((AbstractTreeUI)this).getPathBounds(var1);
  601.       if (var2 != null && this.tree != null) {
  602.          this.tree.scrollRectToVisible(var2);
  603.       }
  604.  
  605.    }
  606.  
  607.    public void scrollRowToVisible(int var1) {
  608.       Rectangle var2 = ((AbstractTreeUI)this).getRowBounds(var1);
  609.       if (var2 != null && this.tree != null) {
  610.          this.tree.scrollRectToVisible(var2);
  611.       }
  612.  
  613.    }
  614.  
  615.    public TreeCellRenderer getCellRenderer() {
  616.       return this.currentCellRenderer;
  617.    }
  618.  
  619.    protected LargeTreeModelNode createExpandedNodeForValue(Object var1, int var2) {
  620.       return new BasicLargeTreeModelNode(this, var1, var2);
  621.    }
  622.  
  623.    public void paint(Graphics var1, JComponent var2) {
  624.       if (this.tree != var2) {
  625.          throw new InternalError("incorrect component");
  626.       } else {
  627.          this.checkConsistency();
  628.          this.getCellRenderer();
  629.          this.tree.getBackground();
  630.          ((Component)var2).getSize();
  631.          Rectangle var3 = var1.getClipBounds();
  632.          int var4 = ((AbstractTreeUI)this).getRowContainingYLocation(var3.y);
  633.          int var5 = ((AbstractTreeUI)this).getRowContainingYLocation(var3.y + var3.height);
  634.          boolean var6 = var4 > -1 && var5 > -1;
  635.          if (var6 && super.largeModel) {
  636.             int[] var14 = new int[1];
  637.             if (((AbstractTreeUI)this).isRootVisible()) {
  638.                var14[0] = 0;
  639.                ((BasicLargeTreeModelNode)super.largeRoot).paintAll(new BasicTreeUIPaintInfo(this, var1), var14, var4, var5, 0, this);
  640.             } else {
  641.                var14[0] = -1;
  642.                ((BasicLargeTreeModelNode)super.largeRoot).paintAll(new BasicTreeUIPaintInfo(this, var1), var14, var4, var5, -1, this);
  643.             }
  644.          } else {
  645.             if (var6) {
  646.                var1.setColor(this.getHashColor());
  647.                VisibleTreeNode var7 = ((AbstractTreeUI)this).getNode(var4);
  648.  
  649.                for(VisibleTreeNode var8 = (VisibleTreeNode)((DefaultMutableTreeNode)var7).getParent(); var8 != null; var8 = (VisibleTreeNode)((DefaultMutableTreeNode)var8).getParent()) {
  650.                   VisibleTreeNode var9 = (VisibleTreeNode)((DefaultMutableTreeNode)var8).getLastChild();
  651.                   this.drawVerticalPartOfLeg(var1, var2, var8.getVisibleLevel(), this.getNodeY(var8), this.getNodeY(var9), this.getNodeHeight(var8), this.getNodeHeight(var9));
  652.                   this.drawingCache.addElement(var8);
  653.                }
  654.  
  655.                for(int var16 = var4; var16 <= var5; ++var16) {
  656.                   var7 = ((AbstractTreeUI)this).getNode(var16);
  657.                   VisibleTreeNode var15 = (VisibleTreeNode)((DefaultMutableTreeNode)var7).getParent();
  658.                   if (var15 != null && !this.drawingCache.contains(var15)) {
  659.                      VisibleTreeNode var10 = (VisibleTreeNode)((DefaultMutableTreeNode)var15).getLastChild();
  660.                      this.drawVerticalPartOfLeg(var1, var2, var15.getVisibleLevel(), this.getNodeY(var15), this.getNodeY(var10), this.getNodeHeight(var15), this.getNodeHeight(var10));
  661.                      this.drawingCache.addElement(var15);
  662.                   }
  663.  
  664.                   if (var15 != null) {
  665.                      this.drawHorizontalPartOfLeg(var1, var2, this.getNodeY(var7) + this.getNodeHeight(var7) / 2, this.getNodeX(var15) + 8, this.getNodeX(var7));
  666.                   }
  667.  
  668.                   int var17 = this.getNodeX(var7);
  669.                   int var11 = this.getNodeY(var7);
  670.                   int var12 = this.getNodeHeight(var7);
  671.                   if (this.shouldPaintExpandControl(var15, var7)) {
  672.                      this.paintExpandControl(var1, var2, var15, var7, var17, var11, var12, var16);
  673.                   }
  674.  
  675.                   this.paintRow(var1, var2, var15, var7, var17, var11, var12, var16);
  676.                }
  677.  
  678.                this.drawingCache.removeAllElements();
  679.             }
  680.  
  681.          }
  682.       }
  683.    }
  684.  
  685.    protected boolean shouldPaintExpandControl(VisibleTreeNode var1, VisibleTreeNode var2) {
  686.       boolean var3 = true;
  687.       if (((DefaultMutableTreeNode)var2).getLevel() == 0 && !((AbstractTreeUI)this).getShowsRootHandles() || ((DefaultMutableTreeNode)var2).getLevel() == 1 && !((AbstractTreeUI)this).isRootVisible() && !((AbstractTreeUI)this).getShowsRootHandles()) {
  688.          var3 = false;
  689.       }
  690.  
  691.       return var3;
  692.    }
  693.  
  694.    protected int getNodeX(VisibleTreeNode var1) {
  695.       int var2 = ((AbstractTreeUI)this).getShowsRootHandles() ? 1 : 0;
  696.       return (var1.getVisibleLevel() + var2) * this.totalChildIndent;
  697.    }
  698.  
  699.    protected int getNodeY(VisibleTreeNode var1) {
  700.       return var1.getYOrigin();
  701.    }
  702.  
  703.    protected int getNodeHeight(VisibleTreeNode var1) {
  704.       return ((AbstractTreeUI)this).isFixedRowHeight() ? ((AbstractTreeUI)this).getRowHeight() : var1.getPreferredSize().height;
  705.    }
  706.  
  707.    public void drawVerticalPartOfLeg(Graphics var1, JComponent var2, int var3, int var4, int var5, int var6, int var7) {
  708.       int var8 = ((AbstractTreeUI)this).getShowsRootHandles() ? 1 : 0;
  709.       int var9 = (var3 + var8) * this.totalChildIndent + 8;
  710.       Rectangle var10 = var1.getClipBounds();
  711.       int var11 = var10.x;
  712.       int var12 = var10.x + (var10.width - 1);
  713.       if (var9 > var11 && var9 < var12) {
  714.          int var13 = var10.y;
  715.          int var14 = var10.y + var10.height;
  716.          int var15 = Math.max(var4 + var6 + this.getVerticalLegBuffer(), var13);
  717.          int var16 = Math.min(var5 + var7 / 2, var14);
  718.          var1.setColor(this.getHashColor());
  719.          this.drawVerticalLine(var1, var2, var9, var15, var16);
  720.       }
  721.  
  722.    }
  723.  
  724.    protected int getVerticalLegBuffer() {
  725.       return 0;
  726.    }
  727.  
  728.    protected int getHorizontalLegBuffer() {
  729.       return 0;
  730.    }
  731.  
  732.    protected void drawVerticalLine(Graphics var1, JComponent var2, int var3, int var4, int var5) {
  733.       var1.drawLine(var3, var4, var3, var5);
  734.    }
  735.  
  736.    public void drawHorizontalPartOfLeg(Graphics var1, JComponent var2, int var3, int var4, int var5) {
  737.       Rectangle var6 = var1.getClipBounds();
  738.       int var7 = var6.x;
  739.       int var8 = var6.x + (var6.width - 1);
  740.       int var9 = var6.y;
  741.       int var10 = var6.y + (var6.height - 1);
  742.       var5 -= this.getHorizontalLegBuffer();
  743.       if (var3 > var9 && var3 < var10 && var5 > var7 && var4 < var8) {
  744.          var4 = Math.max(var4, var7);
  745.          var5 = Math.min(var5, var8);
  746.          var1.setColor(this.getHashColor());
  747.          this.drawHorizontalLine(var1, var2, var3, var4, var5);
  748.       }
  749.  
  750.    }
  751.  
  752.    protected void drawHorizontalLine(Graphics var1, JComponent var2, int var3, int var4, int var5) {
  753.       var1.drawLine(var4, var3, var5, var3);
  754.    }
  755.  
  756.    protected void paintRow(Graphics var1, JComponent var2, VisibleTreeNode var3, VisibleTreeNode var4, int var5, int var6, int var7, int var8) {
  757.       int var9 = -1;
  758.       if (this.tree.hasFocus()) {
  759.          var9 = this.tree.getLeadSelectionRow();
  760.       }
  761.  
  762.       Component var10 = this.getCellRenderer().getTreeCellRendererComponent(this.tree, var4.getValue(), ((AbstractTreeUI)this).isSelectedIndex(var8), var4.isExpanded(), var4.isLeaf(), var8, var9 == var8);
  763.       this.rendererPane.paintComponent(var1, var10, this.tree, var5, var6, var4.getPreferredSize().width, var7, true);
  764.    }
  765.  
  766.    protected void paintExpandControl(Graphics var1, JComponent var2, VisibleTreeNode var3, VisibleTreeNode var4, int var5, int var6, int var7, int var8) {
  767.       if (!var4.isLeaf() && (!var4.hasBeenExpanded() || var4.getModelChildCount() > 0)) {
  768.          int var9 = var5 - (this.getRightChildIndent() - 1);
  769.          int var10 = var6 + var7 / 2;
  770.          if (var4.isExpanded()) {
  771.             Icon var11 = this.getExpandedIcon();
  772.             if (var11 != null) {
  773.                this.drawCentered(var2, var1, var11, var9, var10);
  774.                return;
  775.             }
  776.          } else {
  777.             Icon var12 = this.getCollapsedIcon();
  778.             if (var12 != null) {
  779.                this.drawCentered(var2, var1, var12, var9, var10);
  780.             }
  781.          }
  782.       }
  783.  
  784.    }
  785.  
  786.    protected void drawCentered(Component var1, Graphics var2, Icon var3, int var4, int var5) {
  787.       var3.paintIcon(var1, var2, var4 - var3.getIconWidth() / 2, var5 - var3.getIconHeight() / 2);
  788.    }
  789.  
  790.    protected void drawDashedHorizontalLine(Graphics var1, int var2, int var3, int var4) {
  791.       var3 += var3 % 2;
  792.  
  793.       for(int var5 = var3; var5 <= var4; var5 += 2) {
  794.          var1.drawLine(var5, var2, var5, var2);
  795.       }
  796.  
  797.    }
  798.  
  799.    protected void drawDashedVerticalLine(Graphics var1, int var2, int var3, int var4) {
  800.       var3 += var3 % 2;
  801.  
  802.       for(int var5 = var3; var5 <= var4; var5 += 2) {
  803.          var1.drawLine(var2, var5, var2, var5);
  804.       }
  805.  
  806.    }
  807.  
  808.    public void setPreferredMinSize(Dimension var1) {
  809.       this.preferredMinSize = var1;
  810.    }
  811.  
  812.    public Dimension getPreferredMinSize() {
  813.       return this.preferredMinSize;
  814.    }
  815.  
  816.    public Dimension getPreferredSize(JComponent var1) {
  817.       return this.getPreferredSize(var1, true);
  818.    }
  819.  
  820.    public Dimension getPreferredSize(JComponent var1, boolean var2) {
  821.       Dimension var3 = this.getPreferredMinSize();
  822.       if (var2) {
  823.          this.checkConsistency();
  824.       }
  825.  
  826.       if (!this.validCachedPreferredSize) {
  827.          this.updateCachedPreferredSize();
  828.       }
  829.  
  830.       if (this.tree != null) {
  831.          return var3 != null ? new Dimension(Math.max(var3.width, this.cPreferredSize.width), Math.max(var3.height, this.cPreferredSize.height)) : new Dimension(this.cPreferredSize.width, this.cPreferredSize.height);
  832.       } else {
  833.          return var3 != null ? var3 : new Dimension(0, 0);
  834.       }
  835.    }
  836.  
  837.    public Dimension getMinimumSize(JComponent var1) {
  838.       return this.getPreferredMinSize() != null ? this.getPreferredMinSize() : new Dimension(0, 0);
  839.    }
  840.  
  841.    public Dimension getMaximumSize(JComponent var1) {
  842.       if (this.tree != null) {
  843.          return this.getPreferredSize(this.tree);
  844.       } else {
  845.          return this.getPreferredMinSize() != null ? this.getPreferredMinSize() : new Dimension(0, 0);
  846.       }
  847.    }
  848.  
  849.    public void valueChanged(TreeSelectionEvent var1) {
  850.       this.completeEditing();
  851.       super.valueChanged(var1);
  852.       this.lastSelectedRow = ((AbstractTreeUI)this).getMinSelectionRow();
  853.       TreePath[] var2 = var1.getPaths();
  854.       Rectangle var4 = this.tree.getVisibleRect();
  855.       boolean var5 = true;
  856.       int var6 = this.tree.getSize().width;
  857.       if (var2 != null) {
  858.          int var8 = var2.length;
  859.          if (var8 > 4) {
  860.             this.tree.repaint();
  861.             var5 = false;
  862.          } else {
  863.             for(int var7 = 0; var7 < var8; ++var7) {
  864.                Rectangle var3 = ((AbstractTreeUI)this).getPathBounds(var2[var7]);
  865.                if (var3 != null && var4.intersects(var3)) {
  866.                   this.tree.repaint(0, var3.y, var6, var3.height);
  867.                }
  868.             }
  869.          }
  870.       }
  871.  
  872.       if (var5) {
  873.          Rectangle var9 = ((AbstractTreeUI)this).getPathBounds(var1.getOldLeadSelectionPath());
  874.          if (var9 != null && var4.intersects(var9)) {
  875.             this.tree.repaint(0, var9.y, var6, var9.height);
  876.          }
  877.  
  878.          var9 = ((AbstractTreeUI)this).getPathBounds(var1.getNewLeadSelectionPath());
  879.          if (var9 != null && var4.intersects(var9)) {
  880.             this.tree.repaint(0, var9.y, var6, var9.height);
  881.          }
  882.       }
  883.  
  884.    }
  885.  
  886.    public void editingStopped(ChangeEvent var1) {
  887.       this.completeEditing(false, false, true);
  888.    }
  889.  
  890.    public void editingCanceled(ChangeEvent var1) {
  891.       this.completeEditing(false, false, false);
  892.    }
  893.  
  894.    public boolean isEditing() {
  895.       return this.editingComponent != null;
  896.    }
  897.  
  898.    public boolean stopEditing() {
  899.       if (this.editingComponent != null && this.cellEditor.stopCellEditing()) {
  900.          this.completeEditing(false, false, true);
  901.          return true;
  902.       } else {
  903.          return false;
  904.       }
  905.    }
  906.  
  907.    public void cancelEditing() {
  908.       if (this.editingComponent != null) {
  909.          this.completeEditing(false, true, false);
  910.       }
  911.  
  912.    }
  913.  
  914.    protected void completeEditing() {
  915.       if (this.tree.getInvokesStopCellEditing() && this.stopEditingInCompleteEditing && this.editingComponent != null) {
  916.          this.cellEditor.stopCellEditing();
  917.       }
  918.  
  919.       this.completeEditing(false, true, false);
  920.    }
  921.  
  922.    protected void completeEditing(boolean var1, boolean var2, boolean var3) {
  923.       if (this.stopEditingInCompleteEditing && this.editingComponent != null) {
  924.          Component var4 = this.editingComponent;
  925.          TreePath var5 = this.editingPath;
  926.          TreeCellEditor var6 = this.cellEditor;
  927.          Object var7 = var6.getCellEditorValue();
  928.          Rectangle var8 = ((AbstractTreeUI)this).getPathBounds(this.editingPath);
  929.          this.editingComponent = null;
  930.          this.editingPath = null;
  931.          if (var1) {
  932.             var6.stopCellEditing();
  933.          } else if (var2) {
  934.             var6.cancelCellEditing();
  935.          }
  936.  
  937.          this.tree.remove(var4);
  938.          var8.x = 0;
  939.          var8.width = this.tree.getSize().width;
  940.          this.tree.repaint(var8);
  941.          if (var3) {
  942.             super.treeModel.valueForPathChanged(var5, var7);
  943.          }
  944.       }
  945.  
  946.    }
  947.  
  948.    public void startEditingAtPath(TreePath var1) {
  949.       this.scrollPathToVisible(var1);
  950.       if (var1 != null && ((AbstractTreeUI)this).isVisible(var1)) {
  951.          this.startEditing(var1, (MouseEvent)null);
  952.       }
  953.  
  954.    }
  955.  
  956.    protected boolean startEditing(TreePath var1, MouseEvent var2) {
  957.       this.completeEditing();
  958.       if (this.cellEditor != null && this.tree.isPathEditable(var1)) {
  959.          int var3 = ((AbstractTreeUI)this).getRowForPath(var1);
  960.          this.editingComponent = this.cellEditor.getTreeCellEditorComponent(this.tree, var1.getLastPathComponent(), ((AbstractTreeUI)this).isPathSelected(var1), ((AbstractTreeUI)this).isExpanded(var1), super.treeModel.isLeaf(var1.getLastPathComponent()), var3);
  961.          if (this.cellEditor.isCellEditable(var2)) {
  962.             Rectangle var4 = ((AbstractTreeUI)this).getPathBounds(var1);
  963.             if (this.editingComponent.getFont() == null) {
  964.                this.editingComponent.setFont(this.tree.getFont());
  965.             }
  966.  
  967.             this.editingComponent.getPreferredSize();
  968.             this.tree.add(this.editingComponent);
  969.             this.editingComponent.setBounds(var4.x, var4.y, var4.width, var4.height);
  970.             this.editingPath = var1;
  971.             this.editingComponent.validate();
  972.             this.tree.paintImmediately(var4.x, var4.y, var4.width, var4.height);
  973.             if (this.cellEditor.shouldSelectCell(var2)) {
  974.                this.stopEditingInCompleteEditing = false;
  975.  
  976.                try {
  977.                   this.tree.setSelectionRow(var3);
  978.                } catch (Exception var6) {
  979.                   System.out.println("Editing exception: " + var6);
  980.                }
  981.  
  982.                this.stopEditingInCompleteEditing = true;
  983.             }
  984.  
  985.             if (var2 != null && var2 instanceof MouseEvent) {
  986.                Point var5 = SwingUtilities.convertPoint(this.tree, new Point(var2.getX(), var2.getY()), this.editingComponent);
  987.                new BasicTreeMouseListener(this, this.tree, SwingUtilities.getDeepestComponentAt(this.editingComponent, var5.x, var5.y), var2);
  988.             }
  989.  
  990.             return true;
  991.          }
  992.  
  993.          this.editingComponent = null;
  994.       }
  995.  
  996.       return false;
  997.    }
  998.  
  999.    public TreePath getEditingPath() {
  1000.       return this.editingPath;
  1001.    }
  1002.  
  1003.    public void mouseClicked(MouseEvent var1) {
  1004.    }
  1005.  
  1006.    public void mousePressed(MouseEvent var1) {
  1007.       if (this.tree != null && this.tree.isEnabled()) {
  1008.          this.tree.requestFocus();
  1009.       }
  1010.  
  1011.       this.checkConsistency();
  1012.       int var2;
  1013.       if (this.tree != null && this.tree.isEnabled()) {
  1014.          var2 = ((AbstractTreeUI)this).getRowContainingYLocation(var1.getY());
  1015.          if (var2 != -1) {
  1016.             Rectangle var3 = ((AbstractTreeUI)this).getRowBounds(var2);
  1017.             if (var1.getY() > var3.y + var3.height) {
  1018.                var2 = -1;
  1019.             }
  1020.          }
  1021.       } else {
  1022.          var2 = -1;
  1023.       }
  1024.  
  1025.       if (var2 > -1 && var2 < ((AbstractTreeUI)this).getRowCount()) {
  1026.          int var4 = -1;
  1027.          LargeTreeModelNode var5 = null;
  1028.          VisibleTreeNode var6 = null;
  1029.          int var12;
  1030.          if (!super.largeModel) {
  1031.             var6 = ((AbstractTreeUI)this).getNode(var2);
  1032.             var12 = var6.getVisibleLevel();
  1033.          } else if (var2 == 0 && ((AbstractTreeUI)this).isRootVisible()) {
  1034.             var5 = super.largeRoot;
  1035.             var12 = 0;
  1036.          } else {
  1037.             int[] var7 = new int[1];
  1038.             var5 = ((AbstractTreeUI)this).getLargeParentAndChildIndexOfRow(var2, var7);
  1039.             var12 = var5.getVisibleLevel() + 1;
  1040.             var4 = var7[0];
  1041.          }
  1042.  
  1043.          this.checkForClickInExpandControl(var6, var5, var4, var2, var12, var1.getX(), var1.getY());
  1044.          int var13 = var1.getX();
  1045.          int var8;
  1046.          if (((AbstractTreeUI)this).getShowsRootHandles()) {
  1047.             var8 = this.totalChildIndent * (var12 + 1);
  1048.          } else {
  1049.             var8 = this.totalChildIndent * var12;
  1050.          }
  1051.  
  1052.          if (var13 > var8) {
  1053.             int var9;
  1054.             if (!super.largeModel) {
  1055.                var9 = var6.getPreferredSize().width;
  1056.             } else {
  1057.                var9 = ((AbstractTreeUI)this).getRowBounds(var2).width;
  1058.             }
  1059.  
  1060.             if (var13 <= var9 + var8 && !this.startEditing(((AbstractTreeUI)this).getPathForRow(var2), var1)) {
  1061.                int var10 = this.lastSelectedRow;
  1062.                if (var10 >= ((AbstractTreeUI)this).getRowCount() || !((AbstractTreeUI)this).isSelectedIndex(var10)) {
  1063.                   var10 = -1;
  1064.                }
  1065.  
  1066.                if (((InputEvent)var1).isControlDown()) {
  1067.                   if (((AbstractTreeUI)this).isSelectedIndex(var2)) {
  1068.                      this.tree.removeSelectionInterval(var2, var2);
  1069.                   } else {
  1070.                      this.tree.addSelectionInterval(var2, var2);
  1071.                   }
  1072.  
  1073.                   if (var10 != -1) {
  1074.                      this.lastSelectedRow = var10;
  1075.                      return;
  1076.                   }
  1077.                } else if (((InputEvent)var1).isShiftDown()) {
  1078.                   if (var10 == -1) {
  1079.                      this.tree.addSelectionInterval(var2, var2);
  1080.                   } else {
  1081.                      if (var2 < var10) {
  1082.                         this.tree.setSelectionInterval(var2, var10);
  1083.                      } else {
  1084.                         this.tree.setSelectionInterval(var10, var2);
  1085.                      }
  1086.  
  1087.                      this.lastSelectedRow = var10;
  1088.                   }
  1089.  
  1090.                   if (var10 != -1) {
  1091.                      this.lastSelectedRow = var10;
  1092.                      return;
  1093.                   }
  1094.                } else {
  1095.                   this.tree.setSelectionInterval(var2, var2);
  1096.                   if (var1.getClickCount() == 2) {
  1097.                      if (!super.largeModel) {
  1098.                         var6.toggleExpanded();
  1099.                         this.ensureRowsAreVisible(var2, var2 + Math.min(10, var6.visibleChildCount()));
  1100.                         return;
  1101.                      }
  1102.  
  1103.                      if (var4 == -1) {
  1104.                         var5.toggleExpanded();
  1105.                         this.ensureRowsAreVisible(var2, var2 + Math.min(10, var5.getTotalChildCount()));
  1106.                         return;
  1107.                      }
  1108.  
  1109.                      if (!((AbstractTreeUI)this).isExpanded(var2)) {
  1110.                         ((AbstractTreeUI)this).expandRow(var2);
  1111.                      } else {
  1112.                         ((AbstractTreeUI)this).collapseRow(var2);
  1113.                      }
  1114.  
  1115.                      LargeTreeModelNode var11 = ((AbstractTreeUI)this).getLargeTreeModelNodeForRow(var2, false);
  1116.                      if (var11 != null) {
  1117.                         this.ensureRowsAreVisible(var2, var2 + Math.min(10, var11.getTotalChildCount()));
  1118.                         return;
  1119.                      }
  1120.  
  1121.                      this.ensureRowsAreVisible(var2, var2);
  1122.                   }
  1123.                }
  1124.             }
  1125.          }
  1126.       }
  1127.  
  1128.    }
  1129.  
  1130.    protected void checkForClickInExpandControl(VisibleTreeNode var1, LargeTreeModelNode var2, int var3, int var4, int var5, int var6, int var7) {
  1131.       if (this.clickedInExpandControl(var1, var2, var4, var5, var6, var7)) {
  1132.          this.handleExpandControlClick(var1, var2, var3, var4);
  1133.       }
  1134.  
  1135.    }
  1136.  
  1137.    protected boolean clickedInExpandControl(VisibleTreeNode var1, LargeTreeModelNode var2, int var3, int var4, int var5, int var6) {
  1138.       if (var1 != null && var1.isLeaf()) {
  1139.          return false;
  1140.       } else {
  1141.          int var7;
  1142.          if (this.getExpandedIcon() != null) {
  1143.             var7 = this.getExpandedIcon().getIconWidth();
  1144.          } else {
  1145.             var7 = 8;
  1146.          }
  1147.  
  1148.          int var8;
  1149.          if (((AbstractTreeUI)this).getShowsRootHandles()) {
  1150.             var8 = var4 * this.totalChildIndent + this.getLeftChildIndent() - var7 / 2;
  1151.          } else {
  1152.             var8 = (var4 - 1) * this.totalChildIndent + this.getLeftChildIndent() - var7 / 2;
  1153.          }
  1154.  
  1155.          int var9 = var8 + var7;
  1156.          return var5 >= var8 && var5 <= var9;
  1157.       }
  1158.    }
  1159.  
  1160.    public void handleExpandControlClick(VisibleTreeNode var1, LargeTreeModelNode var2, int var3, int var4) {
  1161.       if (!super.largeModel) {
  1162.          var1.toggleExpanded();
  1163.          this.ensureRowsAreVisible(var4, var4 + Math.min(10, var1.visibleChildCount()));
  1164.       } else if (var3 == -1) {
  1165.          var2.toggleExpanded();
  1166.          this.ensureRowsAreVisible(var4, var4 + Math.min(10, var2.getTotalChildCount()));
  1167.       } else {
  1168.          this.toggleExpandState(var4);
  1169.          LargeTreeModelNode var5 = ((AbstractTreeUI)this).getLargeTreeModelNodeForRow(var4, false);
  1170.          if (var5 != null) {
  1171.             this.ensureRowsAreVisible(var4, var4 + Math.min(10, var5.getTotalChildCount()));
  1172.          }
  1173.  
  1174.       }
  1175.    }
  1176.  
  1177.    protected void toggleExpandState(int var1) {
  1178.       if (!((AbstractTreeUI)this).isExpanded(var1)) {
  1179.          ((AbstractTreeUI)this).expandRow(var1);
  1180.       } else {
  1181.          ((AbstractTreeUI)this).collapseRow(var1);
  1182.       }
  1183.    }
  1184.  
  1185.    public void mouseReleased(MouseEvent var1) {
  1186.    }
  1187.  
  1188.    public void mouseEntered(MouseEvent var1) {
  1189.    }
  1190.  
  1191.    public void mouseExited(MouseEvent var1) {
  1192.    }
  1193.  
  1194.    public void focusGained(FocusEvent var1) {
  1195.       if (this.tree != null) {
  1196.          int var2 = this.tree.getLeadSelectionRow();
  1197.          if (var2 != -1) {
  1198.             this.tree.repaint(((AbstractTreeUI)this).getRowBounds(var2));
  1199.          }
  1200.       }
  1201.  
  1202.    }
  1203.  
  1204.    public void focusLost(FocusEvent var1) {
  1205.       this.focusGained(var1);
  1206.    }
  1207.  
  1208.    public void keyPressed(KeyEvent var1) {
  1209.       if (this.tree.hasFocus() && this.tree.isEnabled()) {
  1210.          KeyStroke var2 = KeyStroke.getKeyStroke(var1.getKeyCode(), ((InputEvent)var1).getModifiers());
  1211.          if (this.tree.getConditionForKeyStroke(var2) == 0) {
  1212.             ActionListener var3 = this.tree.getActionForKeyStroke(var2);
  1213.             if (var3 instanceof Action) {
  1214.                this.repeatKeyAction = (Action)var3;
  1215.             } else {
  1216.                this.repeatKeyAction = null;
  1217.             }
  1218.          } else {
  1219.             this.repeatKeyAction = null;
  1220.          }
  1221.  
  1222.          if (this.isKeyDown && this.repeatKeyAction != null) {
  1223.             this.repeatKeyAction.actionPerformed((ActionEvent)null);
  1224.             ((InputEvent)var1).consume();
  1225.             return;
  1226.          }
  1227.  
  1228.          this.isKeyDown = true;
  1229.       }
  1230.  
  1231.    }
  1232.  
  1233.    public void keyReleased(KeyEvent var1) {
  1234.       this.isKeyDown = false;
  1235.    }
  1236.  
  1237.    public void keyTyped(KeyEvent var1) {
  1238.    }
  1239.  
  1240.    public void setModel(TreeModel var1) {
  1241.       this.completeEditing();
  1242.       super.setModel(var1);
  1243.    }
  1244.  
  1245.    public void rebuild() {
  1246.       this.completeEditing();
  1247.       super.rebuild();
  1248.    }
  1249.  
  1250.    public void setSelectionModel(TreeSelectionModel var1) {
  1251.       this.completeEditing();
  1252.       if (super.treeSelectionModel != null) {
  1253.          super.treeSelectionModel.removePropertyChangeListener(this);
  1254.       }
  1255.  
  1256.       super.setSelectionModel(var1);
  1257.       if (super.treeSelectionModel != null) {
  1258.          super.treeSelectionModel.addPropertyChangeListener(this);
  1259.       }
  1260.  
  1261.       if (this.tree != null) {
  1262.          this.tree.repaint();
  1263.       }
  1264.  
  1265.    }
  1266.  
  1267.    protected VisibleTreeNode createNodeForValue(Object var1, int var2) {
  1268.       return new BasicVisibleTreeNode(this, var1, var2);
  1269.    }
  1270.  
  1271.    protected LargeTreeModelNode createLargeTreeModelNodeForValue(Object var1, int var2) {
  1272.       return new BasicLargeTreeModelNode(this, var1, var2);
  1273.    }
  1274.  
  1275.    protected void repaintNode(BasicLargeTreeModelNode var1) {
  1276.       if (this.tree != null) {
  1277.          this.tree.repaint(0, ((LargeTreeModelNode)var1).getRow() * super.rowHeight, this.tree.getSize().width, super.rowHeight);
  1278.       }
  1279.  
  1280.    }
  1281.  
  1282.    protected void repaintNode(VisibleTreeNode var1) {
  1283.       Rectangle var2 = var1.getNodeBounds();
  1284.       if (this.tree != null) {
  1285.          this.tree.repaint(0, var2.y, this.tree.getSize().width, var2.height);
  1286.       }
  1287.  
  1288.    }
  1289.  
  1290.    private void writeObject(ObjectOutputStream var1) throws IOException {
  1291.       Vector var2 = new Vector();
  1292.       var1.defaultWriteObject();
  1293.       if (this.collapsedIcon != null && this.collapsedIcon instanceof Serializable) {
  1294.          var2.addElement("collapsedIcon");
  1295.          var2.addElement(this.collapsedIcon);
  1296.       }
  1297.  
  1298.       if (this.expandedIcon != null && this.expandedIcon instanceof Serializable) {
  1299.          var2.addElement("expandedIcon");
  1300.          var2.addElement(this.expandedIcon);
  1301.       }
  1302.  
  1303.       if (this.currentCellRenderer != null && this.currentCellRenderer instanceof Serializable) {
  1304.          var2.addElement("currentCellRenderer");
  1305.          var2.addElement(this.currentCellRenderer);
  1306.       }
  1307.  
  1308.       if (this.cellEditor != null && this.cellEditor instanceof Serializable) {
  1309.          var2.addElement("cellEditor");
  1310.          var2.addElement(this.cellEditor);
  1311.       }
  1312.  
  1313.       var1.writeObject(var2);
  1314.    }
  1315.  
  1316.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  1317.       var1.defaultReadObject();
  1318.       Vector var2 = (Vector)var1.readObject();
  1319.       int var3 = 0;
  1320.       int var4 = var2.size();
  1321.       if (var3 < var4 && var2.elementAt(var3).equals("collapsedIcon")) {
  1322.          ++var3;
  1323.          this.collapsedIcon = (Icon)var2.elementAt(var3);
  1324.          ++var3;
  1325.       }
  1326.  
  1327.       if (var3 < var4 && var2.elementAt(var3).equals("expandedIcon")) {
  1328.          ++var3;
  1329.          this.expandedIcon = (Icon)var2.elementAt(var3);
  1330.          ++var3;
  1331.       }
  1332.  
  1333.       if (var3 < var4 && var2.elementAt(var3).equals("currentCellRenderer")) {
  1334.          ++var3;
  1335.          this.currentCellRenderer = (TreeCellRenderer)var2.elementAt(var3);
  1336.          ++var3;
  1337.       }
  1338.  
  1339.       if (var3 < var4 && var2.elementAt(var3).equals("cellEditor")) {
  1340.          ++var3;
  1341.          this.cellEditor = (TreeCellEditor)var2.elementAt(var3);
  1342.          ++var3;
  1343.       }
  1344.  
  1345.       if (super.largeModel && this.tree != null && this.componentListener == null) {
  1346.          this.componentListener = new 2(this);
  1347.          this.tree.addComponentListener(this.componentListener);
  1348.       }
  1349.  
  1350.    }
  1351. }
  1352.