content: package oscfg.diagram.edit.parts;
  
  import java.util.ArrayList;
  import java.util.LinkedList;
  import java.util.List;
  
  import org.eclipse.draw2d.ColorConstants;
  import org.eclipse.draw2d.Graphics;
  import org.eclipse.draw2d.IFigure;
  import org.eclipse.draw2d.PositionConstants;
  import org.eclipse.draw2d.RoundedRectangle;
  import org.eclipse.draw2d.Shape;
  import org.eclipse.draw2d.StackLayout;
  import org.eclipse.draw2d.ToolbarLayout;
  import org.eclipse.draw2d.geometry.Dimension;
  import org.eclipse.gef.EditPart;
  import org.eclipse.gef.EditPolicy;
  import org.eclipse.gef.editpolicies.LayoutEditPolicy;
  import org.eclipse.gef.editpolicies.ResizableEditPolicy;
  import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
  import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
  import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
  import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConstrainedToolbarLayoutEditPolicy;
  import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
  import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
  import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
  import org.eclipse.gmf.runtime.emf.type.core.IElementType;
  import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
  import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
  import org.eclipse.gmf.runtime.notation.View;
  import org.eclipse.swt.graphics.Color;
  
  import oscfg.diagram.edit.policies.MutexItemSemanticEditPolicy;
  import oscfg.diagram.edit.policies.OscfgTextSelectionEditPolicy;
  import oscfg.diagram.part.OscfgVisualIDRegistry;
  import oscfg.diagram.providers.OscfgElementTypes;
  
  /**
   * @generated
   */
  public class MutexEditPart extends ShapeNodeEditPart {
  
  	/**
  	 * @generated
  	 */
  	public static final int VISUAL_ID = 3012;
  
  	/**
  	 * @generated
  	 */
  	protected IFigure contentPane;
  
  	/**
  	 * @generated
  	 */
  	protected IFigure primaryShape;
  
  	/**
  	 * @generated
  	 */
  	public MutexEditPart(View view) {
  		super(view);
  	}
  
  	/**
  	 * @generated
  	 */
  	protected void createDefaultEditPolicies() {
  		super.createDefaultEditPolicies();
  		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
  				new MutexItemSemanticEditPolicy());
  		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
  		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies
  		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);
  	}
  
  	/**
  	 * @generated
  	 */
  	protected LayoutEditPolicy createLayoutEditPolicy() {
  
  		ConstrainedToolbarLayoutEditPolicy lep = new ConstrainedToolbarLayoutEditPolicy() {
  
  			protected EditPolicy createChildEditPolicy(EditPart child) {
  				if (child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE) == null) {
  					if (child instanceof ITextAwareEditPart) {
  						return new OscfgTextSelectionEditPolicy();
  					}
  				}
  				return super.createChildEditPolicy(child);
  			}
  		};
  		return lep;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected IFigure createNodeShape() {
  		return primaryShape = new MutexFigure();
  	}
  
  	/**
  	 * @generated
  	 */
  	public MutexFigure getPrimaryShape() {
  		return (MutexFigure) primaryShape;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected boolean addFixedChild(EditPart childEditPart) {
  		if (childEditPart instanceof MutexNameEditPart) {
  			((MutexNameEditPart) childEditPart).setLabel(getPrimaryShape()
  					.getFigureMutexNameFigure());
  			return true;
  		}
  		return false;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected boolean removeFixedChild(EditPart childEditPart) {
  		if (childEditPart instanceof MutexNameEditPart) {
  			return true;
  		}
  		return false;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected void addChildVisual(EditPart childEditPart, int index) {
  		if (addFixedChild(childEditPart)) {
  			return;
  		}
  		super.addChildVisual(childEditPart, -1);
  	}
  
  	/**
  	 * @generated
  	 */
  	protected void removeChildVisual(EditPart childEditPart) {
  		if (removeFixedChild(childEditPart)) {
  			return;
  		}
  		super.removeChildVisual(childEditPart);
  	}
  
  	/**
  	 * @generated
  	 */
  	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
  		return getContentPane();
  	}
  
  	/**
  	 * @generated
  	 */
  	protected NodeFigure createNodePlate() {
  		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(0, 20);
  		return result;
  	}
  
  	/**
  	 * @generated
  	 */
  	public EditPolicy getPrimaryDragEditPolicy() {
  		EditPolicy result = super.getPrimaryDragEditPolicy();
  		if (result instanceof ResizableEditPolicy) {
  			ResizableEditPolicy ep = (ResizableEditPolicy) result;
  			ep.setResizeDirections(PositionConstants.WEST
  					| PositionConstants.EAST);
  		}
  		return result;
  	}
  
  	/**
  	 * Creates figure for this edit part.
  	 * 
  	 * Body of this method does not depend on settings in generation model
  	 * so you may safely remove <i>generated</i> tag and modify it.
  	 * 
  	 * @generated
  	 */
  	protected NodeFigure createNodeFigure() {
  		NodeFigure figure = createNodePlate();
  		figure.setLayoutManager(new StackLayout());
  		IFigure shape = createNodeShape();
  		figure.add(shape);
  		contentPane = setupContentPane(shape);
  		return figure;
  	}
  
  	/**
  	 * Default implementation treats passed figure as content pane.
  	 * Respects layout one may have set for generated figure.
  	 * @param nodeShape instance of generated figure class
  	 * @generated
  	 */
  	protected IFigure setupContentPane(IFigure nodeShape) {
  		if (nodeShape.getLayoutManager() == null) {
  			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
  			layout.setSpacing(5);
  			nodeShape.setLayoutManager(layout);
  		}
  		return nodeShape; // use nodeShape itself as contentPane
  	}
  
  	/**
  	 * @generated
  	 */
  	public IFigure getContentPane() {
  		if (contentPane != null) {
  			return contentPane;
  		}
  		return super.getContentPane();
  	}
  
  	/**
  	 * @generated
  	 */
  	protected void setForegroundColor(Color color) {
  		if (primaryShape != null) {
  			primaryShape.setForegroundColor(color);
  		}
  	}
  
  	/**
  	 * @generated
  	 */
  	protected void setBackgroundColor(Color color) {
  		if (primaryShape != null) {
  			primaryShape.setBackgroundColor(color);
  		}
  	}
  
  	/**
  	 * @generated
  	 */
  	protected void setLineWidth(int width) {
  		if (primaryShape instanceof Shape) {
  			((Shape) primaryShape).setLineWidth(width);
  		}
  	}
  
  	/**
  	 * @generated
  	 */
  	protected void setLineType(int style) {
  		if (primaryShape instanceof Shape) {
  			((Shape) primaryShape).setLineStyle(style);
  		}
  	}
  
  	/**
  	 * @generated
  	 */
  	public EditPart getPrimaryChildEditPart() {
  		return getChildBySemanticHint(OscfgVisualIDRegistry
  				.getType(MutexNameEditPart.VISUAL_ID));
  	}
  
  	/**
  	 * @generated
  	 */
  	public class MutexFigure extends RoundedRectangle {
  
  		/**
  		 * @generated
  		 */
  		private WrappingLabel fFigureMutexNameFigure;
  
  		/**
  		 * @generated
  		 */
  		public MutexFigure() {
  
  			ToolbarLayout layoutThis = new ToolbarLayout();
  			layoutThis.setStretchMinorAxis(true);
  			layoutThis.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
  
  			layoutThis.setSpacing(5);
  			layoutThis.setVertical(true);
  
  			this.setLayoutManager(layoutThis);
  
  			this.setCornerDimensions(new Dimension(getMapMode().DPtoLP(8),
  					getMapMode().DPtoLP(8)));
  			this.setBackgroundColor(THIS_BACK);
  			createContents();
  		}
  
  		/**
  		 * @generated
  		 */
  		private void createContents() {
  
  			fFigureMutexNameFigure = new WrappingLabel();
  			fFigureMutexNameFigure.setText("<...>");
  
  			this.add(fFigureMutexNameFigure);
  
  		}
  
  		/**
  		 * @generated
  		 */
  		private boolean myUseLocalCoordinates = false;
  
  		/**
  		 * @generated
  		 */
  		protected boolean useLocalCoordinates() {
  			return myUseLocalCoordinates;
  		}
  
  		/**
  		 * @generated
  		 */
  		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
  			myUseLocalCoordinates = useLocalCoordinates;
  		}
  
  		/**
  		 * @generated
  		 */
  		public WrappingLabel getFigureMutexNameFigure() {
  			return fFigureMutexNameFigure;
  		}
  
  		/**
  		 * @generated NOT
  		 */
  		protected void fillShape(Graphics graphics) {
  			Color bgColor = graphics.getBackgroundColor();
  			Color fgColor = graphics.getForegroundColor();
  			graphics.setBackgroundColor(ColorConstants.white);
  			graphics.setForegroundColor(THIS_BACK);
  			graphics.fillGradient(getBounds(), true);
  			graphics.setBackgroundColor(bgColor);
  			graphics.setForegroundColor(fgColor);
  		}
  
  	}
  
  	/**
  	 * @generated
  	 */
  	static final Color THIS_BACK = new Color(null, 230, 100, 100);
  
  }
  