home *** CD-ROM | disk | FTP | other *** search
Java Source | 1996-08-14 | 16.7 KB | 716 lines |
- import java.awt.*;
- import java.applet.*;
- import java.util.*;
- import java.io.*;
- import java.net.*;
-
- import objTank;
-
- /**
- * A applet that shows drawing
- *
- * @version 1.0 03/24/96
- * @author Kang, Dae Woong (namu@star.elim.net)
- */
- public class ViewDraw extends Applet
- {
- Dimension dimension = new Dimension(0, 0);
- String comment = new String();
- Vector drawVector = new Vector();
- Vector objVector = new Vector();
-
- Image offImage; // for double buffering
- Graphics offGraphics;
-
- static final int CHART_ID = 0x3140;
- static final int CHART_VERSION = 0x0100;
-
- static Applet me;
-
- /**
- * Load Draw File
- */
- public void init() // load draw file
- {
- String fileName = getParameter("draw");
-
- if (fileName == null)
- return;
- showStatus("Loading : " + fileName);
- me = this;
-
- URL url = null;
- try
- {
- url = new URL(getDocumentBase(), fileName);
- }
- catch (MalformedURLException e)
- {
- System.err.println(fileName + " document not found" + e);
- return;
- }
-
- try
- {
- DataInputStream dis= new DataInputStream(url.openStream());
-
- int count;
- int str_len; // string len
- byte[] str_byte; // string buf
-
- if (CHART_ID != dis.readShort())
- throw (new IOException("This is not draw file"));
-
- if (CHART_VERSION != dis.readShort())
- throw (new IOException("This is invalid version draw file"));
-
- str_len = dis.readByte();
- str_byte = new byte[str_len];
- dis.readFully(str_byte);
- comment = new String(str_byte, 0);
-
- dimension.width = dis.readShort();
- dimension.height = dis.readShort();
-
- count = dis.readShort();
- for (int i = 0 ; i < count; i++)
- {
- ObjTank obj = new ObjTank();
- obj.read(dis, this);
- objVector.addElement(obj);
- }
-
- count = dis.readShort();
- for (int i = 0 ; i < count; i++)
- {
- MiniDraw dd = new MiniDraw();
- dd.read(dis, objVector);
- drawVector.addElement(dd);
- }
- }
- catch (IOException ioeRead)
- {
- System.out.println(ioeRead);
- return;
- }
- showStatus(comment + "(" + dimension.width + "x" + dimension.height + ")");
- }
-
- public void paint(Graphics g)
- {
- update(g);
- }
-
- public void update(Graphics g)
- {
- Rectangle clipRect = g.getClipRect();
- offGraphics.setColor(getBackground());
- offGraphics.fillRect(clipRect.x, clipRect.y, clipRect.width, clipRect.height);
-
- Enumeration enum = drawVector.elements();
- while (enum.hasMoreElements())
- ((MiniDraw) enum.nextElement()).draw(offGraphics);
- g.drawImage(offImage, 0, 0, null);
- }
-
- public boolean mouseDown(Event e, int x, int y)
- {
- Enumeration enum = drawVector.elements();
- MiniDraw dd;
- while (enum.hasMoreElements())
- {
- dd = (MiniDraw) enum.nextElement();
- if (dd.inside(x, y) && dd.hasURL())
- {
- URL url= null;
- try
- url = new URL(dd.urlName);
- catch (MalformedURLException mue1)
- {
- try
- url = new URL(getDocumentBase(), dd.urlName);
- catch (MalformedURLException mue2)
- ;
- }
-
- if (url != null)
- getAppletContext().showDocument(url);
- return true;
- }
- }
- showStatus(comment + "(" + dimension.width + "x" + dimension.height + ")");
- return true;
- }
-
- public boolean mouseMove(Event e, int x, int y)
- {
- Enumeration enum = drawVector.elements();
- MiniDraw dd;
- while (enum.hasMoreElements())
- {
- dd = (MiniDraw) enum.nextElement();
- if (dd.inside(x, y) && dd.hasURL())
- {
- showStatus(dd.urlName);
- return true;
- }
- }
-
- return true;
- }
-
- public void layout()
- {
- Dimension dm = size();
-
- if (dm.width != 0 && dm.height != 0)
- {
- offImage = createImage(dm.width, dm.height);
- offGraphics = offImage.getGraphics();
- }
- }
-
- public String[][] getParameterInfo()
- {
- String pinfo[][] =
- {
- {"draw", "String", "draw file to show"},
- };
- return pinfo;
- }
-
- public String getAppletInfo()
- {
- return new String("Web Draw 1.0 Author:Kang, Daewoong");
- }
- }
-
-
- /**
- * subset of Draw For viewonly
- * @see : Draw
- */
- class MiniDraw extends Rectangle
- {
- int method;
- int content;
- int shape;
- Color color = new Color(0);
- Vector intParams = null;
-
- double lineAngle = 0;
-
- int fontStyle;
- String fontName = null;
- String text = null;
-
- String urlName = null;
-
- // used OBJECT Drawing
- ObjTank objTank;
- //draw method ======================
- static final int LINE = 0;
- static final int RECT = 1;
- static final int ROUND_RECT = 2;
- static final int POLYGON = 3;
- static final int OVAL = 4;
- static final int PIE = 5;
- static final int ARC = 6;
- static final int STRING = 7;
- static final int IMAGE = 8;
- static final int CHART = 9;
- static final int SELECT = 10;
- static final int ANCHOR = 11;
- //draw content ======================
- static final int CONTENT_FILL = 0;
- static final int CONTENT_UNFILL = 1;
- //draw shape =========================
- static final int SHAPE_PLAIN = 0;
- static final int SHAPE_UP = 1;
- static final int SHAPE_DOWN = 2;
-
- static final int INVALID_PARAM = 0x7FFFFFFF;
-
- public MiniDraw()
- {
- }
-
- public void read(DataInputStream dis, Vector obj) throws IOException
- {
-
- try
- {
- x = dis.readShort();
- y = dis.readShort();
- width = dis.readShort();
- height = dis.readShort();
-
- method = dis.readByte();
- shape = dis.readByte();
- content = dis.readByte();
- color = new Color(dis.readInt());
-
- int count = dis.readShort();
- for (int i = 0; i < count; i++)
- addParam(dis.readShort() );
-
- if (method == STRING)
- {
- int len;
- byte[] buf;
-
- fontStyle = dis.readInt();
-
- len = dis.readByte();
- buf = new byte[len];
- dis.readFully(buf);
- fontName = new String(buf, 0);
-
- len = dis.readByte();
- buf = new byte[len];
- dis.readFully(buf);
- text = new String(buf, 0);
- }
-
- if (method == IMAGE || method == CHART)
- {
- int index = dis.readShort();
- if (obj != null)
- {
- objTank = (ObjTank) obj.elementAt(index);
- }
- }
-
- int len;
- len = dis.readByte();
- if (len > 0)
- {
- byte[] buf = new byte[len];
- dis.readFully(buf);
- urlName = new String(buf, 0);
- }
-
- if (method == LINE)
- setLineAngle();
-
- }
- catch (IOException ioe)
- throw ioe;
- }
-
- public int getPointsCount()
- {
- switch (method)
- {
- case LINE:
- case POLYGON:
- return getParaCount()/2;
- case ROUND_RECT: return 1;
- case PIE:
- case ARC:
- return 2;
- default: return 0;
- }
- }
-
-
- public int getFontSize()
- {
- return height*4/5;
- }
-
- public void addParam(int p)
- {
- if (intParams == null)
- intParams = new Vector();
- intParams.addElement(new Integer(p));
- }
- public boolean isYNearAngle(int i) // is it near y line?
- {
- double angle = (getParam(i + 2) == getParam(i)) ? Math.PI/2 : Math.atan((double)(getParam(i + 3) - getParam(i + 1))/(getParam(i + 2) - getParam(i)));
- return angle > Math.PI/4 || angle < -Math.PI/4;
- }
-
- public boolean isTopLeftAngle(int angle)
- {
- angle %= 360;
- return angle >= 45 && angle < 225;
- }
-
- public int bottom() { return y + height; }
- public int right() { return x + width; }
- public Point getCenterPoint() { return new Point(x + width/2, y + height/2); }
- public boolean hasText()
- {
- return text != null && text.length() > 0;
- }
-
- public boolean hasURL()
- {
- return urlName != null && urlName.length() > 0;
- }
-
- public int getParaCount()
- {
- return intParams.size();
- }
-
- public void drawAngleLine(Graphics g, int angle)
- {
- Point pt = getCenterPoint();
- double a = angle / 180.0 * Math.PI;
-
- g.drawLine(pt.x, pt.y, pt.x + (int)(width/2*Math.cos(a)), pt.y - (int)(height/2*Math.sin(a)));
- }
-
- public Polygon getPolygon()
- {
- Polygon plg = new Polygon();
-
- Enumeration e = intParams.elements();
- while (e.hasMoreElements())
- plg.addPoint(((Integer) e.nextElement()).intValue(), ((Integer) e.nextElement()).intValue());
-
- return plg;
- }
-
- public void setLineAngle()
- {
- lineAngle = (getParam(2) == getParam(0)) ? Math.PI/2 : Math.atan((double)(getParam(3) - getParam(1))/(getParam(2) - getParam(0)));
- }
- public boolean is3D()
- {
- return shape != SHAPE_PLAIN;
- }
-
- public boolean isFill()
- {
- return content == CONTENT_FILL;
- }
-
- /**
- * index of param
- * if error return INVALID_PARAM
- */
- public int getParam(int i)
- {
- try
- {
- return ((Integer) intParams.elementAt(i)).intValue();
- }
- catch (ArrayIndexOutOfBoundsException e)
- {
- System.err.println("Draw.getParam invalide index :" + i);
- return INVALID_PARAM;
- }
- }
- public void draw(Graphics g)
- {
- Color clrTopLeft = null, clrBottomRight = null;
- if (shape == SHAPE_UP)
- {
- clrTopLeft = color.brighter();
- clrBottomRight = color.darker();
- }
- else if (shape == SHAPE_DOWN)
- {
- clrTopLeft = color.darker();
- clrBottomRight = color.brighter();
- }
-
- switch (method)
- {
- case LINE:
- g.setColor(color);
- g.drawLine(getParam(0), getParam(1), getParam(2), getParam(3));
- if (is3D())
- {
- if (lineAngle > Math.PI / 4 || lineAngle < -Math.PI / 4)
- {
- g.setColor(clrTopLeft);
- g.drawLine(getParam(0) - 1, getParam(1), getParam(2) - 1, getParam(3));
- g.setColor(clrBottomRight);
- g.drawLine(getParam(0) + 1, getParam(1), getParam(2) + 1, getParam(3));
- }
- else
- {
- g.setColor(clrTopLeft);
- g.drawLine(getParam(0), getParam(1) - 1, getParam(2), getParam(3) - 1);
- g.setColor(clrBottomRight);
- g.drawLine(getParam(0), getParam(1) + 1, getParam(2), getParam(3) + 1);
- }
- }
- break;
- case RECT:
- g.setColor(color);
- if (isFill())
- {
- g.fillRect(x, y, width, height);
- }
- switch (shape)
- {
- case SHAPE_PLAIN:
- if (!isFill())
- g.drawRect(x, y, width, height);
- break;
- case SHAPE_UP:
- g.draw3DRect(x, y, width, height, true);
- break;
- case SHAPE_DOWN:
- g.draw3DRect(x, y, width, height, false);
- break;
- }
- break;
- case ROUND_RECT:
- if (isFill())
- {
- g.setColor(color);
- g.fillRoundRect(x, y, width, height, getParam(0), getParam(1));
- }
-
- if (is3D())
- {
- Rectangle rcCorner = new Rectangle(x, y + height - getParam(1), getParam(0), getParam(1));
- // bottom left corner
- int wid = rcCorner.width/2;
- int hgt = rcCorner.height/2;
-
- g.setColor(clrBottomRight);
- g.drawArc(rcCorner.x, rcCorner.y, rcCorner.width, rcCorner.height, 225, 45);
- g.setColor(clrTopLeft);
- g.drawArc(rcCorner.x, rcCorner.y, rcCorner.width, rcCorner.height, 180, 45);
-
- g.drawLine(x, bottom() - hgt, x, y + hgt); // left line
-
- g.drawArc(x, y, rcCorner.width, rcCorner.height, 90, 90); // top left corner
-
- // top right corner
- rcCorner.move(right() - rcCorner.width, y);
- g.drawLine(x + wid, y, right() - wid, y); // top line
- g.drawArc(rcCorner.x, rcCorner.y, rcCorner.width, rcCorner.height, 45, 45);
- g.setColor(clrBottomRight);
- g.drawArc(rcCorner.x, rcCorner.y, rcCorner.width, rcCorner.height, 0, 45);
-
- // bottom right corner
- g.drawLine(right(), y + hgt, right(), bottom() - hgt); // right line
- g.drawArc(right() - rcCorner.width, bottom() - rcCorner.height, rcCorner.width, rcCorner.height, 270, 90); // bottom right corner
-
- g.drawLine(right() - rcCorner.width/2, bottom(), x + rcCorner.width/2, bottom()); // bottom line
- }
- else
- {
- if (!isFill())
- {
- g.setColor(color);
- g.drawRoundRect(x, y, width, height, getParam(0), getParam(1));
- }
- }
- break;
- case POLYGON:
- if (isFill())
- {
- g.setColor(color);
- if (getPointsCount() > 2)
- g.fillPolygon(getPolygon());
- else
- g.drawPolygon(getPolygon());
- if (is3D())
- {
- int count = getParaCount() - 2;
- int i = 0;
- while (i < count)
- {
- g.setColor
- (
- (
- (getParam(i + 3) > getParam(i + 1)) ||
- ( (getParam(i + 3) == getParam(i + 1)) && (getParam(i + 2) < getParam(i)) )
- ) ? clrBottomRight : clrTopLeft
- );
- g.drawLine(getParam(i), getParam(i + 1), getParam(i + 2), getParam(i + 3));
- i += 2;
- }
- //close line
- g.setColor
- (
- (
- (getParam(1) > getParam(i + 1)) ||
- ( (getParam(1) == getParam(i + 1)) && (getParam(0) < getParam(i)) )
- ) ? clrBottomRight : clrTopLeft
- );
- g.drawLine(getParam(i), getParam(i + 1), getParam(0), getParam(1));
- }
- }
- else
- {
- if (is3D())
- {
- int count = getParaCount() - 2;
- int i = 0;
- while (i < count)
- {
- if (isYNearAngle(i))
- {
- g.setColor(clrTopLeft);
- g.drawLine(getParam(i) - 1, getParam(i + 1), getParam(i + 2) - 1, getParam(i + 3));
- g.setColor(clrBottomRight);
- g.drawLine(getParam(i) + 1, getParam(i + 1), getParam(i + 2) + 1, getParam(i + 3));
- }
- else
- {
- g.setColor(clrTopLeft);
- g.drawLine(getParam(i), getParam(i + 1) - 1, getParam(i + 2), getParam(i + 3) - 1);
- g.setColor(clrBottomRight);
- g.drawLine(getParam(i), getParam(i + 1) + 1, getParam(i + 2), getParam(i + 3) + 1);
- }
- i += 2;
- }
- }
- g.setColor(color);
- g.drawPolygon(getPolygon());
- }
- break;
- case OVAL:
- if (isFill())
- {
- g.setColor(color);
- g.fillOval(x, y, width, height);
- }
-
- if (is3D())
- {
- g.setColor(clrTopLeft);
- g.drawArc(x, y, width, height, 45, 180);
- g.setColor(clrBottomRight);
- g.drawArc(x, y, width, height, 225, 180);
- }
- else
- {
- if (!isFill())
- {
- g.setColor(color);
- g.drawOval(x, y, width, height);
- }
- }
- break;
- case PIE:
- if (isFill())
- {
- g.setColor(color);
- g.fillArc(x, y, width, height, getParam(0), getParam(1));
- }
- if (is3D())
- {
- int[] angleSep = { 45, 225, 405, 585, 765};
- int angleCur = getParam(0);
- int angleEnd = angleCur + getParam(1);
- int angleSize = 0;
- int i = (angleCur + 135) / 180;
-
- // start line
- g.setColor( isTopLeftAngle(angleCur + 90) ? clrBottomRight : clrTopLeft);
- drawAngleLine(g, getParam(0));
-
- while (angleCur < angleEnd)
- {
- angleSize = ((angleSep[i] >= angleEnd) ? angleEnd : angleSep[i]) - angleCur;
-
- g.setColor( isTopLeftAngle(angleCur) ? clrTopLeft : clrBottomRight);
- g.drawArc(x, y, width, height, angleCur, angleSize);
-
- angleCur = angleSep[i++];
- }
-
- // end line
- g.setColor( isTopLeftAngle(getParam(0) + getParam(1) + 90) ? clrTopLeft : clrBottomRight);
- drawAngleLine(g, getParam(0) + getParam(1));
-
- }
- else
- {
- if (!isFill())
- {
- g.setColor(color);
- g.drawArc(x, y, width, height, getParam(0), getParam(1));
- drawAngleLine(g, getParam(0));
- drawAngleLine(g, getParam(0) + getParam(1));
- }
- }
-
- break;
- case ARC:
- g.setColor(color);
- g.drawArc(x, y, width, height, getParam(0), getParam(1));
- if (is3D())
- {
- int[] angleSep = { 45, 225, 405, 585, 765};
- int angleCur = getParam(0);
- int angleEnd = angleCur + getParam(1);
- int angleSize = 0;
- int i = (angleCur + 135) / 180;
-
- while (angleCur < angleEnd)
- {
- angleSize = ((angleSep[i] >= angleEnd) ? angleEnd : angleSep[i]) - angleCur;
-
- if ((angleCur % 360) >= 45 && (angleCur % 360) < 225)
- {
- g.setColor(clrTopLeft);
- g.drawArc(x - 1, y - 1, width + 2, height + 2, angleCur, angleSize);
- g.setColor(clrBottomRight);
- g.drawArc(x + 1, y + 1, width - 2, height - 2, angleCur, angleSize);
- }
- else
- {
- g.setColor(clrBottomRight);
- g.drawArc(x - 1, y - 1, width + 2, height + 2, angleCur, angleSize);
- g.setColor(clrTopLeft);
- g.drawArc(x + 1, y + 1, width - 2, height - 2, angleCur, angleSize);
- }
-
- angleCur = angleSep[i++];
- }
- }
- break;
- case STRING:
- if (hasText())
- {
- g.setFont( new Font(fontName, fontStyle, getFontSize()) );
- if (is3D())
- {
- g.setColor(clrTopLeft);
- g.drawString(text, x - 1, y + getFontSize() - 1);
- g.setColor(clrBottomRight);
- g.drawString(text, x + 1, y + getFontSize() + 1);
- }
- g.setColor(color);
- g.drawString(text, x, y + getFontSize());
-
- }
- break;
- case IMAGE:
- if (objTank.image != null)
- g.drawImage(objTank.image, x, y, ViewDraw.me);
- break;
- case CHART:
- if (objTank.obj != null)
- {
- Enumeration enum = objTank.obj.elements();
-
- while (enum.hasMoreElements())
- {
- Draw dd = (Draw) enum.nextElement();
- Draw clone = new Draw(dd);
- clone.multiply((double)width/objTank.dim.width, (double)height/objTank.dim.height);
- clone.transelate(x, y);
- clone.draw(g);
- }
- }
- break;
-
- default:
- System.out.println("invalid draw method");
- }
- }
- }
-