00001 package edu.stanford.hci.r3.tools.design.swing;
00002
00003 import java.awt.Color;
00004 import java.awt.Graphics;
00005 import java.awt.Graphics2D;
00006 import java.awt.Rectangle;
00007 import java.awt.RenderingHints;
00008 import java.awt.Shape;
00009 import java.awt.event.MouseEvent;
00010 import java.awt.event.MouseListener;
00011 import java.awt.event.MouseMotionListener;
00012 import java.awt.geom.Line2D;
00013 import java.util.ArrayList;
00014 import java.util.List;
00015
00016 import javax.swing.BorderFactory;
00017 import javax.swing.JComponent;
00018
00019 import edu.stanford.hci.r3.events.EventHandler;
00020 import edu.stanford.hci.r3.events.PenEvent;
00021 import edu.stanford.hci.r3.events.PenEvent.PenEventModifier;
00022 import edu.stanford.hci.r3.paper.Region;
00023 import edu.stanford.hci.r3.pen.PenSample;
00024 import edu.stanford.hci.r3.units.Percentage;
00025 import edu.stanford.hci.r3.units.Pixels;
00026 import edu.stanford.hci.r3.units.coordinates.PercentageCoordinates;
00027
00041 public class RegionComponent extends JComponent implements MouseMotionListener, MouseListener {
00042
00046 private static final long serialVersionUID = -8845814285246446932L;
00047 private Region region;
00048
00049 private List<Shape> inks = new ArrayList<Shape>();
00050
00051
00052 public RegionComponent(Region r) {
00053 this.region = r;
00054 setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, new Color(120,120,120)));
00055 addMouseMotionListener(this);
00056 addMouseListener(this);
00057 r.addEventHandler(new EventHandler() {
00058
00059 boolean penDown = false;
00060
00061 double lastX,lastY;
00062
00063 public void handleEvent(PenEvent event) {
00064
00065 PercentageCoordinates pl = event.getPercentageLocation();
00066
00067 double x = pl.getPercentageInXDirection() * getWidth() / 100;
00068 double y = pl.getPercentageInYDirection() * getHeight() / 100;
00069
00070 double force = event.getOriginalSample().getForce() / 128;
00071
00072 System.out.println("x="+x+",y="+y+",force="+force);
00073
00074 if (event.getOriginalSample().getForce()>0) {
00075 if (penDown) {
00076
00077 add(new Line2D.Double(x,y,lastX,lastY));
00078 } else {
00079 penDown = true;
00080
00081
00082 add(new Line2D.Double(x,y,x,y));
00083 }
00084 } else {
00085 if (penDown) {
00086 penDown = false;
00087
00088 } else {
00089
00090 }
00091 }
00092 lastX = x;
00093 lastY = y;
00094 }
00095
00096 public String toString() {
00097 return "[RegionComponent EventHandler]";
00098 }
00099 });
00100 }
00101
00106 public Region getRegion() {
00107 return region;
00108 }
00109
00110 public void mouseDragged(MouseEvent e) {
00111 fireEvent(getEvent(e.getX(),e.getY(),true,true));
00112 }
00113
00114 protected void add(Shape s) {
00115 synchronized (inks) {
00116 inks.add(s);
00117 }
00118 Rectangle r = s.getBounds();
00119 repaint(r.x-1,r.y-1,r.width+4,r.height+4);
00120
00121 }
00122
00126 protected void paintComponent(Graphics g) {
00127 super.paintComponent(g);
00128 Graphics2D g2d = (Graphics2D)g;
00129 g2d.setColor(Color.WHITE);
00130 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
00131 RenderingHints.VALUE_ANTIALIAS_ON);
00132 synchronized (inks) {
00133 for (Shape s : inks)
00134 g2d.draw(s);
00135 }
00136 }
00137
00138 public void mouseMoved(MouseEvent e) {}
00139 public void mouseClicked(MouseEvent e) {}
00140 public void mouseEntered(MouseEvent e) {}
00141 public void mouseExited(MouseEvent e) {}
00142
00143 public void mousePressed(MouseEvent e) {
00144 fireEvent(getEvent(e.getX(),e.getY(),true,false));
00145 }
00146
00147 public void mouseReleased(MouseEvent e) {
00148 fireEvent(getEvent(e.getX(),e.getY(),false,false));
00149 }
00156 private Percentage getPercentage(double x, double max) {
00157 return new Percentage(x*100.0/max,new Pixels(max));
00158 }
00167 private PenEvent getEvent(int x, int y, boolean down, boolean sample) {
00168 long ts = System.currentTimeMillis();
00169 PenEvent pe =
00170 new PenEvent(0,"Swing",ts, new PenSample(x,y,down ? 128 : 0,ts));
00171 if (!sample)
00172 pe.setModifier(down ? PenEventModifier.DOWN : PenEventModifier.UP);
00173
00174 pe.setPercentageLocation(
00175 new PercentageCoordinates(getPercentage(x,getWidth()),
00176 getPercentage(y,getHeight())));
00177
00178 return pe;
00179 }
00180
00185 private void fireEvent(PenEvent pe) {
00186 for (EventHandler eh : region.getEventHandlers()) {
00187 eh.handleEvent(pe);
00188 if (pe.isConsumed())
00189 return;
00190 }
00191 }
00192
00193 }