/******************************************************************************* * 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.internal.finder; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.widgets.Widget; import com.windowtester.runtime.IAdaptable; import com.windowtester.runtime.internal.factory.WTRuntimeManager; import com.windowtester.runtime.locator.IWidgetLocator; import com.windowtester.runtime.locator.IWidgetMatcher; import com.windowtester.runtime.swt.internal.widgets.ISWTWidgetMatcher; import com.windowtester.runtime.swt.internal.widgets.ISWTWidgetReference; import com.windowtester.runtime.swt.internal.widgets.ISearchable; import com.windowtester.runtime.swt.internal.widgets.finder.SWTWidgetFinder; /** * NOTE: ultimately to replace: com.windowtester.finder.swt.SWTWidgetFinder */ public class BasicWidgetFinder { //TODO: surface way to configure retries... private static final Widget[] EMPTY_LIST = new Widget[]{}; public Widget[] findAll(Widget root, IWidgetMatcher matcher) { // Matcher legacyMatcher = new AdapterFactory().adapt(matcher); // return collectMatches(root, legacyMatcher); IWidgetLocator[] locators = findAllLocators(root, matcher); List<Widget> widgets = new ArrayList<Widget>(); for (int i = 0; i < locators.length; i++) { widgets.add(((ISWTWidgetReference<Widget>)locators[i]).getWidget()); } return widgets.toArray(EMPTY_LIST); } public IWidgetLocator[] findAllLocators(Widget root, IWidgetMatcher matcher) { ISWTWidgetReference<?> rootRef = (ISWTWidgetReference<?>) WTRuntimeManager.asReference(root); ISWTWidgetMatcher swtMatcher = adaptMatcher(matcher); if (swtMatcher == null) throw new IllegalStateException("matcher: " + matcher + " must adapt to the ISWTWidgetMatcher interface"); return SWTWidgetFinder.forActiveShell().withScope((ISearchable) rootRef).findAll((swtMatcher)); // return adaptWidgetsToLocators(findAll(root, matcher)); } private ISWTWidgetMatcher adaptMatcher(IWidgetMatcher matcher) { if (matcher instanceof ISWTWidgetMatcher) return (ISWTWidgetMatcher) matcher; if (matcher instanceof IAdaptable) return (ISWTWidgetMatcher) ((IAdaptable)matcher).getAdapter(ISWTWidgetMatcher.class); return null; } // public Widget[] collectMatches(Widget searchRooot, Matcher matcher) { // // MatchResult result = new WidgetFinder().find(searchRooot, matcher); // // List matches = new ArrayList(); // // switch(result.getType()) { // case WidgetFinder.MULTIPLE_WIDGETS_FOUND : // matches.addAll(result.getWidgets()); // break; // case WidgetFinder.MATCH : // matches.add(result.getWidget()); // break; // case WidgetFinder.WIDGET_NOT_FOUND : // break; // } // // return (Widget[]) matches.toArray(EMPTY_LIST); // } // // private static IWidgetLocator[] adaptWidgetsToLocators(Widget[] widgets) { // List locators = new ArrayList(); // for (int i = 0; i < widgets.length; i++) { // locators.add(WidgetReference.create((Widget)widgets[i])); // } // return (IWidgetLocator[]) locators.toArray(new IWidgetLocator[]{}); // } }