Ink.java

00001 package edu.stanford.hci.r3.pen.ink;
00002 
00003 import java.awt.Color;
00004 import java.io.File;
00005 import java.util.ArrayList;
00006 import java.util.List;
00007 
00008 import javax.swing.filechooser.FileSystemView;
00009 
00010 import edu.stanford.hci.r3.pattern.coordinates.PageAddress;
00011 import edu.stanford.hci.r3.render.ink.InkRenderer;
00012 import edu.stanford.hci.r3.util.DebugUtils;
00013 import edu.stanford.hci.r3.util.MathUtils;
00014 import edu.stanford.hci.r3.util.files.FileUtils;
00015 
00028 public class Ink {
00029 
00036         public enum InkSource {
00037                 BATCHED, STREAMED, UNKNOWN
00038         }
00039 
00043         private static final Color DEFAULT_DARK_INK_COLOR = new Color(0, 0, 0, 230);
00044 
00048         private Color color = DEFAULT_DARK_INK_COLOR;
00049 
00054         private double maxX = Double.MIN_VALUE;
00055 
00059         private double maxY = Double.MIN_VALUE;
00060 
00064         private double minX = Double.MAX_VALUE;
00065 
00069         private double minY = Double.MAX_VALUE;
00070 
00074         private String name = "Ink";
00075 
00080         private PageAddress pageAddress;
00081 
00085         private InkSource sourceType = InkSource.UNKNOWN;
00086 
00090         private List<InkStroke> strokes;
00091 
00095         public Ink() {
00096                 this(new ArrayList<InkStroke>());
00097         }
00098 
00104         public Ink(File xmlFile) {
00105                 this(); // empty list of strokes
00106                 loadFromXMLFile(xmlFile);
00107         }
00108 
00112         public Ink(List<InkStroke> theStrokes) {
00113                 strokes = theStrokes;
00114 
00115                 for (InkStroke s : theStrokes) {
00116                         updateMinAndMax(s);
00117                 }
00118         }
00119 
00124         public void addStroke(InkStroke s) {
00125                 strokes.add(s);
00126                 updateMinAndMax(s);
00127         }
00128 
00132         public String getAsXML() {
00133                 return getAsXML(true);
00134         }
00135 
00142         public String getAsXML(boolean useSeparatorLines) {
00143                 final String separator = useSeparatorLines ? "\n" : "";
00144 
00145                 StringBuilder sb = new StringBuilder();
00146                 sb.append(getOpenTagXML() + separator);
00147                 sb.append(getInnerXML(useSeparatorLines) + separator);
00148                 sb.append("</ink>");
00149                 return sb.toString();
00150         }
00151 
00155         public Color getColor() {
00156                 return color;
00157         }
00158 
00159         public String getInnerXML() {
00160                 return getInnerXML(false);
00161         }
00162 
00166         public String getInnerXML(boolean useSeparatorLines) {
00167                 final String separator = useSeparatorLines ? "\n" : "";
00168                 StringBuilder sb = new StringBuilder();
00169                 for (InkStroke s : strokes) {
00170                         sb.append("<stroke begin=\"" + s.getFirstTimestamp() + "\" end=\""
00171                                         + s.getLastTimestamp() + "\">" + separator);
00172                         double[] x = s.getXSamples();
00173                         double[] y = s.getYSamples();
00174                         int[] f = s.getForceSamples();
00175                         long[] ts = s.getTimeSamples();
00176                         for (int i = 0; i < x.length; i++) {
00177                                 sb.append("<p x=\"" + x[i] + "\" y=\"" + y[i] + "\" f=\"" + f[i] + "\" t=\""
00178                                                 + ts[i] + "\"/>");
00179                         }
00180                         sb.append("</stroke>" + separator);
00181                 }
00182                 return sb.toString();
00183         }
00184 
00185         public double getMaxX() {
00186                 return maxX;
00187         }
00188 
00189         public double getMaxY() {
00190                 return maxY;
00191         }
00192 
00193         public double getMinX() {
00194                 return minX;
00195         }
00196 
00197         public double getMinY() {
00198                 return minY;
00199         }
00200 
00204         public String getName() {
00205                 return name;
00206         }
00207 
00211         public int getNumStrokes() {
00212                 return strokes.size();
00213         }
00214 
00218         private String getOpenTagXML() {
00219                 if (pageAddress == null) {
00220                         return "<ink>";
00221                 } else {
00222                         return "<ink address=\"" + pageAddress.toString() + "\">";
00223                 }
00224         }
00225 
00229         public InkRenderer getRenderer() {
00230                 return new InkRenderer(this);
00231         }
00232 
00236         public PageAddress getSourcePageAddress() {
00237                 return pageAddress;
00238         }
00239 
00243         public InkSource getSourceType() {
00244                 return sourceType;
00245         }
00246 
00250         public List<InkStroke> getStrokes() {
00251                 return strokes;
00252         }
00253 
00260         public void loadFromXMLFile(File xmlFileSource) {
00261                 new InkXMLParser(this).parse(xmlFileSource);
00262         }
00263 
00267         public void removeStroke(InkStroke s) {
00268                 strokes.remove(s);
00269         }
00270 
00275         public File renderToJPEGFile() {
00276                 File homeDir = FileSystemView.getFileSystemView().getHomeDirectory();
00277                 // DebugUtils.println(homeDir);
00278                 File destFile = new File(homeDir, getName() + ".jpg");
00279                 // DebugUtils.println(destFile);
00280                 new InkRenderer(this).renderToJPEGRecentered(destFile);
00281                 return destFile;
00282         }
00283 
00287         public void resetColor() {
00288                 setColor(DEFAULT_DARK_INK_COLOR);
00289         }
00290 
00296         public void saveToXMLFile(File xmlFileDest) {
00297                 FileUtils.writeStringToFile(getAsXML(true), xmlFileDest);
00298         }
00299 
00303         public void setColor(Color c) {
00304                 color = c;
00305         }
00306 
00313         public void setName(String theName) {
00314                 name = theName;
00315         }
00316 
00323         public void setSourcePageAddress(PageAddress address) {
00324                 setSourceType(InkSource.BATCHED);
00325                 pageAddress = address;
00326         }
00327 
00331         public void setSourcePageAddress(String pageAddrString) {
00332                 setSourcePageAddress(new PageAddress(pageAddrString));
00333         }
00334 
00338         public void setSourceType(InkSource src) {
00339                 sourceType = src;
00340         }
00341 
00345         private void updateMinAndMax(InkStroke s) {
00346                 // update maxs and mins
00347                 minX = Math.min(s.getMinX(), minX);
00348                 minY = Math.min(s.getMinY(), minY);
00349                 maxX = Math.max(s.getMaxX(), maxX);
00350                 maxY = Math.max(s.getMaxY(), maxY);
00351         }
00352 }

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