home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Net: Ultimate Internet Guide
/
WWLCD1.ISO
/
pc
/
java
/
prmjatgt
/
workpanel.java
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
NeXTSTEP
RISC OS
UTF-8
Wrap
Java Source
|
1996-08-14
|
29.9 KB
|
1,278 lines
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.net.*;
import java.io.*;
/**
* A class where draw the drawing
*
* @version 1.0 03/24/96
* @author Kang, Dae Woong (namu@star.elim.net)
*/
class WorkPanel extends Panel// implements ImageObserver
{
Image offImage; // for double buffering
Graphics offGraphics;
FileFrame fileFrame = null; // for select OBJECT
static Applet applet;
static WorkPanel me = null;
URL urlDocument;
int writePort;
int stateGrid = 0;
boolean isFirstPaint = false;
//************************* Vector's ************************************************
Vector drawVector = new Vector(); // draw saving area
Vector bufVector = new Vector(); // for select drawings, delelte, copy, paste
Vector objVector = new Vector(); // picture, draws vector
Vector logoVector = new Vector(); // for displaying logo
//***************************************************************************************
boolean isDimensionSetted = false;
Dimension dimension;
Point ptScroll = new Point(0, 0);
String comment = new String();
Draw curDraw;
Rectangle rcShift = new Rectangle();
Point ptStart = new Point(0, 0);
boolean isFirst = false;
Tracker tracker = new Tracker();
Label lbPosition = new Label("x : 0000, y : 000");;
TextField tfInput = new TextField();
//****************** constant *********************************************************************
static final int CHART_ID = 0x3140;
static final int CHART_VERSION = 0x0100;
/**
* Constructor
*/
public WorkPanel(Applet applet)
{
Draw draw;
Dimension dim = size();
dimension = new Dimension(dim.width, dim.height);
this.applet = applet;
me = this;
urlDocument = applet.getDocumentBase();
String tmp = applet.getParameter("port");
writePort = (tmp == null) ? 3140 : Integer.parseInt(tmp);
if (writePort == 0)
writePort = 3140;
fileFrame = new FileFrame(applet, this, urlDocument);
fileFrame.pack();
setBackground(Color.lightGray);
// add logoVector
draw = new Draw(Draw.OVAL, Draw.CONTENT_FILL, Draw.SHAPE_UP, Color.lightGray, 0, 0, 1040, 760);
logoVector.addElement(draw);
draw = new Draw(Draw.OVAL, Draw.CONTENT_UNFILL, Draw.SHAPE_DOWN, Color.lightGray, 80, 80, 880, 600);
logoVector.addElement(draw);
draw = new Draw(Draw.STRING, Draw.CONTENT_FILL, Draw.SHAPE_UP, Color.red, 0, 220, 0, 130);
draw.text = "Web Draw 1.0";
draw.fontName = "TimesRoman";
draw.fontStyle = Font.BOLD;
draw.width = getStringWidth(draw);
draw.x = (1040 - draw.width)/2;
logoVector.addElement(draw);
draw = new Draw(Draw.STRING, Draw.CONTENT_FILL, Draw.SHAPE_PLAIN, Color.black, 0, 360, 0, 60);
draw.text = "96.3.24";
draw.fontName = "TimesRoman";
draw.fontStyle = Font.PLAIN;
draw.width = getStringWidth(draw);
draw.x = (1040 - draw.width)/2;
logoVector.addElement(draw);
draw = new Draw(Draw.STRING, Draw.CONTENT_FILL, Draw.SHAPE_UP, Color.orange, 0, 420, 0, 70);
draw.text = "Author : Kang, Daewoong";
draw.fontName = "TimesRoman";
draw.fontStyle = Font.PLAIN;
draw.width = getStringWidth(draw);
draw.x = (1040 - draw.width)/2;
logoVector.addElement(draw);
draw = new Draw(Draw.STRING, Draw.CONTENT_FILL, Draw.SHAPE_PLAIN, Color.black, 0, 510, 0, 60);
draw.text = "namu@star.elim.net";
draw.fontName = "TimesRoman";
draw.fontStyle = Font.PLAIN;
draw.width = getStringWidth(draw);
draw.x = (1040 - draw.width)/2;
logoVector.addElement(draw);
}
//****************** set method *********************************************************
public void setColor(Color color)
{
Draw.curColor = color;
if (Draw.curMethod == Draw.SELECT && bufVector.size() > 0)
{
Rectangle clip = tracker.getClipRect();
Enumeration enum = bufVector.elements();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.color = new Color(color.hashCode());
}
repaint(clip);
}
}
public void setMethod(int method)
{
if ( (Draw.curMethod == Draw.STRING || Draw.curMethod == Draw.SELECT || Draw.curMethod == Draw.ANCHOR) && tfInput.isVisible())
endString();
if (Draw.curMethod == Draw.SELECT && bufVector.size() > 0)
unselect(null);
if (Draw.curMethod == Draw.IMAGE || Draw.curMethod == Draw.DRAW)
fileFrame.hide();
if (Draw.curMethod == Draw.ANCHOR)
repaint();
Draw.curMethod = method;
isFirst = true;
if (Draw.curMethod == Draw.ANCHOR)
repaint();
switch (Draw.curMethod)
{
case Draw.IMAGE: fileFrame.refImage(); break;
case Draw.DRAW: fileFrame.refDraw(); break;
}
}
public void setShape(int shape)
{
Draw.curShape = shape;
isFirst = true;
if (Draw.curMethod == Draw.SELECT && bufVector.size() > 0)
{
Rectangle clip = tracker.getClipRect();
Enumeration enum = bufVector.elements();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.shape = shape;
}
repaint(clip);
}
}
public void setContent(int fill)
{
Draw.curContent = fill;
isFirst = true;
if (Draw.curMethod == Draw.SELECT && bufVector.size() > 0)
{
Rectangle clip = tracker.getClipRect();
Enumeration enum = bufVector.elements();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.content = fill;
}
repaint(clip);
}
}
public void setFontName(String fontName)
{
Draw.curFontName = fontName;
if (Draw.curMethod == Draw.SELECT && bufVector.size() > 0)
{
Rectangle clip = tracker.getClipRect();
Enumeration enum = bufVector.elements();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
if (dd.hasText())
{
clip = clip.union(dd.getClipRect());
dd.fontName = new String(fontName);
dd.width = getStringWidth(dd);
clip = clip.union(dd.getClipRect());
}
}
clip = clip.union(tracker.getClipRect());
repaint(clip);
}
}
public void setFontStyle(int style)
{
Draw.curFontStyle = style;
if (Draw.curMethod == Draw.SELECT && bufVector.size() > 0)
{
Rectangle clip = tracker.getClipRect();
Enumeration enum = bufVector.elements();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
if (dd.hasText())
{
clip = clip.union(dd.getClipRect());
dd.fontStyle = style;
dd.width = getStringWidth(dd);
clip = clip.union(dd.getClipRect());
}
}
clip = clip.union(tracker.getClipRect());
repaint(clip);
}
}
public void setSize(int wid, int hig, String comment)
{
dimension.width = wid;
dimension.height = hig;
this.comment = comment;
isDimensionSetted = true;
((Panel)getParent()).layout();
repaint();
}
public void runCommand(int cmd)
{
if (Draw.curMethod == Draw.SELECT && bufVector.size() > 0)
{
Rectangle clip = tracker.getClipRect();
Draw dd;
int i, count;
switch (cmd)
{
case RunCommandBar.COPY:
i = 0;
count = bufVector.size();
while (i < count)
{
dd = (Draw) bufVector.elementAt(i);
clip = clip.union(dd.getClipRect());
Draw clone = new Draw(dd);
clone.transelate(10, 10);
clone.isSelected = true;
drawVector.addElement(clone);
if (dd == tracker.draw)
{
tracker.setDraw(clone, 0, 0);
}
dd.isSelected = false;
bufVector.setElementAt(clone, i);
i++;
}
repaint(clip.x, clip.y, clip.width + 10, clip.height + 10);
break;
case RunCommandBar.DELETE:
i = 0;
count = bufVector.size();
tracker.stateSelect = tracker.OFF;
while (i < count)
{
dd = (Draw) bufVector.elementAt(i);
if (dd.method == Draw.IMAGE || dd.method == Draw.DRAW)
{
dd.objTank.refCount--;
if (dd.objTank.refCount-- == 0)
{
objVector.removeElement(dd.objTank);
}
}
clip = clip.union(dd.getClipRect());
drawVector.removeElement(dd);
i++;
}
bufVector.removeAllElements();
repaint(clip);
break;
}
}
switch (cmd)
{
case RunCommandBar.SET_SIZE:
SetSizeFrame frm = new SetSizeFrame(this, applet);
frm.tfWidth.setText(Integer.toString(dimension.width));
frm.tfHeight.setText(Integer.toString(dimension.height));
frm.tfComment.setText(comment);
frm.pack();
frm.show();
applet.disable();
break;
case RunCommandBar.GRID:
stateGrid = ++stateGrid % 3;
repaint();
break;
case RunCommandBar.WRITE_DRAW:
fileFrame.writeDraw();
break;
case RunCommandBar.READ_DRAW:
fileFrame.readDraw();
break;
case RunCommandBar.ALIGN_TOP:
if (bufVector.size() > 1)
{
Enumeration enum = bufVector.elements();
Rectangle clip = tracker.getClipRect();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.move(dd.x, tracker.draw.y);
clip = clip.union(dd.getClipRect());
}
repaint(clip);
}
break;
case RunCommandBar.ALIGN_LEFT:
if (bufVector.size() > 1)
{
Enumeration enum = bufVector.elements();
Rectangle clip = tracker.getClipRect();
Draw dd;
int val = tracker.draw.x;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.move(tracker.draw.x, dd.y);
clip = clip.union(dd.getClipRect());
}
repaint(clip);
}
break;
case RunCommandBar.ALIGN_BOTTOM:
if (bufVector.size() > 1)
{
Enumeration enum = bufVector.elements();
Rectangle clip = tracker.getClipRect();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.move(dd.x, tracker.draw.y + tracker.draw.height - dd.y);
clip = clip.union(dd.getClipRect());
}
repaint(clip);
}
break;
case RunCommandBar.ALIGN_RIGHT:
if (bufVector.size() > 1)
{
Enumeration enum = bufVector.elements();
Rectangle clip = tracker.getClipRect();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.move(tracker.draw.x + tracker.draw.width - dd.x, dd.y);
clip = clip.union(dd.getClipRect());
}
repaint(clip);
}
break;
case RunCommandBar.BRING_FRONT:
if (bufVector.size() == 1)
{
Rectangle clip = tracker.getClipRect();
Draw dd = new Draw(tracker.draw);
drawVector.removeElement(tracker.draw);
drawVector.addElement(dd);
bufVector.removeElement(tracker.draw);
bufVector.addElement(dd);
tracker.setDraw(dd, 0, 0);
repaint(clip);
}
break;
case RunCommandBar.BRING_BACK:
if (bufVector.size() == 1)
{
Rectangle clip = tracker.getClipRect();
Draw dd = new Draw(tracker.draw);
drawVector.removeElement(tracker.draw);
drawVector.insertElementAt(dd, 0);
bufVector.removeElement(tracker.draw);
bufVector.addElement(dd);
tracker.setDraw(dd, 0, 0);
repaint(clip);
}
break;
case RunCommandBar.REMOVE_ALL:
drawVector.removeAllElements();
bufVector.removeAllElements();
curDraw = null;
tracker.stateSelect = tracker.OFF;
repaint();
break;
case RunCommandBar.ABOUT_DRAW:
isFirstPaint = true;
repaint();
break;
default:
}
}
//*************************** Event Handlere ********************************************
public boolean handleEvent(Event e)
{
e.translate(ptScroll.x, ptScroll.y);
return super.handleEvent(e);
}
public boolean mouseDown(Event e, int x, int y)
{
if ((e.modifiers & 0x4) == 0x4) //right mouse button down
{
switch (Draw.curMethod)
{
case Draw.POLYGON:
isFirst = true; // polygon end
break;
case Draw.SELECT:
Draw dd;
int i = drawVector.size() - 1;
while (i >= 0)
{
dd = (Draw) drawVector.elementAt(i);
if (dd.method == Draw.STRING && dd.inside(x, y))
{
if (tfInput.isVisible())
endString();
curDraw = dd;
tfInput.setText(curDraw.text);
beginString();
break;
}
i--;
}
break;
}
return true;
}
ptStart.x = x;
ptStart.y = y;
switch (Draw.curMethod)
{
case Draw.POLYGON:
if (isFirst)
{
drawVector.addElement(new Draw(x, y, 1, 1));
curDraw = (Draw)drawVector.lastElement();
curDraw.addParam(x, y, x, y);
isFirst = false;
}
else
{
curDraw.addParam(x, y);
}
break;
case Draw.STRING:
if (tfInput.isVisible())
endString();
tfInput.reshape(x - ptScroll.x, y - ptScroll.y, 1, 1);
tfInput.setText("");
tfInput.show();
drawVector.addElement(new Draw(x, y, 1, 1));
curDraw = (Draw)drawVector.lastElement();
curDraw.fontName = new String(Draw.curFontName);
curDraw.fontStyle = Draw.curFontStyle;
break;
case Draw.SELECT:
if (e.shiftDown())
{
rcShift.reshape(x, y, 0, 0);
break;
}
Rectangle clip = null;
Rectangle rcPrev = tracker.getClipRect();
if (!tracker.isInTracker(x, y))
{
Draw dd;
int i = drawVector.size() - 1;
while (i >= 0)
{
dd = (Draw) drawVector.elementAt(i);
if (dd.inside(x, y))
{
if (e.controlDown())
{
if (dd != curDraw)
{
if (dd.isSelected)
clip = dd.getClipRect();
dd.toggleSelect();
if (dd.isSelected)
{
bufVector.addElement(dd);
if (bufVector.size() == 1)
{
tracker.setDraw(dd, x, y);
curDraw = dd;
clip = tracker.getClipRect();
}
else
{
clip = dd.getClipRect();
}
}
else
{
bufVector.removeElement(dd);
}
tracker.stateSelect = tracker.SELECT;
break;
}
}
else
{
if (!dd.isSelected)
{
unselect(rcPrev);
dd.isSelected = true;
bufVector.addElement(dd);
}
tracker.setDraw(dd, x, y);
curDraw = dd;
clip = tracker.getClipRect();
break;
}
}
i--;
}
if (i < 0)
{
unselect(rcPrev);
}
else
{
if (!rcPrev.isEmpty())
clip = clip.union(rcPrev);
if (!clip.isEmpty())
repaint(clip);
}
}
break;
case Draw.ANCHOR:
{
Draw dd;
int i = drawVector.size() - 1;
while (i >= 0)
{
dd = (Draw) drawVector.elementAt(i);
if (dd.inside(x, y))
{
if (tfInput.isVisible())
endString();
curDraw = dd;
beginString();
break;
}
i--;
}
}
break;
default:
drawVector.addElement(new Draw(x, y, 1, 1));
curDraw = (Draw)drawVector.lastElement();
switch (Draw.curMethod)
{
case Draw.LINE:
curDraw.addParam(x, y, x, y);
isFirst = false;
break;
case Draw.ROUND_RECT:
curDraw.addParam(10, 10);
break;
case Draw.PIE:
case Draw.ARC:
curDraw.addParam(0, 270);
break;
case Draw.IMAGE:
case Draw.DRAW:
String path = fileFrame.getPath();
if (path != null)
{
int count = objVector.size();
boolean found = false;
ObjTank obj;
int i = 0;
while ( i < count)
{
obj = (ObjTank)objVector.elementAt(i);
if (obj.path.equals(path))
{
obj.refContent(curDraw);
found = true;
repaint(curDraw);
break;
}
i++;
}
if (!found)
{
if (Draw.curMethod == Draw.IMAGE)
{
obj = new ObjTank(path, true);
if (obj.setContent(applet))
{
obj.refContent(curDraw);
objVector.addElement(obj);
repaint(curDraw);
}
else
{
drawVector.removeElement(curDraw);
curDraw = null;
}
}
else //OBJECT
{
obj = new ObjTank(path, false);
if (obj.setContent(applet))
{
obj.refContent(curDraw);
objVector.addElement(obj);
repaint(curDraw);
}
else
{
drawVector.removeElement(curDraw);
curDraw = null;
}
}
}
}
break;
}
break;
}
return true;
}
public boolean mouseDrag(Event e, int x, int y)
{
if ((e.modifiers & 0x4) == 0x4 || curDraw == null) //right mouse button down
return true;
switch (Draw.curMethod)
{
case Draw.SELECT:
if (e.shiftDown())
{
Graphics g = getGraphics();
g.setColor(Color.blue);
g.setXORMode(Color.white);
g.drawRect(rcShift.x, rcShift.y, rcShift.width, rcShift.height);
rcShift.reshape(Math.min(ptStart.x, x), Math.min(ptStart.y, y),
Math.abs(ptStart.x - x), Math.abs(ptStart.y - y));
g.drawRect(rcShift.x, rcShift.y, rcShift.width, rcShift.height);
g.dispose();
break;
}
Rectangle clip = tracker.getClipRect();
if(tracker.drag(x, y))
{
if (tracker.stateSelect == tracker.MOVE)
{
Enumeration enum = bufVector.elements();
Draw dd;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
clip = clip.union(dd.getClipRect());
dd.transelate(tracker.w, tracker.h);
clip = clip.union(dd.getClipRect());
}
clip = clip.union(tracker.getClipRect());
repaint(clip);
break;
}
if (tracker.draw.method == Draw.STRING && tracker.draw.width < getStringWidth(tracker.draw))
{
tracker.draw.width = getStringWidth(tracker.draw);
}
clip = clip.union(tracker.getClipRect());
if (!clip.isEmpty())
repaint(clip);
}
break;
case Draw.STRING:
setCurRect(x, y);
tfInput.reshape(curDraw.x - ptScroll.x, curDraw.y - ptScroll.y, curDraw.width, curDraw.height);
break;
case Draw.IMAGE:
case Draw.DRAW:
case Draw.ANCHOR:
break;
default:
Rectangle rc = curDraw.getClipRect();
if (curDraw.isPointsOnlyType())
{
if (!isFirst)
{
curDraw.setLastPoint(x, y);
curDraw.setRect( curDraw.getPolygon().getBoundingBox() );
if (curDraw.method == Draw.LINE)
curDraw.setLineAngle();
if (curDraw.isEmpty())
curDraw.grow((curDraw.width == 0) ? 2 : 0, (curDraw.height == 0) ? 2 : 0);
}
}
else
{
setCurRect(x, y);
}
Rectangle clipRect = rc.union(curDraw.getClipRect());
clipRect.grow(2, 2);
repaint(clipRect);
}
return true;
}
public boolean mouseUp(Event e, int x, int y)
{
switch (Draw.curMethod)
{
case Draw.SELECT:
if (!rcShift.isEmpty())
{
Graphics g = getGraphics();
g.setXORMode(Color.white);
g.setColor(Color.blue);
g.drawRect(rcShift.x, rcShift.y, rcShift.width, rcShift.height);
g.dispose();
Enumeration enum = drawVector.elements();
Draw dd;
boolean check = false;
while (enum.hasMoreElements())
{
dd = (Draw) enum.nextElement();
if (dd.equals( rcShift.intersection(dd) ) && !dd.isSelected)
{
dd.isSelected = true;
bufVector.addElement(dd);
check = true;
}
}
if (check)
{
rcShift.grow(2, 2);
if (tracker.stateSelect == tracker.OFF)
{
tracker.setDraw((Draw)bufVector.firstElement(), -1, -1);
rcShift = rcShift.union(tracker.getClipRect());
}
repaint(rcShift);
}
rcShift.reshape(-1, -1, 0, 0);
}
break;
case Draw.STRING:
beginString();
break;
}
return true;
}
public boolean mouseMove(Event e, int x, int y)
{
lbPosition.setText("x : " + x + ", y : " + y);
return true;
}
public boolean keyDown(Event e, int key)
{
if (e.target == tfInput)
{
if (key == 27 || key == 10) // esc key or enter key
{
endString();
return true;
}
}
return false;
}
public boolean keyUp(Event e, int key)
{
if (e.target == tfInput)
{
if (!(key == 27 || key == 10)) // esc key or enter key
{
if (Draw.curMethod == Draw.ANCHOR)
curDraw.urlName = new String(tfInput.getText());
else
curDraw.text = new String(tfInput.getText());
}
}
return false;
}
//*********************** read/ write ****************************************************************
public boolean writeDraw(String dir, String file)
{
Socket sock = null;
if (file.indexOf(".draw") == -1)
{
file += ".draw";
}
try
{
Enumeration enum;
sock = new Socket(urlDocument.getHost(), writePort);
DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
dos.writeBytes(dir);
dos.writeByte(0); // directory end mark
dos.writeBytes(file);
dos.writeByte(-1); //file name end mark
dos.writeShort(CHART_ID);
dos.writeShort(CHART_VERSION);
dos.writeByte(comment.length());
dos.writeBytes(comment);
dos.writeShort(dimension.width);
dos.writeShort(dimension.height);
dos.writeShort(objVector.size());
enum = objVector.elements();
while (enum.hasMoreElements())
((ObjTank) enum.nextElement()).write(dos);
dos.writeShort(drawVector.size()); // draws count
enum = drawVector.elements();
while (enum.hasMoreElements())
((Draw) enum.nextElement()).write(dos, objVector);
dos.flush();
sock.close();
sock = null;
}
catch (SocketException soe)
{
System.err.println("server not response");
}
catch (IOException ioeWrite)
{
if (sock != null)
{
try
sock.close();
catch (IOException ioe2)
System.err.println("close error" + ioe2);
}
System.err.println(ioeWrite);
return false;
}
return true;
}
public void readDraw(String nmFile)
{
URL url = null;
try
{
url = new URL(urlDocument, nmFile);
}
catch (MalformedURLException e)
{
System.err.println(nmFile + " document not found" + e);
return;
}
try
{
DataInputStream dis = new DataInputStream(url.openStream());
int count;
int str_len; // string len
byte[] str_byte; // string buf
unselect(null);
bufVector.removeAllElements();
tracker.stateSelect = tracker.OFF;
curDraw = null;
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();
objVector.removeAllElements();
count = dis.readShort();
for (int i = 0 ; i < count; i++)
{
ObjTank obj = new ObjTank();
obj.read(dis, applet);
objVector.addElement(obj);
}
drawVector.removeAllElements();
repaint(); //clear screen
count = dis.readShort();
for (int i = 0 ; i < count; i++)
{
Draw dd = new Draw();
dd.read(dis, objVector);
drawVector.addElement(dd);
}
repaint();
}
catch (IOException ioeRead)
{
System.err.println(ioeRead);
return;
}
}
//***************************************************************************************
private int getStringWidth(Draw draw)
{
FontMetrics fm = getFontMetrics(new Font(draw.fontName, draw.fontStyle, draw.getFontSize()));
return fm.stringWidth(draw.text);
}
private int getURLWidth(Draw draw)
{
FontMetrics fm = getFontMetrics(draw.getURLFont());
return fm.stringWidth(draw.urlName);
}
private void beginString()
{
if (Draw.curMethod == Draw.ANCHOR)
{
int wid = 140;
int sx = curDraw.x + (curDraw.width - wid)/2;
if (sx < 0)
{
sx = 0;
}
else
{
Dimension dim = size();
if (dim.width < sx + wid)
sx = dim.width - wid;
}
tfInput.reshape(sx - ptScroll.x, curDraw.y + (curDraw.height - Draw.URL_FONT_HEIGHT)/2 - ptScroll.y, wid, Draw.URL_FONT_HEIGHT);
tfInput.setForeground(Color.blue);
tfInput.setFont(curDraw.getURLFont());
tfInput.setText(curDraw.hasURL() ? curDraw.urlName : "");
tfInput.show();
tfInput.requestFocus();
}
else
{
tfInput.reshape(curDraw.x - ptScroll.x, curDraw.y - ptScroll.y, curDraw.width + ((curDraw.hasText()) ? curDraw.height : 0), curDraw.height);
tfInput.setForeground(curDraw.color);
tfInput.setFont(new Font(curDraw.fontName, curDraw.fontStyle, curDraw.getFontSize()));
tfInput.show();
tfInput.requestFocus();
}
}
private void endString()
{
if (Draw.curMethod == Draw.ANCHOR)
{
if (curDraw.hasURL())
{
int wid = getURLWidth(curDraw);
repaint(curDraw.x + (curDraw.width - wid)/2, curDraw.y + (curDraw.height - Draw.URL_FONT_HEIGHT)/2, wid, Draw.URL_FONT_HEIGHT);
}
}
else
{
if (curDraw.hasText())
{
curDraw.resize(getStringWidth(curDraw), curDraw.height);
if (curDraw.width > tfInput.size().width)
repaint(curDraw);
}
else
{
drawVector.removeElement(curDraw);
}
}
tfInput.hide();
}
public void paint(Graphics g)
{
update(g);
}
public void repaint(int x, int y, int width, int height)
{
super.repaint(x - ptScroll.x, y-ptScroll.y, width, height);
}
public void repaint(Rectangle rc)
{
Rectangle clone = new Rectangle(rc.x, rc.y, rc.width, rc.height);
clone.translate(-ptScroll.x, -ptScroll.y);
super.repaint(clone.x, clone.y, clone.width, clone.height);
}
public void update(Graphics g)
{
Rectangle clipRect;
if (isFirstPaint)
{
drawLogo(g);
isFirstPaint = false;
}
g.clipRect(0, 0, dimension.width, dimension.height);
clipRect = g.getClipRect();
clipRect.translate(ptScroll.x, ptScroll.y);
offGraphics.translate(-ptScroll.x, -ptScroll.y);
offGraphics.setColor(getBackground());
offGraphics.fillRect(clipRect.x, clipRect.y, clipRect.width, clipRect.height);
if (stateGrid != 0)
{
int gap = (stateGrid == 1) ? 5 : 10;
int sx = clipRect.x - (clipRect.x % gap);
int sy = clipRect.y - (clipRect.y % gap);
int ex = clipRect.x + clipRect.width;
int ey = clipRect.y + clipRect.height;
offGraphics.setColor(getBackground().darker());
for (int x = sx; x < ex; x+= gap)
offGraphics.drawLine(x, sy, x, ey);
for (int y = sy; y < ey; y+= gap)
offGraphics.drawLine(sx, y, ex, y);
}
Enumeration e = drawVector.elements();
Draw dd;
while (e.hasMoreElements())
{
dd = (Draw) e.nextElement();
if (!(clipRect.intersection(dd.getClipRect())).isEmpty())
{
dd.draw(offGraphics);
}
}
// draw selected mark
offGraphics.setXORMode(Color.blue);
offGraphics.setColor(Color.white);
e = bufVector.elements();
while (e.hasMoreElements())
{
dd = (Draw) e.nextElement();
if (!(clipRect.intersection(dd.getClipRect())).isEmpty())
{
offGraphics.drawRect(dd.x, dd.y, dd.width, dd.height);
}
}
offGraphics.setPaintMode();
if (!(clipRect.intersection(tracker.getClipRect())).isEmpty())
tracker.draw(offGraphics);
clipRect.translate(-ptScroll.x, -ptScroll.y);
offGraphics.translate(ptScroll.x, ptScroll.y);
Dimension dm = size();
if (clipRect.x <= 0 || clipRect.y <= 0 || clipRect.x + clipRect.width >= dm.width || clipRect.y + clipRect.height >= dm.height)
{
offGraphics.setColor(Color.black);
offGraphics.drawRect(0, 0, dm.width -1, dm.height - 1);
}
if (clipRect.x + clipRect.width >= dimension.width || clipRect.y + clipRect.height >= dimension.height)
{
offGraphics.setColor(Color.black);
offGraphics.drawRect(0, 0, dimension.width -1, dimension.height - 1);
}
g.drawImage(offImage, 0, 0, null);
}
void setCurRect(int x, int y)
{
curDraw.reshape(Math.min(ptStart.x, x), Math.min(ptStart.y, y),
Math.abs(ptStart.x - x), Math.abs(ptStart.y - y));
}
private void unselect(Rectangle clip)
{
Draw dd;
Rectangle rc;
if (bufVector.size() < 1)
return;
rc = ((Draw)bufVector.firstElement()).getClipRect();
if (!tracker.getClipRect().isEmpty())
{
rc = rc.union(tracker.getClipRect());
tracker.stateSelect = tracker.OFF;
}
if (clip != null && !clip.isEmpty())
rc = rc.union(clip);
Enumeration e = bufVector.elements();
while (e.hasMoreElements())
{
dd = (Draw) e.nextElement();
rc = rc.union(dd.getClipRect());
dd.isSelected = false;
}
bufVector.removeAllElements();
repaint(rc);
}
public synchronized void layout()
{
Dimension dm = size();
offImage = createImage(dm.width, dm.height);
offGraphics = offImage.getGraphics();
if (!isDimensionSetted)
dimension = dm;
}
public synchronized void drawLogo(Graphics g)
{
Dimension dm = size();
Dimension bound = new Dimension(dm.width*2/3, dm.height*2/3);
Enumeration enum;
Point m = new Point(0, 0);
double i = 0.05;
double wid = 0.0;
double hig = 0.0;
while (wid < bound.width && hig < bound.height)
{
enum = logoVector.elements();
wid = 1040.0 * i;
hig = 760.0 * i;
m.x = (int)(dm.width - wid)/2;
m.y = (int)(dm.height - hig)/2;
while(enum.hasMoreElements())
{
Draw dd = (Draw) enum.nextElement();
Draw clone = new Draw(dd);
clone.multiply(i, i);
clone.transelate(m.x, m.y);
clone.draw(offGraphics);
}
g.drawImage(offImage, 0, 0, null);
i *= 1.1;
try
wait(80);
catch (InterruptedException e)
return;
}
try
wait(3000);
catch (InterruptedException e)
return;
}
}