blob: f5d32d371b434ae650364d874eab16a12f75678e [file] [log] [blame]
/*******************************************************************************
* 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();
}
}