/*******************************************************************************
* 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.gef.internal.locator;
import java.io.Serializable;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.ui.palette.PaletteViewer;
import com.windowtester.internal.runtime.finder.IIdentifierHintProvider;
import com.windowtester.internal.runtime.locator.IUISelector2;
import com.windowtester.runtime.IClickDescription;
import com.windowtester.runtime.IUIContext;
import com.windowtester.runtime.WidgetSearchException;
import com.windowtester.runtime.gef.IFigureMatcher;
import com.windowtester.runtime.gef.internal.finder.IFigureFinder;
import com.windowtester.runtime.gef.internal.finder.IFigureIdentifier;
import com.windowtester.runtime.gef.internal.finder.MultiplePartsFoundException;
import com.windowtester.runtime.gef.internal.finder.PartNotFoundException;
import com.windowtester.runtime.gef.internal.finder.RevealingFinder;
import com.windowtester.runtime.gef.internal.helpers.PalettePartFinder;
import com.windowtester.runtime.gef.internal.identifier.PaletteItemIdentifier;
import com.windowtester.runtime.gef.internal.matchers.PaletteItemPartMatcher;
import com.windowtester.runtime.gef.internal.selectors.IEditPartProvider;
import com.windowtester.runtime.gef.internal.selectors.IPaletteViewerProvider;
import com.windowtester.runtime.gef.internal.selectors.IRevealer;
import com.windowtester.runtime.gef.internal.selectors.PaletteItemSelector;
import com.windowtester.runtime.locator.IItemLocator;
import com.windowtester.runtime.locator.IWidgetLocator;
import com.windowtester.runtime.locator.IWidgetReference;
import com.windowtester.runtime.swt.internal.finder.RetrySupport;
import com.windowtester.runtime.swt.internal.finder.RetrySupport.Clickable;
import com.windowtester.runtime.swt.locator.eclipse.ActiveEditorLocator;
import com.windowtester.runtime.swt.locator.eclipse.IEditorLocator;
/**
* A locator delegate for palette item figures.
*/
public class PaletteItemLocatorDelegate extends FigureLocatorDelegate implements IItemLocator, IIdentifierHintProvider, Serializable {
private static final long serialVersionUID = 8895478461592424401L;
/**
* A class used as a back-pointer to bridge services provided by the locator to the selector.
*
*/
private class SelectorBridge implements IEditPartProvider, IPaletteViewerProvider {
public EditPart getPart() throws MultiplePartsFoundException, PartNotFoundException {
return getPartFinder().getEditPart();
}
public PaletteViewer getViewer() {
return getPartFinder().getPaletteViewer();
}
}
//initialized in constructor
private final PalettePartFinder partFinder;
private final String itemPath;
////////////////////////////////////////////////////////////////////////////////
//
// Instance creation
//
////////////////////////////////////////////////////////////////////////////////
public PaletteItemLocatorDelegate(String itemPath) {
this(itemPath, unspecifiedEditor());
}
public PaletteItemLocatorDelegate(String itemPath, IEditorLocator editor) {
super(createPartMatcher(itemPath));
setScope(ScopeFactory.editor(editor));
this.partFinder = new PalettePartFinder(itemPath, editor);
this.itemPath = itemPath;
}
/**
* Create a locator that matches any editor.
*/
private static IEditorLocator unspecifiedEditor() {
return new ActiveEditorLocator();
}
/**
* Build a part matcher out of this path.
*/
private static IFigureMatcher createPartMatcher(String path) {
return new PaletteItemPartMatcher(path);
}
////////////////////////////////////////////////////////////////////////////////
//
// Accessors
//
////////////////////////////////////////////////////////////////////////////////
protected final PalettePartFinder getPartFinder() {
return partFinder;
}
/* (non-Javadoc)
* @see com.windowtester.runtime.locator.IItemLocator#getPath()
*/
public String getPath() {
return itemPath;
}
////////////////////////////////////////////////////////////////////////////////
//
// Specialized locator behavior
//
////////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see com.windowtester.runtime.gef.internal.locator.FigureLocatorDelegate#createSelector()
*/
protected IUISelector2 createSelector() {
SelectorBridge bridge = new SelectorBridge();
return new PaletteItemSelector(bridge, bridge, getPath());
}
/* (non-Javadoc)
* @see com.windowtester.runtime.gef.locator.FigureLocator2#createFinder()
*/
protected IFigureFinder createFinder() {
//take the standard finder and add revealing
return new RevealingFinder(super.createFinder(), new IRevealer() {
public void reveal(IUIContext ui) throws WidgetSearchException {
((PaletteItemSelector)getSelector()).reveal(ui);
}
});
}
/* (non-Javadoc)
* @see com.windowtester.runtime.gef.locator.FigureLocator#getFigureIdentifier()
*/
protected IFigureIdentifier getFigureIdentifier() {
return new PaletteItemIdentifier();
}
/* (non-Javadoc)
* @see com.windowtester.runtime.gef.internal.locator.FigureLocatorDelegate#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
if (adapter == IItemLocator.class)
return this;
if (adapter == IIdentifierHintProvider.class)
return this;
return super.getAdapter(adapter);
}
/* (non-Javadoc)
* @see com.windowtester.internal.runtime.locator.IUISelector#click(com.windowtester.runtime.IUIContext, com.windowtester.runtime.locator.WidgetReference, com.windowtester.runtime.IClickDescription)
*/
public IWidgetLocator click(final IUIContext ui, IWidgetReference widget /* N.B. recalculated */ , final IClickDescription click) throws WidgetSearchException {
return RetrySupport.performClickWithRetries(new Clickable() {
public IWidgetLocator click() throws WidgetSearchException {
//NOTE: we are do a find retry since the reference might change
//(As in when a new editor is activated)
IWidgetReference toClick = (IWidgetReference) ui.find(PaletteItemLocatorDelegate.this);
return getSelector().click(ui, toClick, click);
}
});
}
/* (non-Javadoc)
* @see com.windowtester.internal.runtime.locator.IUISelector#contextClick(com.windowtester.runtime.IUIContext, com.windowtester.runtime.locator.WidgetReference, com.windowtester.runtime.IClickDescription, java.lang.String)
*/
public IWidgetLocator contextClick(final IUIContext ui, IWidgetReference widget /* N.B. recalculated */, final IClickDescription click, final String menuItemPath) throws WidgetSearchException {
return RetrySupport.performClickWithRetries(new Clickable() {
public IWidgetLocator click() throws WidgetSearchException {
//NOTE: we are do a find retry since the reference might change
//(As in when a new editor is activated)
IWidgetReference toClick = (IWidgetReference) ui.find(PaletteItemLocatorDelegate.this);
return getSelector().contextClick(ui, toClick, click, menuItemPath);
}
});
}
////////////////////////////////////////////////////////////////////////////////
//
// Debugging
//
////////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("PaletteItemLocator(\"").append(getPartFinder().getItemPath()).append("\"");
IEditorLocator editor = getPartFinder().getEditor();
if (editor != null)
sb.append(", ").append(editor);
sb.append(")");
return sb.toString();
}
////////////////////////////////////////////////////////////////////////////////
//
// Identification hints
//
////////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see com.windowtester.internal.runtime.finder.IIdentifierHintProvider#requiresXY()
*/
public boolean requiresXY() {
return false;
}
}