/*******************************************************************************
* 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.matchers.eclipse;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.part.ViewPart;
import com.windowtester.runtime.swt.internal.finder.eclipse.views.ViewFinder;
import com.windowtester.runtime.swt.internal.widgets.ISWTWidgetReference;
/**
* Matcher that matches widgets that are components of a {@link ViewPart}.
*
*/
public class ViewComponentMatcher extends PartComponentMatcher {
/** Cached view control */
private Control viewControl;
private final IViewControlProvider viewControlProvider;
public static interface IViewControlProvider {
Control getViewControl();
String getViewLabel();
}
private static abstract class ViewControlProvider implements IViewControlProvider {
private final String identifier;
ViewControlProvider(String identifier) {
this.identifier = identifier;
}
/* (non-Javadoc)
* @see com.windowtester.finder.matchers.swt.ViewComponentMatcher.IViewControlProvider#getViewLabel()
*/
public String getViewLabel() {
return identifier;
}
}
private static final class ByNameProvider extends ViewControlProvider {
ByNameProvider(String name) {
super(name);
}
/* (non-Javadoc)
* @see com.windowtester.finder.matchers.swt.ViewComponentMatcher.IViewControlProvider#getViewControl(java.lang.String)
*/
public Control getViewControl() {
return ViewFinder.getViewControlForName(getViewLabel());
}
}
private static final class ByIdProvider extends ViewControlProvider {
ByIdProvider(String id) {
super(id);
}
/* (non-Javadoc)
* @see com.windowtester.finder.matchers.swt.ViewComponentMatcher.IViewControlProvider#getViewControl(java.lang.String)
*/
public Control getViewControl() {
return ViewFinder.getViewControl(getViewLabel());
}
}
public static ViewComponentMatcher forId(String id) {
return new ViewComponentMatcher(new ByIdProvider(id));
}
public static ViewComponentMatcher forName(String name) {
return new ViewComponentMatcher(new ByNameProvider(name));
}
/**
* Create a matcher for components of the given view (identified by view identifier).
* @param viewId the view identifier of the view
*/
public ViewComponentMatcher(String viewId) {
this(new ByIdProvider(viewId));
}
public ViewComponentMatcher(IViewControlProvider viewControlProvider) {
this.viewControlProvider = viewControlProvider;
}
/* (non-Javadoc)
* @see com.windowtester.runtime.swt.internal.matchers.eclipse.PartComponentMatcher#getPartControl()
*/
protected Control getPartControl() throws com.windowtester.runtime.WidgetSearchException {
if (viewControl == null || viewControl.isDisposed())
viewControl = doGetViewControl();
return viewControl;
}
@Override
public boolean matches(ISWTWidgetReference<?> ref) {
return super.matches(ref);
}
//hook for override
protected Control doGetViewControl() {
return viewControlProvider.getViewControl();
}
/**
* Return a String representation of this view component matcher.
* @see java.lang.Object#toString()
*/
public String toString() {
return "View Component matcher (" + viewControlProvider.getViewLabel() + ")";
}
}