| /******************************************************************************* |
| * 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.editparts; |
| |
| import java.util.List; |
| |
| import org.eclipse.bpel.model.Activity; |
| import org.eclipse.bpel.model.Sequence; |
| import org.eclipse.bpel.ui.adapters.IContainer; |
| import org.eclipse.bpel.ui.adapters.ILabeledElement; |
| import org.eclipse.bpel.ui.editparts.policies.BPELComponentEditPolicy; |
| import org.eclipse.bpel.ui.editparts.policies.BPELContainerEditPolicy; |
| import org.eclipse.bpel.ui.editparts.policies.BPELDirectEditPolicy; |
| import org.eclipse.bpel.ui.editparts.policies.BPELOrderedLayoutEditPolicy; |
| import org.eclipse.bpel.ui.editparts.policies.OutlineTreeEditPolicy; |
| import org.eclipse.bpel.ui.editparts.util.OutlineTreePartFactory; |
| import org.eclipse.bpel.ui.util.BPELUtil; |
| import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter; |
| import org.eclipse.bpel.ui.util.ModelHelper; |
| import org.eclipse.bpel.ui.util.MultiObjectAdapter; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPolicy; |
| import org.eclipse.gef.TreeEditPart; |
| import org.eclipse.gef.editparts.AbstractTreeEditPart; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.swt.widgets.TreeItem; |
| import org.eclipse.swt.widgets.Widget; |
| |
| |
| |
| /** |
| * |
| * OutlineTreeEditPart is the edit part that is present in the outline (tree) view of the process. |
| * @author IBM |
| * |
| */ |
| |
| |
| public class OutlineTreeEditPart extends AbstractTreeEditPart { |
| |
| protected MultiObjectAdapter adapter; |
| protected Image outlineImage = null; |
| |
| /** |
| * Brand new shiny OutlineTreeEdit part. |
| */ |
| |
| public OutlineTreeEditPart() { |
| adapter = new BatchedMultiObjectAdapter() { |
| boolean needRefresh = false; |
| |
| @Override |
| public void notify(Notification notification) { |
| needRefresh = true; |
| refreshAdapters(); |
| } |
| |
| @Override |
| public void finish() { |
| if (isActive() && needRefresh) handleModelChanged(); |
| needRefresh = false; |
| } |
| }; |
| } |
| |
| protected void addAllAdapters() { |
| EObject modelObject = (EObject)getModel(); |
| adapter.addToObject(modelObject); |
| |
| // if the object has an extension, add adapter to that too |
| EObject extension = ModelHelper.getExtension(modelObject); |
| if (extension != null) adapter.addToObject(extension); |
| // if the object contains an implicit sequence, add adapter to that also |
| try { |
| Activity activity = ModelHelper.getActivity(modelObject); |
| if (activity instanceof Sequence) { |
| // TODO: perhaps we should check and make sure it's an implicit sequence! |
| // for now, don't worry about it. |
| adapter.addToObject(activity); |
| } |
| } catch (IllegalArgumentException e) { |
| // it's not a single-activity container. ignore. |
| } |
| // ..but we probably don't need an adapter on the implicit sequence... |
| } |
| |
| protected void removeAllAdapters() { |
| adapter.removeFromAll(); |
| } |
| |
| protected void refreshAdapters() { |
| removeAllAdapters(); |
| addAllAdapters(); |
| } |
| |
| /** |
| * @see org.eclipse.gef.editparts.AbstractEditPart#activate() |
| */ |
| @Override |
| public void activate() { |
| if (isActive()) { |
| return; |
| } |
| |
| super.activate(); |
| addAllAdapters(); |
| } |
| |
| /** |
| * @see org.eclipse.gef.editparts.AbstractEditPart#deactivate() |
| */ |
| @Override |
| public void deactivate() { |
| if (!isActive()) { |
| return; |
| } |
| removeAllAdapters(); |
| super.deactivate(); |
| } |
| |
| |
| @Override |
| protected void unregisterVisuals() { |
| if (outlineImage != null) { |
| outlineImage = null; |
| } |
| super.unregisterVisuals(); |
| } |
| |
| /** |
| * Refreshes the Widget of this based on the property |
| * given to update. All major properties are updated |
| * irrespective of the property input. |
| * |
| * @param property Property to be refreshed. |
| */ |
| |
| @Override |
| protected void refreshVisuals() { |
| if (getWidget() instanceof Tree) |
| return; |
| super.refreshVisuals(); |
| Image is = getSmallImg(); |
| if (is != null) { |
| if (outlineImage != null) { |
| outlineImage = null; |
| } |
| outlineImage = is; |
| TreeItem item = (TreeItem)getWidget(); |
| if (outlineImage != null) |
| outlineImage.setBackground(item.getParent().getBackground()); |
| setWidgetImage(outlineImage); |
| } |
| |
| String name = getLabel(); |
| setWidgetText(name); |
| } |
| |
| private Image getSmallImg() { |
| Object model = getModel(); |
| ILabeledElement element = BPELUtil.adapt(model, ILabeledElement.class); |
| if (element != null) { |
| return element.getSmallImage(model); |
| } |
| return null; |
| } |
| |
| private String getLabel() { |
| Object model = getModel(); |
| ILabeledElement element = BPELUtil.adapt(model, ILabeledElement.class); |
| if (element != null) { |
| return element.getLabel(model); |
| } |
| return null; |
| } |
| |
| @Override |
| protected void createEditPolicies() { |
| |
| installEditPolicy(EditPolicy.COMPONENT_ROLE, new BPELComponentEditPolicy()); |
| installEditPolicy(EditPolicy.LAYOUT_ROLE, new BPELOrderedLayoutEditPolicy()); |
| installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new OutlineTreeEditPolicy()); |
| installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new BPELDirectEditPolicy()); |
| |
| if (BPELUtil.adapt(getModel(), IContainer.class) != null) { |
| installEditPolicy(EditPolicy.CONTAINER_ROLE, new BPELContainerEditPolicy()); |
| } |
| } |
| |
| @Override |
| protected List getModelChildren() { |
| return OutlineTreePartFactory.getModelChildren(this.getModel()); |
| } |
| |
| |
| /** |
| * Handle model changed notifications. |
| * |
| */ |
| |
| public void handleModelChanged() { |
| refreshChildren(); |
| refreshVisuals(); |
| } |
| |
| |
| @Override |
| protected void reorderChild(EditPart editpart, int index) { |
| |
| boolean expanded = false; |
| boolean resetState = false; |
| TreeEditPart treeEditPart = (TreeEditPart)editpart; |
| Widget wid = treeEditPart.getWidget(); |
| if (wid != null) { |
| if (wid instanceof TreeItem) { |
| TreeItem ti = (TreeItem)wid; |
| expanded = ti.getExpanded(); |
| resetState = true; |
| } |
| } |
| |
| removeChildVisual(editpart); |
| List<EditPart> children = getChildren(); |
| children.remove(editpart); |
| children.add(index, editpart); |
| addChildVisual(editpart, index); |
| |
| // reset the expanded state if the part was previously so |
| if (resetState) { |
| TreeItem ti = (TreeItem)treeEditPart.getWidget(); |
| if (ti != null) |
| ti.setExpanded(expanded); |
| } |
| editpart.refresh(); |
| } |
| } |