From: Kevin D. <kda...@us...> - 2004-05-28 15:12:35
|
Update of /cvsroot/abbot/abbot.swt/src/abbot/tester/swt In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10015/src/abbot/tester/swt Modified Files: MenuItemTester.java Log Message: Made changes to: MenuItemTester- added actionClickMenuItemByPath and removed actionClickSubMenuItem Index: MenuItemTester.java =================================================================== RCS file: /cvsroot/abbot/abbot.swt/src/abbot/tester/swt/MenuItemTester.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** MenuItemTester.java 20 May 2004 15:19:51 -0000 1.2 --- MenuItemTester.java 28 May 2004 15:12:24 -0000 1.3 *************** *** 8,11 **** --- 8,25 ---- import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Control; + import org.eclipse.swt.widgets.*; + import org.eclipse.swt.widgets.Decorations; + + import abbot.script.swt.WidgetReference; + import abbot.swt.utilities.EventWatcher; + import abbot.finder.swt.*; + import abbot.swt.*; + import abbot.script.*; + + import org.eclipse.swt.events.*; + + import abbot.Log; + + import org.eclipse.swt.graphics.Rectangle; public class MenuItemTester extends ItemTester { *************** *** 19,22 **** --- 33,42 ---- protected boolean enabled,selection; protected Menu menu, parent; + protected Rectangle bounds; + + public static final String ARM_LISTENER_NAME = "a4sArmListener"; + public static final String SELECTION_LISTENER_NAME = "a4sSelectionListener"; + public static final String WATCHER_NAME = "a4sWatcher"; + public static final int PATH_CLICKING_WAIT_TIME = 5000; /** *************** *** 34,37 **** --- 54,58 ---- menu = item.getMenu(); parent = item.getParent(); + bounds = item.getBounds(); } }); *************** *** 63,102 **** return parent; } /* end getters */ /** ! * Clicks all menu items in path to the given menuitem, and clicks the ! * given menu item. ! * ! * @param item the MenuItem to be clicked ! * @param parent the Control that owns the menu if it is a popup menu (or null othewise) ! * ! */ ! public void actionClickSubMenuItem(MenuItem item, Control parentControl, final int delay){ ! // get all items to be clicked along the path ! final Stack pathStack = new Stack(); ! Menu parentMenu; ! MenuItem parentItem; ! while(true){ ! pathStack.push(item); ! parentMenu = getParent(item); ! parentItem = ((MenuTester)WidgetTester.getTester(Menu.class)).getParentItem(parent); ! if(parentItem==null) ! break; ! item = parentItem; ! } ! // rt-click root parent control if root is a popup ! if(((MenuTester)WidgetTester.getTester(Menu.class)).getStyle(parent)==SWT.POP_UP){ ! actionClick(parentControl); ! actionDelay(delay); } ! // click all items along the path ! while(pathStack.size()>0){ ! actionClick((MenuItem)pathStack.pop()); ! actionDelay(delay); } ! } } --- 84,230 ---- return parent; } + public synchronized Rectangle getBounds(MenuItem item){ + getProperties(item); + return bounds; + } /* end getters */ + // flag and associated methods to identify if actionClickMenuItemByPath + // has completed + boolean doneClickingMenuItem = false; + private synchronized void setDone(){ + doneClickingMenuItem = true; + } + private synchronized void setUndone(){ + doneClickingMenuItem = false; + } + private synchronized boolean isDone(){ + return doneClickingMenuItem; + } + /** ! * Clicks each MenuItem along the path. Use '/' as the path delimiter, and ! * note that "/item1/" resolves to a path of length 3, with item texts "", "item1", and "". ! * In addition, a test will freeze if clicking the last item in the path ! * opens another menu. ! * ! **/ ! // not threadsafe ! public void actionClickMenuItemByPath(final String path, final Control parentControl, ! final Decorations parentDecorations, final int delay){ ! boolean started = false; ! setUndone(); ! Thread t = new Thread(){ ! public void run(){ ! actionClickMenuItemByPathImp(path,parentControl,parentDecorations, delay); ! } ! }; ! while(!isDone()){ ! waitForIdle(parentDecorations.getDisplay()); ! if(!started){ ! started = true; ! t.start(); ! } } + } + + private void actionClickMenuItemByPathImp(String path, Control parentControl, Decorations parentDecorations, int delay){ + // TODO: rt-click control if menu is a popup ! int separator = -1; ! String text = null; ! do{ ! separator = path.indexOf('/'); ! text = (separator==-1)?path : path.substring(0,separator); ! resolveAndClickItem(text, parentControl, parentDecorations); ! actionDelay(delay); ! path = path.substring(separator+1); ! }while(separator>=0); ! ! setDone(); ! } ! ! // create a WidgetReference, resolve it, and click the widget ! private void resolveAndClickItem(String text, Control parentControl, Decorations parentDecorations){ ! String title = ((DecorationsTester)WidgetTester.getTester(Decorations.class)). ! getText(parentDecorations); ! WidgetReference ref = new WidgetReference(null,MenuItem.class,null,null, ! title,text); ! try{ ! MenuItem item = (MenuItem)DefaultWidgetFinder.getFinder().findWidget(ref); ! addWatcher(item); ! actionClick(item); ! final MenuItem itemT = item; ! wait(new Condition() { ! public boolean test() { ! return itemT.isDisposed() || isArmedOrSelected(itemT); ! } ! }, PATH_CLICKING_WAIT_TIME); ! ! if(!item.isDisposed()){ ! removeWatcher(item); ! } ! }catch(WidgetNotFoundException wnfe){ ! System.err.println("Widget MenuItem {"+text+"} not found"); ! setDone(); ! }catch(MultipleWidgetsFoundException mwfe){ ! System.err.println("Multiple Widgets found when looking for " ! +" MenuItem {"+text+"}"); ! setDone(); } ! } ! ! // Listener to signal when a menu item has been clicked ! class Watcher implements Listener{ ! public boolean gotArm = false; ! public boolean gotSelection = false; ! public void handleEvent(org.eclipse.swt.widgets.Event e){ ! if(e.type==SWT.Arm) ! gotArm = true; ! if(e.type==SWT.Selection) ! gotSelection= true; ! } ! } ! ! // adds a watcher-listener to the given menu item ! private void addWatcher(final MenuItem item){ ! item.getDisplay().syncExec(new Runnable(){ ! public void run(){ ! Watcher watcher = new Watcher(); ! item.setData(WATCHER_NAME,watcher); ! item.addListener(SWT.Arm,watcher); ! item.addListener(SWT.Selection,watcher); ! } ! }); ! } ! ! // removes the given item's watcher-listener ! private void removeWatcher(final MenuItem item){ ! item.getDisplay().syncExec(new Runnable(){ ! public void run(){ ! Watcher watcher = (Watcher)item.getData(WATCHER_NAME); ! if(watcher!=null) ! item.removeListener(SWT.Arm,watcher); ! item.removeListener(SWT.Selection, watcher); ! } ! }); ! } ! ! private Watcher watcher=null; ! ! // tests whether the given item has received the Arm or Selection event ! private boolean isArmedOrSelected(final MenuItem item){ ! item.getDisplay().syncExec(new Runnable(){ ! public void run(){ ! watcher = (Watcher)item.getData(WATCHER_NAME); ! } ! }); ! return testWatcher(); ! } ! ! private synchronized boolean testWatcher(){ ! return watcher.gotArm || watcher.gotSelection; ! } } |