/**
* @author liuchunxia
*
* edit wire
*/
package net.ms.designer.editors.workflow.editparts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.ms.designer.editors.workflow.figures.FigureFactory;
import net.ms.designer.editors.workflow.models.Wire;
import net.ms.designer.editors.workflow.models.WireBendPoint;
import net.ms.designer.editors.workflow.policies.WireBendPointEditPolicy;
import net.ms.designer.editors.workflow.policies.WireEditPolicy;
import net.ms.designer.editors.workflow.policies.WireEndpointEditPolicy;
import net.ms.designer.editors.workflow.policies.WirePropertyEditPolicy;
import net.ms.designer.editors.workflow.policies.WorkflowPropertyEditPolicy;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.RelativeBendpoint;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.NodeEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.editparts.AbstractConnectionEditPart;
import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
public class WireEditPart extends AbstractConnectionEditPart implements PropertyChangeListener, NodeEditPart{
AccessibleEditPart acc;
public static final Color alive = new Color(Display.getDefault(), 0, 74,
168), dead = new Color(Display.getDefault(), 0, 0, 0);
public void activate() {
// //System.out.println("WireEditAPart.activate");
super.activate();
((Wire) getModel()).addPropertyChangeListener(this);
}
public void deactivate() {
super.deactivate();
((Wire) getModel()).removePropertyChangeListener(this);
}
public void activateFigure() {
super.activateFigure();
getFigure().addPropertyChangeListener(
Connection.PROPERTY_CONNECTION_ROUTER, this);
}
// public void propertyChange(PropertyChangeEvent event) {
// // TODO Auto-generated method stub
// String property = event.getPropertyName();
// if (Wire.PROP_BENDPOINT.toLowerCase().equals(property.toLowerCase())) {
// refreshBendpoints();
// }
// }
/**
* Listens to changes in properties of the Wire (like the contents being
* carried), and reflects is in the visuals.
*
* @param event
* Event notifying the change.
*/
public void propertyChange(PropertyChangeEvent event) {
String property = event.getPropertyName();
if (Connection.PROPERTY_CONNECTION_ROUTER.equals(property)) {
refreshBendpoints();
refreshBendpointEditPolicy();
}else if(Wire.ID_DESCRIPTION.equals(property))
refreshDescription();
if ("value".equals(property)) //$NON-NLS-1$
refreshVisuals();
if ("bendpoint".equals(property)) //$NON-NLS-1$
refreshBendpoints();
}
public void refreshDescription(){
List l = getFigure().getChildren();
for(Iterator i = l.iterator();i.hasNext();){
IFigure f = (IFigure)i.next();
if(f instanceof Label){
Label label = (Label)f;
String strTemp = ((Wire)getModel()).getDescription();
if(strTemp.trim().equals("")){
label.setOpaque(false);
}else{
label.setOpaque(true);
}
label.setText(strTemp);
}
}
}
protected void refreshBendpoints() {
Wire conn = (Wire) getModel();
List modelConstraint = conn.getBendPointsList();
List figureConstraint = new ArrayList();
for (int i = 0; i < modelConstraint.size(); i++) {
WireBendPoint cbp = (WireBendPoint) modelConstraint
.get(i);
RelativeBendpoint rbp = new RelativeBendpoint(getConnectionFigure());
rbp.setRelativeDimensions(cbp.getFirstRelativeDimension(), cbp
.getSecondRelativeDimension());
rbp.setWeight((i + 1) / ((float) modelConstraint.size() + 1));
figureConstraint.add(rbp);
}
getConnectionFigure().setRoutingConstraint(figureConstraint);
}
private void refreshBendpointEditPolicy() {
// if (getConnectionFigure().getConnectionRouter() instanceof ManhattanConnectionRouter
// ||
// !((Wire)getModel()).ifEditAble())
// installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, null);
// else
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
new WireBendPointEditPolicy());
}
protected void refreshVisuals() {
refreshBendpoints();
}
/**
* Adds extra EditPolicies as required.
*/
protected void createEditPolicies() {
installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
new WireEndpointEditPolicy());
installEditPolicy(EditPolicy.CONNECTION_ROLE, new WireEditPolicy());
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
new WireBendPointEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE,new WirePropertyEditPolicy());
}
public void setSelected(int value) {
super.setSelected(value);
if (value != EditPart.SELECTED_NONE)
((PolylineConnection) getFigure()).setLineWidth(2);
else
((PolylineConnection) getFigure()).setLineWidth(1);
}
/**
* Returns a newly created Figure to represent the connection.
*
* @return The created Figure.
*/
protected IFigure createFigure() {
if ((Wire)getModel() == null)
return null;
Connection connx = FigureFactory.createNewBendableWire((Wire) getModel());
// //System.out.println("wireEditPart.createFigure");
return connx;
}
/**
* Returns the Figure associated with this, which draws the Wire.
*
* @return Figure of this.
*/
protected IFigure getWireFigure() {
return (PolylineConnection) getFigure();
}
public AccessibleEditPart getAccessibleEditPart() {
if (acc == null)
acc = new AccessibleGraphicalEditPart() {
public void getName(AccessibleEvent e) {
e.result = "LogicMessages.Wire_LabelText";
}
};
// //System.out.println("wireEditPart.getAccessibleEditPart");
return acc;
}
public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) {
// //System.out.println("com.example.parts.NodePart.getSourceConnectionAnchor(ConnectionEditPart connection)");
return new ChopboxAnchor(getFigure());
}
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
// //System.out.println("com.example.parts.NodePart.getSourceConnectionAnchor(Request request)");
return new ChopboxAnchor(getFigure());
}
public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) {
// //System.out.println("com.example.parts.NodePart.getTargetConnectionAnchor(ConnectionEditPart connection)");
return new ChopboxAnchor(getFigure());
}
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
// //System.out.println("com.example.parts.NodePart.getTargetConnectionAnchor(Request request)");
return new ChopboxAnchor(getFigure());
}
}