blob: bf8bfa69945fefad750d56c3395f60a96755b8ea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2017 Red Hat Inc. 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:
* Mickael Istria (Red Hat) - initial API and implementation
* Rastislav Wagner (Red Hat) - initial API and implementation
*******************************************************************************/
package org.eclipse.swtbot.generator.framework;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
public class WidgetUtils {
/**
*
* @param control which index should be found
* @return index of control
*/
public static int getIndex(Control control) {
// This is the reverse method of
// Matcher matcher = allOf(widgetOfType(Button.class), withStyle(SWT.PUSH, "SWT.PUSH"));
// return new SWTBotButton((Button) widget(matcher, index), matcher);
// TODO? Evaluate reusing matchers here too
int index = 0;
Composite parent = null;
do {
parent = control.getParent();
Control[] children = parent.getChildren();
if (children.length == 0) {
throw new RuntimeException("Could not determine index for widget " + control);
}
for (Control c : children) {
if (c.equals(control)) {
return index;
} else if (c.getClass().equals(control.getClass())) {
index++;
}
}
} while (!(parent instanceof Shell));
throw new RuntimeException("Could not determine index for widget " + control);
}
/**
*
* @param control which group should be found
* @return group text or null if group was not found
*/
public static String getGroup(Control control){
Composite parent = control.getParent();
while(parent != null){
if(parent instanceof Group){
return ((Group)parent).getText();
}
parent = parent.getParent();
}
return null;
}
/**
*
* @param widget which parent shell should be found
* @return shell which contains widget or null
*/
public static Shell getShell(Control widget) {
while (widget != null) {
if (widget instanceof Shell) {
return ((Shell)widget);
} else {
widget = ((Control)widget).getParent();
}
}
return null;
}
/**
*
* @param widget widget which label should be found
* @return label text or null if no label was found
*/
public static String getLabel(Control widget) {
Control[] controls = widget.getParent().getChildren();
for (int i = 0; i < controls.length; i++) {
if (controls[i] instanceof Label && controls[i + 1].equals(widget)) {
return ((Label) controls[i]).getText();
}
}
return null;
}
/**
* Clean text
* @param text text to clean
* @return cleaned text
*/
public static String cleanText(String text) {
if(text != null){
return text.replaceAll("&", "").split("\t")[0];
}
return null;
}
private static Control getPreviousControl(Control control) {
int i = Arrays.asList(control.getParent().getChildren()).indexOf(control);
if (i <= 0) {
return null;
}
return control.getParent().getChildren()[i - 1];
}
public static String widgetLocator(Widget widget) {
if (widget instanceof Text) {
return widgetLocator((Text)widget);
} else if (widget instanceof StyledText) {
return widgetLocator((StyledText)widget);
} else if (widget instanceof MenuItem) {
return widgetLocator((MenuItem)widget);
}
return "Widget not supported: " + widget.getClass().getSimpleName(); //$NON-NLS-1$
}
public static String widgetLocator(Text text) {
StringBuilder res = new StringBuilder("bot."); //$NON-NLS-1$
Control previous = getPreviousControl(text);
if (previous instanceof Label && !((Label)previous).getText().isEmpty()) {
res.append("textWithLabel(\""); //$NON-NLS-1$
res.append(((Label)previous).getText());
res.append("\")"); //$NON-NLS-1$
} else {
res.append("text("); //$NON-NLS-1$
int index = getIndex(text);
if (index != 0) {
res.append(index);
}
res.append(")"); //$NON-NLS-1$
}
return res.toString();
}
public static String widgetLocator(StyledText text) {
StringBuilder res = new StringBuilder("bot."); //$NON-NLS-1$
Control previous = getPreviousControl(text);
if (previous instanceof Label && !((Label)previous).getText().isEmpty()) {
res.append("styledTextWithLabel(\""); //$NON-NLS-1$
res.append(((Label)previous).getText());
res.append("\")"); //$NON-NLS-1$
} else {
res.append("styledText("); //$NON-NLS-1$
int index = getIndex(text);
if (index != 0) {
res.append(index);
}
res.append(")"); //$NON-NLS-1$
}
return res.toString();
}
public static String widgetLocator(MenuItem menuItem) {
StringBuilder res = new StringBuilder("bot"); //$NON-NLS-1$
List<String> path = new ArrayList<String>();
MenuItem currentItem = menuItem;
Menu parent = null;
while (currentItem != null && currentItem.getParent() != null) {
path.add(WidgetUtils.cleanText(currentItem.getText()));
parent = currentItem.getParent();
currentItem = parent.getParentItem();
}
Collections.reverse(path);;
boolean isPopup = (parent.getStyle() & SWT.POP_UP) != 0;
boolean isFirst = true;
for (String text : path) {
if (isFirst && isPopup) {
isFirst = false;
res.append(".contextMenu(\"");
} else {
res.append(".menu(\"");
}
res.append(WidgetUtils.cleanText(text));
res.append("\")");
}
return res.toString();
}
}