//Page.java
import java.applet.Applet;
import java.awt.*;
import java.net.URL;
import java.util.Stack;public class Page extends Canvas
{
    /* member class not found */
    class Inner {}
    public Page(Scrollbar scrollbar, Scrollbar scrollbar1)
    {
        tree = new Stack();
        treeDepth = 0;
        vbar = scrollbar;
        hbar = scrollbar1;
    }    public void addLine(int i, URL url, URL url1, String s)
    {
        Element element = new Element(url, url1, s, this);
        if(root == null)
        {
            if(i != 0)
                throw new RuntimeException("Initial depth non-zero.");
            tree.push(root = element);
        } else
        {
            if(i == treeDepth)
                tree.push(((Element)tree.pop()).sibling = element);
            else
            if(i > treeDepth)
            {
                if(i > treeDepth + 1)
                    throw new RuntimeException("Depth change error: " + s);
                tree.push(((Element)tree.peek()).offspring = element);
            } else
            if(i < treeDepth)
            {
                for(int j = i; j < treeDepth; j++)
                    tree.pop();                tree.push(((Element)tree.pop()).sibling = element);
            }
            treeDepth = i;
        }
    } public void barChanged()
    {
        originY = -vbar.getValue();
        originX = -hbar.getValue();
        repaint();
    }    void getDimensions()
    {
        docW = doc.getWidth(this);
        docH = doc.getHeight(this);
        dirW = dir.getWidth(this);
        dirH = dir.getHeight(this);
        openW = open.getWidth(this);
        openH = open.getHeight(this);
        textH = getFontMetrics(getFont()).getHeight();
        textA = getFontMetrics(getFont()).getAscent();
    }    public void init(Navigator navigator)
    {
        parent = navigator;
        doc = navigator.getImage(navigator.getDocumentBase(), navigator.getParameter("doc", "doc.gif"));
        prepareImage(doc, this);
        dir = navigator.getImage(navigator.getDocumentBase(), navigator.getParameter("dir", "dir.gif"));
        prepareImage(dir, this);
        open = navigator.getImage(navigator.getDocumentBase(), navigator.getParameter("open", "openDir.gif"));
        prepareImage(open, this);
    }    public void layout()
    {
        super.layout();
        if(size().height > 0 && root != null)
        {
            getDimensions();
            int i = root.getHeight() + 3;
            char c = '\u017C';
            int j = size().height;
            int k = size().width;
            vbar.setValues(vbar.getValue(), j, vbar.getMinimum(), i);
            vbar.setLineIncrement(textH);
            vbar.setPageIncrement(j);
            hbar.setValues(hbar.getValue(), k, hbar.getMinimum(), c);
            originX = -Math.max(0, Math.min(c - k, hbar.getValue()));
            originY = -Math.max(0, Math.min(i - j, vbar.getValue()));
        }
    }    public boolean mouseDown(Event event, int i, int j)
    {
        if(root != null)
        {
            boolean flag = false;
            getDimensions();
            Point point = new Point(10 - hbar.getValue(), 2 - vbar.getValue());
            Element element = root.locate(i, j, point);
            if(element != null && element.offspring != null && i < point.x + openW)
            {
                element.open = element.open ^ true;
                layout();
                flag = true;
            }
            if(selected != element)
            {
                if(selected != null)
                    selected.selected = false;
                selected = element;
                if(selected != null)
                    selected.selected = true;
                flag = true;
            }
            if(event.clickCount == 1)
                postEvent(new Event(this, 701, element.url1));
            else
            if(selected != null && event.clickCount == 2 && (selected.offspring == null || i >= point.x + openW))
                postEvent(new Event(this, 1001, element.url2));
            if(flag)
                repaint();
        }
        return super.mouseDown(event, i, j);
    }    public void paint(Graphics g)
    {
        if(root != null)
        {
            getDimensions();
            root.paint(g, -hbar.getValue(), -vbar.getValue(), new Point(10 - hbar.getValue(), 2 - vbar.getValue()));
        }
    }    Navigator parent;
    Scrollbar vbar;
    Scrollbar hbar;
    Image doc;
    Image dir;
    Image open;
    int originX;
    int originY;
    Element root;
    Element selected;
    Stack tree;
    int treeDepth;
    int docW;
    int docH;
    int dirW;
    int dirH;
    int openW;
    int openH;
    int textH;
    int textA;
}

解决方案 »

  1.   

    import java.awt.*;
    import java.net.URL;public class Element
    {
        /* member class not found */
        class Inner {}
        public Element(URL url, URL url3, String s, Page page )
        {
            parent = page;
            url1 = url;
            url2 = url3;
            name = s;
        }    public int getHeight()
        {
            int i = myHeight();
            if(open && offspring != null)
                i += offspring.getHeight();
            if(sibling != null)
                return i + sibling.getHeight();
            else
                return i;
        }    Element locate(int i, int j, Point point)
        {
            int k = point.x;
            int l = point.y;
            int i1 = myHeight();
            int j1 = offspring != null ? open ? parent.openW : parent.dirW : parent.docW;
            if(i >= k && j >= l && j < l + i1 && i < k + j1 + 4 + parent.getFontMetrics(parent.getFont()).stringWidth(name))
                return this;
            point.translate(0, i1);
            if(open && offspring != null)
            {
                point.translate(j1 + 4, 0);
                Element element = offspring.locate(i, j, point);
                if(element != null)
                    return element;
                point.translate(-(j1 + 4), 0);
            }
            if(sibling != null)
                return sibling.locate(i, j, point);
            else
                return null;
        }    int myHeight()
        {
            int i = offspring != null ? open ? parent.openH : parent.dirH : parent.docH;
            return parent.textH <= i ? i + 1 : parent.textH;
        }    void paint(Graphics g, int i, int j, Point point)
        {
            int k = point.x;
            int l = point.y;
            int i1 = myHeight();
            int j1 = offspring != null ? open ? parent.openW : parent.dirW : parent.docW;
            point.translate(0, i1);
            if(j < parent.size().height && l + i1 / 2 > 0)
                g.drawLine(i, j, i, l + i1 / 2);
            if(l < parent.size().height && l + i1 > 0)
            {
                g.drawLine(i, l + i1 / 2, k + j1 / 2, l + i1 / 2);
                Color color = g.getColor();
                if(selected)
                    g.setColor(Color.red);
                g.drawString(name, k + j1 + 4, l + (i1 - parent.textH) / 2 + parent.textA);
                if(selected)
                    g.setColor(color);
            }
            if(open && offspring != null)
            {
                point.translate(j1 + 4, 0);
                offspring.paint(g, k + j1 / 2, l + i1 / 2, point);
                point.translate(-(j1 + 4), 0);
            }
            if(l < parent.size().height && l + i1 > 0)
                if(offspring == null)
                    g.drawImage(parent.doc, k, l + (i1 - parent.docH) / 2, parent);
                else
                if(open)
                    g.drawImage(parent.open, k, l + (i1 - parent.openH) / 2, parent);
                else
                    g.drawImage(parent.dir, k, l + (i1 - parent.dirH) / 2, parent);
            if(sibling != null)
                sibling.paint(g, i, l + i1 / 2, point);
        }    Page parent;
        URL url1;
        URL url2;
        String name;
        boolean open;
        boolean selected;
        Element sibling;
        Element offspring;
    }