home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 October / PCO1097.ISO / FilesBBS / WIN95 / IAVAZIP.EXE / DATA.Z / TreeView.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-08-18  |  9.9 KB  |  471 lines

  1. package com.sfs.awt.treeview;
  2.  
  3. import com.sfs.util.Sortable;
  4. import java.applet.Applet;
  5. import java.awt.AWTEvent;
  6. import java.awt.BorderLayout;
  7. import java.awt.Color;
  8. import java.awt.Component;
  9. import java.awt.Container;
  10. import java.awt.Dimension;
  11. import java.awt.FontMetrics;
  12. import java.awt.Frame;
  13. import java.awt.Graphics;
  14. import java.awt.Image;
  15. import java.awt.Insets;
  16. import java.awt.MediaTracker;
  17. import java.awt.Panel;
  18. import java.awt.Point;
  19. import java.awt.Rectangle;
  20. import java.awt.Scrollbar;
  21. import java.awt.Window;
  22. import java.awt.event.AdjustmentEvent;
  23. import java.awt.event.AdjustmentListener;
  24. import java.awt.event.FocusEvent;
  25. import java.awt.event.InputEvent;
  26. import java.awt.event.KeyEvent;
  27. import java.awt.event.MouseEvent;
  28. import java.util.Vector;
  29.  
  30. public class TreeView extends Panel implements AdjustmentListener {
  31.    public int ofsX;
  32.    public int ofsY;
  33.    static final int FOLDER = 0;
  34.    static final int OPENFOLDER = 1;
  35.    static final int PLUS = 2;
  36.    static final int MINUS = 3;
  37.    static final int DOCUMENT = 4;
  38.    static final int OPENDOCUMENT = 5;
  39.    public static final int DISTANCE = 17;
  40.    public RootFolder Root;
  41.    Vector Icons;
  42.    // $FF: renamed from: mt java.awt.MediaTracker
  43.    MediaTracker field_0;
  44.    Scrollbar Hor;
  45.    Scrollbar Ver;
  46.    protected Vector TreeViewListeners;
  47.    Dimension dimension;
  48.    boolean haveFocus;
  49.    public boolean SelectionAllowed;
  50.    Image Background;
  51.  
  52.    private void processSelection(InputEvent var1, Item var2) {
  53.       if (this.SelectionAllowed) {
  54.          if ((var1.getModifiers() & 3) == 0) {
  55.             this.Root.clearSelection();
  56.          }
  57.  
  58.          if (var1.isControlDown() && var1 instanceof MouseEvent) {
  59.             if (this.Root.getCaretItem().isSelected()) {
  60.                this.Root.getCaretItem().setSelected(false);
  61.                return;
  62.             }
  63.  
  64.             if (!(this.Root.getCaretItem() instanceof Folder) || !this.Root.getCaretItem().isOpen()) {
  65.                this.Root.getCaretItem().setSelected(true);
  66.                return;
  67.             }
  68.          } else if (var1.isShiftDown()) {
  69.             int var3 = this.Root.indexOf(this.Root.getCaretItem());
  70.             int var4 = this.Root.indexOf(var2);
  71.             if (var3 > var4) {
  72.                int var5 = var4;
  73.                var4 = var3;
  74.                var3 = var5;
  75.             }
  76.  
  77.             Item var8 = this.Root.visibleItemAt(var3++);
  78.  
  79.             do {
  80.                if (!(var8 instanceof Folder) || !var8.isOpen()) {
  81.                   var8.setSelected(true);
  82.                }
  83.  
  84.                var3 = this.Root.indexOf(var8);
  85.                var8 = this.Root.nextVisibleItem(var3);
  86.             } while(var3 < var4);
  87.          }
  88.  
  89.       }
  90.    }
  91.  
  92.    public Insets getInsets() {
  93.       return new Insets(0, 0, 2, 0);
  94.    }
  95.  
  96.    protected void processFocusEvent(FocusEvent var1) {
  97.       if (!var1.isTemporary()) {
  98.          switch (((AWTEvent)var1).getID()) {
  99.             case 1004:
  100.                this.haveFocus = true;
  101.                return;
  102.             case 1005:
  103.                this.haveFocus = false;
  104.                return;
  105.          }
  106.       }
  107.  
  108.    }
  109.  
  110.    public void adjustmentValueChanged(AdjustmentEvent var1) {
  111.       Scrollbar var2 = (Scrollbar)var1.getAdjustable();
  112.       int var3 = var1.getValue();
  113.       if (var2 == this.Hor) {
  114.          this.ofsX = var3;
  115.       } else {
  116.          Item var4 = this.Root.visibleItemAt(0);
  117.          int var5 = this.Root.indexOf(var4);
  118.  
  119.          for(int var6 = 0; var3 != var6; ++var6) {
  120.             var4 = this.Root.nextVisibleItem(var5);
  121.             var5 = this.Root.indexOf(var4);
  122.          }
  123.  
  124.          this.ofsY = var5;
  125.       }
  126.  
  127.       ((Component)this).repaint();
  128.    }
  129.  
  130.    public void processMouseEvent(MouseEvent var1) {
  131.       if (((AWTEvent)var1).getID() == 501) {
  132.          int var10000 = this.dimension.width / 17;
  133.          int var2 = this.dimension.height / 17;
  134.          this.Root.getSpaces();
  135.          if (var2 >= this.Root.getHeight()) {
  136.             var2 = this.Root.getHeight() - 1;
  137.          }
  138.  
  139.          Item var3 = this.Root.visibleItemAt(this.ofsY);
  140.          int var4 = this.Root.indexOf(var3);
  141.          int var5 = 0;
  142.          Point var6 = var1.getPoint();
  143.  
  144.          do {
  145.             Rectangle var7 = new Rectangle(10 + (var3.getSpaces() - this.ofsX) * 17 - 8, 10 + var5 * 17 - 9, 17 + this.Root.fm.stringWidth(var3.getName()) + 4, 17);
  146.             if (var7.contains(var6)) {
  147.                if (var1.getClickCount() == 2 && (((InputEvent)var1).getModifiers() & 3) == 0) {
  148.                   var3.setOpen(!var3.isOpen());
  149.                }
  150.  
  151.                this.processSelection(var1, var3);
  152.                this.Root.caretItem = var3;
  153.                this.Root.AdjustScrollbars();
  154.                ((Component)this).repaint();
  155.                this.castTreeViewEvent(var3, var1.getClickCount());
  156.                break;
  157.             }
  158.  
  159.             if (var3 instanceof Folder) {
  160.                Rectangle var8 = new Rectangle(10 + (var3.getSpaces() - 1 - this.ofsX) * 17 - 4, 10 + var5 * 17 - 4, 13, 13);
  161.                if (var8.contains(var6)) {
  162.                   if ((((InputEvent)var1).getModifiers() & 3) == 0) {
  163.                      var3.setOpen(!var3.isOpen());
  164.                   }
  165.  
  166.                   this.processSelection(var1, var3);
  167.                   this.Root.caretItem = var3;
  168.                   this.Root.AdjustScrollbars();
  169.                   ((Component)this).repaint();
  170.                   this.castTreeViewEvent(var3, var1.getClickCount());
  171.                   break;
  172.                }
  173.             }
  174.  
  175.             var3 = this.Root.nextVisibleItem(var4);
  176.             if (var3 == null) {
  177.                break;
  178.             }
  179.  
  180.             var4 = this.Root.indexOf(var3);
  181.          } while(var5++ < var2);
  182.       }
  183.  
  184.       super.processMouseEvent(var1);
  185.    }
  186.  
  187.    public synchronized void paint(Graphics var1) {
  188.       if (this.Background == null) {
  189.          this.Background = ((Component)this).createImage(this.dimension.width, this.dimension.height - 2);
  190.       }
  191.  
  192.       Graphics var2 = this.Background.getGraphics();
  193.       if (var2 != null) {
  194.          var2.setColor(((Component)this).getBackground());
  195.          var2.fillRect(0, 0, this.dimension.width, this.dimension.height);
  196.          var2.setColor(Color.black);
  197.          if (this.Root.fm == null) {
  198.             FontMetrics var3 = ((Component)this).getGraphics().getFontMetrics();
  199.             this.Root.fm = var3;
  200.             this.Root.AdjustScrollbars();
  201.          }
  202.  
  203.          if (this.field_0.statusAll(true) == 5) {
  204.             var2.drawString("loading icons ...", 10, 10);
  205.          } else {
  206.             int var10 = this.dimension.width / 17;
  207.             int var4 = this.dimension.height / 17;
  208.             this.Root.getSpaces();
  209.             if (var4 >= this.Root.getHeight()) {
  210.                var4 = this.Root.getHeight() - 1;
  211.             }
  212.  
  213.             Item var5 = this.Root.visibleItemAt(this.ofsY);
  214.             int var6 = this.Root.indexOf(var5);
  215.             int var7 = 0;
  216.  
  217.             do {
  218.                boolean[] var8 = var5.getSpacesArray();
  219.  
  220.                for(int var9 = 0; var9 < var5.getSpaces() && var9 < var10; ++var9) {
  221.                   if (var8[var9]) {
  222.                      var2.drawLine(10 + (var9 - this.ofsX) * 17, 10 + (var7 - 1) * 17, 10 + (var9 - this.ofsX) * 17, 10 + (var7 - 1) * 17 + 17);
  223.                   }
  224.                }
  225.  
  226.                if (var5 != this.Root) {
  227.                   var2.drawLine(10 + (var5.getSpaces() - 1 - this.ofsX) * 17, 10 + var7 * 17, 10 + (var5.getSpaces() - this.ofsX) * 17, 10 + var7 * 17);
  228.                }
  229.  
  230.                var5 = this.Root.nextVisibleItem(var6);
  231.                if (var5 == null) {
  232.                   break;
  233.                }
  234.  
  235.                var6 = this.Root.indexOf(var5);
  236.             } while(var7++ < var4);
  237.  
  238.             var5 = this.Root.visibleItemAt(this.ofsY);
  239.             var6 = this.Root.indexOf(var5);
  240.             var7 = 0;
  241.  
  242.             do {
  243.                Image var14 = (Image)this.Icons.elementAt(var5.isOpen() ? var5.getDocumentType() + 1 : var5.getDocumentType());
  244.                var2.drawImage(var14, 10 + (var5.getSpaces() - this.ofsX) * 17 - 8, 10 + var7 * 17 - 8, this);
  245.                if (!this.Root.isSelectedItem(var5) && var5 != this.Root.getCaretItem()) {
  246.                   var2.setColor(var5.isDisabled() ? Color.gray : Color.black);
  247.                } else {
  248.                   var2.setColor(Color.blue);
  249.                   var2.fillRect(9 + (var5.getSpaces() - this.ofsX) * 17 + 17 - 6, 10 + var7 * 17 - 9, this.Root.fm.stringWidth(var5.getName()) + 4, 17);
  250.                   if (var5 == this.Root.getCaretItem() && this.haveFocus) {
  251.                      var2.setColor(Color.red);
  252.                      var2.drawRect(9 + (var5.getSpaces() - this.ofsX) * 17 + 17 - 6, 10 + var7 * 17 - 9, this.Root.fm.stringWidth(var5.getName()) + 4, 16);
  253.                   }
  254.  
  255.                   var2.setColor(Color.white);
  256.                   var2.setColor(var5.isDisabled() ? Color.gray : Color.white);
  257.                }
  258.  
  259.                var2.drawString(var5.getName(), 10 + (var5.getSpaces() - this.ofsX) * 17 + 17 - 5, 10 + var7 * 17 + 5);
  260.                var2.setColor(Color.black);
  261.                if (var5 instanceof Folder && var5 != this.Root && ((Folder)var5).size() > 0) {
  262.                   var14 = (Image)this.Icons.elementAt(var5.isOpen() ? 3 : 2);
  263.                   var2.drawImage(var14, 10 + (var5.getSpaces() - 1 - this.ofsX) * 17 - 4, 10 + var7 * 17 - 4, this);
  264.                }
  265.  
  266.                var5 = this.Root.nextVisibleItem(var6);
  267.                if (var5 == null) {
  268.                   break;
  269.                }
  270.  
  271.                var6 = this.Root.indexOf(var5);
  272.             } while(var7++ < var4);
  273.          }
  274.  
  275.          var2.dispose();
  276.          var1.drawImage(this.Background, 0, 0, this);
  277.       }
  278.    }
  279.  
  280.    public void setSorter(Sortable var1) {
  281.       this.Root.setSorter(var1);
  282.    }
  283.  
  284.    protected void processKeyEvent(KeyEvent var1) {
  285.       switch (((AWTEvent)var1).getID()) {
  286.          case 400:
  287.             if (var1.getKeyChar() == '\r') {
  288.                this.Root.getCaretItem().setOpen(!this.Root.getCaretItem().isOpen());
  289.                this.Root.AdjustScrollbars();
  290.                ((Component)this).repaint();
  291.                this.castTreeViewEvent(this.Root.getCaretItem(), 2);
  292.             }
  293.             break;
  294.          case 401:
  295.             switch (var1.getKeyCode()) {
  296.                case 38:
  297.                   Item var3 = this.Root.prevVisibleItem(this.Root.indexOf(this.Root.caretItem));
  298.                   if (var3 != null) {
  299.                      this.processSelection(var1, var3);
  300.                      this.Root.caretItem = var3;
  301.                      ((Component)this).repaint();
  302.                   }
  303.                case 39:
  304.                default:
  305.                   break;
  306.                case 40:
  307.                   Item var2 = this.Root.nextVisibleItem(this.Root.indexOf(this.Root.caretItem));
  308.                   if (var2 != null) {
  309.                      this.processSelection(var1, var2);
  310.                      this.Root.caretItem = var2;
  311.                      ((Component)this).repaint();
  312.                   }
  313.             }
  314.       }
  315.  
  316.       super.processKeyEvent(var1);
  317.    }
  318.  
  319.    public void update(Graphics var1) {
  320.       this.paint(var1);
  321.    }
  322.  
  323.    public Item addItem(String var1, Object var2, int var3) throws TreeViewException {
  324.       Object var4 = null;
  325.       Item var5;
  326.       this.Root.add(var5 = new Item(this.Root, this.Root, var1, var2, var3));
  327.       return var5;
  328.    }
  329.  
  330.    public Item addItem(String var1, Object var2) throws TreeViewException {
  331.       Object var3 = null;
  332.       Item var4;
  333.       this.Root.add(var4 = new Item(this.Root, this.Root, var1, var2));
  334.       return var4;
  335.    }
  336.  
  337.    public synchronized void removeTreeViewListener(TreeViewListener var1) {
  338.       this.TreeViewListeners.removeElement(var1);
  339.    }
  340.  
  341.    public Folder addFolder(String var1, Object var2, int var3) throws TreeViewException {
  342.       return this.Root.addFolder(var1, var2, var3);
  343.    }
  344.  
  345.    public Folder addFolder(String var1, Object var2) throws TreeViewException {
  346.       return this.Root.addFolder(var1, var2);
  347.    }
  348.  
  349.    public Dimension getMinimumSize() {
  350.       return this.dimension;
  351.    }
  352.  
  353.    public Dimension getPreferredSize() {
  354.       return this.dimension;
  355.    }
  356.  
  357.    public void setSize(Dimension var1) {
  358.       this.dimension = var1;
  359.       this.Background = null;
  360.       ((Container)this).validate();
  361.    }
  362.  
  363.    public synchronized void addTreeViewListener(TreeViewListener var1) {
  364.       this.TreeViewListeners.addElement(var1);
  365.    }
  366.  
  367.    public int useIcon(Image var1, Image var2) {
  368.       this.Icons.addElement(var1);
  369.       this.Icons.addElement(var2);
  370.       return this.Icons.size() - 2;
  371.    }
  372.  
  373.    public void setBounds(int var1, int var2, int var3, int var4) {
  374.       super.setBounds(var1, var2, var3, var4);
  375.       this.dimension = ((Component)this).getSize();
  376.       this.Background = null;
  377.       this.Root.AdjustScrollbars();
  378.    }
  379.  
  380.    private synchronized void castTreeViewEvent(Item var1, int var2) {
  381.       int var3;
  382.       if (var1.isOpen()) {
  383.          var3 = var1 instanceof Folder ? 1 : 3;
  384.       } else {
  385.          var3 = var1 instanceof Folder ? 0 : 2;
  386.       }
  387.  
  388.       TreeViewEventObject var4 = new TreeViewEventObject(var3, var1, var2, this);
  389.  
  390.       for(int var5 = 0; var5 < this.TreeViewListeners.size(); ++var5) {
  391.          ((TreeViewListener)this.TreeViewListeners.elementAt(var5)).handleTreeViewEvent(var4);
  392.       }
  393.  
  394.    }
  395.  
  396.    public TreeView(Applet var1, String var2, Object var3) {
  397.       this(var2, var3);
  398.       this.field_0 = new MediaTracker(this);
  399.       Class var5 = this.getClass();
  400.  
  401.       for(int var6 = 0; var6 < this.Icons.capacity(); ++var6) {
  402.          Image var4;
  403.          this.Icons.addElement(var4 = var1.getImage(var5.getResource(Integer.toString(var6) + ".gif")));
  404.          this.field_0.addImage(var4, var6);
  405.       }
  406.  
  407.    }
  408.  
  409.    public TreeView(Frame var1, String var2, Object var3) {
  410.       this(var2, var3);
  411.       this.field_0 = new MediaTracker(this);
  412.       Class var5 = this.getClass();
  413.  
  414.       for(int var6 = 0; var6 < this.Icons.capacity(); ++var6) {
  415.          Image var4;
  416.          this.Icons.addElement(var4 = ((Window)var1).getToolkit().getImage(var5.getResource(Integer.toString(var6) + ".gif")));
  417.          this.field_0.addImage(var4, var6);
  418.       }
  419.  
  420.    }
  421.  
  422.    protected TreeView(String var1, Object var2) {
  423.       this.Icons = new Vector(6);
  424.       this.Hor = new Scrollbar(0);
  425.       this.Ver = new Scrollbar(1);
  426.       this.TreeViewListeners = new Vector();
  427.       this.dimension = new Dimension(100, 200);
  428.       this.SelectionAllowed = true;
  429.       this.Root = new RootFolder(this, var1, var2);
  430.       this.Hor.addAdjustmentListener(this);
  431.       this.Ver.addAdjustmentListener(this);
  432.       ((Container)this).setLayout(new BorderLayout());
  433.       this.Ver.setUnitIncrement(1);
  434.       this.Ver.setVisibleAmount(0);
  435.       this.Ver.setBlockIncrement(1);
  436.       this.Hor.setUnitIncrement(1);
  437.       this.Hor.setVisibleAmount(0);
  438.       this.Hor.setBlockIncrement(1);
  439.       this.Root.caretItem = this.Root;
  440.       ((Component)this).setBackground(Color.white);
  441.       ((Component)this).enableEvents(28L);
  442.    }
  443.  
  444.    public void setScrollbars(int var1, int var2) {
  445.       if (var1 * 17 + 17 < this.dimension.height && ((Container)this).isAncestorOf(this.Ver)) {
  446.          this.ofsY = 0;
  447.          ((Container)this).remove(this.Ver);
  448.          ((Container)this).validate();
  449.       } else if (var1 * 17 + 17 >= this.dimension.height && !((Container)this).isAncestorOf(this.Ver)) {
  450.          ((Container)this).add("East", this.Ver);
  451.          ((Container)this).validate();
  452.       }
  453.  
  454.       if (var2 * 17 + 17 < this.dimension.width && ((Container)this).isAncestorOf(this.Hor)) {
  455.          this.ofsX = 0;
  456.          ((Container)this).remove(this.Hor);
  457.          ((Container)this).validate();
  458.       } else if (var2 * 17 + 17 >= this.dimension.width && !((Container)this).isAncestorOf(this.Hor)) {
  459.          ((Container)this).add("South", this.Hor);
  460.          ((Container)this).validate();
  461.       }
  462.  
  463.       this.Ver.setMaximum(var1 - 1);
  464.       this.Hor.setMaximum(var2 - 1);
  465.    }
  466.  
  467.    public void setAllowSelection(boolean var1) {
  468.       this.SelectionAllowed = var1;
  469.    }
  470. }
  471.