/******************************************************************************* * 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.Component; import java.awt.MenuItem; import java.awt.Window; import java.awt.event.ComponentEvent; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JMenuItem; import javax.swing.JTable; import javax.swing.JTree; import abbot.script.Resolver; import abbot.script.Step; import abbot.util.AWT; import com.windowtester.recorder.event.ISemanticEventListener; import com.windowtester.recorder.event.IUISemanticEvent; import com.windowtester.recorder.event.UISemanticEventFactory; /*** * Override the createStep methods and call the WindowTester semantic * event generation * */ public class ComponentRecorder extends abbot.editor.recorder.ComponentRecorder { /** A list of semantic event listeners */ private List _listenerList; protected boolean doneEventGeneration = false; public ComponentRecorder(Resolver resolver) { super(resolver); } /** * override to capture window opening event */ protected boolean parseWindowEvent(AWTEvent event) { if (event.getID()== ComponentEvent.COMPONENT_SHOWN){ // create semantic event IUISemanticEvent semanticEvent = UISemanticEventFactory.createShellShowingEvent((Window)event.getSource()); notify(semanticEvent); } return super.parseWindowEvent(event); } /** * Override */ protected Step createStep() { return super.createStep(); } /** * Override */ protected Step createAWTMenuSelection(Component parent, MenuItem menuItem, boolean isPopup) { // TODO Auto-generated method return super.createAWTMenuSelection(parent, menuItem, isPopup); } /** * Override */ protected Step createClick(Component target, int x, int y, int mods, int count) { // windowtester semantic event generation IUISemanticEvent semanticEvent = UISemanticEventFactory.createWidgetSelectionEvent(target,x,y,count,getButton()); notify(semanticEvent); return super.createClick(target, x, y, mods, count); } /** * Override */ protected Step createDrag(Component comp, int x, int y) { // TODO Auto-generated method stub return super.createDrag(comp, x, y); } /** * Override */ protected Step createDrop(Component comp, int x, int y) { // TODO Auto-generated method stub return super.createDrop(comp, x, y); } /** * Override */ protected Step createInputMethod(ArrayList codes, String text) { // TODO Auto-generated method stub return super.createInputMethod(codes, text); } /** * Override */ protected Step createKey(Component comp, char keychar, int mods) { // Create semantic event and notify listener IUISemanticEvent semanticEvent = UISemanticEventFactory.createKeyDownEvent(comp,keychar,mods); notify(semanticEvent); return super.createKey(comp, keychar, mods); } /** * Override */ protected Step createMenuSelection(Component menuItem) { // Create semantic event and notify listener IUISemanticEvent semanticEvent = UISemanticEventFactory.createMenuSelectionEvent(menuItem,getX(),getY()); notify(semanticEvent); return super.createMenuSelection(menuItem); } /** * Override */ protected Step createPopupMenuSelection(Component invoker, int x, int y, Component menuItem) { // Create semantic event and notify listener if (!doneEventGeneration){ IUISemanticEvent semanticEvent = null; if (invoker != null){ semanticEvent = UISemanticEventFactory.createContextMenuSelectionEvent(invoker,x,y,(JMenuItem)menuItem); } else { // sometimes invoker is lost Component parent = null; Component popup = null; popup = menuItem.getParent(); parent = AWT.getInvoker(popup); // System.out.println(parent); if (parent instanceof JTree){ int row = ((JTree)parent).getMinSelectionRow(); semanticEvent = UISemanticEventFactory.createTreeItemContextMenuSelectionEvent((JTree)parent,row,(JMenuItem)menuItem); } if (parent instanceof JTable){ int row = ((JTable)parent).getSelectedRow(); int col = ((JTable)parent).getSelectedColumn(); semanticEvent = UISemanticEventFactory.createTableContextMenuSelectionEvent((JTable)parent,(JMenuItem)menuItem,row,col); } } notify(semanticEvent); } return super.createPopupMenuSelection(invoker, x, y, menuItem); } /** * Override */ protected Step createWindowEvent(Window window, boolean isClose) { // create semantic event and notify listener if (isClose) { IUISemanticEvent semanticEvent = UISemanticEventFactory.createShellDisposedEvent(window); notify(semanticEvent); } return super.createWindowEvent(window, isClose); } public void addListener(ISemanticEventListener listener) { List listeners = getListeners(); if (listeners.contains(listener)) System.out.println("multiple adds of listener: " + listener); else listeners.add(listener); } /** * Get the registered event listeners. * @return a list of resgistered listeners */ public List getListeners() { if (_listenerList == null) _listenerList = new ArrayList(); return _listenerList; } public void removeListener(ISemanticEventListener listener) { List listeners = getListeners(); if (listeners.contains(listener)) System.out.println("listener removed that was not registered: " + listener); else listeners.remove(listener); } public void notify(IUISemanticEvent semanticEvent) { for (Iterator iter = getListeners().iterator(); iter.hasNext(); ) ((ISemanticEventListener)iter.next()).notify(semanticEvent); } }