00001 package edu.stanford.hci.r3.events.handlers;
00002
00003 import java.util.ArrayList;
00004 import java.util.Collections;
00005 import java.util.List;
00006
00007 import edu.stanford.hci.r3.events.EventHandler;
00008 import edu.stanford.hci.r3.events.PenEvent;
00009 import edu.stanford.hci.r3.pen.PenSample;
00010 import edu.stanford.hci.r3.pen.handwriting.HandwritingRecognitionService;
00011 import edu.stanford.hci.r3.pen.ink.Ink;
00012 import edu.stanford.hci.r3.pen.ink.InkStroke;
00013 import edu.stanford.hci.r3.units.PatternDots;
00014 import edu.stanford.hci.r3.units.Units;
00015 import edu.stanford.hci.r3.units.coordinates.PercentageCoordinates;
00016
00028 public abstract class HandwritingRecognizer extends EventHandler {
00029
00033 private static final PatternDots DOTS = new PatternDots();
00034
00038 private List<PenSample> currentStrokeSamples = new ArrayList<PenSample>();
00039
00043 private HandwritingRecognitionService recognizerService;
00044
00048 private List<InkStroke> strokes = Collections.synchronizedList(new ArrayList<InkStroke>());
00049
00054 public HandwritingRecognizer() {
00055 recognizerService = HandwritingRecognitionService.getInstance();
00056 }
00057
00061 public void clear() {
00062 strokes.clear();
00063 }
00064
00065 public abstract void contentArrived();
00066
00070 public void handleEvent(PenEvent event) {
00071 final PercentageCoordinates percentageLocation = event.getPercentageLocation();
00072 final Units x = percentageLocation.getX();
00073 final Units y = percentageLocation.getY();
00074 final long timestamp = event.getTimestamp();
00075
00076
00077 if (event.isTypePenDown()) {
00078
00079 currentStrokeSamples.clear();
00080 currentStrokeSamples.add(new PenSample(x.getValueInPixels(), y.getValueInPixels(), 128,
00081 timestamp));
00082 } else if (event.isTypePenUp()) {
00083 strokes.add(new InkStroke(currentStrokeSamples, DOTS));
00084 contentArrived();
00085
00086 } else {
00087 currentStrokeSamples.add(new PenSample(x.getValueInPixels(), y.getValueInPixels(), 128,
00088 timestamp));
00089 }
00090 }
00091
00095 public String recognizeHandwriting() {
00096 if (strokes.size() == 0) {
00097
00098 return "";
00099 } else {
00100 final Ink ink = new Ink(strokes);
00101 final String xml = ink.getAsXML(false );
00102 final String result = recognizerService.recognizeHandwriting(xml);
00103 return result;
00104 }
00105 }
00106
00110 public List<String> recognizeHandwritingWithAlternatives() {
00111 recognizeHandwriting();
00112 return recognizerService.getAlternatives();
00113 }
00114
00118 @Override
00119 public String toString() {
00120 return "Handwriting Recognizer: " + strokes.size() + " strokes.";
00121 }
00122
00123 }