RegionComponent.java

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                                                 // Dragged
00077                                                 add(new Line2D.Double(x,y,lastX,lastY));
00078                                         } else {
00079                                                 penDown = true;
00080                                                 
00081                                                 // Pressed
00082                                                 add(new Line2D.Double(x,y,x,y));
00083                                         }
00084                                 } else {
00085                                         if (penDown) {
00086                                                 penDown = false;
00087                                                 // Released
00088                                         } else {
00089                                                 // Moved
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                 //repaint();
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 }

Generated on Sat Apr 14 18:21:37 2007 for R3 Paper Toolkit by  doxygen 1.4.7