/******************************************************************************* * 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(); } }