/**
* Copyright (c) 2005-2006 IBM Corporation and others.
* 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:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.edit.ui.view;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.ui.EMFEditUIPlugin;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.views.properties.PropertySheetEntry;
import org.eclipse.ui.views.properties.PropertySheetPage;
/**
* This property sheet page has an additional button in its local toolbar that locates the value of the
* selected property in the editor.
*/
public class ExtendedPropertySheetPage extends PropertySheetPage
{
protected List<Object> objectsToSelect = new ArrayList<Object>();
protected AdapterFactoryEditingDomain editingDomain;
protected IAction locateValueAction = new LocateValueAction();
protected class LocateValueAction extends Action
{
private static final long serialVersionUID = 1L;
public LocateValueAction()
{
setText(EMFEditUIPlugin.INSTANCE.getString("_UI_LocateValue_action"));
setToolTipText(EMFEditUIPlugin.INSTANCE.getString("_UI_LocateValue_action_tool_tip"));
setImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(EMFEditUIPlugin.INSTANCE.getImage("full/elcl16/LocateValue")));
setDisabledImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(EMFEditUIPlugin.INSTANCE.getImage("full/dlcl16/LocateValue")));
}
@Override
public void run()
{
List<Object> selection = new ArrayList<Object>();
for (Object object : objectsToSelect)
{
selection.add(editingDomain.getWrapper(object));
}
setSelectionToViewer(selection);
}
}
public ExtendedPropertySheetPage(AdapterFactoryEditingDomain editingDomain)
{
super();
this.editingDomain = editingDomain;
}
/**
* This method should be overridden to set the selection.
*/
protected void setSelectionToViewer(List<?> selection)
{
// Do nothing.
}
@Override
public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager)
{
super.makeContributions(menuManager, toolBarManager, statusLineManager);
toolBarManager.add(locateValueAction);
}
@Override
public void handleEntrySelection(ISelection selection)
{
super.handleEntrySelection(selection);
objectsToSelect.clear();
if (!selection.isEmpty() && selection instanceof IStructuredSelection)
{
IStructuredSelection structuredSelection = (IStructuredSelection)selection;
if (structuredSelection.size() == 1)
{
Object object = structuredSelection.getFirstElement();
if (object instanceof PropertySheetEntry)
{
PropertySheetEntry entry = (PropertySheetEntry)object;
Object [] values = entry.getValues();
if (values != null)
{
for (int i = 0; i < values.length; ++i)
{
Object value = values[i];
if (value instanceof IItemPropertySource)
{
Object realValue = ((IItemPropertySource)value).getEditableValue(null);
if (realValue instanceof Collection<?>)
{
for (Object o : (Collection<?>)realValue)
{
addObjectToSelect(o);
}
}
else
{
addObjectToSelect(realValue);
}
}
}
}
}
}
}
locateValueAction.setEnabled(!objectsToSelect.isEmpty());
}
protected void addObjectToSelect(Object object)
{
if (object instanceof EObject)
{
objectsToSelect.add(object);
}
}
}