/* Copyright 2012-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.snaker.designer.parts; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.AbsoluteBendpoint; import org.eclipse.draw2d.BendpointConnectionRouter; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.MouseMotionListener; import org.eclipse.draw2d.PolygonDecoration; import org.eclipse.draw2d.PolylineConnection; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.editparts.AbstractConnectionEditPart; import org.eclipse.ui.views.properties.IPropertySource; import org.snaker.designer.config.Component; import org.snaker.designer.config.ConfigManager; import org.snaker.designer.model.BaseElement; import org.snaker.designer.model.ModelHelper; import org.snaker.designer.model.ModelPropertySource; import org.snaker.designer.model.Transition; import org.snaker.designer.policies.ConnectionBendpointEditPolicy; import org.snaker.designer.policies.ConnectionEndpointEditPolicy; import org.snaker.designer.policies.TransitionEditPolicy; /** * Transition模型的EditPart * @author yuqs * @version 1.0 */ public class TransitionEditPart extends AbstractConnectionEditPart implements PropertyChangeListener { private IPropertySource propertySource = null; private int dx, dy, anchorX, anchorY; private Label label; public TransitionEditPart(Transition model) { setModel(model); } protected void createEditPolicies() { installEditPolicy(EditPolicy.CONNECTION_ROLE, new TransitionEditPolicy()); installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionEndpointEditPolicy()); installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new ConnectionBendpointEditPolicy()); } protected IFigure createFigure() { final PolylineConnection result = new PolylineConnection(); result.setForegroundColor(ColorConstants.gray); result.setConnectionRouter(new BendpointConnectionRouter()); result.setTargetDecoration(new PolygonDecoration()); result.setToolTip(new Label(getLabelName())); label = new Label(getLabelName()); label.setOpaque(true); result.add(label, new LabelMidpointOffsetLocator(result, 0, getTransition().getOffset())); label.addMouseListener(new MouseListener() { public void mouseDoubleClicked(MouseEvent me) { } public void mousePressed(MouseEvent me) { anchorX = me.x; anchorY = me.y; me.consume(); getViewer().appendSelection(TransitionEditPart.this); } public void mouseReleased(MouseEvent me) { me.consume(); } }); label.addMouseMotionListener(new MouseMotionListener() { public void mouseDragged(MouseEvent me) { dx += me.x - anchorX; dy += me.y - anchorY; anchorX = me.x; anchorY = me.y; Object constraint = result.getLayoutManager().getConstraint( label); if (constraint instanceof LabelMidpointOffsetLocator) { Point offset = new Point(dx, dy); ((LabelMidpointOffsetLocator) constraint).setOffset(offset); label.revalidate(); getTransition().setOffset(offset); } me.consume(); } @Override public void mouseEntered(MouseEvent arg0) { } @Override public void mouseExited(MouseEvent arg0) { } @Override public void mouseHover(MouseEvent arg0) { } @Override public void mouseMoved(MouseEvent arg0) { } }); return result; } @SuppressWarnings("rawtypes") public Object getAdapter(Class key) { if (IPropertySource.class == key) { return getPropertySource(); } return super.getAdapter(key); } protected IPropertySource getPropertySource() { if (this.propertySource == null) { Component component = ConfigManager.getComponentByName( ConfigManager.COMPONENT_TYPE_TRANSITION); ModelHelper.loadAttribute((BaseElement) getModel(), component); this.propertySource = new ModelPropertySource(getTransition(), component); } return this.propertySource; } protected void refreshVisuals() { refreshBendpoints(); } public void setSelected(int value) { super.setSelected(value); if (value != EditPart.SELECTED_NONE) ((PolylineConnection) getFigure()).setLineWidth(2); else ((PolylineConnection) getFigure()).setLineWidth(1); } public void activate() { super.activate(); getTransition().addPropertyChangeListener(this); } public void deactivate() { super.deactivate(); getTransition().removePropertyChangeListener(this); } @Override public void propertyChange(PropertyChangeEvent evt) { String property = evt.getPropertyName(); if (Transition.PROP_BENDPOINT.equals(property)) refreshBendpoints(); else if (Transition.PROP_DISPLAYNAME.equals(property)) refreshLabel(); else { refreshVisuals(); refreshLabel(); } } protected void refreshBendpoints() { List<Point> bendpoints = getTransition().getBendpoints(); List<Point> constraint = new ArrayList<Point>(); for (int i = 0; i < bendpoints.size(); i++) { constraint.add(new AbsoluteBendpoint((Point) bendpoints.get(i))); } getConnectionFigure().setRoutingConstraint(constraint); } protected void refreshLabel() { this.label.setText(getLabelName()); } private Transition getTransition() { return (Transition) getModel(); } private String getLabelName() { return getTransition().getDisplayName(); } }