/*******************************************************************************
* 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.recorder;
import java.awt.AWTEvent;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Window;
import java.awt.event.WindowEvent;
import abbot.Log;
import abbot.script.Action;
import abbot.script.ComponentReference;
import abbot.script.Resolver;
import abbot.script.Step;
/**
* Record basic semantic events you might find on an Window. <p>
*
* abbot.editor.recorder.WindowRecorder
*
*/
public class FrameRecorder extends WindowRecorder {
private Frame frame;
private int newState;
public FrameRecorder(Resolver resolver) {
super(resolver);
}
private int WINDOW_STATE_CHANGED = 9 + WindowEvent.WINDOW_FIRST;
protected synchronized void init(int recordingType) {
super.init(recordingType);
frame = null;
}
/** Additionally handle state change events (1.4 and later). */
protected boolean isWindowEvent(AWTEvent event) {
return ((event.getSource() instanceof Frame)
&& event.getID() == WINDOW_STATE_CHANGED)
|| super.isWindowEvent(event);
}
protected boolean parseWindowEvent(AWTEvent event) {
int id = event.getID();
boolean consumed = true;
if (id == WINDOW_STATE_CHANGED) {
frame = (Frame)event.getSource();
newState = getExtendedState(frame);
setFinished(true);
}
else {
consumed = super.parseWindowEvent(event);
}
return consumed;
}
protected Step createStep() {
if (getRecordingType() == SE_WINDOW && frame != null) {
return createFrameStateChange(frame, newState);
}
return super.createStep();
}
protected Step createFrameStateChange(Frame frame, int newState) {
// window tester - do we support this?
ComponentReference ref = getResolver().addComponent(frame);
return new Action(getResolver(), null,
newState == Frame.NORMAL
? "actionNormalize" : "actionMaximize",
new String[] { ref.getID() }, Frame.class);
}
protected Step createResize(Window window, Dimension size) {
Step step = null;
if (((Frame)window).isResizable()) {
ComponentReference ref = getResolver().addComponent(window);
step = new Action(getResolver(),
null, "actionResize",
new String[] { ref.getID(),
String.valueOf(size.width),
String.valueOf(size.height),
}, Frame.class);
}
return step;
}
protected int getExtendedState(Frame frame) {
try {
Integer state = (Integer)
Frame.class.getMethod("getExtendedState", new Class[] { }).
invoke(frame, new Object[] { });
Log.debug("State is " + state);
return state.intValue();
}
catch(Exception e) {
return frame.getState();
}
}
}