package com.isencia.passerelle.workbench.model.editor.ui.editpart;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Tree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ptolemy.actor.AtomicActor;
import ptolemy.actor.CompositeActor;
import ptolemy.actor.Director;
import ptolemy.actor.IOPort;
import ptolemy.actor.TypedAtomicActor;
import ptolemy.data.expr.Parameter;
import ptolemy.kernel.util.ChangeListener;
import ptolemy.kernel.util.ChangeRequest;
import ptolemy.kernel.util.Changeable;
import ptolemy.kernel.util.NamedObj;
import ptolemy.kernel.util.Settable;
import ptolemy.kernel.util.ValueListener;
import ptolemy.moml.Vertex;
import ptolemy.vergil.kernel.attributes.TextAttribute;
import com.isencia.passerelle.workbench.model.editor.ui.ImageRegistry;
import com.isencia.passerelle.workbench.model.editor.ui.palette.PaletteBuilder;
/**
* EditPart for components in the Tree.
*/
public class OutlineEditPart extends org.eclipse.gef.editparts.AbstractTreeEditPart implements ValueListener, ChangeListener {
// private HashSet<Image> modelImages = new HashSet<Image>();
// public HashSet<Image> getModelImages() {
// return modelImages;
// }
private static Logger logger = LoggerFactory.getLogger(OutlineEditPart.class);
/**
* Constructor initializes this with the given model.
*
* @param model
* Model for this outline
*/
public OutlineEditPart(Object model) {
super(model);
if (model instanceof Parameter) {
Parameter parameter = (Parameter) model;
parameter.addValueListener(this);
}
}
public Logger getLogger() {
return logger;
}
public void activate() {
if (isActive())
return;
super.activate();
if (getNamedObjectModel() instanceof Changeable) {
Changeable changeable = (Changeable) getNamedObjectModel();
changeable.addChangeListener(this);
}
}
public void deactivate() {
if (!isActive())
return;
if (getNamedObjectModel() instanceof Changeable) {
Changeable changeable = (Changeable) getNamedObjectModel();
changeable.removeChangeListener(this);
}
super.deactivate();
}
/**
* Creates and installs pertinent EditPolicies for this.
*/
protected void createEditPolicies() {
}
/**
* Returns the model of this as a NamedObj.
*
* @return Model of this.
*/
protected NamedObj getNamedObjectModel() {
return (NamedObj) getModel();
}
/**
* Returns <code>null</code> as a Tree EditPart holds no children under it.
*
* @return <code>null</code>
*/
protected List getModelChildren() {
NamedObj namedObjectModel = getNamedObjectModel();
List children = new ArrayList();
if (namedObjectModel instanceof AtomicActor) {
AtomicActor actor = (AtomicActor) namedObjectModel;
children.addAll(actor.attributeList(Parameter.class));
children.addAll(actor.inputPortList());
children.addAll(actor.outputPortList());
} else if (namedObjectModel instanceof CompositeActor) {
CompositeActor composite = (CompositeActor) namedObjectModel;
children.addAll(composite.attributeList(AtomicActor.class));
children.addAll(composite.attributeList(Parameter.class));
children.addAll(composite.inputPortList());
Enumeration enumeration = composite.getEntities();
while (enumeration.hasMoreElements()) {
children.add(enumeration.nextElement());
}
} else if (namedObjectModel instanceof IOPort) {
IOPort text = (IOPort) namedObjectModel;
children.addAll(text.attributeList(ptolemy.kernel.util.StringAttribute.class));
} else if (namedObjectModel instanceof Vertex) {
Vertex text = (Vertex) namedObjectModel;
children.addAll(text.attributeList(Vertex.class));
} else if (namedObjectModel instanceof TextAttribute) {
TextAttribute text = (TextAttribute) namedObjectModel;
children.addAll(text.attributeList(ptolemy.kernel.util.StringAttribute.class));
} else if (namedObjectModel instanceof Director) {
Director director = (Director) namedObjectModel;
children.addAll(director.attributeList(Parameter.class));
}
return children;
}
/**
* Refreshes the visual properties of the TreeItem for this part.
*/
protected void refreshVisuals() {
if (getWidget() instanceof Tree)
return;
NamedObj model = getNamedObjectModel();
// Set Image
if (model instanceof Director)
setWidgetImage(DirectorEditPart.IMAGE_DESCRIPTOR_DIRECTOR, model);
else if (model instanceof Parameter)
setWidgetImage(ActorEditPart.IMAGE_DESCRIPTOR_PARAMETER, model);
else if (model instanceof IOPort) {
IOPort port = (IOPort) model;
if (port.isInput())
setWidgetImage(ActorEditPart.IMAGE_DESCRIPTOR_INPUTPORT, model);
else
setWidgetImage(ActorEditPart.IMAGE_DESCRIPTOR_OUTPUTPORT, model);
} else if (model instanceof TypedAtomicActor) {
setWidgetImage(ActorEditPart.IMAGE_DESCRIPTOR_ACTOR, model);
} else if (model instanceof CompositeActor) {
setWidgetImage(PaletteBuilder.getInstance().getIcon(model.getClass()), model);
}
// Set Text
if (model instanceof Parameter) {
Parameter param = (Parameter) model;
String name = param.getName();
String value = param.getExpression();
setWidgetText(name + "=" + (value == null ? "" : value));
} else
setWidgetText(model.getName());
}
/**
* NOTE This can be called from non-UI thread!
*/
public void valueChanged(Settable settable) {
try {
getRoot().getViewer().getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
refreshVisuals();
}
});
} catch (Exception e) {
}
}
public void changeExecuted(ChangeRequest changerequest) {
try {
refreshVisuals();
refreshChildren();
} catch (Exception e) {
}
}
public void changeFailed(ChangeRequest changerequest, Exception exception) {
getLogger().error("Error during execution of ChangeRequest", exception);
}
protected void setWidgetImage(ImageDescriptor image, NamedObj obj) {
Image createImage = ImageRegistry.getInstance().getImage(image);
setWidgetImage(createImage);
// modelImages.add(createImage);
}
}