blob: fe48393c6c66e482683c56109be56c6bc4927a04 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2012 Ketan Padegaonkar and others.
* 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:
* Ketan Padegaonkar - initial API and implementation
*******************************************************************************/
package org.eclipse.swtbot.eclipse.finder.widgets;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.utils.PartLabelDescription;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.finders.Finder;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.results.ListResult;
import org.eclipse.swtbot.swt.finder.results.VoidResult;
import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarPushButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarRadioButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarSeparatorButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarToggleButton;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.internal.WorkbenchPartReference;
import org.hamcrest.Matcher;
import org.hamcrest.SelfDescribing;
import org.hamcrest.core.IsAnything;
/**
* This represents the eclipse {@link IWorkbenchPartReference} item, subclasses must extend this to implement support
* for various {@link IWorkbenchPartReference}s.
*
* @author Ketan Padegaonkar <KetanPadegaonkar [at] gmail [dot] com>
* @author Ralf Ebert www.ralfebert.de (bug 271630)
* @version $Id$
* @since 2.0
*/
public abstract class SWTBotWorkbenchPart<T extends IWorkbenchPartReference> {
/** The IWorkbenchPartReference reference that this part encapsulates. */
protected final T partReference;
/** The logger. */
protected final Logger log;
/** A helper swtbot instance. */
protected final SWTWorkbenchBot bot;
private final SelfDescribing description;
private Widget widget;
private final Matcher<Widget> anyWidget = new IsAnything<Widget>();
/**
* Creates an instance of a workbench part.
*
* @param partReference the part reference.
* @param bot the helper bot.
*/
public SWTBotWorkbenchPart(T partReference, SWTWorkbenchBot bot) {
this(partReference, bot, new PartLabelDescription<T>(partReference));
}
/**
* Creates an instance of a workbench part.
*
* @param partReference the part reference.
* @param bot the helper bot.
* @param description the description of the workbench part.
*/
public SWTBotWorkbenchPart(T partReference, SWTWorkbenchBot bot, SelfDescribing description) {
this.bot = bot;
if (description == null )
description = new PartLabelDescription<T>(partReference);
this.description = description;
Assert.isNotNull(partReference, "The part reference cannot be null"); //$NON-NLS-1$
this.partReference = partReference;
log = Logger.getLogger(getClass());
}
/**
* @return the reference for this part.
*/
public T getReference() {
return partReference;
}
/**
* Close the partReference.
*/
public abstract void close();
/**
* Shows the part if it is visible.
*/
public void show() {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
try {
partReference.getPage().activate(partReference.getPart(true));
partReference.getPage().showView(partReference.getId());
} catch (PartInitException e) {
throw new RuntimeException("Could not show partReference - " + partReference.getPartName(), e); //$NON-NLS-1$
}
}
});
}
/**
* Gets the title of the partReference.
*
* @return the title of the part as visible in the tab
*/
public String getTitle() {
return partReference.getPartName();
}
/**
* Gets the toolbar buttons currently visible.
*
* @return The set of toolbar buttons.
*/
public List<SWTBotToolbarButton> getToolbarButtons() {
return UIThreadRunnable.syncExec(new ListResult<SWTBotToolbarButton>() {
@Override
public List<SWTBotToolbarButton> run() {
ToolBar toolbar = null;
IWorkbenchPartSite site = partReference.getPart(false).getSite();
if (site instanceof IViewSite) {
IToolBarManager t = ((IViewSite) site).getActionBars().getToolBarManager();
if (t instanceof ToolBarManager) {
toolbar = ((ToolBarManager)t).getControl();
}
}
final List<SWTBotToolbarButton> l = new ArrayList<SWTBotToolbarButton>();
if (toolbar == null)
return l;
ToolItem[] items = toolbar.getItems();
log.debug("number of items : " + items.length);
for (int i = 0; i < items.length; i++) {
try {
if (SWTUtils.hasStyle(items[i], SWT.PUSH))
l.add(new SWTBotToolbarPushButton(items[i]));
else if(SWTUtils.hasStyle(items[i], SWT.CHECK))
l.add(new SWTBotToolbarToggleButton(items[i]));
else if(SWTUtils.hasStyle(items[i], SWT.RADIO))
l.add(new SWTBotToolbarRadioButton(items[i]));
else if(SWTUtils.hasStyle(items[i], SWT.DROP_DOWN))
l.add(new SWTBotToolbarDropDownButton(items[i]));
else if(SWTUtils.hasStyle(items[i], SWT.SEPARATOR))
l.add(new SWTBotToolbarSeparatorButton(items[i]));
} catch (WidgetNotFoundException e) {
log.warn("Failed to find widget " + items[i].getText(), e); //$NON-NLS-1$
}
}
return l;
}
});
}
/**
* Gets the toolbar drop down button matching the given toolbar button.
*
* @param tooltip The tooltip to use to find the button to return.
* @return The toolbar button.
* @throws WidgetNotFoundException Thrown if the widget was not found matching the given tooltip.
*/
public SWTBotToolbarDropDownButton toolbarDropDownButton(String tooltip) throws WidgetNotFoundException {
SWTBotToolbarButton abstractButton = toolbarButton(tooltip);
if (abstractButton instanceof SWTBotToolbarDropDownButton)
return (SWTBotToolbarDropDownButton) abstractButton;
throw new WidgetNotFoundException("Unable to find toolitem with the given tooltip '" + tooltip + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Gets the toolbar radio button matching the given toolbar button.
*
* @param tooltip The tooltip to use to find the button to return.
* @return The toolbar button.
* @throws WidgetNotFoundException Thrown if the widget was not found matching the given tooltip.
*/
public SWTBotToolbarRadioButton toolbarRadioButton(String tooltip) throws WidgetNotFoundException {
SWTBotToolbarButton abstractButton = toolbarButton(tooltip);
if (abstractButton instanceof SWTBotToolbarRadioButton)
return (SWTBotToolbarRadioButton) abstractButton;
throw new WidgetNotFoundException("Unable to find toolitem with the given tooltip '" + tooltip + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Gets the toolbar push button matching the given toolbar button.
*
* @param tooltip The tooltip to use to find the button to return.
* @return The toolbar button.
* @throws WidgetNotFoundException Thrown if the widget was not found matching the given tooltip.
*/
public SWTBotToolbarPushButton toolbarPushButton(String tooltip) throws WidgetNotFoundException {
SWTBotToolbarButton abstractButton = toolbarButton(tooltip);
if (abstractButton instanceof SWTBotToolbarPushButton)
return (SWTBotToolbarPushButton) abstractButton;
throw new WidgetNotFoundException("Unable to find toolitem with the given tooltip '" + tooltip + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Gets the toggle toolbar button matching the given toolbar button.
*
* @param tooltip The tooltip to use to find the button to return.
* @return The toolbar button.
* @throws WidgetNotFoundException Thrown if the widget was not found matching the given tooltip.
*/
public SWTBotToolbarToggleButton toolbarToggleButton(String tooltip) throws WidgetNotFoundException {
SWTBotToolbarButton abstractButton = toolbarButton(tooltip);
if (abstractButton instanceof SWTBotToolbarToggleButton)
return (SWTBotToolbarToggleButton) abstractButton;
throw new WidgetNotFoundException("Unable to find toolitem with the given tooltip '" + tooltip + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Gets the toolbar button matching the given toolbar button.
*
* @param tooltip The tooltip to use to find the button to return.
* @return The toolbar button.
* @throws WidgetNotFoundException Thrown if the widget was not found matching the given tooltip.
*/
public SWTBotToolbarButton toolbarButton(String tooltip) throws WidgetNotFoundException {
List<SWTBotToolbarButton> l = getToolbarButtons();
for (int i = 0; i < l.size(); i++) {
SWTBotToolbarButton item = l.get(i);
if (item.getToolTipText().equals(tooltip)) {
return item;
}
}
throw new WidgetNotFoundException("Unable to find toolitem with the given tooltip '" + tooltip + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* @param matcher a matcher.
* @return a widget within the parent widget that matches the specified matcher.
*/
protected <S extends Widget> S findWidget(Matcher<S> matcher) {
return findWidgets(matcher).get(0);
}
/**
* @param matcher a matcher.
* @return a widget within the parent widget that matches the specified matcher.
*/
protected <S extends Widget> List<? extends S> findWidgets(Matcher<S> matcher) {
Finder finder = bot.getFinder();
Control control = getControl();
boolean shouldFindInvisibleControls = finder.shouldFindInvisibleControls();
finder.setShouldFindInvisibleControls(true);
try {
return bot.widgets(matcher, control);
} catch (Exception e) {
throw new WidgetNotFoundException("Could not find any control inside the view " + partReference.getPartName(), e); //$NON-NLS-1$
} finally {
finder.setShouldFindInvisibleControls(shouldFindInvisibleControls);
}
}
/**
* Returns the workbench pane control.
*
* @return returns the workbench pane control.
*/
private Control getControl() {
return ((WorkbenchPartReference) partReference).getPane().getControl();
}
/**
* Returns a SWTBot instance that matches the contents of this workbench part.
*
* @return SWTBot
*/
public SWTBot bot() {
return new SWTBot(getControl());
}
/**
* Asserts that the viewpart is active.
*
*/
protected void assertActive() {
Assert.isLegal(isActive(), MessageFormat.format("The workbench part {0}is not active", description));
}
/**
* @return <code>true</code> if the part is currently active.
*/
public abstract boolean isActive();
/**
* Sets focus on the current part.
*/
public abstract void setFocus();
/**
* The parent widget inside the partReference. If you want to look for a particular widget within the part, this is
* a good place to start searching for the widget.
* <p>
* <b>NOTE:</b> Clients must ensure that the part is active at the time of making this call. If the part is not
* active, then this method will throw a {@link WidgetNotFoundException}.
* </p>
*
* @return the parent widget in the part.
* @see #findWidget(org.hamcrest.Matcher)
* @see #assertActive()
* @see #show()
*/
public Widget getWidget() {
show();
if (widget == null)
widget = findWidget(anyWidget);
return widget;
}
}