/******************************************************************************* * 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.reveal; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Widget; import abbot.tester.swt.TableItemTester; import abbot.tester.swt.TableTester; import com.windowtester.runtime.MultipleWidgetsFoundException; import com.windowtester.runtime.WidgetNotFoundException; import com.windowtester.runtime.swt.internal.selector.UIDriver; /** * A custom revealer for revealing table items. */ public class TableItemRevealer implements IRevealStrategy { /** How long to wait for a reveal action to complete */ private static final int REVEAL_WAIT = 100; private TableTester _tableTester = new TableTester(); private TableItemTester _tableItemTester = new TableItemTester(); /** * @see com.windowtester.runtime.swt.internal.reveal.IRevealStrategy#reveal(org.eclipse.swt.widgets.Widget, int, int) */ public Widget reveal(Widget w, int x, int y) { if (!(w instanceof TableItem)) throw new IllegalArgumentException("Widget must be a TableItem"); TableItem item = (TableItem)w; Table table = _tableItemTester.getParent(item); _tableTester.actionShowTableItem(table, item); waitForReveal(); return w; } /** * Wait for the reveal action to complete. */ private void waitForReveal() { /* * This is a kludge. Unfortunately, there is no good way to test for item visibility. * As a stop gap, we just wait for a set period of time. */ UIDriver.pause(REVEAL_WAIT); } /** * @see com.windowtester.runtime.swt.internal.reveal.IRevealStrategy#reveal(org.eclipse.swt.widgets.Widget, java.lang.String, int, int) */ public Widget reveal(Widget w, String path, int x, int y) throws WidgetNotFoundException, MultipleWidgetsFoundException { revealColumn(w, path); //reveal row reveal(w, x, y); return w; } private void revealColumn(Widget w, String path) { if (!(w instanceof TableItem)) throw new IllegalArgumentException("Widget must be a TableItem"); int columnIndex = 0; try { columnIndex = Integer.parseInt(path); } catch (NumberFormatException e) { throw new IllegalArgumentException(path + " must be an integer value to select the item column"); } TableItem item = (TableItem)w; Table table = _tableItemTester.getParent(item); //sanity check to prevent from trying to reveal a column that does not exist if (_tableTester.getColumnCount(table) == 0) return; //might this be made more general? TableColumn column = _tableTester.getColumn(table, columnIndex); showColumn(table, column); waitForReveal(); } //TableTester can't be trusted... private void showColumn(final Table table, final TableColumn column) { table.getDisplay().syncExec(new Runnable() { public void run() { table.showColumn(column); } }); } }