/******************************************************************************* * 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.locator.forms; import java.util.concurrent.Callable; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.forms.widgets.Hyperlink; import com.windowtester.runtime.IClickDescription; import com.windowtester.runtime.IUIContext; import com.windowtester.runtime.WT; import com.windowtester.runtime.WidgetSearchException; import com.windowtester.runtime.locator.IWidgetLocator; import com.windowtester.runtime.locator.IWidgetReference; import com.windowtester.runtime.swt.internal.drivers.MenuDriver; import com.windowtester.runtime.swt.internal.operation.SWTLocation; import com.windowtester.runtime.swt.internal.operation.SWTMenuOperation; import com.windowtester.runtime.swt.internal.operation.SWTShowMenuOperation; import com.windowtester.runtime.swt.internal.operation.SWTWidgetLocation; import com.windowtester.runtime.swt.internal.selector.BasicWidgetSelector; import com.windowtester.runtime.swt.internal.widgets.ISWTWidgetReference; import com.windowtester.runtime.swt.internal.widgets.MenuReference; import com.windowtester.runtime.swt.internal.widgets.SWTWidgetReference; import com.windowtester.runtime.swt.locator.forms.IHyperlinkReference; import com.windowtester.runtime.util.StringComparator; public class HyperlinkControlReference extends AbstractHyperlinkReference implements ISWTWidgetReference { public static IHyperlinkReference forControl(Hyperlink link) { return new HyperlinkControlReference(link); } private final Hyperlink link; private final BasicWidgetSelector selector = new BasicWidgetSelector(); private final SWTWidgetReference<Hyperlink> linkRef; public HyperlinkControlReference(Hyperlink link) { super(link.getDisplay()); this.link = link; this.linkRef = new SWTWidgetReference<Hyperlink>(link); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.locator.forms.IHyperlinkReference#getBounds() */ public Rectangle getDisplayBounds() { return linkRef.getDisplayBounds(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.locator.forms.IHyperlinkReference#getHref() */ public String getHref() { return displayRef.execute(new Callable<String>() { public String call() throws Exception { return (String) link.getHref(); } }); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.locator.forms.IHyperlinkReference#getText() */ public String getText() { return displayRef.execute(new Callable<String>() { public String call() throws Exception { return (String) link.getText(); } }); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.locator.forms.IHyperlinkReference#hasHRef(java.lang.String) */ public boolean hasHRef(String href) { return StringComparator.matches(href, getHref()); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.locator.forms.IHyperlinkReference#hasText(java.lang.String) */ public boolean hasText(String text) { return StringComparator.matches(text, getText()); } /* (non-Javadoc) * @see com.windowtester.runtime.locator.IWidgetReference#getWidget() */ public Hyperlink getWidget() { return link; } /* (non-Javadoc) * @see com.windowtester.runtime.swt.locator.forms.IHyperlinkReference#getControl() */ public Control getControl() { return link; } /* (non-Javadoc) * @see com.windowtester.runtime.locator.IWidgetLocator#findAll(com.windowtester.runtime.IUIContext) */ public IWidgetLocator[] findAll(IUIContext ui) { return new IHyperlinkReference[]{this}; } /* (non-Javadoc) * @see com.windowtester.runtime.locator.IWidgetMatcher#matches(java.lang.Object) */ public boolean matches(Object widget) { return widget == link; } /* (non-Javadoc) * @see com.windowtester.runtime.swt.internal.locator.forms.IHyperlinkSelector#doClick(com.windowtester.runtime.IUIContext, com.windowtester.runtime.IClickDescription, com.windowtester.runtime.swt.internal.locator.forms.IHyperlinkReference) */ public IWidgetLocator doClick(IUIContext ui, IClickDescription click, IHyperlinkReference linkRef) throws WidgetSearchException { Rectangle linkBounds = getDisplayBounds(); selector.click(link, linkBounds.width/2, linkBounds.height/2, click.modifierMask(), click.clicks()); return linkRef; } /* (non-Javadoc) * @see com.windowtester.internal.runtime.locator.IUISelector#contextClick(com.windowtester.runtime.IUIContext, com.windowtester.runtime.locator.IWidgetReference, com.windowtester.runtime.IClickDescription, java.lang.String) */ public IWidgetLocator contextClick(IUIContext ui, IWidgetReference widget, final IClickDescription click, String menuItemPath) throws WidgetSearchException { return new MenuDriver().resolveAndSelect(new Callable<MenuReference>() { public MenuReference call() throws Exception { return showContextMenu(click); } }, menuItemPath); } /* (non-Javadoc) * @see ISWTWidgetReferenceWithContextMenu#showContextMenu() */ public MenuReference showContextMenu(IClickDescription click) { // Rectangle linkBounds = getBounds(); // selector.contextClick(link, linkBounds.x +linkBounds.width/2 , linkBounds.y +linkBounds.height/2, menuItemPath); // return linkRef; SWTLocation location = SWTWidgetLocation.withDefaultCenter(this, click); SWTMenuOperation op = new SWTShowMenuOperation(null).waitForIdle().click(WT.BUTTON3, location, false); op.execute(); return op.getMenu(); } /* (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { return "HyperlinkControlReference: text=" + getText() + " href= " + getHref(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#getName() */ public String getName() { return linkRef.getName(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#getData() */ public Object getData() { return linkRef.getData(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#getData(java.lang.String) */ public Object getData(final String key) { return linkRef.getData(key); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#getParent() */ public ISWTWidgetReference getParent() { return linkRef.getParent(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#getChildren() */ public ISWTWidgetReference[] getChildren() { return linkRef.getChildren(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#getStyle() */ public int getStyle() { return linkRef.getStyle(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#hasStyle(int) */ public boolean hasStyle(int style) { return linkRef.hasStyle(style); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#getTextForMatching() */ public String getTextForMatching() { return getText(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#hasText() */ public boolean hasText() { return true; } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#isEnabled() */ public boolean isEnabled() { return linkRef.isEnabled(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#isDisposed() */ public boolean isDisposed() { return linkRef.isDisposed(); } /* (non-Javadoc) * @see com.windowtester.runtime.swt.widgets.ISWTWidgetReference#isVisible() */ public boolean isVisible() { return linkRef.isVisible(); } /* (non-javadoc) * @see ISWTWidgetReference#showPulldownMenu(IClickDescription) */ public MenuReference showPulldownMenu(IClickDescription click) { throw new RuntimeException(toString() + " does not have a pulldown menu"); } }