/******************************************************************************* | |
* Copyright (c) 2005, 2012 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 Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.bpel.ui; | |
import java.lang.reflect.Field; | |
import java.util.HashSet; | |
import java.util.Iterator; | |
import java.util.Set; | |
import org.eclipse.bpel.model.BPELExtensibleElement; | |
import org.eclipse.bpel.model.Expression; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.gef.EditPart; | |
import org.eclipse.jface.action.IAction; | |
import org.eclipse.jface.text.ITextSelection; | |
import org.eclipse.jface.viewers.ISelection; | |
import org.eclipse.jface.viewers.IStructuredSelection; | |
import org.eclipse.jface.viewers.StructuredSelection; | |
import org.eclipse.ui.IActionBars; | |
import org.eclipse.ui.IWorkbenchPart; | |
import org.eclipse.ui.actions.ActionFactory; | |
import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistry; | |
import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyViewer; | |
import org.eclipse.ui.part.IPageSite; | |
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; | |
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; | |
/** | |
* Our own version of the TabbedPropertySheetPage in order to supply the | |
* BPELEditor to the property sections. | |
*/ | |
public class BPELTabbedPropertySheetPage extends TabbedPropertySheetPage { | |
protected BPELEditor editor; | |
protected TabbedPropertyViewer viewer; | |
protected TabbedPropertyRegistry registry; | |
public BPELTabbedPropertySheetPage(ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor, BPELEditor editor) { | |
super(tabbedPropertySheetPageContributor); | |
this.editor = editor; | |
} | |
public BPELEditor getEditor() { | |
return editor; | |
} | |
public TabbedPropertyViewer getTabbedPropertyViewer() { | |
if (viewer == null) { | |
// TODO: hack - use reflection to get the field - it should be API in the super class | |
try { | |
Field field = TabbedPropertySheetPage.class.getDeclaredField("tabbedPropertyViewer"); //$NON-NLS-1$ | |
field.setAccessible(true); | |
viewer = (TabbedPropertyViewer) field.get(this); | |
} catch (Exception e) { | |
BPELUIPlugin.log(e); | |
} | |
} | |
return viewer; | |
} | |
public void setBPELEditorActions() { | |
IPageSite pageSite = getSite(); | |
IActionBars actionBars = pageSite.getActionBars(); | |
String id = ActionFactory.REVERT.getId(); | |
IAction action = editor.getActionRegistry().getAction(id); | |
actionBars.setGlobalActionHandler(id, action); | |
id = ActionFactory.UNDO.getId(); | |
action = editor.getActionRegistry().getAction(id); | |
actionBars.setGlobalActionHandler(id, action); | |
id = ActionFactory.REDO.getId(); | |
action = editor.getActionRegistry().getAction(id); | |
actionBars.setGlobalActionHandler(id, action); | |
actionBars.updateActionBars(); | |
} | |
@Override | |
public void init(IPageSite pageSite) { | |
super.init(pageSite); | |
// add some actions to the properties view | |
setBPELEditorActions(); | |
} | |
@Override | |
public void selectionChanged(IWorkbenchPart part, ISelection selection) { | |
// TODO: (DO) If we change selection in the Designer then it causes | |
// changing selection in the SourceTab too. We are not going to create | |
// PropertySheetPage twice, so, ignore the second case | |
if (selection instanceof ITextSelection) { | |
return; | |
} | |
selection = calculateSelection(selection); | |
super.selectionChanged(part, selection); | |
// TabDescriptor[] descriptors = getRegistry().getTabDescriptors(part, selection); | |
// if (descriptors.length > 0) { | |
// super.selectionChanged(part, selection); | |
// } | |
} | |
/** | |
* Replace EditPart with model object. | |
*/ | |
protected ISelection calculateSelection(ISelection selection) { | |
Set<Object> newSet = new HashSet<Object>(); | |
if (selection != null && !selection.isEmpty() && (selection instanceof IStructuredSelection)) { | |
Iterator<Object> it = ((IStructuredSelection)selection).iterator(); | |
while (it.hasNext()) { | |
Object o = it.next(); | |
if (o instanceof EditPart) { | |
o = ((EditPart)o).getModel(); | |
} | |
if (editor.getMultipageEditor().getActiveEditor() == editor.getMultipageEditor().getTextEditor()) { | |
// the selection came from the Source view of this multipage editor so we have to | |
// be careful here: if a selection does not have a corresponding property sheet page | |
// (e.g. a <copy>, <from>. <to>, etc.) then traverse the selection's ancestors to find | |
// an element which DOES have a property sheet page associated with it. | |
while (o!=null && o instanceof EObject && !hasPropertySheetPage(o)) { | |
o = ((EObject)o).eContainer(); | |
} | |
} | |
newSet.add(o); | |
} | |
} | |
return new StructuredSelection(newSet.toArray(new Object[newSet.size()])); | |
} | |
private boolean hasPropertySheetPage(Object o) { | |
return | |
o instanceof org.eclipse.bpel.model.Activity || | |
o instanceof org.eclipse.bpel.model.Assign || | |
o instanceof org.eclipse.bpel.model.Catch || | |
o instanceof org.eclipse.bpel.model.CatchAll || | |
o instanceof org.eclipse.bpel.model.CompensateScope || | |
o instanceof org.eclipse.bpel.model.CorrelationSet || | |
o instanceof org.eclipse.bpel.model.Else || | |
o instanceof org.eclipse.bpel.model.ElseIf || | |
o instanceof org.eclipse.bpel.model.Empty || | |
o instanceof org.eclipse.bpel.model.ForEach || | |
o instanceof org.eclipse.bpel.model.If || | |
o instanceof org.eclipse.bpel.model.Invoke || | |
o instanceof org.eclipse.bpel.model.Link || | |
o instanceof org.eclipse.bpel.model.MessageExchange || | |
o instanceof org.eclipse.bpel.model.MessageExchanges || | |
o instanceof org.eclipse.bpel.model.OnAlarm || | |
o instanceof org.eclipse.bpel.model.OnEvent || | |
o instanceof org.eclipse.bpel.model.OnMessage || | |
o instanceof org.eclipse.bpel.model.PartnerLink || | |
o instanceof org.eclipse.bpel.model.PartnerLinks || | |
o instanceof org.eclipse.bpel.model.Pick || | |
o instanceof org.eclipse.bpel.model.Process || | |
o instanceof org.eclipse.bpel.model.Receive || | |
o instanceof org.eclipse.bpel.model.RepeatUntil || | |
o instanceof org.eclipse.bpel.model.Reply || | |
o instanceof org.eclipse.bpel.model.Scope || | |
o instanceof org.eclipse.bpel.model.Throw || | |
o instanceof org.eclipse.bpel.model.Validate || | |
o instanceof org.eclipse.bpel.model.Variable || | |
o instanceof org.eclipse.bpel.model.Variables || | |
o instanceof org.eclipse.bpel.model.Wait || | |
o instanceof org.eclipse.bpel.model.While; | |
} | |
protected TabbedPropertyRegistry getRegistry() { | |
if (registry == null) { | |
// TODO: hack - use reflection to get the field - it should be API in the super class | |
try { | |
Field field = TabbedPropertySheetPage.class.getDeclaredField("registry"); //$NON-NLS-1$ | |
field.setAccessible(true); | |
registry = (TabbedPropertyRegistry) field.get(this); | |
} catch (Exception e) { | |
BPELUIPlugin.log(e); | |
} | |
} | |
return registry; | |
} | |
} |