/*******************************************************************************
* Copyright (c) 2012 Google, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Google, Inc. - initial API and implementation
*******************************************************************************/
package com.windowtester.swing.event.recorder;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import abbot.editor.recorder.RecordingFailedException;
import abbot.script.Resolver;
import abbot.script.Step;
import com.windowtester.recorder.IEventFilter;
import com.windowtester.recorder.IEventRecorder;
import com.windowtester.recorder.event.ISemanticEventListener;
import com.windowtester.recorder.event.IUISemanticEvent;
import com.windowtester.recorder.event.meta.RecorderErrorEvent;
import com.windowtester.recorder.event.meta.RecorderTraceEvent;
import com.windowtester.swing.event.spy.SpyEventHandler;
import com.windowtester.swing.recorder.ComponentRecorder;
/***
* Extend the Abbot EventRecorder for use with windowtester
* implement the IEventRecorder interface
*/
public class SwingEventRecorder extends abbot.editor.recorder.EventRecorder
implements IEventRecorder{
/** A flag to indicate record state */
protected boolean _isRecording;
/** A flag to indicate pause state */
protected boolean _isPaused;
/** A list of primitive event filters */
private List /*<ISemanticEventListener>*/ _filters;
private final SpyEventHandler spyHandler = new SpyEventHandler();
public SwingEventRecorder(Resolver resolver, boolean captureMotion) {
super(resolver, captureMotion);
}
/**
* Add the given semantic event listener to this recorder. Event listeners
* are notified of all semantic events.
*/
public void addListener(ISemanticEventListener listener) {
// Install existing semantic recorders
for (int i=0;i < recorderClasses.length;i++) {
((ComponentRecorder)getSemanticRecorder(recorderClasses[i])).addListener(listener);
}
}
/**
* Override
* point recorders to windowtester classes
*/
protected String getRecoderName(String cname) {
return "com.windowtester.swing.recorder." + cname + "Recorder";
}
/**
* Override
* notify listeners that recording has terminated
*/
public void terminate() throws RecordingFailedException {
_isRecording = false;
super.terminate();
//get the list of listeners
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyDispose();
}
/* (non-Javadoc)
* @see com.windowtester.recorder.IEventRecorder#toggleSpyMode()
*/
public void toggleSpyMode() {
for (Iterator iter = getListeners().iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifySpyModeToggle();
}
public void stop() {
// System.out.println("Stopping recorder");
try {
_isRecording = false;
super.terminate();
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyStop();
}
catch(RecordingFailedException e) {
Throwable error = e.getReason();
System.out.println("Recording stop failure: " + error.toString());
}
//note: this does a create...
Step step = getStep();
}
public void start() {
super.start();
_isRecording = true;
_isPaused = false;
// get the list of listeners
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyStart();
}
public void write() {
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyWrite();
}
public void restart() {
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyRestart();
}
public void pause() {
_isRecording = false;
_isPaused = true;
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyPause();
}
public void removeListener(ISemanticEventListener listener) {
// remove listener from semantic recorders
for (int i=0;i < recorderClasses.length;i++) {
((ComponentRecorder)getSemanticRecorder(recorderClasses[i])).removeListener(listener);
}
}
public void record(IUISemanticEvent semanticEvent) {
// get the list of listeners
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notify(semanticEvent);
}
public void reportError(RecorderErrorEvent event) {
// get the list of listeners
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyError(event);
}
public void trace(RecorderTraceEvent event) {
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyTrace(event);
}
public void addEventFilter(IEventFilter filter) {
List filters = getEventFilters();
if (filters.contains(filter))
debug("multiple adds of filter: : " + filter);
else
filters.add(filter);
}
public void removeEventFilter(IEventFilter filter) {
List filters = getEventFilters();
if (filters.contains(filter))
debug("filter removed that was not registered: " + filter);
else
filters.remove(filter);
}
public void addHook(String hookName) {
List listeners = getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notifyAssertionHookAdded(hookName);
}
/**
*
* @return list of listeners attached to the recorder
*/
private List getListeners(){
return ((ComponentRecorder)getSemanticRecorder(recorderClasses[0])).getListeners();
}
public void notify(IUISemanticEvent semanticEvent) {
for (Iterator iter = getListeners().iterator(); iter.hasNext(); )
((ISemanticEventListener)iter.next()).notify(semanticEvent);
}
/**
* @return the list of event filters
*/
private List getEventFilters() {
if (_filters == null)
_filters = new ArrayList/*<IEventFilter>*/();
return _filters;
}
/**
* Send this debug message to the tracer
*/
private static void debug(String msg) {
// DebugHandler.trace(TRACE_OPTION, msg);
}
/**
* @return true if this recorder is currently recording
*/
public boolean isRecording() {
return _isRecording;
}
/** Override to generate spy events */
public void insertStep(Step step) {
super.insertStep(step);
if (capturedEvent != null && capturedEvent.getID() == MouseEvent.MOUSE_ENTERED){
IUISemanticEvent event = spyHandler.interepretHover(capturedEvent);
if (event != null)
notify(event);
}
}
}