/*******************************************************************************
* 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.finder.scope;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.draw2d.IFigure;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.swt.widgets.Control;
import com.windowtester.runtime.IUIContext;
import com.windowtester.runtime.draw2d.internal.finder.Draw2DFinder;
import com.windowtester.runtime.draw2d.internal.finder.IFigureSearchScope;
import com.windowtester.runtime.gef.IFigureMatcher;
import com.windowtester.runtime.gef.internal.IGEFEditPartMatcher;
import com.windowtester.runtime.gef.internal.finder.GEFFinder;
import com.windowtester.runtime.gef.internal.finder.IEditPartSearchScope;
import com.windowtester.runtime.gef.internal.helpers.EditorAccessor;
import com.windowtester.runtime.internal.finder.BasicWidgetFinder;
import com.windowtester.runtime.internal.finder.scope.IWidgetSearchScope;
import com.windowtester.runtime.locator.IWidgetLocator;
import com.windowtester.runtime.locator.IWidgetMatcher;
import com.windowtester.runtime.swt.locator.eclipse.IEditorLocator;
/**
* Editor-bound search scope.
*/
public class EditorScope extends AbstractScope implements IFigureSearchScope, IEditPartSearchScope, IWidgetSearchScope, Serializable {
private static final long serialVersionUID = 8575580540868216617L;
private final EditorAccessor editorAccessor;
public EditorScope(IEditorLocator editorLocator) {
editorAccessor = new EditorAccessor(editorLocator);
}
public EditorAccessor getEditor() {
return editorAccessor;
}
/* (non-Javadoc)
* @see com.windowtester.runtime.draw2d.internal.internal.finder.IFigureSearchScope#findAll(com.windowtester.runtime.IUIContext, com.windowtester.runtime.draw2d.internal.IFigureMatcher)
*/
public IWidgetLocator[] findAll(IUIContext ui, IFigureMatcher matcher) {
IWidgetLocator[] paneContents = findInContentPane(matcher);
IWidgetLocator[] paletteContents = findInPalette(matcher);
return merge(paneContents, paletteContents);
}
private IWidgetLocator[] merge(IWidgetLocator[] paneContents, IWidgetLocator[] paletteContents) {
Set merged = new HashSet();
for (int i = 0; i < paneContents.length; i++) {
merged.add(paneContents[i]);
}
for (int i = 0; i < paletteContents.length; i++) {
merged.add(paletteContents[i]);
}
return (IWidgetLocator[]) merged.toArray(noMatches());
}
private IWidgetLocator[] findInContentPane(IFigureMatcher matcher) {
IFigure contentPane = getEditor().getContentPane();
if (contentPane == null)
return noMatches();
return findAll(matcher, contentPane);
}
private IWidgetLocator[] findInPalette(IFigureMatcher matcher) {
PaletteViewer viewer = getEditor().getPaletteViewer();
if (viewer == null)
return noMatches();
IFigure contentPane = GEFFinder.getDefault().getFigure(viewer.getContents());
if (contentPane == null)
return noMatches();
return findAll(matcher, contentPane);
}
private IWidgetLocator[] findAll(IFigureMatcher matcher, IFigure contentPane) {
return Draw2DFinder.getDefault().findAllFigureLocators(contentPane, matcher);
}
/* (non-Javadoc)
* @see com.windowtester.runtime.gef.internal.finder.IEditPartSearchScope#findAll(com.windowtester.runtime.IUIContext, com.windowtester.runtime.gef.IGEFEditPartMatcher)
*/
public IWidgetLocator[] findAll(IUIContext ui, IGEFEditPartMatcher matcher) {
return GEFFinder.getDefault().findAllEditPartReferences(getEditor().getViewer(), matcher);
}
/* (non-Javadoc)
* @see com.windowtester.runtime.internal.finder.scope.IWidgetSearchScope#findAll(com.windowtester.runtime.IUIContext, com.windowtester.runtime.locator.IWidgetMatcher)
*/
public IWidgetLocator[] findAll(IUIContext ui, IWidgetMatcher matcher) {
GraphicalViewer viewer = getEditor().getViewer();
if (viewer == null)
return noMatches();
Control control = viewer.getControl();
if (control == null)
return noMatches();
return new BasicWidgetFinder().findAllLocators(control, matcher);
}
/* (non-Javadoc)
* @see com.windowtester.runtime.gef.internal.finder.scope.AbstractScope#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class<?> adapter) {
if (adapter == IWidgetLocator.class)
return getEditor().getEditor();
return super.getAdapter(adapter);
}
}