[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