/*******************************************************************************
* 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.swt.event.model.factory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import abbot.tester.swt.MenuItemTester;
import com.windowtester.internal.runtime.event.StyleBits;
import com.windowtester.internal.runtime.locator.LocatorPathUtil;
import com.windowtester.recorder.event.user.SemanticDropEvent;
import com.windowtester.recorder.event.user.SemanticMenuSelectionEvent;
import com.windowtester.recorder.event.user.SemanticTreeItemSelectionEvent;
import com.windowtester.recorder.event.user.SemanticWidgetClosedEvent;
import com.windowtester.recorder.event.user.TreeEventType;
import com.windowtester.recorder.event.user.UISemanticEvent;
import com.windowtester.recorder.event.user.UISemanticEvent.EventInfo;
import com.windowtester.runtime.swt.internal.finder.WidgetLocatorService;
import com.windowtester.runtime.swt.internal.util.TextUtils;
import com.windowtester.runtime.swt.locator.SWTWidgetLocator;
import com.windowtester.runtime.swt.locator.eclipse.PullDownMenuItemLocator;
/**
* A factory for building SWTSemanticEvents
*/
public class SWTSemanticEventFactoryImplV2 extends SWTSemanticEventFactoryImplV1 {
////////////////////////////////////////////////////////////////////////////
//
// Helpers
//
////////////////////////////////////////////////////////////////////////////
private final MenuItemTester _menuItemTester = new MenuItemTester();
////////////////////////////////////////////////////////////////////////////
//
// Customized actions
//
////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see com.windowtester.swt.event.model.factory.SWTSemanticEventFactoryImplV1#createDragToEvent(org.eclipse.swt.widgets.Event)
*/
public SemanticDropEvent createDragToEvent(Event event) {
UISemanticEvent selection = createWidgetSelectionEvent(event);
return new SemanticDropEvent(selection);
}
/* (non-Javadoc)
* @see com.windowtester.swt.event.model.factory.SWTSemanticEventFactoryImplV1#createMenuSelectionEvent(org.eclipse.swt.widgets.Event)
*/
public SemanticMenuSelectionEvent createMenuSelectionEvent(Event event) {
MenuItem item = (MenuItem)event.widget;
String pathString = _menuItemTester.getPathString(item);
pathString = LocatorPathUtil.stripAmpersands(pathString);
pathString = LocatorPathUtil.stripAccelerators(pathString);
EventInfo info = new EventInfo();
info.toString = getTrimmedDescription(event);
info.cls = item.getClass().getName();
info.hierarchyInfo = new WidgetLocatorService().inferIdentifyingInfo(item);
info.button = event.button;
info.x = event.x;
info.y = event.y;
// TODO [author=Dan] I would have called stripAmpersands and stripAccelerators
// from WidgetIdentifier$LocatorMapper.map(Widget) to construct a MenuItemLocator
// with a properly normalized path, but WidgetIdentifier.identify(Widget)
// has a loop that calls isUniquelyIdentifying(...) which does not perform the
// same runtime matching as happens during playback. So I placed the hack here.
if (info.hierarchyInfo instanceof com.windowtester.runtime.swt.locator.MenuItemLocator) {
com.windowtester.runtime.swt.locator.MenuItemLocator oldLocator
= (com.windowtester.runtime.swt.locator.MenuItemLocator) info.hierarchyInfo;
com.windowtester.runtime.swt.locator.MenuItemLocator newLocator
= new com.windowtester.runtime.swt.locator.MenuItemLocator(pathString, (SWTWidgetLocator) oldLocator.getParentInfo());
oldLocator.copyDataTo(newLocator);
info.hierarchyInfo = newLocator;
}
SemanticMenuSelectionEvent menuSelect = new SemanticMenuSelectionEvent(info);
String label = extractMenuItemLabel(event);
label = LocatorPathUtil.stripAmpersands(label);
menuSelect.setItemLabel(label);
menuSelect.setPath(pathString);
/*
* Test for pulldown menu case:
*/
Menu menu = item.getParent();
boolean isPullDown = isPullDown(menu);
if (isPullDown)
menuSelect.setStyle(StyleBits.PULL_DOWN);
return menuSelect;
}
private boolean isPullDown(Menu menu) {
Menu parentMenu = menu.getParentMenu();
if (parentMenu != null)
return isPullDown(parentMenu);
int style = menu.getStyle();
return !isMenuBar(style);
}
private boolean isMenuBar(int style) {
return (style & SWT.BAR) == SWT.BAR;
}
public PullDownMenuItemLocator createPullDownMenuSelection(SWTWidgetLocator locator, SemanticMenuSelectionEvent menuSelect) {
return new PullDownMenuItemLocator(menuSelect.getPathString(), locator);
}
/* (non-Javadoc)
* @see com.windowtester.swt.event.model.factory.ISWTSemanticEventFactory#createTreeItemContextMenuSelectionEvent(com.windowtester.recorder.event.user.SemanticTreeItemSelectionEvent, org.eclipse.swt.widgets.Event)
*/
public UISemanticEvent createTreeItemContextMenuSelectionEvent(SemanticTreeItemSelectionEvent treeItemSelectionEvent, Event event) {
String menuPath = _menuItemTester.getPathString((MenuItem)event.widget);
menuPath = LocatorPathUtil.stripAmpersands(menuPath);
menuPath = LocatorPathUtil.stripAccelerators(menuPath);
menuPath = TextUtils.fixTabs(menuPath);
treeItemSelectionEvent.setContextMenuSelectionPath(menuPath);
return treeItemSelectionEvent;
}
/* (non-Javadoc)
* @see com.windowtester.swt.event.model.factory.ISWTSemanticEventFactory#createTreeItemSelectionEvent(org.eclipse.swt.widgets.Event, com.windowtester.recorder.event.user.TreeEventType, int)
*/
public SemanticTreeItemSelectionEvent createTreeItemSelectionEvent(Event event, TreeEventType type, int button) {
return (SemanticTreeItemSelectionEvent) createTreeItemSelectionEvent((TreeItem)event.item, type, button);
}
/* (non-Javadoc)
* @see com.windowtester.swt.event.model.factory.ISWTSemanticEventFactory#createTreeItemSelectionEvent(org.eclipse.swt.widgets.TreeItem, com.windowtester.recorder.event.user.TreeEventType, int)
*/
public UISemanticEvent createTreeItemSelectionEvent(TreeItem item, TreeEventType type, int button) {
EventInfo info = new EventInfo();
info.toString = "Tree Item Selection (" + type.getLabel() + ")";
info.cls = item.getClass().getName();
// info.parentShell = getParentShellInfo(tree);
info.hierarchyInfo = new WidgetLocatorService().inferIdentifyingInfo(item);
info.button = button;
SemanticTreeItemSelectionEvent treeSelect = new SemanticTreeItemSelectionEvent(info, type);
String label = extractTreeItemLabel(item);
treeSelect.setItemLabel(label);
String path = extractPathString(item);
treeSelect.setItemPath(path);
return treeSelect;
}
/* (non-Javadoc)
* @see com.windowtester.swt.event.model.factory.SWTSemanticEventFactoryImplV1#createWidgetDisposedEvent(org.eclipse.swt.widgets.Widget)
*/
public UISemanticEvent createWidgetClosedEvent(Widget widget) {
EventInfo info = new EventInfo();
info.toString = "widget disposal";
info.cls = widget.getClass().getName();
//NOTE: no hierarchy info... this will get filled in from the previous selection by the parser
return new SemanticWidgetClosedEvent(info);
}
// @Override
// public UISemanticEvent createComboSelectionEvent(Event event) {
// // TODO Auto-generated method stub
// return super.createComboSelectionEvent(event);
// }
//
// @Override
// public UISemanticEvent createCComboSelectionEvent(Event event) {
// // TODO Auto-generated method stub
// return super.createCComboSelectionEvent(event);
// }
//
}