// WorkArea.java // // Mark F. Hulber // May 1996 // // // WorkArea implements a scrollable drawing board in which the user can enter // points. The points can be input to an algorithm of choice for processing // and display of the resulting output. So far, two implementations of // the Convex Hull have been implemented (in separate classes) including // the "Gift Wrap" algorithm and the "Graham Scan" // import java.awt.*; public class WorkArea extends Panel { Canvas canvas; Scrollbar hbar, vbar; java.util.Vector lines = new java.util.Vector(100,100); java.util.Vector results, results1, results2; giftWrap gr = new giftWrap(); grahamScan gs = new grahamScan(); int last_x, last_y; int offset_x, offset_y; int canvas_width, canvas_height; private int num_points = 0; Button clear; TextField textarea; Choice algo; String ALG = "Gift Wrap"; public WorkArea(Button cl, TextField ta, Choice al){ canvas = new Canvas(); hbar = new Scrollbar(Scrollbar.HORIZONTAL); vbar = new Scrollbar(Scrollbar.VERTICAL); this.setLayout(new BorderLayout(0,0)); clear = cl; textarea = ta; algo = al; this.add("Center", canvas); this.add("South", hbar); this.add("East", vbar); } public Dimension preferredSize() { return new Dimension(1000,500); } public void paint(Graphics g){ newPoint l1, l, m; for (int i = 0; i < lines.size(); i++) { l = (newPoint)lines.elementAt(i); g.fillOval(l.x-offset_x, l.y-offset_y, 4, 4); } if (ALG == "Gift Wrap") { if ((results1 != null) && (results1.size() > 0)) { l1 = (newPoint)results1.elementAt(0); m = (newPoint)results1.elementAt(0); for (int i = 0, j = 1; j < results1.size(); i++, j++) { l = (newPoint)results1.elementAt(i); m = (newPoint)results1.elementAt(j); g.drawLine(l.x-offset_x, l.y-offset_y, m.x-offset_x, m.y-offset_y); } g.drawLine(m.x-offset_x, m.y-offset_y, l1.x-offset_x, l1.y-offset_y); } } else if (ALG == "Graham Scan") { if ((results2 != null) && (results2.size() > 2)) { l1 = (newPoint)results2.elementAt(0); m = (newPoint)results2.elementAt(0); for (int i = 0, j = 1; j < results2.size(); i++, j++) { l = (newPoint)results2.elementAt(i); m = (newPoint)results2.elementAt(j); g.drawLine(l.x-offset_x, l.y-offset_y, m.x-offset_x, m.y-offset_y); } g.drawLine(m.x-offset_x, m.y-offset_y, l1.x-offset_x, l1.y-offset_y); } } } public boolean mouseDown(Event e, int x, int y) { newPoint l1, l, m; int nx, ny; Graphics g = canvas.getGraphics(); last_x = x; last_y = y; g.fillOval(x, y, 4, 4); nx = x + offset_x; ny = y + offset_y; textarea.setText("x:["+nx+"] y:["+ny+"]"); lines.addElement(new newPoint(nx, ny)); if (ALG == "Gift Wrap") { results1 = gr.doWrap(lines); } else if (ALG == "Graham Scan") { results2 = gs.doGraham(lines); } this.update(g); return true; } public boolean mouseDrag(Event e, int x, int y) { int nx, ny; nx = x + offset_x; ny = y + offset_y; textarea.setText("x:["+nx+"] y:["+ny+"]"); return true; } public boolean mouseMove(Event e, int x, int y) { int nx, ny; nx = x + offset_x; ny = y + offset_y; textarea.setText("x:["+nx+"] y:["+ny+"]"); return true; } public boolean mouseUp(Event e, int x, int y) { return true; } public boolean mouseExit(Event e, int x, int y) { textarea.setText(ALG); return true; } public boolean gotFocus(Event e) { this.update(canvas.getGraphics()); return true; } public boolean mouseEnter(Event e, int x, int y) { this.update(canvas.getGraphics()); return true; } public boolean handleEvent(Event e){ if (e.target == hbar) { switch(e.id) { case Event.SCROLL_LINE_UP: case Event.SCROLL_LINE_DOWN: case Event.SCROLL_PAGE_UP: case Event.SCROLL_PAGE_DOWN: case Event.SCROLL_ABSOLUTE: offset_x = ((Integer)e.arg).intValue(); break; } this.update(canvas.getGraphics()); return true; } else if (e.target == vbar) { switch(e.id) { case Event.SCROLL_LINE_UP: case Event.SCROLL_LINE_DOWN: case Event.SCROLL_PAGE_UP: case Event.SCROLL_PAGE_DOWN: case Event.SCROLL_ABSOLUTE: offset_y = ((Integer)e.arg).intValue(); break; } this.update(canvas.getGraphics()); return true; } else if (e.target == clear) { if (lines != null) lines.removeAllElements(); if (results != null) results.removeAllElements(); if (results1 != null) results1.removeAllElements(); if (results2 != null) results2.removeAllElements(); Graphics g = canvas.getGraphics(); Rectangle r = canvas.bounds(); g.fillRect(r.x, r.y, r.width, r.height); this.update(g); return true; } else if (e.target == algo) { if (e.arg.equals("Gift Wrap")) { textarea.setText("Gift Wrap"); ALG = "Gift Wrap"; results1 = gr.doWrap(lines); } else if (e.arg.equals("Graham Scan")){ textarea.setText("Graham Scan"); ALG = "Graham Scan"; results2 = gs.doGraham(lines); } else if (e.arg.equals("Delaunay")){ textarea.setText("Delaunay"); ALG = "Delaunay"; } Graphics g = canvas.getGraphics(); this.update(g); return true; } return super.handleEvent(e); } public synchronized void reshape(int x, int y, int width, int height) { super.reshape(x, y, width, height); Dimension hbar_size = hbar.size(); Dimension vbar_size = vbar.size(); canvas_width = width - vbar_size.width; canvas_height = height - hbar_size.height; hbar.setValues(offset_x, canvas_width, 0, 2000-canvas_width); vbar.setValues(offset_y, canvas_height, 0, 2000-canvas_height); hbar.setPageIncrement(canvas_width/2); vbar.setPageIncrement(canvas_height/2); this.update(canvas.getGraphics()); } }