package ie.dcu.auto.automator; import ie.dcu.auto.AutomationData; import ie.dcu.matrix.*; import ie.dcu.segment.*; import ie.dcu.segment.annotate.AnnotationManager; import org.eclipse.swt.graphics.Point; /** * Handles the grunt work of the automator (maintaining state, sending * notifications, and so forth). * * Subclasses just need to implement {@link #doReset()}, {@link #doStart()}, and * {@link #doStep()}. * * * @author Kevin McGuinness */ public abstract class AbstractAutomator implements Automator { private final AutomationData data; private boolean done; private int maxSteps; private int step; public AbstractAutomator(AutomationData data) { this.data = data; this.done = false; this.maxSteps = DEFAULT_MAX_STEPS; this.step = -1; } public void setMaxSteps(int maxSteps) { if (maxSteps < 0) { throw new IllegalArgumentException(); } this.maxSteps = maxSteps; } public int getMaxSteps() { return maxSteps; } public int getStep() { return step; } public boolean canReset() { return hasSegmentationContext(); } public boolean canStart() { return step == 0 && hasSegmentationContext(); } public boolean canStep() { return step > 0 && !done && hasSegmentationContext() && step < maxSteps; } public void reset() { if (canReset()) { doReset(); getSegmenter().finish(getSegmentationContext()); getAnnotations().clear(); getSegmentationContext().getMask().clear(); getSegmenter().init(getSegmentationContext()); step = 0; done = false; data.clearEvaluationResults(); data.updateSegmentationError(); data.fireAutomatorStateChanged(); data.fireSegmentationContextUpdated(); } } public void start() { if (canStart()) { doStart(); // Update segmentation getSegmenter().update(getSegmentationContext()); // Evaluate data.evaluate(); // Set step step = 1; // Notify data.updateSegmentationError(); data.fireAutomatorStateChanged(); data.fireSegmentationContextUpdated(); } } public void step() { if (canStep()) { doStep(); // Update segmentation getSegmenter().update(getSegmentationContext()); // Evaluate data.evaluate(); // Increment step step++; if (done || step == maxSteps) { getSegmenter().finish(getSegmentationContext()); } // Notify data.updateSegmentationError(); data.fireAutomatorStateChanged(); data.fireSegmentationContextUpdated(); } } private boolean hasSegmentationContext() { return data.getSegmentationContext() != null; } private Segmenter getSegmenter() { return data.getSegmenter(); } private SegmentationContext getSegmentationContext() { return data.getSegmentationContext(); } protected AnnotationManager getAnnotations() { return data.getSegmentationContext().getAnnotations(); } protected ByteMatrix getForegroundError() { return data.getForegroundError(); } protected ByteMatrix getBackgroundError() { return data.getBackgroundError(); } protected void log(String format, Object... args) { data.logActivity(String.format(format, args)); } protected void setDone(boolean done) { this.done = done; } protected static Point getSwtPointForIndex(Index2D index) { return new Point(index.j, index.i); } protected abstract void doReset(); protected abstract void doStart(); protected abstract void doStep(); }