home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 1999 January / maximum-cd-1999-01.iso / Benchmarks / 12 Step / MusicMatch Jukebox / mmsetup.EXE / data1.cab / Help_Files / WebHelp.cab / treeview / TreeView.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-03-27  |  11.8 KB  |  851 lines

  1. package treeview;
  2.  
  3. import java.applet.Applet;
  4. import java.awt.Button;
  5. import java.awt.Color;
  6. import java.awt.Component;
  7. import java.awt.Container;
  8. import java.awt.Event;
  9. import java.awt.Font;
  10. import java.awt.FontMetrics;
  11. import java.awt.Graphics;
  12. import java.awt.Image;
  13. import java.awt.LayoutManager;
  14. import java.awt.Panel;
  15. import java.awt.Rectangle;
  16. import java.awt.Scrollbar;
  17.  
  18. public class TreeView extends Panel implements ImageSetSource {
  19.    protected int m_nLabelOffset;
  20.    protected ImageSet m_isImages;
  21.    protected ImageSet m_isConnectors;
  22.    protected TreeViewNode m_tvnRoot;
  23.    protected boolean m_bLayoutComplete;
  24.    protected boolean m_bUseButtons;
  25.    protected boolean m_bUseLines;
  26.    protected boolean m_bRootsConnected;
  27.    protected Applet m_applet;
  28.    protected TreeViewNode m_tvnCurrentSelection;
  29.    protected Image m_imgDoubleBuffer;
  30.    protected Rectangle m_rectDisplayArea;
  31.    protected Scrollbar m_sbHorizontal;
  32.    protected Scrollbar m_sbVertical;
  33.    protected Button m_btnScrollerCorner;
  34.    protected int m_nInsetX;
  35.    protected int m_nInsetY;
  36.    protected int m_nConnectorWidth;
  37.    protected int m_nIndent;
  38.    protected int m_nIconWidth;
  39.    protected int m_nIconHeight;
  40.    protected int m_nCellHeight;
  41.    protected int m_nFontBaseOffset;
  42.    private boolean m_bNetscapeScrollers;
  43.    private boolean m_bLayedOutByMouseOver;
  44.    private boolean m_bCompletelyFilled;
  45.    private int m_nHorizPosPixels;
  46.    private int m_nVerticalPosPixels;
  47.    private int m_nImageWidth;
  48.    private int m_nImageHeight;
  49.    public static final int LEAF = 0;
  50.    public static final int BRANCH_COLLAPSED = 1;
  51.    public static final int BRANCH_EXPANDED = 2;
  52.    public static final int LEAF_SELECTED = 3;
  53.    public static final int BRANCH_COLLAPSED_SELECTED = 4;
  54.    public static final int BRANCH_EXPANDED_SELECTED = 5;
  55.    public static final int MIN_NUMBER_IMAGES = 3;
  56.    public static final int MIN_NUMBER_IMAGES_SELECTED = 6;
  57.    protected static final int HEIGHT_HORIZONTAL_SB = 16;
  58.    protected static final int WIDTH_VERTICAL_SB = 16;
  59.    protected static final int ICON_VERTICAL_PADDING = 1;
  60.    protected static final long c_lnDoubleClickWindow = 500L;
  61.    private boolean m_bIsNS3Win32;
  62.    private boolean m_bIsNSWin16;
  63.    private boolean m_bIsUnix;
  64.    private long m_lnLastClickTime;
  65.    private boolean m_bIsMac;
  66.  
  67.    protected TreeViewNode nodeAtLocation(int var1, int var2) {
  68.       if (!this.m_rectDisplayArea.inside(var1, var2)) {
  69.          return null;
  70.       } else {
  71.          int var3 = var2 + this.m_nVerticalPosPixels;
  72.  
  73.          for(TreeViewNode var4 = this.m_tvnRoot; var4 != null; var4 = var4.nextNode(true)) {
  74.             Rectangle var5 = var4.getBounds();
  75.             if (var3 > var5.y && var3 <= var5.y + var5.height && var4.getLabel() != null) {
  76.                return var4;
  77.             }
  78.          }
  79.  
  80.          return null;
  81.       }
  82.    }
  83.  
  84.    public boolean mouseEnter(Event var1, int var2, int var3) {
  85.       if (!this.m_bLayoutComplete) {
  86.          this.layout();
  87.       }
  88.  
  89.       if (this.m_applet != null) {
  90.          TreeViewNode var4 = this.nodeAtLocation(var2, var3);
  91.          if (var4 != null && this.m_bCompletelyFilled) {
  92.             this.m_applet.showStatus(var4.getLabel());
  93.          }
  94.       }
  95.  
  96.       return false;
  97.    }
  98.  
  99.    protected int getMaxWidth(TreeViewNode var1, int var2, boolean var3) {
  100.       int var4 = 0;
  101.  
  102.       for(TreeViewNode var5 = var1; var5 != null; var5 = (TreeViewNode)((SiblingChildTree)var5).getSibling()) {
  103.          if (var5.getWidth() + var2 > var4) {
  104.             var4 = var5.getWidth() + var2;
  105.          }
  106.  
  107.          if (!var3 || !var5.getCollapsedState()) {
  108.             int var6 = this.getMaxWidth((TreeViewNode)((SiblingChildTree)var5).getChild(), var2 + this.m_nIndent, var3);
  109.             if (var6 > var4) {
  110.                var4 = var6;
  111.             }
  112.          }
  113.       }
  114.  
  115.       return var4;
  116.    }
  117.  
  118.    public int getLabelOffset() {
  119.       return this.m_nLabelOffset;
  120.    }
  121.  
  122.    public void setLabelOffset(int var1) {
  123.       this.m_nLabelOffset = var1;
  124.    }
  125.  
  126.    protected void sizeNode(TreeViewNode var1) {
  127.       if (var1 != null) {
  128.          FontMetrics var2 = ((Component)this).getFontMetrics(((Component)this).getFont());
  129.          int var3 = 0;
  130.          if (this.m_bUseButtons || this.m_bUseLines) {
  131.             var3 = this.m_nIconWidth;
  132.          }
  133.  
  134.          if (var1.getCurrentImage() != null) {
  135.             var3 += this.m_nIconWidth + this.m_nLabelOffset;
  136.          }
  137.  
  138.          if (var1.getLabel() != null) {
  139.             var3 += var2.stringWidth(var1.getLabel());
  140.          } else if (var1.getCurrentImage() != null) {
  141.             var3 -= this.m_nLabelOffset;
  142.          }
  143.  
  144.          var1.setBounds(0, 0, var3, this.m_nCellHeight);
  145.       }
  146.    }
  147.  
  148.    public TreeViewNode nextNode(boolean var1) {
  149.       try {
  150.          return (TreeViewNode)this.m_tvnRoot.prevNode();
  151.       } catch (NullPointerException var2) {
  152.          return null;
  153.       }
  154.    }
  155.  
  156.    public TreeViewNode previousNode(boolean var1) {
  157.       try {
  158.          return (TreeViewNode)this.m_tvnRoot.prevNode();
  159.       } catch (NullPointerException var2) {
  160.          return null;
  161.       }
  162.    }
  163.  
  164.    public void expandAll() {
  165.       try {
  166.          this.m_tvnRoot.expandTree();
  167.       } catch (NullPointerException var1) {
  168.       }
  169.    }
  170.  
  171.    public void update(Graphics var1) {
  172.       if (!this.m_bLayoutComplete) {
  173.          this.layout();
  174.       }
  175.  
  176.       this.paint(var1);
  177.    }
  178.  
  179.    protected void sizeTree(TreeViewNode var1) {
  180.       for(TreeViewNode var2 = var1; var2 != null; var2 = (TreeViewNode)((SiblingChildTree)var2).getSibling()) {
  181.          this.sizeNode(var2);
  182.          this.sizeTree((TreeViewNode)((SiblingChildTree)var2).getChild());
  183.       }
  184.  
  185.    }
  186.  
  187.    protected void setSelectionToTop() {
  188.       if (this.m_tvnCurrentSelection != null) {
  189.          this.m_tvnCurrentSelection.select(false);
  190.       }
  191.  
  192.       for(this.m_tvnCurrentSelection = this.m_tvnRoot; this.m_tvnCurrentSelection != null && this.m_tvnCurrentSelection.getLabel() == null; this.m_tvnCurrentSelection = this.m_tvnCurrentSelection.nextNode(true)) {
  193.       }
  194.  
  195.       if (this.m_tvnCurrentSelection != null) {
  196.          this.m_tvnCurrentSelection.select(true);
  197.       }
  198.  
  199.    }
  200.  
  201.    public int getCellHeight() {
  202.       return this.m_nCellHeight;
  203.    }
  204.  
  205.    public void setCellHeight(int var1) {
  206.       if (var1 < this.m_nIconHeight + 1) {
  207.          this.m_nCellHeight = this.m_nIconHeight + 1;
  208.       } else {
  209.          this.m_nCellHeight = var1;
  210.       }
  211.    }
  212.  
  213.    public int getXInset() {
  214.       return this.m_nInsetX;
  215.    }
  216.  
  217.    public void setXInset(int var1) {
  218.       if (var1 < 0) {
  219.          var1 = 0;
  220.       }
  221.  
  222.    }
  223.  
  224.    public synchronized void layout() {
  225.       this.m_bLayoutComplete = false;
  226.       this.m_rectDisplayArea.reshape(0, 0, ((Component)this).bounds().width, ((Component)this).bounds().height);
  227.       if (this.m_rectDisplayArea.width >= 1 && this.m_rectDisplayArea.height >= 1) {
  228.          try {
  229.             this.sizeTree(this.m_tvnRoot);
  230.             int var1 = this.getMaxWidth(this.m_tvnRoot, 0, true);
  231.             int var2 = this.getMaxHeight(this.m_tvnRoot, 0, true) / this.m_nCellHeight - 1;
  232.             if (var2 >= 1) {
  233.                if (var1 + 1 > this.m_rectDisplayArea.width) {
  234.                   Rectangle var10000 = this.m_rectDisplayArea;
  235.                   var10000.height -= 16;
  236.                }
  237.  
  238.                int var3 = this.m_rectDisplayArea.height / this.m_nCellHeight;
  239.                if (var2 > var3) {
  240.                   Rectangle var5 = this.m_rectDisplayArea;
  241.                   var5.width -= 16;
  242.                }
  243.  
  244.                this.rods_reshape(this.m_sbHorizontal, 0, this.m_rectDisplayArea.height, this.m_rectDisplayArea.width, 16);
  245.                this.m_sbHorizontal.setValues(this.m_nHorizPosPixels, this.m_rectDisplayArea.width, 0, var1 - (this.m_bNetscapeScrollers ? this.m_rectDisplayArea.width : 0));
  246.                this.rods_reshape(this.m_sbVertical, this.m_rectDisplayArea.width, 0, 16, this.m_rectDisplayArea.height);
  247.                this.m_sbVertical.setValues(this.m_nVerticalPosPixels / this.m_nCellHeight, var3, 0, var2 - (this.m_bNetscapeScrollers ? var3 : 1));
  248.                this.rods_reshape(this.m_btnScrollerCorner, this.m_rectDisplayArea.width, this.m_rectDisplayArea.height, 16, 16);
  249.                if (this.m_rectDisplayArea.height < 0) {
  250.                   this.m_rectDisplayArea.height = 0;
  251.                }
  252.  
  253.                if (this.m_rectDisplayArea.width < 0) {
  254.                   this.m_rectDisplayArea.width = 0;
  255.                }
  256.  
  257.                if (this.m_imgDoubleBuffer != null && (this.m_nImageWidth != this.m_rectDisplayArea.width || this.m_nImageHeight != this.m_rectDisplayArea.height)) {
  258.                   this.m_imgDoubleBuffer.flush();
  259.                   this.m_imgDoubleBuffer = null;
  260.                }
  261.  
  262.                if (this.m_imgDoubleBuffer == null) {
  263.                   this.m_imgDoubleBuffer = ((Component)this).createImage(this.m_rectDisplayArea.width, this.m_rectDisplayArea.height);
  264.                   this.m_nImageWidth = this.m_rectDisplayArea.width;
  265.                   this.m_nImageHeight = this.m_rectDisplayArea.height;
  266.                }
  267.  
  268.                this.m_bLayoutComplete = true;
  269.             }
  270.          } catch (Exception var4) {
  271.             this.m_imgDoubleBuffer = null;
  272.          }
  273.       }
  274.    }
  275.  
  276.    public int getIconWidth() {
  277.       return this.m_nIconWidth;
  278.    }
  279.  
  280.    public void setIconWidth(int var1) {
  281.       if (var1 < 0) {
  282.          var1 = 0;
  283.       }
  284.  
  285.       this.m_nIconWidth = var1;
  286.    }
  287.  
  288.    public ImageSet getConnectors() {
  289.       return this.m_isConnectors;
  290.    }
  291.  
  292.    public void setConnectors(ImageSet var1) {
  293.       this.m_isConnectors = var1;
  294.    }
  295.  
  296.    protected void toggleOpenCloseNode(TreeViewNode var1) {
  297.       var1.setCollapsedState(!var1.getCollapsedState());
  298.       if (var1.getCollapsedState()) {
  299.          this.m_tvnCurrentSelection.select(false);
  300.  
  301.          for(TreeViewNode var2 = (TreeViewNode)this.m_tvnCurrentSelection.getParent(); var2 != null; var2 = (TreeViewNode)((SiblingChildTree)var2).getParent()) {
  302.             if (var2.getCollapsedState()) {
  303.                this.m_tvnCurrentSelection = var2;
  304.             }
  305.          }
  306.  
  307.          this.m_tvnCurrentSelection.select(true);
  308.          int var5 = this.getMaxHeight(this.m_tvnRoot, 0, true) / this.m_nCellHeight - 1;
  309.          int var3 = this.m_rectDisplayArea.height / this.m_nCellHeight;
  310.          int var4 = this.m_nVerticalPosPixels / this.m_nCellHeight;
  311.          if (var4 + var3 > var5) {
  312.             var4 = Math.max(var5 - var3, 0);
  313.          }
  314.  
  315.          this.m_nVerticalPosPixels = var4 * this.m_nCellHeight;
  316.       }
  317.  
  318.    }
  319.  
  320.    public TreeViewNode nextVisibleNode() {
  321.       try {
  322.          return this.m_tvnRoot.nextNode(true);
  323.       } catch (NullPointerException var1) {
  324.          return null;
  325.       }
  326.    }
  327.  
  328.    public TreeViewNode previousVisibleNode() {
  329.       try {
  330.          return this.m_tvnRoot.prevNode(true);
  331.       } catch (NullPointerException var1) {
  332.          return null;
  333.       }
  334.    }
  335.  
  336.    protected int getMaxHeight(TreeViewNode var1, int var2, boolean var3) {
  337.       int var4 = var2;
  338.  
  339.       for(TreeViewNode var5 = var1; var5 != null; var5 = (TreeViewNode)((SiblingChildTree)var5).getSibling()) {
  340.          var4 += var5.getHeight();
  341.          if (!var3 || !var5.getCollapsedState()) {
  342.             var4 = this.getMaxHeight((TreeViewNode)((SiblingChildTree)var5).getChild(), var4, var3);
  343.          }
  344.       }
  345.  
  346.       return var4;
  347.    }
  348.  
  349.    public int getYInset() {
  350.       return this.m_nInsetY;
  351.    }
  352.  
  353.    public void setFilled(boolean var1) {
  354.       this.m_bCompletelyFilled = var1;
  355.       this.m_bLayoutComplete = false;
  356.       ((Component)this).repaint();
  357.    }
  358.  
  359.    public void setYInset(int var1) {
  360.       if (var1 < 0) {
  361.          var1 = 0;
  362.       }
  363.  
  364.    }
  365.  
  366.    public boolean mouseExit(Event var1, int var2, int var3) {
  367.       if (this.m_applet != null && this.m_bCompletelyFilled) {
  368.          this.m_applet.showStatus("");
  369.       }
  370.  
  371.       return false;
  372.    }
  373.  
  374.    public void setApplet(Applet var1) {
  375.       this.m_applet = var1;
  376.    }
  377.  
  378.    public void paint(Graphics var1) {
  379.       if (!this.m_bLayoutComplete) {
  380.          this.layout();
  381.       }
  382.  
  383.       if (this.m_imgDoubleBuffer != null) {
  384.          if (this.m_bIsNS3Win32) {
  385.             var1.dispose();
  386.          }
  387.  
  388.          Graphics var2 = this.m_imgDoubleBuffer.getGraphics();
  389.          var2.setFont(((Component)this).getFont());
  390.          var2.setColor(((Component)this).getBackground());
  391.          var2.fillRect(0, 0, ((Component)this).bounds().width, ((Component)this).bounds().height);
  392.          var2.setColor(((Component)this).getForeground());
  393.          var2.translate(-this.m_nHorizPosPixels, -this.m_nVerticalPosPixels);
  394.  
  395.          try {
  396.             this.paintTree(var2, this.m_tvnRoot, this.m_nInsetX, this.m_nInsetY);
  397.          } catch (NullPointerException var3) {
  398.          }
  399.  
  400.          var2.dispose();
  401.          var2 = this.m_imgDoubleBuffer.getGraphics();
  402.          this.paintBorder(var2);
  403.          if (this.m_bIsNS3Win32) {
  404.             var2.dispose();
  405.             var1 = ((Component)this).getGraphics();
  406.          }
  407.  
  408.          var1.drawImage(this.m_imgDoubleBuffer, 0, 0, this);
  409.       }
  410.    }
  411.  
  412.    protected void paintNode(Graphics var1, TreeViewNode var2, int var3, int var4) {
  413.       var2.moveBounds(var3, var4);
  414.       var3 = this.drawConnector(var1, var2, var3, var4);
  415.       if (var2.getCurrentImage() != null) {
  416.          var1.drawImage(var2.getCurrentImage(), var3, var4 + 1, this.m_nIconWidth, this.m_nIconHeight, this);
  417.          var3 += this.m_nIconWidth + this.m_nLabelOffset;
  418.       }
  419.  
  420.       if (var2.getLabel() != null) {
  421.          this.drawText(var1, var2, var3, var4);
  422.       }
  423.  
  424.    }
  425.  
  426.    protected void rods_reshape(Component var1, int var2, int var3, int var4, int var5) {
  427.       var1.move(var2, var3);
  428.       var1.resize(var4, var5);
  429.    }
  430.  
  431.    public boolean getUseLines() {
  432.       return this.m_bUseLines;
  433.    }
  434.  
  435.    public TreeViewNode getRoot() {
  436.       return this.m_tvnRoot;
  437.    }
  438.  
  439.    public void setRoot(TreeViewNode var1) {
  440.       this.m_tvnRoot = var1;
  441.       this.setSelectionToTop();
  442.    }
  443.  
  444.    public void setUseLines(boolean var1) {
  445.       this.m_bUseLines = var1;
  446.    }
  447.  
  448.    protected int drawConnector(Graphics var1, TreeViewNode var2, int var3, int var4) {
  449.       if (this.m_bUseButtons && this.m_bUseLines) {
  450.          Image var17 = null;
  451.          Object var6 = null;
  452.  
  453.          try {
  454.             if (((SiblingChildTree)var2).getChild() != null) {
  455.                if (var2.getCollapsedState()) {
  456.                   var17 = this.m_isConnectors.getImage(5);
  457.                } else {
  458.                   var17 = this.m_isConnectors.getImage(6);
  459.                }
  460.             }
  461.          } catch (IndexOutOfBoundsException var11) {
  462.             var17 = null;
  463.          } catch (NullPointerException var12) {
  464.             var17 = null;
  465.          }
  466.  
  467.          try {
  468.             if (((SiblingChildTree)var2).getParent() == null) {
  469.                if (this.m_bRootsConnected) {
  470.                   if (((SiblingChildTree)var2).getSiblingLeft() == null) {
  471.                      if (((SiblingChildTree)var2).getSibling() == null) {
  472.                         var18 = this.m_isConnectors.getImage(1);
  473.                      } else {
  474.                         var18 = this.m_isConnectors.getImage(2);
  475.                      }
  476.                   } else if (((SiblingChildTree)var2).getSibling() == null) {
  477.                      var18 = this.m_isConnectors.getImage(4);
  478.                   } else {
  479.                      var18 = this.m_isConnectors.getImage(3);
  480.                   }
  481.                } else {
  482.                   var18 = this.m_isConnectors.getImage(1);
  483.                }
  484.             } else if (((SiblingChildTree)var2).getSiblingLeft() == null && ((SiblingChildTree)var2).getParent() != null && ((TreeViewNode)((SiblingChildTree)var2).getParent()).getLabel() == null) {
  485.                var18 = this.m_isConnectors.getImage(2);
  486.             } else if (((SiblingChildTree)var2).getSibling() == null) {
  487.                var18 = this.m_isConnectors.getImage(4);
  488.             } else {
  489.                var18 = this.m_isConnectors.getImage(3);
  490.             }
  491.          } catch (IndexOutOfBoundsException var13) {
  492.             var18 = null;
  493.          } catch (NullPointerException var14) {
  494.             var18 = null;
  495.          }
  496.  
  497.          if (var18 != null) {
  498.             var1.drawImage(var18, var3, var4, this);
  499.          }
  500.  
  501.          if (var17 != null) {
  502.             var1.drawImage(var17, var3, var4, this);
  503.          }
  504.  
  505.          var3 += this.m_nConnectorWidth;
  506.       } else if (this.m_bUseButtons) {
  507.          Image var5 = null;
  508.  
  509.          try {
  510.             if (((SiblingChildTree)var2).getChild() != null) {
  511.                if (var2.getCollapsedState()) {
  512.                   var5 = this.m_isConnectors.getImage(5);
  513.                } else {
  514.                   var5 = this.m_isConnectors.getImage(6);
  515.                }
  516.             }
  517.          } catch (IndexOutOfBoundsException var9) {
  518.             var5 = null;
  519.          } catch (NullPointerException var10) {
  520.             var5 = null;
  521.          }
  522.  
  523.          if (var5 != null) {
  524.             var1.drawImage(var5, var3, var4, this);
  525.          }
  526.  
  527.          var3 += this.m_nConnectorWidth;
  528.       } else if (this.m_bUseLines) {
  529.          Object var15 = null;
  530.  
  531.          try {
  532.             if (((SiblingChildTree)var2).getParent() == null) {
  533.                if (this.m_bRootsConnected) {
  534.                   if (((SiblingChildTree)var2).getSiblingLeft() == null) {
  535.                      if (((SiblingChildTree)var2).getSibling() == null) {
  536.                         var16 = this.m_isConnectors.getImage(1);
  537.                      } else {
  538.                         var16 = this.m_isConnectors.getImage(2);
  539.                      }
  540.                   } else if (((SiblingChildTree)var2).getSibling() == null) {
  541.                      var16 = this.m_isConnectors.getImage(4);
  542.                   } else {
  543.                      var16 = this.m_isConnectors.getImage(3);
  544.                   }
  545.                } else {
  546.                   var16 = this.m_isConnectors.getImage(1);
  547.                }
  548.             } else if (((SiblingChildTree)var2).getSibling() == null) {
  549.                var16 = this.m_isConnectors.getImage(4);
  550.             } else {
  551.                var16 = this.m_isConnectors.getImage(3);
  552.             }
  553.          } catch (IndexOutOfBoundsException var7) {
  554.             var16 = null;
  555.          } catch (NullPointerException var8) {
  556.             var16 = null;
  557.          }
  558.  
  559.          if (var16 != null) {
  560.             var1.drawImage(var16, var3, var4, this);
  561.          }
  562.  
  563.          var3 += this.m_nConnectorWidth;
  564.       }
  565.  
  566.       return var3;
  567.    }
  568.  
  569.    protected void paintBorder(Graphics var1) {
  570.       Rectangle var2 = this.m_rectDisplayArea;
  571.       Color var3 = ((Component)this).getBackground();
  572.       Color var4 = var3.darker();
  573.       Color var5 = var4.darker();
  574.       Color var6 = var5.darker();
  575.       var1.setColor(var5);
  576.       var1.drawLine(0, 0, var2.width - 1, 0);
  577.       var1.drawLine(0, 0, 0, var2.height - 1);
  578.       var1.setColor(var6);
  579.       var1.drawLine(1, 1, var2.width - 2, 1);
  580.       var1.drawLine(1, 1, 1, var2.height - 2);
  581.       var1.setColor(var4);
  582.       var1.drawLine(var2.width - 2, 1, var2.width - 2, var2.height - 2);
  583.       var1.drawLine(1, var2.height - 2, var2.width - 2, var2.height - 2);
  584.       var1.setColor(var3);
  585.       var1.drawLine(var2.width - 1, 1, var2.width - 1, var2.height - 1);
  586.       var1.drawLine(0, var2.height - 1, var2.width - 1, var2.height - 1);
  587.    }
  588.  
  589.    public void collapseAll() {
  590.       try {
  591.          this.m_tvnRoot.collapseTree();
  592.       } catch (NullPointerException var1) {
  593.       }
  594.    }
  595.  
  596.    public boolean getUseButtons() {
  597.       return this.m_bUseButtons;
  598.    }
  599.  
  600.    public void setUseButtons(boolean var1) {
  601.       this.m_bUseButtons = var1;
  602.    }
  603.  
  604.    public int getIconHeight() {
  605.       return this.m_nIconHeight;
  606.    }
  607.  
  608.    public void setIconHeight(int var1) {
  609.       if (var1 < 0) {
  610.          var1 = 0;
  611.       }
  612.  
  613.       this.m_nIconHeight = var1;
  614.       if (var1 > this.m_nCellHeight - 1) {
  615.          this.m_nCellHeight = var1 + 1;
  616.       }
  617.  
  618.    }
  619.  
  620.    public ImageSet getImages() {
  621.       return this.m_isImages;
  622.    }
  623.  
  624.    public void setImages(ImageSet var1) {
  625.       this.m_isImages = var1;
  626.    }
  627.  
  628.    public int getIndent() {
  629.       return this.m_nIndent;
  630.    }
  631.  
  632.    public void setIndent(int var1) {
  633.       this.m_nIndent = var1;
  634.    }
  635.  
  636.    public boolean getRootsConnected() {
  637.       return this.m_bRootsConnected;
  638.    }
  639.  
  640.    public TreeView() {
  641.       this((ImageSet)null, (TreeViewNode)null);
  642.    }
  643.  
  644.    public TreeView(ImageSet var1) {
  645.       this(var1, (TreeViewNode)null);
  646.    }
  647.  
  648.    public TreeView(TreeViewNode var1) {
  649.       this((ImageSet)null, var1);
  650.    }
  651.  
  652.    public TreeView(ImageSet var1, TreeViewNode var2) {
  653.       this.m_nLabelOffset = 6;
  654.       this.m_bUseButtons = true;
  655.       this.m_bRootsConnected = true;
  656.       this.m_sbHorizontal = new Scrollbar(0);
  657.       this.m_sbVertical = new Scrollbar(1);
  658.       this.m_btnScrollerCorner = new Button();
  659.       this.m_nInsetX = 5;
  660.       this.m_nInsetY = 1;
  661.       this.m_nConnectorWidth = 16;
  662.       this.m_nIndent = 7 + this.m_nConnectorWidth;
  663.       this.m_nIconWidth = 20;
  664.       this.m_nIconHeight = 16;
  665.       this.m_nCellHeight = this.m_nIconHeight + 1;
  666.       this.m_nFontBaseOffset = this.m_nIconHeight;
  667.  
  668.       try {
  669.          if (System.getProperty("java.vendor").startsWith("Netscape")) {
  670.             if (System.getProperty("java.version").startsWith("1.0") && System.getProperty("os.name").startsWith("Windows") && System.getProperty("os.version").startsWith("4")) {
  671.                this.m_bIsNS3Win32 = true;
  672.             } else if (System.getProperty("os.name").startsWith("16-bit Windows")) {
  673.                this.m_bIsNSWin16 = true;
  674.             }
  675.          }
  676.       } finally {
  677.          ;
  678.       }
  679.  
  680.       this.m_tvnRoot = var2;
  681.       this.m_isImages = var1;
  682.       this.m_isConnectors = new TreeViewConnectorImageSet();
  683.       this.m_imgDoubleBuffer = null;
  684.       this.m_rectDisplayArea = new Rectangle();
  685.       ((Container)this).setLayout((LayoutManager)null);
  686.  
  687.       try {
  688.          String var3 = System.getProperty("os.name");
  689.          if (!var3.startsWith("Windows")) {
  690.             this.m_bIsMac = var3.startsWith("Mac");
  691.             this.m_bIsUnix = !this.m_bIsMac;
  692.          }
  693.       } finally {
  694.          ;
  695.       }
  696.  
  697.       int var15 = WebHelp.GetFontSize();
  698.       ((Component)this).setFont(new Font(WebHelp.GetFontName(), 0, var15));
  699.       FontMetrics var4 = ((Component)this).getFontMetrics(((Component)this).getFont());
  700.       int var5 = var4.getLeading() + var4.getAscent() + var4.getDescent();
  701.       this.setCellHeight(var5);
  702.       if (var5 < this.m_nCellHeight) {
  703.          this.m_nFontBaseOffset = (this.m_nCellHeight + var5) / 2 - var4.getDescent();
  704.       } else {
  705.          this.m_nFontBaseOffset = this.m_nCellHeight - var4.getDescent();
  706.       }
  707.  
  708.       this.setSelectionToTop();
  709.       Scrollbar var6 = new Scrollbar();
  710.       var6.setValues(0, 3, 0, 10);
  711.       var6.setValue(10);
  712.       this.m_bNetscapeScrollers = var6.getValue() == 10;
  713.       this.m_sbHorizontal.setLineIncrement(16);
  714.       if (this.m_sbHorizontal.getPageIncrement() < 128) {
  715.          this.m_sbHorizontal.setPageIncrement(128);
  716.       }
  717.  
  718.       this.m_sbHorizontal.setBackground(new Color(192, 192, 192));
  719.       ((Container)this).add(this.m_sbHorizontal);
  720.       this.m_sbVertical.setBackground(new Color(192, 192, 192));
  721.       ((Container)this).add(this.m_sbVertical);
  722.       this.m_btnScrollerCorner.enable(false);
  723.       ((Container)this).add(this.m_btnScrollerCorner);
  724.    }
  725.  
  726.    public void setRootsConnected(boolean var1) {
  727.       this.m_bRootsConnected = var1;
  728.    }
  729.  
  730.    public boolean handleEvent(Event var1) {
  731.       switch (var1.id) {
  732.          case 501:
  733.             if (this.m_rectDisplayArea.inside(var1.x, var1.y)) {
  734.                int var2 = var1.x + this.m_nHorizPosPixels;
  735.                byte var3 = 11;
  736.                TreeViewNode var4 = this.nodeAtLocation(var1.x, var1.y);
  737.                if (var4 != null) {
  738.                   boolean var5 = !this.m_bIsMac && var1.clickCount % 2 == 0;
  739.                   if (this.m_bIsUnix || this.m_bIsMac || this.m_bIsNSWin16) {
  740.                      long var6 = System.currentTimeMillis();
  741.                      if (this.m_lnLastClickTime > var6 - 500L) {
  742.                         var5 = true;
  743.                         this.m_lnLastClickTime = 0L;
  744.                      } else {
  745.                         this.m_lnLastClickTime = var6;
  746.                      }
  747.                   }
  748.  
  749.                   if (this.m_bIsMac && !var5) {
  750.                      var1.clickCount = 1;
  751.                   }
  752.  
  753.                   if (((SiblingChildTree)var4).getChild() != null && var2 > var4.getBounds().x && (var2 < var4.getBounds().x + var3 || var5)) {
  754.                      ((Component)this).requestFocus();
  755.                      if (this.m_tvnCurrentSelection != null) {
  756.                         this.m_tvnCurrentSelection.select(false);
  757.                      }
  758.  
  759.                      this.m_tvnCurrentSelection = var4;
  760.                      this.m_tvnCurrentSelection.select(true);
  761.                      var4.doAction();
  762.                      this.toggleOpenCloseNode(var4);
  763.                      this.layout();
  764.                      ((Component)this).requestFocus();
  765.                      ((Component)this).repaint();
  766.                   } else if (var2 > var4.getBounds().x + var3 && var1.clickCount < 2) {
  767.                      if (this.m_tvnCurrentSelection != null) {
  768.                         this.m_tvnCurrentSelection.select(false);
  769.                      }
  770.  
  771.                      this.m_tvnCurrentSelection = var4;
  772.                      this.m_tvnCurrentSelection.select(true);
  773.                      var4.doAction();
  774.                      ((Component)this).repaint();
  775.                   }
  776.                }
  777.             }
  778.             break;
  779.          case 601:
  780.          case 602:
  781.          case 603:
  782.          case 604:
  783.          case 605:
  784.             if (var1.target == this.m_sbHorizontal) {
  785.                this.m_nHorizPosPixels = this.m_sbHorizontal.getValue();
  786.             } else if (var1.target == this.m_sbVertical) {
  787.                this.m_nVerticalPosPixels = this.m_sbVertical.getValue() * this.m_nCellHeight;
  788.             }
  789.  
  790.             ((Component)this).repaint();
  791.       }
  792.  
  793.       return super.handleEvent(var1);
  794.    }
  795.  
  796.    protected int paintTree(Graphics var1, TreeViewNode var2, int var3, int var4) {
  797.       for(TreeViewNode var5 = var2; var5 != null; var5 = (TreeViewNode)((SiblingChildTree)var5).getSibling()) {
  798.          int var6 = var3;
  799.          int var7 = var4;
  800.          if (var5.getLabel() != null) {
  801.             this.paintNode(var1, var5, var3, var4);
  802.             var6 = var3 + this.m_nIndent;
  803.             var7 = var4 + this.m_nCellHeight;
  804.          }
  805.  
  806.          if (!var5.getCollapsedState()) {
  807.             var4 = this.paintTree(var1, (TreeViewNode)((SiblingChildTree)var5).getChild(), var6, var7);
  808.          } else {
  809.             var4 = var7;
  810.          }
  811.       }
  812.  
  813.       return var4;
  814.    }
  815.  
  816.    protected void drawText(Graphics var1, TreeViewNode var2, int var3, int var4) {
  817.       var4 += this.m_nFontBaseOffset;
  818.       if (var2.isSelected()) {
  819.          var1.setColor(new Color(0, 0, 128));
  820.          Rectangle var5 = var2.getBounds();
  821.          int var6 = var5.width + var5.x - var3;
  822.          var1.fillRect(var3, var5.y, var6, var5.height);
  823.          var1.setColor(Color.white);
  824.       } else {
  825.          var1.setColor(((Component)this).getForeground());
  826.       }
  827.  
  828.       var1.setFont(((Component)this).getFont());
  829.       var1.drawString(var2.getLabel(), var3, var4);
  830.    }
  831.  
  832.    public boolean mouseMove(Event var1, int var2, int var3) {
  833.       if (!this.m_bLayoutComplete) {
  834.          this.layout();
  835.       }
  836.  
  837.       if (this.m_applet != null) {
  838.          TreeViewNode var4 = this.nodeAtLocation(var2, var3);
  839.          if (var4 != null) {
  840.             if (this.m_bCompletelyFilled) {
  841.                this.m_applet.showStatus(var4.getLabel());
  842.             }
  843.          } else if (this.m_bCompletelyFilled) {
  844.             this.m_applet.showStatus("");
  845.          }
  846.       }
  847.  
  848.       return false;
  849.    }
  850. }
  851.