[TeamTalk 124]: [661] TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder: refactor : the distinction between scribble3 and the rest of pendecoder had been eroded , and became confusing, so I merged them.
tk@edam.speech.cs.cmu.edu
tk at edam.speech.cs.cmu.edu
Wed Jul 18 17:35:41 EDT 2007
An HTML attachment was scrubbed...
URL: http://mailman.srv.cs.cmu.edu/pipermail/teamtalk-developers/attachments/20070718/dc79b00b/attachment-0001.html
-------------- next part --------------
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/AbstractDecoderTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/AbstractDecoderTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/AbstractDecoderTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -1,7 +1,5 @@
package edu.cmu.ravenclaw.pendecoder;
-import edu.cmu.ravenclaw.pendecoder.scribble3.AbstractTool;
-
public abstract class AbstractDecoderTool extends AbstractTool {
protected DrawingCanvas canvas;
Added: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/AbstractTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/AbstractTool.java (rev 0)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/AbstractTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -0,0 +1,18 @@
+package edu.cmu.ravenclaw.pendecoder;
+
+import java.awt.Point;
+
+public abstract class AbstractTool implements Tool {
+
+ protected DrawingCanvas canvas;
+ protected String name;
+
+ public String getName() {
+ return name;
+ }
+
+ protected AbstractTool(DrawingCanvas canvas, String name) {
+ this.canvas = canvas;
+ this.name = name;
+ }
+}
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/BotShape.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/BotShape.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/BotShape.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -3,7 +3,7 @@
import java.awt.*;
import java.awt.geom.*;
-public class BotShape extends edu.cmu.ravenclaw.pendecoder.scribble3.Shape implements Cloneable {
+public class BotShape extends edu.cmu.ravenclaw.pendecoder.Shape implements Cloneable {
/**
* this is the iconification of the robot
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/BotTracker.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/BotTracker.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/BotTracker.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -1,17 +1,16 @@
package edu.cmu.ravenclaw.pendecoder;
import java.util.*;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
import java.awt.Graphics;
public class BotTracker {
- protected ScribbleCanvas canvas;
+ protected DrawingCanvas canvas;
protected final static int size = 3;
protected HashMap<String, Shape> bots = new HashMap<String, Shape>();
protected HashMap<Shape, String> names = new HashMap<Shape, String>();
- BotTracker(ScribbleCanvas c) {
+ BotTracker(DrawingCanvas c) {
canvas = c;
}
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ButtonTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ButtonTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ButtonTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -10,8 +10,6 @@
package edu.cmu.ravenclaw.pendecoder;
-import edu.cmu.ravenclaw.pendecoder.scribble3.AbstractTool;
-
/**
*
* @author tkharris
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingCanvas.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingCanvas.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingCanvas.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -3,8 +3,14 @@
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
+import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
import java.util.*;
import java.io.*;
import java.awt.event.*;
@@ -12,25 +18,88 @@
import java.awt.geom.NoninvertibleTransformException;
import java.util.EventListener;
import javax.swing.*;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
+import net.sourceforge.jiu.codecs.CodecMode;
+import net.sourceforge.jiu.codecs.PNGCodec;
+import net.sourceforge.jiu.data.PixelImage;
+import net.sourceforge.jiu.gui.awt.ImageCreator;
-public class DrawingCanvas extends ScribbleCanvas {
+public class DrawingCanvas extends JComponent implements Scrollable {
protected DrawingPad drawingPad = null;
+ protected DrawingCanvasListener drawingCanvasListener;
static public String opTraderFrameHolder; //[2005-09-30] (tk): hack
+ /**
+ * The width and height of the area that the map represents (in centimeters)
+ */
+ protected float native_width, native_height;
+
+ /**
+ * A vector from the upper left corner of the map to the world origin (in centimeters)
+ */
+ protected float x_origin, y_origin;
+
+ /**
+ * The width and height of the actual map image (in pixels)
+ */
+ protected float image_width_in_pixels, image_height_in_pixels;
+
public DrawingCanvas() {
+ colorGenerator = new ColorGenerator(new Color[] {
+ Color.BLACK, //clear space
+ Color.DARK_GRAY, //hash marks
+ Color.GRAY, //unknown space
+ Color.GREEN, //obstructed space
+ Color.YELLOW //highlights
+ });
+
+ String mapfile = null;
+ try {
+ Properties properties = new Properties();
+ properties.load(new FileInputStream("map.properties"));
+ mapfile = properties.getProperty("edu.cmu.ravenclaw.pendecoder.mapfile");
+ if(mapfile == null) throw new Exception("mapfile is missing");
+ String widthstr = properties.getProperty("edu.cmu.ravenclaw.pendecoder.mapwidth");
+ if(widthstr == null) throw new Exception("mapwidth is missing");
+ String heightstr = properties.getProperty("edu.cmu.ravenclaw.pendecoder.mapheight");
+ native_width = Float.parseFloat(widthstr);
+ native_height = Float.parseFloat(heightstr);
+ } catch (NumberFormatException e) {
+ System.err.println("Can't parse double:" + e.toString());
+ System.exit(1);
+ } catch (Exception e) {
+ System.err.println("Problem with properties" + e.toString());
+ System.exit(1);
+ }
+ try {
+ PNGCodec codec = new PNGCodec();
+ codec.setFile(mapfile, CodecMode.LOAD);
+ codec.process();
+ PixelImage pixelimage = codec.getImage();
+ backImage = new MapBufferedImage(ImageCreator.convertToAwtImage(pixelimage, ImageCreator.DEFAULT_ALPHA));
+ image_width_in_pixels = backImage.getWidth(this);
+ image_height_in_pixels = backImage.getHeight(this);
+ setPreferredSize(new Dimension((int)image_width_in_pixels,
+ (int)image_height_in_pixels));
+ } catch(Exception e) {
+ System.err.println("Problem reading or converting PNG: " + e.toString());
+ System.exit(1);
+ }
+ drawingCanvasListener = makeCanvasListener();
+ addMouseListener((MouseListener) listener);
+ addMouseMotionListener((MouseMotionListener) listener);
}
public DrawingCanvas(Image backImage, DrawingPad drawingPad) {
- super(backImage);
+ //calling factory method
+ System.err.println("scribble w/backimage");
+ drawingCanvasListener = makeCanvasListener();
+ addMouseListener((MouseListener) listener);
+ addMouseMotionListener((MouseMotionListener) listener);
+ backImage = new MapBufferedImage(backImage);
this.drawingPad = drawingPad;
}
- public DrawingCanvas(Image backImage) {
- super(backImage);
- }
-
public DrawingCanvas(DrawingPad drawingPad) {
this.drawingPad = drawingPad;
}
@@ -43,6 +112,13 @@
return drawingCanvasListener.getTool();
}
+ /**
+ * factory method
+ */
+ protected DrawingCanvasListener makeCanvasListener() {
+ return new DrawingCanvasListener(this);
+ }
+
public void saySelectBot(String name) {
drawingPad.saySelectBot(name);
}
@@ -171,11 +247,266 @@
+ " origin (cm): (" + x_origin + ", " + y_origin + ")");
}
- // factory method
- protected EventListener makeCanvasListener() {
- return (drawingCanvasListener = new DrawingCanvasListener(this));
- }
-
- protected DrawingCanvasListener drawingCanvasListener;
private static final long serialVersionUID = 2665310629710366124L;
+
+ /**
+ *
+ * The list of shapes of the drawing
+ */
+ protected List<Shape> shapes = new ArrayList<Shape>();
+
+ protected Color curColor = Color.black;
+
+ protected EventListener listener;
+
+ protected boolean mouseButtonDown = false;
+
+ protected int x;
+
+ protected int y;
+
+ /**
+ * The image to display as the background (the map)
+ */
+ protected MapBufferedImage backImage = null;
+
+ /**
+ * An image of hashmarks for the transparent portions of the backImage
+ */
+ protected BufferedImage hashImage = null;
+
+ /**
+ * The width and height of the rendered map image (in pixels).
+ * The map is streched when the application window grows or during zooming, etc.
+ */
+ protected Dimension view_size;
+
+ /**
+ * A transform from the map image to the rendered map image
+ * The map is streched when the application window grows or during zooming, etc.
+ */
+ protected AffineTransform mapScale = new AffineTransform();
+
+ /**
+ * A transform from screen coordinates (pixels, left-handed)
+ * to map coordinates (centimeters, right-handed)
+ */
+ protected AffineTransform screen_to_map = new AffineTransform();
+
+ /**
+ * A transform from map coordinates (centimeters, right-handed)
+ * to screen coordinates (pixels, left-handed)
+ */
+ protected AffineTransform map_to_screen = new AffineTransform();
+
+ /**
+ * A class to generate new colors, maximally distinct from an existing set.
+ */
+ public ColorGenerator colorGenerator = null;
+
+ public void mapUpdate(int type, int x_dim, int y_dim, float x_origin, float y_origin, int resolution, int[] encoded_map) {
+ byte[] decoded_map = new byte[x_dim * y_dim];
+ decodeMap(decoded_map, x_dim, y_dim, encoded_map);
+ if (type == MapBufferedImage.FULL) {
+ if (image_width_in_pixels != x_dim || image_height_in_pixels != y_dim) {
+ int colors[] = new int[3];
+ colors[1] = Color.BLACK.getRGB();
+ colors[2] = Color.DARK_GRAY.getRGB();
+ IndexColorModel iColor = new IndexColorModel(2, 3, colors, 0, false, 0, DataBuffer.TYPE_BYTE);
+ hashImage = new BufferedImage(x_dim, y_dim, BufferedImage.TYPE_BYTE_INDEXED, iColor);
+ int hashing = 100 / resolution;
+ WritableRaster wr = hashImage.getRaster();
+ for (int j = 0; j < y_dim; j++) {
+ for (int i = 0; i < x_dim; i++) {
+ if (j % hashing == 0 || i % hashing == 0)
+ wr.setSample(i, j, 0, 2); else
+ wr.setSample(i, j, 0, 1);
+ }
+ }
+ setPreferredSize(new Dimension(x_dim, y_dim));
+ }
+ backImage = MapBufferedImage.createMapBufferedImage(x_dim, y_dim);
+ native_width = x_dim * resolution;
+ native_height = y_dim * resolution;
+ this.x_origin = x_origin * 100;
+ this.y_origin = y_origin * 100;
+ image_width_in_pixels = x_dim;
+ image_height_in_pixels = y_dim;
+ backImage.setFullMap(decoded_map);
+ repaint();
+ } else
+ if (type == MapBufferedImage.DIFF) {
+ if (x_dim != image_width_in_pixels || y_dim != image_height_in_pixels) {
+ System.err.println("diff map for different full map");
+ } else {
+ backImage.setDiffMap(decoded_map);
+ repaint();
+ }
+ } else {
+ System.err.println("unknown map type: " + type);
+ }
+ }
+
+ protected void decodeMap(byte[] decoded_map, int x, int y, int[] encoded_map) {
+ System.err.println("x: " + x + " y: " + y + " encoded_len: " + encoded_map.length);
+ int j = 0, k = 0;
+ for (int i = 0; i < encoded_map.length; i++) {
+ int run_length = (encoded_map[i] & -256) >> 8;
+ byte run_value = (byte) (encoded_map[i] & 255);
+ if (i == 0)
+ System.err.println("raw: " + encoded_map[i] + " rl: " + run_length + " rv: " + run_value + " j: " + j);
+ for (; j < k + run_length; j++) {
+ decoded_map[j] = run_value;
+ }
+ k = j;
+ }
+ }
+
+ public void setCurColor(Color curColor) {
+ this.curColor = curColor;
+ }
+
+ public Color getCurColor() {
+ return curColor;
+ }
+
+ public void addShape(Shape shape) {
+ if (shape != null) {
+ shapes.add(shape);
+ }
+ }
+
+ public void removeShape(Shape shape) {
+ shapes.remove(shape);
+ }
+
+ public void paintComponent(Graphics g) {
+ Dimension viewportDim = ((JViewport) getParent()).getExtentSize();
+ if (view_size.width < viewportDim.width || view_size.height < viewportDim.height) {
+ setPreferredSize(new Dimension(Math.max(view_size.width, viewportDim.width), Math.max(view_size.height, viewportDim.height)));
+ revalidate();
+ }
+ if (backImage == null) {
+ System.err.println("Got no backImage");
+ return;
+ }
+ Graphics2D mapG = (Graphics2D) g.create();
+ mapG.transform(mapScale);
+ if (hashImage != null) {
+ mapG.drawImage(hashImage, 0, 0, this);
+ }
+ mapG.drawImage(backImage, 0, 0, this);
+ Graphics2D shapeG = (Graphics2D) g.create();
+ shapeG.transform(map_to_screen);
+ shapeG.setFont(BotShape.labelFont);
+ if (shapes != null) {
+ Iterator iter = shapes.iterator();
+ while (iter.hasNext()) {
+ Shape shape = (Shape) iter.next();
+ if (shape != null) {
+ shape.draw(shapeG);
+ if (shape instanceof BotShape) {
+ ((BotShape) shape).label(screen_to_map, shapeG);
+ }
+ }
+ }
+ }
+ }
+
+ public void newFile() {
+ shapes.clear();
+ repaint();
+ }
+
+ public void openFile(String filename) {
+ try {
+ ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
+ try {
+ List l = (List) in.readObject();
+ Iterator li = l.iterator();
+ while (li.hasNext()) {
+ shapes.add((Shape) li.next());
+ }
+ } catch (Exception e) {
+ System.err.println("Some problem with reading: " + e);
+ }
+ in.close();
+ repaint();
+ } catch (IOException e1) {
+ System.out.println("Unable to open file: " + filename);
+ }
+ }
+
+ public void saveFile(String filename) {
+ try {
+ ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
+ out.writeObject(shapes);
+ out.close();
+ System.out.println("Save drawing to " + filename);
+ } catch (IOException e) {
+ System.out.println("Unable to write file: " + filename);
+ }
+ }
+
+ public AffineTransform getScreenToMap() {
+ return screen_to_map;
+ }
+
+ public String selectObj(Point p) {
+ String retval = null;
+ screen_to_map.transform(p, p);
+ if (shapes != null) {
+ Iterator<Shape> i = shapes.iterator();
+ while (i.hasNext()) {
+ Shape shape = i.next();
+ if (shape.contains(p)) {
+ shape.highlight();
+ retval = shape.getName();
+ } else {
+ shape.unhighlight();
+ }
+ }
+ repaint();
+ }
+ return retval;
+ }
+
+ public void setPreferredSize(Dimension d) {
+ view_size = d;
+ map_to_screen.setToScale(view_size.width / native_width, view_size.height / native_height);
+ map_to_screen.translate(x_origin, y_origin);
+ try {
+ screen_to_map = map_to_screen.createInverse();
+ } catch (NoninvertibleTransformException e) {
+ System.err.println("couldn't build map_to_screen");
+ }
+ mapScale.setToScale(view_size.width / image_width_in_pixels, view_size.height / image_height_in_pixels);
+ mapScale.translate(0, image_height_in_pixels);
+ }
+
+ public Dimension getPreferredSize() {
+ return view_size;
+ }
+
+ public Dimension getPreferredScrollableViewportSize() {
+ return getPreferredSize();
+ }
+
+ public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
+ return 1;
+ }
+
+ public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
+ if (orientation == SwingConstants.VERTICAL)
+ return visibleRect.height / 2; else
+ return visibleRect.width / 2;
+ }
+
+ public boolean getScrollableTracksViewportWidth() {
+ return false;
+ }
+
+ public boolean getScrollableTracksViewportHeight() {
+ return false;
+ }
}
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingCanvasListener.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingCanvasListener.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingCanvasListener.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -2,14 +2,59 @@
import java.awt.*;
import java.awt.event.*;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
-public class DrawingCanvasListener extends ScribbleCanvasListener {
+public class DrawingCanvasListener implements MouseListener, MouseMotionListener {
+ protected DrawingCanvas canvas;
+ protected Tool tool;
+
public DrawingCanvasListener(DrawingCanvas canvas) {
- super(canvas, null);
+ this.canvas = canvas;
+ tool = new DrawingTool(canvas, "Scribble");
}
+ public void mousePressed(MouseEvent e) {
+ Point p = e.getPoint();
+ tool.mouseDownAt(p);
+ canvas.mouseButtonDown = true;
+ canvas.x = p.x;
+ canvas.y = p.y;
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ Point p = e.getPoint();
+ if (canvas.mouseButtonDown) {
+ tool.mouseDraggedTo(p);
+ canvas.x = p.x;
+ canvas.y = p.y;
+ }
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ Point p = e.getPoint();
+ tool.mouseReleasedAt(p);
+ canvas.mouseButtonDown = false;
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ Point p = e.getPoint();
+ if(e.getClickCount() == 1) {
+ if(e.getButton() == e.BUTTON1)
+ tool.mouseClickedAt(p);
+ else
+ tool.mouseRightClickedAt(p);
+ } else {
+ tool.mouseDoubleClickedAt(p);
+ }
+ }
+
+ public void mouseEntered(MouseEvent e) {}
+ public void mouseExited(MouseEvent e) {}
+ public void mouseMoved(MouseEvent e) {
+ Point p = e.getPoint();
+ tool.mouseMovedTo(p);
+ }
+
public Tool getTool() {
return tool;
}
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingPad.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingPad.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingPad.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -6,11 +6,9 @@
import javax.swing.*;
import bsh.util.JConsole;
-
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
import java.awt.image.BufferedImage;
-public class DrawingPad extends Scribble {
+public class DrawingPad extends JFrame {
protected ToolKit toolkit;
protected JComponent toolbar;
@@ -23,7 +21,28 @@
public DrawingPad(String title) {
super(title);
-
+ // calling factory method
+ drawingCanvas = makeCanvas();
+ getContentPane().setLayout(new BorderLayout());
+ menuBar = createMenuBar();
+ getContentPane().add(menuBar, BorderLayout.NORTH);
+ pane = new JScrollPane(drawingCanvas);
+ JRootPane rootPane = new JRootPane();
+ rootPane.setContentPane(pane);
+ LogoViewport logopane = new LogoViewport();
+ rootPane.setGlassPane(logopane);
+ logopane.setVisible(true);
+ pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
+ pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+ getContentPane().add(rootPane, BorderLayout.CENTER);
+ addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ if (exitAction != null) {
+ exitAction.actionPerformed(new ActionEvent(DrawingPad.this, 0, null));
+ }
+ }
+ });
+
//add toolbar
toolkit = createToolkit();
drawingCanvas.setTool(toolkit.getTool(0));
@@ -96,7 +115,7 @@
}
public void mapUpdate(int type, int x_dim, int y_dim, float x_origin, float y_origin, int resolution, int[] encoded_map) {
- canvas.mapUpdate(type, x_dim, y_dim, x_origin, y_origin, resolution, encoded_map);
+ drawingCanvas.mapUpdate(type, x_dim, y_dim, x_origin, y_origin, resolution, encoded_map);
}
public void addServer(PenDecoderServer server) {
@@ -140,7 +159,7 @@
}
// factory method
- protected ScribbleCanvas makeCanvas() {
+ protected DrawingCanvas makeCanvas() {
return (drawingCanvas = new DrawingCanvas(this));
}
@@ -279,4 +298,52 @@
}
private static final long serialVersionUID = -3941481106291332264L;
+
+ protected JMenuBar createMenuBar() {
+ JMenuBar menuBar = new JMenuBar();
+ JMenu menu;
+ JMenuItem mi;
+ menu = new JMenu("File");
+ menuBar.add(menu);
+ exitAction = new ExitListener();
+ mi = new JMenuItem("Exit");
+ menu.add(mi);
+ mi.addActionListener(exitAction);
+ menu = new JMenu("Help");
+ menuBar.add(menu);
+ mi = new JMenuItem("About");
+ menu.add(mi);
+ mi.addActionListener(new AboutListener());
+ return menuBar;
+ }
+
+ class ExitListener implements ActionListener {
+
+ public void actionPerformed(ActionEvent e) {
+ int result = JOptionPane.showConfirmDialog(null, "Do you want to exit?", "Exit Treasure Hunt GUI?", JOptionPane.YES_NO_OPTION);
+ if (result == JOptionPane.YES_OPTION) {
+ System.exit(0);
+ }
+ }
+ }
+
+
+ class AboutListener implements ActionListener {
+
+ public void actionPerformed(ActionEvent e) {
+ JOptionPane.showMessageDialog(null, "Teamtalk version 1.0\nCarnegie Mellon\nBoeing Phantom Works\n",
+ "About", JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+
+ protected JScrollPane pane;
+
+ protected JMenuBar menuBar;
+
+ protected ActionListener exitAction;
+
+ protected static int width = 1200;
+
+ protected static int height = 800;
+
}
Added: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingTool.java (rev 0)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/DrawingTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -0,0 +1,45 @@
+package edu.cmu.ravenclaw.pendecoder;
+
+import java.awt.*;
+import javax.swing.Icon;
+
+public class DrawingTool extends AbstractTool {
+
+ public DrawingTool(DrawingCanvas canvas, String name) {
+ super(canvas, name);
+ }
+
+ public void mouseDownAt(Point p) {
+ curStroke = new edu.cmu.ravenclaw.pendecoder.Stroke(canvas.getCurColor());
+ curStroke.addPoint(p);
+ }
+
+ public void mouseDraggedTo(Point p) {
+ if (curStroke != null) {
+ curStroke.addPoint(p);
+ Graphics g = canvas.getGraphics();
+ g.setColor(canvas.getCurColor());
+ g.drawLine(canvas.x, canvas.y, p.x, p.y);
+ }
+ }
+
+ public void mouseReleasedAt(Point p) {
+ if (curStroke != null) {
+ curStroke.addPoint(p);
+ canvas.addShape(curStroke);
+ curStroke = null;
+ }
+ }
+
+ public void mouseClickedAt(Point p) {}
+ public void mouseDoubleClickedAt(Point p) {}
+ public void mouseRightClickedAt(Point p) {}
+ public void mouseMovedTo(Point p) {}
+
+ public Icon getIcon() {
+ return null;
+ }
+
+ protected edu.cmu.ravenclaw.pendecoder.Stroke curStroke = null;
+
+}
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/IconTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/IconTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/IconTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -15,8 +15,6 @@
import javax.swing.Icon;
import javax.swing.ImageIcon;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
-
/**
*
* @author tkharris
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Imager.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Imager.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Imager.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -7,11 +7,7 @@
package edu.cmu.ravenclaw.pendecoder;
-import java.awt.Canvas;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Image;
+import java.awt.*;
import java.awt.image.BufferedImage;
/**
Added: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/LogoViewport.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/LogoViewport.java (rev 0)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/LogoViewport.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -0,0 +1,90 @@
+/*
+ * LogoViewport.java
+ *
+ * Created on April 25, 2006, 12:35 PM
+ *
+ * To change this template, choose Tools | Options and locate the template under
+ * the Source Creation and Management node. Right-click the template and choose
+ * Open. You can then make changes to the template in the Source Editor.
+ */
+
+package edu.cmu.ravenclaw.pendecoder;
+
+import java.awt.*;
+import java.awt.image.*;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+
+/**
+ *
+ * @author tkharris
+ * LogoViewport displays an image with the white parts transparent onto the
+ * glass pane of a JScrollPane.
+ */
+public class LogoViewport extends JComponent {
+
+ private Image logo_image;
+ private boolean have_dimensions = false;
+ private int image_width, image_height;
+
+ /**
+ * Creates a new instance of LogoViewport
+ */
+ public LogoViewport() {
+ try {
+ logo_image = ImageIO.read(new File("cmu_wordmark1r-boeing.JPG"));
+ } catch (IOException e) {
+ System.err.println("Problem reading ");
+ }
+ setOpaque(false);
+ }
+
+ //this function makes colors "near" white transparent
+ //the more white you are, the more transparent you become
+ //this is useful for images with a sort-of white background
+ private static Image makeColorTransparent (Image im) {
+ ImageFilter filter = new RGBImageFilter() {
+ public final int filterRGB(int x, int y, int rgb) {
+ /*
+ int intensity = ((rgb & 0x00FF0000)>>16) +
+ ((rgb & 0x0000FF00)>>8) +
+ ((rgb & 0x000000FF))
+ / 3;
+ if(intensity > 0xC0) intensity = 0xFF;
+ else if(intensity < 0x20) intensity = 0x00;
+ else if(intensity <= 0x80) intensity -= 0x20;
+ else intensity += 0x30;
+ return ((0xFF - intensity) << 24) | (rgb & 0x00FFFFFF);
+ */
+ return (0xA0 << 24) | (rgb & 0xFFFFFF);
+ }
+ };
+
+ ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
+ return Toolkit.getDefaultToolkit().createImage(ip);
+ }
+
+ //just draw the image in the lower right-hand corner
+ public void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ Graphics2D g2 = (Graphics2D)g.create();
+ if(!have_dimensions) {
+ image_width = logo_image.getWidth(this);
+ image_height = logo_image.getHeight(this);
+ have_dimensions = image_width != -1 && image_height != -1;
+ if(!have_dimensions) return;
+ }
+ Rectangle r = ((JScrollPane) getRootPane().getContentPane()).getViewportBorderBounds();
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8F));
+ g2.drawImage(logo_image, r.width-image_width, r.height-image_height, this);
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_OVER));
+ g2.setColor(new Color(1F, 1F, 1F, 0.7F));
+ g2.fillRoundRect(r.width-image_width, r.height-image_height,
+ image_width, image_height, 20, 20);
+ }
+
+ private static final long serialVersionUID = 317617020444574870L;
+}
Added: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/MapBufferedImage.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/MapBufferedImage.java (rev 0)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/MapBufferedImage.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -0,0 +1,69 @@
+/*
+ * MapBufferedImage.java
+ *
+ * Created on August 12, 2006, 9:48 AM
+ */
+
+package edu.cmu.ravenclaw.pendecoder;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.image.*;
+
+/**
+ *
+ * @author tkharris
+ */
+public class MapBufferedImage extends BufferedImage {
+
+ static public final int FULL = 0;
+ static public final int DIFF = 1;
+
+ /**
+ * Creates a new instance of MapBufferedImage
+ */
+ public MapBufferedImage(int w, int h, int type, IndexColorModel cm) {
+ super(w, h, type, cm);
+ }
+
+ public MapBufferedImage(java.awt.Image i) {
+ super(i.getWidth(null), i.getHeight(null), BufferedImage.TYPE_INT_RGB);
+ Graphics2D g2 = createGraphics();
+ g2.drawImage(i, 0, 0, null);
+ g2.dispose();
+ }
+
+ static public MapBufferedImage createMapBufferedImage(int w, int h) {
+ int colors[] = new int[256];
+ for(int i=0; i<256; i++) colors[i] = Color.BLACK.getRGB();
+ colors[64] = Color.GRAY.getRGB();
+ colors[255] = Color.GREEN.getRGB();
+ IndexColorModel iColor =
+ new IndexColorModel(8, 256, colors, 0, false, 128, DataBuffer.TYPE_BYTE);
+ return new MapBufferedImage(w, h, TYPE_BYTE_INDEXED, iColor);
+ }
+
+ public void setFullMap(byte[] ras) {
+ WritableRaster wr = getRaster();
+ int h = getHeight();
+ int w = getWidth();
+ for(int y=0; y<h; y++) {
+ for(int x=0; x<w; x++) {
+ byte val = ras[y*w+x];
+ wr.setSample(x, y, 0, val);
+ }
+ }
+ }
+
+ public void setDiffMap(byte[] ras) {
+ WritableRaster wr = getRaster();
+ int h = getHeight();
+ int w = getWidth();
+ for(int y=0; y<h; y++) {
+ for(int x=0; x<w; x++) {
+ byte val = ras[y*w+x];
+ if(val!=0) wr.setSample(x, y, 0, val);
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/NPointShape.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/NPointShape.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/NPointShape.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -8,7 +8,7 @@
package edu.cmu.ravenclaw.pendecoder;
import java.awt.Color;
-import edu.cmu.ravenclaw.pendecoder.scribble3.Shape;
+import edu.cmu.ravenclaw.pendecoder.Shape;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/NPointTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/NPointTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/NPointTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -2,7 +2,6 @@
import java.awt.*;
import javax.swing.Icon;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
public class NPointTool extends AbstractDecoderTool {
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ObjShape.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ObjShape.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ObjShape.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -3,7 +3,7 @@
import java.awt.*;
import java.awt.geom.*;
-public class ObjShape extends edu.cmu.ravenclaw.pendecoder.scribble3.Shape implements Cloneable {
+public class ObjShape extends edu.cmu.ravenclaw.pendecoder.Shape implements Cloneable {
/**
* this is the iconification of the object
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PenDecoderServer.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PenDecoderServer.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PenDecoderServer.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -13,7 +13,6 @@
*/
import javax.imageio.ImageIO;
-import edu.cmu.ravenclaw.pendecoder.scribble3.MapBufferedImage;
import java.io.*;
import java.util.*;
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PlacementTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PlacementTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PlacementTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -9,7 +9,6 @@
import java.awt.*;
import java.awt.geom.AffineTransform;
import javax.swing.Icon;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
/**
*
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PointTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PointTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PointTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -3,7 +3,6 @@
import java.awt.*;
import javax.swing.Icon;
import javax.swing.JViewport;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
public class PointTool extends AbstractDecoderTool {
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PolyLineShape.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PolyLineShape.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/PolyLineShape.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -1,4 +1,5 @@
package edu.cmu.ravenclaw.pendecoder;
+
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
Added: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Shape.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Shape.java (rev 0)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Shape.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -0,0 +1,56 @@
+package edu.cmu.ravenclaw.pendecoder;
+
+import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.io.Serializable;
+
+public abstract class Shape implements Serializable {
+
+ public Shape() {}
+
+ public Shape(Color color) {
+ this.color = color;
+ }
+
+ public Shape(Color color, String name) {
+ this.color = color;
+ this.name = name;
+ }
+
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public boolean highlight() {
+ System.err.println(name + ": I selected");
+ boolean retval = selected;
+ selected = true;
+ return retval;
+ }
+
+ public boolean unhighlight() {
+ boolean retval = selected;
+ selected = false;
+ return retval;
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public abstract void draw(Graphics2D g);
+ public abstract boolean contains(Point pt);
+ public abstract void transform(AffineTransform at);
+
+ protected Color color = Color.black;
+ protected boolean selected = false;
+ protected String name = null;
+}
Added: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Stroke.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Stroke.java (rev 0)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Stroke.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -0,0 +1,55 @@
+package edu.cmu.ravenclaw.pendecoder;
+
+import java.util.*;
+import java.awt.Point;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+
+public class Stroke extends Shape {
+
+ public Stroke() {}
+
+ public Stroke(Color color) {
+ super(color);
+ }
+
+ public void addPoint(Point p) {
+ if (p != null) {
+ points.add(p);
+ }
+ }
+
+ public List getPoints() {
+ return points;
+ }
+
+ public void draw(Graphics2D g) {
+ if (color != null) {
+ g.setColor(color);
+ }
+ Point prev = null;
+ Iterator iter = points.iterator();
+ while (iter.hasNext()) {
+ Point cur = (Point) iter.next();
+ if (prev != null) {
+ g.drawLine(prev.x, prev.y, cur.x, cur.y);
+ }
+ prev = cur;
+ }
+ }
+
+ public boolean contains(Point pt) {return false;}
+ public void transform(AffineTransform at) {
+ ListIterator<Point> i = points.listIterator();
+ while(i.hasNext()) {
+ at.transform(i.next(), i.next());
+ }
+ }
+
+ // The list of points on the stroke
+ // elements are instances of java.awt.Point
+ protected List<Point> points = new ArrayList<Point>();
+
+ private static final long serialVersionUID = 396896443777340918L;
+}
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ToggleButtonTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ToggleButtonTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ToggleButtonTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -10,8 +10,6 @@
package edu.cmu.ravenclaw.pendecoder;
-import edu.cmu.ravenclaw.pendecoder.scribble3.AbstractTool;
-
/**
*
* @author tkharris
Added: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Tool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Tool.java (rev 0)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/Tool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -0,0 +1,16 @@
+package edu.cmu.ravenclaw.pendecoder;
+
+import java.awt.*;
+import javax.swing.Icon;
+
+public interface Tool {
+ public Icon getIcon();
+ public String getName();
+ public void mouseDownAt(Point p);
+ public void mouseDraggedTo(Point p);
+ public void mouseReleasedAt(Point p);
+ public void mouseClickedAt(Point p);
+ public void mouseDoubleClickedAt(Point p);
+ public void mouseRightClickedAt(Point p);
+ public void mouseMovedTo(Point p);
+}
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ToolKit.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ToolKit.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/ToolKit.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -1,7 +1,6 @@
package edu.cmu.ravenclaw.pendecoder;
import java.util.*;
-import edu.cmu.ravenclaw.pendecoder.scribble3.Tool;
/**
* ToolKit is a collection of "tools" or drawing modes.
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/TwoEndsShape.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/TwoEndsShape.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/TwoEndsShape.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -5,7 +5,6 @@
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D.Float;
import java.awt.geom.Point2D;
-import edu.cmu.ravenclaw.pendecoder.scribble3.Shape;
public abstract class TwoEndsShape extends Shape implements Cloneable {
Modified: TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/TwoEndsTool.java
===================================================================
--- TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/TwoEndsTool.java 2007-07-17 00:24:24 UTC (rev 660)
+++ TeamTalk/Agents/PenDecoder/src/edu/cmu/ravenclaw/pendecoder/TwoEndsTool.java 2007-07-18 21:35:40 UTC (rev 661)
@@ -2,7 +2,6 @@
import java.awt.*;
import javax.swing.Icon;
-import edu.cmu.ravenclaw.pendecoder.scribble3.*;
public class TwoEndsTool extends AbstractDecoderTool {
More information about the TeamTalk-developers
mailing list