/*******************************************************************************
* 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.AWTEvent;
import java.awt.Component;
import java.awt.MenuComponent;
import abbot.editor.recorder.RecordingFailedException;
import abbot.finder.AWTHierarchy;
import abbot.finder.Hierarchy;
import abbot.script.Script;
import abbot.util.EventNormalizer;
import abbot.util.SingleThreadedEventListener;
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.SpyEventListener;
/**
* The Swing Gui Test Recorder
*/
public class SwingGuiTestRecorder implements IEventRecorder {
private static final long FIXTURE_EVENT_MASK =
abbot.editor.recorder.EventRecorder.RECORDING_EVENT_MASK;
private SwingEventRecorder _recorder;
// the listener
private static EventNormalizer normalizer = new EventNormalizer();
// for compatibility with abbot code, nothing to do with windowtester
private Script _script;
private Hierarchy _hierarchy;
/** A cache to store recorded events */
private EventCachingListener _cache = new EventCachingListener();
/**
* Create an instance
*
*/
public SwingGuiTestRecorder(){
_hierarchy = AWTHierarchy.getDefault();
_script = new Script(_hierarchy);
_recorder = new SwingEventRecorder(_script,true);
// for debug purpose
// _recorder.addListener(new ConsoleReportingListener());
_recorder.addListener(_cache);
_recorder.addListener(new SpyEventListener());
}
public void start() {
WindowTesterSecurityManager.install();
startListening();
_recorder.start();
}
public void stop() {
_recorder.stop();
}
public void write() {
_recorder.write();
}
public void restart() {
_recorder.restart();
}
public void terminate() {
_recorder.terminate();
}
public void toggleSpyMode() {
_recorder.toggleSpyMode();
}
public void pause() {
_recorder.pause();
}
public void addListener(ISemanticEventListener listener) {
_recorder.addListener(listener);
}
public void removeListener(ISemanticEventListener listener) {
_recorder.removeListener(listener);
}
public void record(IUISemanticEvent semanticEvent) {
_recorder.record(semanticEvent);
}
public void reportError(RecorderErrorEvent event) {
_recorder.reportError(event);
}
public void trace(RecorderTraceEvent event) {
_recorder.trace(event);
}
public void addEventFilter(IEventFilter filter) {
_recorder.addEventFilter(filter);
}
public void removeEventFilter(IEventFilter filter) {
_recorder.removeEventFilter(filter);
}
public void addHook(String hookName) {
_recorder.addHook(hookName);
}
/**
* start listening for events
*
*/
private void startListening() {
normalizer.startListening(new SingleThreadedEventListener() {
protected void processEvent(final AWTEvent event) {
startRecordingEvent(event);
}
}, FIXTURE_EVENT_MASK);
}
/**
* The events are sent to the recorder.
*/
public void startRecordingEvent(AWTEvent event) {
Object src = event.getSource();
boolean isComponent = src instanceof Component;
// Allow only component events and AWT menu actions
if (!isComponent && !(src instanceof MenuComponent)) {
System.out.println("Source not a Component or MenuComponent: " + event);
return;
}
if ( _recorder != null) {
//System.out.println("recorder process event");
try {
_recorder.record(event);
}
catch(RecordingFailedException e) {
// Stop recording, but keep what we've got so far
_recorder.stop();
e.printStackTrace();
}
}
}
/* (non-Javadoc)
* @see com.windowtester.recorder.IEventRecorder#isRecording()
*/
public boolean isRecording() {
return _recorder.isRecording();
}
}