/*******************************************************************************
* 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.runtime.swt.internal.selector;
import java.awt.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Widget;
import com.windowtester.internal.runtime.locator.IUISelector;
import com.windowtester.internal.runtime.provisional.WTInternal;
import com.windowtester.runtime.IClickDescription;
import com.windowtester.runtime.IUIContext;
import com.windowtester.runtime.WidgetSearchException;
import com.windowtester.runtime.locator.IWidgetLocator;
import com.windowtester.runtime.locator.IWidgetReference;
import com.windowtester.runtime.locator.WidgetReference;
import com.windowtester.runtime.swt.internal.operation.SWTLocation;
import com.windowtester.runtime.swt.internal.operation.SWTWidgetLocation;
import com.windowtester.runtime.swt.internal.widgets.SWTWidgets;
import com.windowtester.runtime.swt.widgets.ISWTWidgetReference;
/**
* A default selector for SWT widgets.
*
* @author Phil Quitslund
*
*/
public class DefaultSWTWidgetSelector implements IUISelector {
private BasicWidgetSelector _selector = new BasicWidgetSelector();
/* (non-Javadoc)
* @see com.windowtester.runtime.locator.IUISelector#click(com.windowtester.runtime.IUIContext, com.windowtester.runtime.locator.WidgetReference, com.windowtester.runtime.IClickDescription)
*/
public IWidgetLocator click(IUIContext ui, IWidgetReference ref, IClickDescription click) throws WidgetSearchException {
//WidgetReference ref = (WidgetReference)ui.find(this);
Widget w = (Widget)ref.getWidget();
Point offset = getXYOffset(w, click);
Widget clicked = doClick(click.clicks(), w, offset, click.modifierMask());
return WidgetReference.create(clicked, this);
}
/* (non-Javadoc)
* @see com.windowtester.runtime.locator.IUISelector#contextClick(com.windowtester.runtime.IUIContext, com.windowtester.runtime.locator.WidgetReference, com.windowtester.runtime.IClickDescription, java.lang.String)
*/
public IWidgetLocator contextClick(IUIContext ui, IWidgetReference ref, IClickDescription click, String menuItemPath) throws WidgetSearchException {
// Widget w = (Widget)ref.getWidget();
// Point offset = getXYOffset(w, click);
// Widget clicked = doContextClick(w, offset, menuItemPath);
// return WidgetReference.create(clicked, this);
SWTLocation location = unspecifiedXY(click)
? new SWTWidgetLocation((ISWTWidgetReference<?>) ref, WTInternal.CENTER)
: new SWTWidgetLocation((ISWTWidgetReference<?>) ref, WTInternal.TOPLEFT).offset(click.x(), click.y());
return new SWTMenuSelector().contextClick(location, false, menuItemPath);
}
/**
* Test this click to see if an offset is specified.
*/
private boolean unspecifiedXY(IClickDescription click) {
//dummy sentinel for now
return click.isDefaultCenterClick();
}
/**
* Get the x,y offset for the click.
* @param click
*/
public Point getXYOffset(Widget w, IClickDescription click) {
if (unspecifiedXY(click)) {
Rectangle rect = SWTWidgets.asReference(w).getDisplayBounds();
return new Point(rect.width/2, rect.height/2);
}
return new Point(click.x(), click.y());
}
/**
* Perform the click. This is intended to be overridden in subclasses
* @param clicks - the number of clicks
* @param w - the widget to click
* @param offset - the x,y offset (from top left corner)
* @param modifierMask - the mouse modifier mask
* @return the clicked widget
*/
protected Widget doClick(int clicks, Widget w, Point offset, int modifierMask) {
return _selector.click(w, offset.x, offset.y, modifierMask, clicks);
}
// /* (non-Javadoc)
// * @see com.windowtester.runtime2.locator.IUISelector#contextClick(com.windowtester.runtime2.IUIContext2, com.windowtester.runtime2.locator.WidgetReference, java.lang.String)
// */
// public IWidgetLocator contextClick(IUIContext ui, WidgetReference ref,
// String menuItemPath) throws WidgetSearchException {
// Widget w = (Widget)ref.getWidget();
// //TODO: XYs ignored on context clicks!!!!!
// //Rectangle rect = UIProxy.getBounds(w);
// //Point offset = new Point(rect.width/2, rect.height/2);
// Widget clicked = doContextClick(w, /*offset, click.modifierMask()*/ menuItemPath);
// return WidgetReference.create(clicked, this);
// }
// private Widget doContextClick(Widget w, Point offset, String menuItemPath) throws MultipleWidgetsFoundException, WidgetNotFoundException {
// return _selector.contextClick(w, offset.x, offset.y, menuItemPath);
// }
}