import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import java.util.Arrays;
import java.util.List;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.keyboard.Keyboard;
+import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes;
import org.eclipse.swtbot.swt.finder.results.Result;
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.waits.Conditions;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
private static final String WINDOW_MENU = "Window";
private static final String PREFERENCES_MENU_ITEM = "Preferences";
private static boolean fPrintedEnvironment = false;
+ private static Logger log = Logger.getLogger(SWTBotUtils.class);
private SWTBotUtils() {
+
}
private static final String TRACING_PERSPECTIVE_ID = TracingPerspectiveFactory.ID;
SWTBotUtils.waitForJobs();
+ closeSecondaryShells(bot);
+ SWTBotUtils.waitForJobs();
+
final SWTBotView projectViewBot = bot.viewById(IPageLayout.ID_PROJECT_EXPLORER);
projectViewBot.setFocus();
* swtbotshells for all the shells
*/
public static void focusMainWindow(SWTBotShell[] shellBots) {
+ SWTBotShell mainShell = getMainShell(shellBots);
+ if (mainShell != null) {
+ mainShell.activate();
+ }
+ }
+
+ private static SWTBotShell getMainShell(SWTBotShell[] shellBots) {
+ SWTBotShell mainShell = null;
for (SWTBotShell shellBot : shellBots) {
if (shellBot.getText().toLowerCase().contains("eclipse")) {
- shellBot.activate();
+ mainShell = shellBot;
}
}
+ return mainShell;
+ }
+
+ /**
+ * Close all non-main shells that are visible.
+ *
+ * @param bot
+ * the workbench bot
+ */
+ public static void closeSecondaryShells(SWTWorkbenchBot bot) {
+ SWTBotShell[] shells = bot.shells();
+ SWTBotShell mainShell = getMainShell(shells);
+ if (mainShell == null) {
+ return;
+ }
+
+ // Close all non-main shell but make sure we don't close an invisible
+ // shell such the special "limbo shell" that Eclipse needs to work
+ Arrays.stream(shells)
+ .filter(shell -> shell != mainShell)
+ .filter(SWTBotShell::isVisible)
+ .peek(shell -> log.debug(MessageFormat.format("Closing ligering shell with title {0}", shell.getText())))
+ .forEach(SWTBotShell::close);
}
/**
String gtkVersion = System.getProperty("org.eclipse.swt.internal.gtk.version");
if (gtkVersion != null) {
System.out.println("GTK version=" + gtkVersion);
+ // Try to print the GTK theme information as behavior can change depending on the theme
+ String gtkTheme = System.getProperty("org.eclipse.swt.internal.gtk.theme");
+ System.out.println("GTK theme=" + (gtkTheme == null ? "unknown" : gtkTheme));
+
String overlayScrollbar = System.getenv("LIBOVERLAY_SCROLLBAR");
if (overlayScrollbar != null) {
System.out.println("LIBOVERLAY_SCROLLBAR=" + overlayScrollbar);
SWTBotTreeItem currentItem = tracesNode;
for (String segment : elementPath.segments()) {
currentItem = getTraceProjectItem(projectExplorerBot, currentItem, segment);
- currentItem.select();
currentItem.doubleClick();
}
});
}
+ /**
+ * Clear the trace folder (using the UI)
+ *
+ * @param bot
+ * a given workbench bot
+ * @param projectName
+ * the name of the project (needs to exist)
+ */
+ public static void clearTracesFolderUI(SWTWorkbenchBot bot, String projectName) {
+ SWTBotTreeItem tracesFolder = selectTracesFolder(bot, projectName);
+ tracesFolder.contextMenu().menu("Clear").click();
+ String CONFIRM_CLEAR_DIALOG_TITLE = "Confirm Clear";
+ bot.waitUntil(Conditions.shellIsActive(CONFIRM_CLEAR_DIALOG_TITLE));
+
+ SWTBotShell shell = bot.shell(CONFIRM_CLEAR_DIALOG_TITLE);
+ shell.bot().button("Yes").click();
+ bot.waitUntil(Conditions.shellCloses(shell));
+ bot.waitWhile(ConditionHelpers.treeItemHasChildren(tracesFolder));
+ }
+
/**
* Clear the experiment folder
*
bot.waitUntil(ConditionHelpers.IsTreeNodeAvailable(nodeNames[0], tree));
SWTBotTreeItem currentNode = tree.getTreeItem(nodeNames[0]);
- for (int i = 1; i < nodeNames.length; i++) {
+ return getTreeItem(bot, currentNode, Arrays.copyOfRange(nodeNames, 1, nodeNames.length));
+ }
+
+ /**
+ * Get the tree item from a parent tree item at the specified location
+ *
+ * @param bot
+ * the SWTBot
+ * @param treeItem
+ * the treeItem to find the tree item under
+ * @param nodeNames
+ * the path to the tree item, in the form of node names (from
+ * parent to child).
+ * @return the tree item
+ */
+ public static SWTBotTreeItem getTreeItem(SWTBot bot, SWTBotTreeItem treeItem, String... nodeNames) {
+ if (nodeNames.length == 0) {
+ return treeItem;
+ }
+
+ SWTBotTreeItem currentNode = treeItem;
+ for (int i = 0; i < nodeNames.length; i++) {
+ bot.waitUntil(ConditionHelpers.treeItemHasChildren(treeItem));
currentNode.expand();
String nodeName = nodeNames[i];
return currentNode;
}
+ /**
+ * Press the keyboard shortcut that goes to the top of a tree widget. The
+ * key combination can differ on different platforms.
+ *
+ * @param keyboard
+ * the keyboard to use
+ */
+ public static void pressShortcutGoToTreeTop(Keyboard keyboard) {
+ if (SWTUtils.isMac()) {
+ keyboard.pressShortcut(Keystrokes.ALT, Keystrokes.UP);
+ } else {
+ keyboard.pressShortcut(Keystrokes.HOME);
+ }
+ }
+
/**
* Get the active events editor. Note that this will wait until such editor
* is available.