//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;
}
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;
}
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;
}