Go to the documentation of this file.00001 package org.ros.model.ros.diagram.edit.parts;
00002
00003 import org.eclipse.draw2d.ColorConstants;
00004 import org.eclipse.draw2d.Graphics;
00005 import org.eclipse.draw2d.GridData;
00006 import org.eclipse.draw2d.GridLayout;
00007 import org.eclipse.draw2d.IFigure;
00008 import org.eclipse.draw2d.MarginBorder;
00009 import org.eclipse.draw2d.PositionConstants;
00010 import org.eclipse.draw2d.RectangleFigure;
00011 import org.eclipse.draw2d.RoundedRectangle;
00012 import org.eclipse.draw2d.Shape;
00013 import org.eclipse.draw2d.StackLayout;
00014 import org.eclipse.draw2d.geometry.Dimension;
00015 import org.eclipse.draw2d.geometry.Rectangle;
00016 import org.eclipse.gef.EditPart;
00017 import org.eclipse.gef.EditPolicy;
00018 import org.eclipse.gef.Request;
00019 import org.eclipse.gef.commands.Command;
00020 import org.eclipse.gef.editpolicies.LayoutEditPolicy;
00021 import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
00022 import org.eclipse.gef.requests.CreateRequest;
00023 import org.eclipse.gmf.runtime.diagram.core.edithelpers.CreateElementRequestAdapter;
00024 import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart;
00025 import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
00026 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
00027 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy;
00028 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
00029 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
00030 import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator;
00031 import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewAndElementRequest;
00032 import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
00033 import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
00034 import org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeUtil;
00035 import org.eclipse.gmf.runtime.emf.type.core.IElementType;
00036 import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
00037 import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
00038 import org.eclipse.gmf.runtime.notation.View;
00039 import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;
00040 import org.eclipse.swt.SWT;
00041 import org.eclipse.swt.graphics.Color;
00042 import org.eclipse.swt.graphics.Font;
00043 import org.eclipse.swt.widgets.Display;
00044 import org.ros.model.ros.diagram.edit.policies.NodeCanonicalEditPolicy;
00045 import org.ros.model.ros.diagram.edit.policies.NodeItemSemanticEditPolicy;
00046 import org.ros.model.ros.diagram.part.RosVisualIDRegistry;
00047 import org.ros.model.ros.diagram.providers.RosElementTypes;
00048
00052 public class NodeEditPart extends AbstractBorderedShapeEditPart {
00053
00057 public static final int VISUAL_ID = 3001;
00058
00062 protected IFigure contentPane;
00063
00067 protected IFigure primaryShape;
00068
00072 public NodeEditPart(View view) {
00073 super(view);
00074 }
00075
00079 protected void createDefaultEditPolicies() {
00080 installEditPolicy(EditPolicyRoles.CREATION_ROLE,
00081 new CreationEditPolicyWithCustomReparent(
00082 RosVisualIDRegistry.TYPED_INSTANCE));
00083 super.createDefaultEditPolicies();
00084 installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
00085 new NodeItemSemanticEditPolicy());
00086 installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,
00087 new DragDropEditPolicy());
00088 installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
00089 new NodeCanonicalEditPolicy());
00090 installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
00091
00092
00093 }
00094
00098 protected LayoutEditPolicy createLayoutEditPolicy() {
00099 org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {
00100
00101 protected EditPolicy createChildEditPolicy(EditPart child) {
00102 View childView = (View) child.getModel();
00103 switch (RosVisualIDRegistry.getVisualID(childView)) {
00104 case PublisherEditPart.VISUAL_ID:
00105 case SubscriberEditPart.VISUAL_ID:
00106 case ActionServerEditPart.VISUAL_ID:
00107 case ActionClientEditPart.VISUAL_ID:
00108 case ServiceServerEditPart.VISUAL_ID:
00109 case ServiceClientEditPart.VISUAL_ID:
00110 return new BorderItemSelectionEditPolicy();
00111 }
00112 EditPolicy result = child
00113 .getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
00114 if (result == null) {
00115 result = new NonResizableEditPolicy();
00116 }
00117 return result;
00118 }
00119
00120 protected Command getMoveChildrenCommand(Request request) {
00121 return null;
00122 }
00123
00124 protected Command getCreateCommand(CreateRequest request) {
00125 return null;
00126 }
00127 };
00128 return lep;
00129 }
00130
00134 protected IFigure createNodeShape() {
00135 return primaryShape = new NodeFigure2();
00136 }
00137
00141 public NodeFigure2 getPrimaryShape() {
00142 return (NodeFigure2) primaryShape;
00143 }
00144
00148 protected boolean addFixedChild(EditPart childEditPart) {
00149 if (childEditPart instanceof NodeNameEditPart) {
00150 ((NodeNameEditPart) childEditPart).setLabel(getPrimaryShape()
00151 .getFigureNodeNameFigure());
00152 return true;
00153 }
00154 if (childEditPart instanceof NodeParametersEditPart) {
00155 IFigure pane = getPrimaryShape()
00156 .getFigureParameterCompartmentFigure();
00157 setupContentPane(pane);
00158 pane.add(((NodeParametersEditPart) childEditPart).getFigure());
00159 return true;
00160 }
00161 if (childEditPart instanceof PublisherEditPart) {
00162 BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
00163 PositionConstants.EAST);
00164 getBorderedFigure().getBorderItemContainer().add(
00165 ((PublisherEditPart) childEditPart).getFigure(), locator);
00166 return true;
00167 }
00168 if (childEditPart instanceof SubscriberEditPart) {
00169 BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
00170 PositionConstants.WEST);
00171 getBorderedFigure().getBorderItemContainer().add(
00172 ((SubscriberEditPart) childEditPart).getFigure(), locator);
00173 return true;
00174 }
00175 if (childEditPart instanceof ActionServerEditPart) {
00176 BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
00177 PositionConstants.EAST);
00178 getBorderedFigure().getBorderItemContainer()
00179 .add(((ActionServerEditPart) childEditPart).getFigure(),
00180 locator);
00181 return true;
00182 }
00183 if (childEditPart instanceof ActionClientEditPart) {
00184 BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
00185 PositionConstants.WEST);
00186 getBorderedFigure().getBorderItemContainer()
00187 .add(((ActionClientEditPart) childEditPart).getFigure(),
00188 locator);
00189 return true;
00190 }
00191 if (childEditPart instanceof ServiceServerEditPart) {
00192 BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
00193 PositionConstants.EAST);
00194 getBorderedFigure().getBorderItemContainer().add(
00195 ((ServiceServerEditPart) childEditPart).getFigure(),
00196 locator);
00197 return true;
00198 }
00199 if (childEditPart instanceof ServiceClientEditPart) {
00200 BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
00201 PositionConstants.WEST);
00202 getBorderedFigure().getBorderItemContainer().add(
00203 ((ServiceClientEditPart) childEditPart).getFigure(),
00204 locator);
00205 return true;
00206 }
00207 return false;
00208 }
00209
00213 protected boolean removeFixedChild(EditPart childEditPart) {
00214 if (childEditPart instanceof NodeNameEditPart) {
00215 return true;
00216 }
00217 if (childEditPart instanceof NodeParametersEditPart) {
00218 IFigure pane = getPrimaryShape()
00219 .getFigureParameterCompartmentFigure();
00220 pane.remove(((NodeParametersEditPart) childEditPart).getFigure());
00221 return true;
00222 }
00223 if (childEditPart instanceof PublisherEditPart) {
00224 getBorderedFigure().getBorderItemContainer().remove(
00225 ((PublisherEditPart) childEditPart).getFigure());
00226 return true;
00227 }
00228 if (childEditPart instanceof SubscriberEditPart) {
00229 getBorderedFigure().getBorderItemContainer().remove(
00230 ((SubscriberEditPart) childEditPart).getFigure());
00231 return true;
00232 }
00233 if (childEditPart instanceof ActionServerEditPart) {
00234 getBorderedFigure().getBorderItemContainer().remove(
00235 ((ActionServerEditPart) childEditPart).getFigure());
00236 return true;
00237 }
00238 if (childEditPart instanceof ActionClientEditPart) {
00239 getBorderedFigure().getBorderItemContainer().remove(
00240 ((ActionClientEditPart) childEditPart).getFigure());
00241 return true;
00242 }
00243 if (childEditPart instanceof ServiceServerEditPart) {
00244 getBorderedFigure().getBorderItemContainer().remove(
00245 ((ServiceServerEditPart) childEditPart).getFigure());
00246 return true;
00247 }
00248 if (childEditPart instanceof ServiceClientEditPart) {
00249 getBorderedFigure().getBorderItemContainer().remove(
00250 ((ServiceClientEditPart) childEditPart).getFigure());
00251 return true;
00252 }
00253 return false;
00254 }
00255
00259 protected void addChildVisual(EditPart childEditPart, int index) {
00260 if (addFixedChild(childEditPart)) {
00261 return;
00262 }
00263 super.addChildVisual(childEditPart, -1);
00264 }
00265
00269 protected void removeChildVisual(EditPart childEditPart) {
00270 if (removeFixedChild(childEditPart)) {
00271 return;
00272 }
00273 super.removeChildVisual(childEditPart);
00274 }
00275
00279 protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
00280 if (editPart instanceof NodeParametersEditPart) {
00281 return getPrimaryShape().getFigureParameterCompartmentFigure();
00282 }
00283 if (editPart instanceof IBorderItemEditPart) {
00284 return getBorderedFigure().getBorderItemContainer();
00285 }
00286 return getContentPane();
00287 }
00288
00292 protected NodeFigure createNodePlate() {
00293 DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);
00294 return result;
00295 }
00296
00305 protected NodeFigure createMainFigure() {
00306 NodeFigure figure = createNodePlate();
00307 figure.setLayoutManager(new StackLayout());
00308 IFigure shape = createNodeShape();
00309 figure.add(shape);
00310 contentPane = setupContentPane(shape);
00311 return figure;
00312 }
00313
00320 protected IFigure setupContentPane(IFigure nodeShape) {
00321 if (nodeShape.getLayoutManager() == null) {
00322 ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
00323 layout.setSpacing(5);
00324 nodeShape.setLayoutManager(layout);
00325 }
00326 return nodeShape;
00327 }
00328
00332 public IFigure getContentPane() {
00333 if (contentPane != null) {
00334 return contentPane;
00335 }
00336 return super.getContentPane();
00337 }
00338
00342 protected void setForegroundColor(Color color) {
00343 if (primaryShape != null) {
00344 primaryShape.setForegroundColor(color);
00345 }
00346 }
00347
00351 protected void setBackgroundColor(Color color) {
00352 if (primaryShape != null) {
00353 primaryShape.setBackgroundColor(color);
00354 }
00355 }
00356
00360 protected void setLineWidth(int width) {
00361 if (primaryShape instanceof Shape) {
00362 ((Shape) primaryShape).setLineWidth(width);
00363 }
00364 }
00365
00369 protected void setLineType(int style) {
00370 if (primaryShape instanceof Shape) {
00371 ((Shape) primaryShape).setLineStyle(style);
00372 }
00373 }
00374
00378 public EditPart getPrimaryChildEditPart() {
00379 return getChildBySemanticHint(RosVisualIDRegistry
00380 .getType(NodeNameEditPart.VISUAL_ID));
00381 }
00382
00386 public EditPart getTargetEditPart(Request request) {
00387 if (request instanceof CreateViewAndElementRequest) {
00388 CreateElementRequestAdapter adapter = ((CreateViewAndElementRequest) request)
00389 .getViewAndElementDescriptor()
00390 .getCreateElementRequestAdapter();
00391 IElementType type = (IElementType) adapter
00392 .getAdapter(IElementType.class);
00393 if (type == RosElementTypes.Parameter_3002) {
00394 return getChildBySemanticHint(RosVisualIDRegistry
00395 .getType(NodeParametersEditPart.VISUAL_ID));
00396 }
00397 }
00398 return super.getTargetEditPart(request);
00399 }
00400
00404 public class NodeFigure2 extends RoundedRectangle {
00405 public static final int BLUR_SHADOW_WIDTH = 5;
00406
00407 @Override
00408 public void paintFigure(Graphics graphics) {
00409 drawBlurredShadow(graphics);
00410 super.paintFigure(graphics);
00411 }
00412
00413 private void drawBlurredShadow(Graphics graphics) {
00414
00415 graphics.pushState();
00416
00417 int size = MapModeUtil.getMapMode(this).DPtoLP(BLUR_SHADOW_WIDTH);
00418 int step = MapModeUtil.getMapMode(this).DPtoLP(-1);
00419
00420 graphics.setForegroundColor(ColorConstants.gray);
00421 graphics.setLineWidth(MapModeUtil.getMapMode(this).DPtoLP(2));
00422 graphics.translate(size, size);
00423 graphics.setClip(graphics.getClip(new Rectangle(getBounds()))
00424 .expand(size, size));
00425 graphics.setAlpha(20);
00426 outlineShape(graphics);
00427 graphics.translate(step, step);
00428 graphics.setAlpha(30);
00429 outlineShape(graphics);
00430 graphics.translate(step, step);
00431 graphics.setAlpha(60);
00432 outlineShape(graphics);
00433 graphics.translate(step, step);
00434 graphics.setAlpha(100);
00435 outlineShape(graphics);
00436 graphics.translate(step, step);
00437 graphics.setAlpha(150);
00438 outlineShape(graphics);
00439
00440 graphics.popState();
00441 }
00442
00446 private WrappingLabel fFigureNodeNameFigure;
00450 private RectangleFigure fFigureParameterCompartmentFigure;
00451
00455 public NodeFigure2() {
00456
00457 GridLayout layoutThis = new GridLayout();
00458 layoutThis.numColumns = 1;
00459 layoutThis.makeColumnsEqualWidth = true;
00460 this.setLayoutManager(layoutThis);
00461
00462 this.setCornerDimensions(new Dimension(getMapMode().DPtoLP(20),
00463 getMapMode().DPtoLP(20)));
00464 this.setLineWidth(2);
00465 this.setMinimumSize(new Dimension(getMapMode().DPtoLP(240),
00466 getMapMode().DPtoLP(180)));
00467 createContents();
00468 }
00469
00473 private void createContents() {
00474
00475 RectangleFigure nodeTopFigure0 = new RectangleFigure();
00476
00477 nodeTopFigure0.setForegroundColor(NODETOPFIGURE0_FORE);
00478
00479 nodeTopFigure0.setBorder(new MarginBorder(getMapMode().DPtoLP(5),
00480 getMapMode().DPtoLP(5), getMapMode().DPtoLP(5),
00481 getMapMode().DPtoLP(5)));
00482
00483 GridData constraintNodeTopFigure0 = new GridData();
00484 constraintNodeTopFigure0.verticalAlignment = GridData.BEGINNING;
00485 constraintNodeTopFigure0.horizontalAlignment = GridData.FILL;
00486 constraintNodeTopFigure0.horizontalIndent = 0;
00487 constraintNodeTopFigure0.horizontalSpan = 1;
00488 constraintNodeTopFigure0.verticalSpan = 1;
00489 constraintNodeTopFigure0.grabExcessHorizontalSpace = true;
00490 constraintNodeTopFigure0.grabExcessVerticalSpace = false;
00491 this.add(nodeTopFigure0, constraintNodeTopFigure0);
00492
00493 GridLayout layoutNodeTopFigure0 = new GridLayout();
00494 layoutNodeTopFigure0.numColumns = 1;
00495 layoutNodeTopFigure0.makeColumnsEqualWidth = true;
00496 nodeTopFigure0.setLayoutManager(layoutNodeTopFigure0);
00497
00498 fFigureNodeNameFigure = new WrappingLabel();
00499
00500 fFigureNodeNameFigure.setText("<...>");
00501
00502 fFigureNodeNameFigure.setFont(FFIGURENODENAMEFIGURE_FONT);
00503
00504 GridData constraintFFigureNodeNameFigure = new GridData();
00505 constraintFFigureNodeNameFigure.verticalAlignment = GridData.BEGINNING;
00506 constraintFFigureNodeNameFigure.horizontalAlignment = GridData.BEGINNING;
00507 constraintFFigureNodeNameFigure.horizontalIndent = 0;
00508 constraintFFigureNodeNameFigure.horizontalSpan = 3;
00509 constraintFFigureNodeNameFigure.verticalSpan = 1;
00510 constraintFFigureNodeNameFigure.grabExcessHorizontalSpace = false;
00511 constraintFFigureNodeNameFigure.grabExcessVerticalSpace = false;
00512 nodeTopFigure0.add(fFigureNodeNameFigure,
00513 constraintFFigureNodeNameFigure);
00514
00515 fFigureParameterCompartmentFigure = new RectangleFigure();
00516
00517 fFigureParameterCompartmentFigure.setFill(false);
00518
00519 GridData constraintFFigureParameterCompartmentFigure = new GridData();
00520 constraintFFigureParameterCompartmentFigure.verticalAlignment = GridData.FILL;
00521 constraintFFigureParameterCompartmentFigure.horizontalAlignment = GridData.FILL;
00522 constraintFFigureParameterCompartmentFigure.horizontalIndent = 0;
00523 constraintFFigureParameterCompartmentFigure.horizontalSpan = 1;
00524 constraintFFigureParameterCompartmentFigure.verticalSpan = 1;
00525 constraintFFigureParameterCompartmentFigure.grabExcessHorizontalSpace = true;
00526 constraintFFigureParameterCompartmentFigure.grabExcessVerticalSpace = true;
00527 this.add(fFigureParameterCompartmentFigure,
00528 constraintFFigureParameterCompartmentFigure);
00529
00530 fFigureParameterCompartmentFigure
00531 .setLayoutManager(new StackLayout());
00532
00533 }
00534
00538 public WrappingLabel getFigureNodeNameFigure() {
00539 return fFigureNodeNameFigure;
00540 }
00541
00545 public RectangleFigure getFigureParameterCompartmentFigure() {
00546 return fFigureParameterCompartmentFigure;
00547 }
00548
00549 }
00550
00554 static final Color NODETOPFIGURE0_FORE = new Color(null, 236, 232, 233);
00555
00559 static final Font FFIGURENODENAMEFIGURE_FONT = new Font(
00560 Display.getCurrent(), Display.getDefault().getSystemFont()
00561 .getFontData()[0].getName(), 10, SWT.BOLD);
00562
00563 }