package abbot.tester.swt;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import com.windowtester.runtime.swt.internal.operation.SWTMouseOperation;
import com.windowtester.runtime.swt.internal.selector.ListHelper;
/**
* Provides widget-specific actions, assertions, and getter methods for
* widgets of type List.
*/
public class ListTester extends ScrollableTester {
public static final String copyright = "Licensed Materials -- Property of IBM\n"+
"(c) Copyright International Business Machines Corporation, 2003\nUS Government "+
"Users Restricted Rights - Use, duplication or disclosure restricted by GSA "+
"ADP Schedule Contract with IBM Corp.";
/**
* Proxy for
* {@link List#addSelectionListener(SelectionListener)}.
*/
public void addSelectionListener(final List l, final SelectionListener listener) {
Robot.syncExec(l.getDisplay(), null, new Runnable() {
public void run() {
l.addSelectionListener(listener);
}
});
}
/**
* Proxy for
* {@link List#removeSelectionListener(SelectionListener)}.
*/
public void removeSelectionListener(final List l, final SelectionListener listener) {
Robot.syncExec(l.getDisplay(), null, new Runnable() {
public void run() {
l.removeSelectionListener(listener);
}
});
}
/**
* Proxy for {@link List#getItem(int i)}.
*/
public String getItem(final List l, final int i) {
String result = (String) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return l.getItem(i);
}
});
return result;
}
/**
* Proxy for {@link List#getItemCount()}.
*/
public int getItemCount(final List l) {
Integer result = (Integer) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Integer(l.getItemCount());
}
});
return result.intValue();
}
/**
* Proxy for {@link List#getItemHeight()}.
*/
public int getItemHeight(final List l) {
Integer result = (Integer) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Integer(l.getItemHeight());
}
});
return result.intValue();
}
/**
* Proxy for {@link List#getItems()}.
*/
public String [] getItems(final List l) {
java.util.List result = (java.util.List) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
String [] items = l.getItems();
java.util.List list = new ArrayList(items.length);
//!pq: fix to actually *add* the items...
list.addAll(Arrays.asList(items));
return list;
}
});
String [] items = new String [result.size()];
for (int i = 0; i < items.length; i++) {
items[i] = (String)result.get(i);
}
return items;
}
/**
* Proxy for {@link List#getSelection()}.
*/
public String [] getSelection(final List l) {
java.util.List result = (java.util.List) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
String [] items = l.getSelection();
java.util.List list = new ArrayList(items.length);
//!pq: fix to actually *add* the items...
list.addAll(Arrays.asList(items));
return list;
}
});
String [] items = new String [result.size()];
for (int i = 0; i < items.length; i++) {
items[i] = (String)result.get(i);
}
return items;
}
/**
* Proxy for {@link List#getSelectionCount()}.
*/
public int getSelectionCount(final List l) {
Integer result = (Integer) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Integer(l.getSelectionCount());
}
});
return result.intValue();
}
/**
* Proxy for {@link List#getSelectionIndex()}.
*/
public int getSelectionIndex(final List l) {
Integer result = (Integer) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Integer(l.getSelectionIndex());
}
});
return result.intValue();
}
/**
* Proxy for {@link List#getSelectionIndices()()}.
*/
public int [] getSelectionIndices(final List l) {
java.util.List result = (java.util.List) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
int [] items = l.getSelectionIndices();
//a little autoboxing would be nice!
java.util.List list = new ArrayList(items.length);
//!pq: fix to actually *add* the items...
for (int i=0; i < items.length; ++i)
list.add(new Integer(items[i]));
return list;
}
});
int [] items = new int [result.size()];
for (int i = 0; i < items.length; i++) {
items[i] = ((Integer)result.get(i)).intValue();
}
return items;
}
/**
* Proxy for {@link List#getTopIndex()}.
*/
public int getTopIndex(final List l) {
Integer result = (Integer) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Integer(l.getTopIndex());
}
});
return result.intValue();
}
/**
* Proxy for {@link List#indexOf(String)}
*/
public int indexOf(final List l, final String s) {
Integer result = (Integer) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Integer(l.indexOf(s));
}
});
return result.intValue();
}
/**
* Proxy for {@link List#indexOf(String,int)}
*/
public int indexOf(final List l, final String s, final int i) {
Integer result = (Integer) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Integer(l.indexOf(s,i));
}
});
return result.intValue();
}
/**
* Proxy for {@link List#isSelected(int)}
*/
public boolean isSelected(final List l, final int i) {
Boolean result = (Boolean) Robot.syncExec(l.getDisplay(),
new RunnableWithResult() {
public Object runWithResult() {
return new Boolean(l.isSelected(i));
}
});
return result.booleanValue();
}
/**
* Proxy for
* {@link List#showSelection()}.
*/
public void showSelection(final List l) {
Robot.syncExec(l.getDisplay(), null, new Runnable() {
public void run() {
l.showSelection();
}
});
}
/**
* Proxy for
* {@link List#select(int)}.
*/
public void select(final List l, final int i) {
Robot.syncExec(l.getDisplay(), null, new Runnable() {
public void run() {
l.select(i);
}
});
}
/**
* Proxy for
* {@link List#select(int,int)}.
*/
public void select(final List l, final int start, final int end) {
Robot.syncExec(l.getDisplay(), null, new Runnable() {
public void run() {
l.select(start,end);
}
});
}
/**
* Proxy for
* {@link List#select(int [])}.
*/
public void select(final List l, final int [] i) {
Robot.syncExec(l.getDisplay(), null, new Runnable() {
public void run() {
l.select(i);
}
});
}
/**
* Proxy for
* {@link List#selectAll()}.
*/
public void selectAll(final List l) {
Robot.syncExec(l.getDisplay(), null, new Runnable() {
public void run() {
l.selectAll();
}
});
}
/** Move the mouse pointer over the item at the given index **/
protected void mouseMoveIndex(final List list, final int index){
actionFocus(list);
Robot.syncExec(list.getDisplay(),null,new Runnable(){
public void run(){
list.setTopIndex(index);
}
});
int topIndex = getTopIndex(list);
int borderWidth = getBorderWidth(list);
int itemHeight = getItemHeight(list);
Rectangle bounds = getGlobalBounds(list);
Rectangle clientArea = getClientArea(list);
itemHeight = ListHelper.fixItemHeight(list.getDisplay(), itemHeight);
mouseMove2(bounds.x+clientArea.width/2,bounds.y+borderWidth+itemHeight*(index-topIndex)+itemHeight/2);
actionWaitForIdle(list.getDisplay());
}
/** Click the first occurance given item **/
public void actionClickItem(List list, String item){
//FIXME[author=pq]: button presses are not selecting; KeyEvents work though...
actionClickItem(list,item,SWT.BUTTON1);
}
public void actionDoubleClickItem(List list, String item) {
actionDoubleClickItem(list, item, SWT.BUTTON1);
}
//!pq:
public void actionDoubleClickItem(List list, String item, int accelerator){
String[] items = getItems(list);
int index = -1;
for(int i=0; i<items.length;i++){
if(item.equals(items[i])&&index==-1)
index = i;
}
if(index==-1){
throw new ActionFailedException("List item \""+item+"\" not found");
}
actionDoubleClickIndex(list, index);
}
/** Click the item at the given index **/
public void actionClickIndex(List list, int index){
actionClickIndex(list,index,SWT.BUTTON1);
}
/** Click the first occurance of given item based on the given accelerator **/
public void actionClickItem(List list, String item, int accelerator){
String[] items = getItems(list);
int index = -1;
for(int i=0; i<items.length;i++){
if(item.equals(items[i])&&index==-1)
index = i;
}
if(index==-1){
throw new ActionFailedException("List item \""+item+"\" not found");
}
actionClickIndex(list,index,accelerator);
}
/** Click the item at the given index based on the given accelerator **/
public void actionClickIndex(List list, int index, int accelerator){
actionFocus(list);
//System.out.println("moving mouse");
mouseMoveIndex(list,index);
//System.out.println("...done moving mouse");
//System.out.println("waiting for idle");
actionWaitForIdle(list.getDisplay());
//System.out.println("...done waiting for idle");
//System.out.println("clicking key");
// !pq: keyClick fix
// mousePress(accelerator);
// mouseRelease(accelerator);
// mousePress2(accelerator);
// mouseRelease2(accelerator);
new SWTMouseOperation(accelerator).execute();
//keyClick(accelerator);
//System.out.println("...done clicking key");
//System.out.println("waiting for idle");
actionWaitForIdle(list.getDisplay());
//System.out.println("...done waiting for idle");
}
/**
* Select the first occurance of an item from the given list if it wasn't already
* selected, and unselect it otherwise.
*/
public void actionSelectItem(List list, String item){
String[] items = getItems(list);
int index = -1;
for(int i=0; i<items.length;i++){
if(item.equals(items[i])&&index==-1)
index = i;
}
if(index==-1){
throw new ActionFailedException("List item \""+item+"\" not found");
}
actionSelectIndex(list,index);
}
/**
* Selects the item at the given index, or unselects it if it was
* already selected.
*/
public void actionSelectIndex(final List list, final int index){
actionFocus(list);
mouseMoveIndex(list,index);
Robot.syncExec(list.getDisplay(),null,new Runnable(){
public void run(){
int[] selectionIndices = list.getSelectionIndices();
boolean selected = false;
//int indexIntoSelected = -1;
for(int i=0; i<selectionIndices.length;i++){
if(selectionIndices[i]==index){
selected = true;
//indexIntoSelected = i;
}
}
if(selected){
int[] setSelected = new int[selectionIndices.length-1];
int x = 0;
for(int i=0; i<setSelected.length;i++){
if(selectionIndices[i]!=index){
setSelected[x] = selectionIndices[i];
x++;
}
}
list.setSelection(setSelected);
}
else{//!selected
int[] setSelected = new int[selectionIndices.length+1];
for(int i=0; i<selectionIndices.length;i++){
setSelected[i] = selectionIndices[i];
}
setSelected[setSelected.length-1]=index;
list.setSelection(setSelected);
}
}
});
actionWaitForIdle(list.getDisplay());
}
/**
* Double click the item at the given index.
* @author Markus Kuhn <markuskuhn@users.sourceforge.net>
*/
public void actionDoubleClickIndex(List list, int index){
actionDoubleClickIndex(list,index,SWT.BUTTON1);
}
/*
* @author Markus Kuhn <markuskuhn@users.sourceforge.net>
*/
public void actionDoubleClickIndex(List list, int index, int accelerator){
Display display = list.getDisplay();
actionFocus(list);
mouseMoveIndex(list,index);
actionWaitForIdle(display);
// !pq: keyClick fix
// mousePress(accelerator);
// mouseRelease(accelerator);
// keyClick(accelerator);
// mousePress2(accelerator);
new SWTMouseOperation(accelerator).execute();
delay(50);
// !pq: keyClick fix
// mousePress(accelerator);
// mouseRelease(accelerator);
// keyClick(accelerator);
// mousePress2(accelerator);
new SWTMouseOperation(accelerator).execute();
actionWaitForIdle(display);
}
}