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();
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
00278 File destFile = new File(homeDir, getName() + ".jpg");
00279
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
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 }