/**
* Copyright (c) 2006 Borland Software Corporation
*
* 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:
* bblajer - initial API and implementation
*/
package org.eclipse.gmf.runtime.lite.properties;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gmf.runtime.lite.parts.CommandStackAdapterManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
public abstract class AdvancedPropertySection extends org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection {
public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
super.createControls(parent, tabbedPropertySheetPage);
myPropertySheetEntry = new RootUndoablePropertySheetEntry(null, page);
myPropertySheetEntry.setPropertySourceProvider(getPropertySourceProvider());
page.setRootEntry(myPropertySheetEntry);
}
public void setInput(IWorkbenchPart part, ISelection selection) {
if (selection.isEmpty()
|| false == selection instanceof StructuredSelection) {
super.setInput(part, selection);
return;
}
final StructuredSelection structuredSelection = ((StructuredSelection) selection);
ArrayList<Object> transformedSelection = new ArrayList<Object>(structuredSelection.size());
for (Iterator<?> it = structuredSelection.iterator(); it.hasNext(); ) {
Object r = transformSelection(it.next());
if (r != null) {
transformedSelection.add(r);
}
}
CommandStack commandStack = getCommandStack(transformedSelection);
myPropertySheetEntry.setCommandStack(commandStack);
super.setInput(part, new StructuredSelection(transformedSelection));
}
protected CommandStack getCommandStack(ArrayList<?> selection) {
CommandStack result = null;
for(Object next : selection) {
TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(next);
if (editingDomain == null) {
return null;
}
CommandStack nextStackCandidate = getCommandStack(editingDomain);
if (nextStackCandidate == null) {
return null;
}
if (result == null) {
result = nextStackCandidate;
} else if (result != nextStackCandidate) {
return null;
}
}
return result;
}
static CommandStack getCommandStack(TransactionalEditingDomain editingDomain) {
if (editingDomain == null) {
return null;
}
CommandStackAdapterManager adapterManager = (CommandStackAdapterManager) EcoreUtil.getExistingAdapter(editingDomain.getResourceSet(), CommandStackAdapterManager.class);
if (adapterManager == null || adapterManager.isReleased()) {
return null;
}
return adapterManager.getCommandStack();
}
protected PropertySourceProvider getPropertySourceProvider() {
if (myPropertySourceProvider == null) {
myPropertySourceProvider = new PropertySourceProvider(getItemProvidersAdapterFactory());
}
return myPropertySourceProvider;
}
protected abstract AdapterFactory getItemProvidersAdapterFactory();
/**
* Allows the subclasses to unwrap or otherwise modify the contents of the selection. The <code>null</code> result may be returned,
* in this case it will be ignored.
* <p/>By default, the passed object is returned untouched.
*/
protected Object transformSelection(Object selected) {
return selected;
}
@Override
public void refresh() {
page.refresh();
}
private PropertySourceProvider myPropertySourceProvider;
private RootUndoablePropertySheetEntry myPropertySheetEntry;
}