Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortfesenko2010-07-22 14:34:07 +0000
committertfesenko2010-07-22 14:34:07 +0000
commit5dc875bc2700b9f28daabec4f4449fe4a90ee691 (patch)
tree7ce01fee22dfd939b6154a94ecd308ab62a3d9c0
parentc7098934fd93d12de585017fc5e007d912b19eff (diff)
downloadorg.eclipse.papyrus-5dc875bc2700b9f28daabec4f4449fe4a90ee691.tar.gz
org.eclipse.papyrus-5dc875bc2700b9f28daabec4f4449fe4a90ee691.tar.xz
org.eclipse.papyrus-5dc875bc2700b9f28daabec4f4449fe4a90ee691.zip
318000 - [Class Diagram] Refactor the creation / move / drag and drop behavior of the ContainmentLink - respect package header when placing a circle node
-rw-r--r--plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CContainmentCircleEditPart.java21
-rw-r--r--plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CPackageEditPart.java17
-rw-r--r--plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/locator/ContainmentCircleOnPackageLocator.java102
-rw-r--r--plugins/uml/org.eclipse.papyrus.diagram.common/src/org/eclipse/papyrus/diagram/common/figure/node/PackageNodePlateFigure.java35
4 files changed, 142 insertions, 33 deletions
diff --git a/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CContainmentCircleEditPart.java b/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CContainmentCircleEditPart.java
index 5b3a8731a14..8e9e9d17b87 100644
--- a/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CContainmentCircleEditPart.java
+++ b/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CContainmentCircleEditPart.java
@@ -13,10 +13,6 @@
*****************************************************************************/
package org.eclipse.papyrus.diagram.clazz.custom.edit.part;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.diagram.clazz.edit.parts.ContainmentCircleEditPart;
@@ -39,23 +35,6 @@ public class CContainmentCircleEditPart extends ContainmentCircleEditPart {
}
/**
- * Limit the size of the containment circle node size
- *
- **/
- protected void refreshBounds() {
- if(getBorderItemLocator() != null) {
- int x = ((Integer)getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_X())).intValue();
- int y = ((Integer)getStructuralFeatureValue(NotationPackage.eINSTANCE.getLocation_Y())).intValue();
- Point loc = new Point(x, y);
- Dimension size = new Dimension(20, 20);
- getBorderItemLocator().setConstraint(new Rectangle(loc, size));
-
- } else {
- super.refreshBounds();
- }
- }
-
- /**
* Modify the default size of the containment circle node
*/
protected org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure createNodePlate() {
diff --git a/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CPackageEditPart.java b/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CPackageEditPart.java
index d1cfa026ace..65de156b869 100644
--- a/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CPackageEditPart.java
+++ b/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/edit/part/CPackageEditPart.java
@@ -13,9 +13,13 @@
*****************************************************************************/
package org.eclipse.papyrus.diagram.clazz.custom.edit.part;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator;
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.papyrus.diagram.clazz.custom.locator.ContainmentCircleOnPackageLocator;
+import org.eclipse.papyrus.diagram.clazz.edit.parts.ContainmentCircleEditPart;
import org.eclipse.papyrus.diagram.clazz.edit.parts.PackageEditPart;
import org.eclipse.papyrus.diagram.common.figure.node.PackageNodePlateFigure;
@@ -36,4 +40,17 @@ public class CPackageEditPart extends PackageEditPart {
DefaultSizeNodeFigure result = new PackageNodePlateFigure(200, 100);
return result;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ protected boolean addFixedChild(EditPart childEditPart) {
+ if(childEditPart instanceof ContainmentCircleEditPart) {
+ IBorderItemLocator locator = new ContainmentCircleOnPackageLocator(getMainFigure());
+ getBorderedFigure().getBorderItemContainer().add(((ContainmentCircleEditPart)childEditPart).getFigure(), locator);
+ return true;
+ }
+ return super.addFixedChild(childEditPart);
+ }
+
}
diff --git a/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/locator/ContainmentCircleOnPackageLocator.java b/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/locator/ContainmentCircleOnPackageLocator.java
new file mode 100644
index 00000000000..ac40d86a996
--- /dev/null
+++ b/plugins/uml/org.eclipse.papyrus.diagram.clazz/custom-src/org/eclipse/papyrus/diagram/clazz/custom/locator/ContainmentCircleOnPackageLocator.java
@@ -0,0 +1,102 @@
+package org.eclipse.papyrus.diagram.clazz.custom.locator;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator;
+import org.eclipse.papyrus.diagram.common.figure.node.PackageNodePlateFigure;
+
+
+/**
+ * The Class ContainmentCircleOnPackageLocator.
+ */
+public class ContainmentCircleOnPackageLocator extends BorderItemLocator {
+
+ /** The Constant DEFAULT_BORDER_ITEM_OFFSET. */
+ private static final Dimension DEFAULT_BORDER_ITEM_OFFSET = new Dimension(1, 1);
+
+ /** The Constant DEFAULT_SIZE. */
+ private static final Dimension DEFAULT_SIZE = new Dimension(20, 20);
+
+ private Dimension originalBorderItemOffset = DEFAULT_BORDER_ITEM_OFFSET;
+
+ /**
+ * Instantiates a new containment circle on package locator.
+ *
+ * @param parentFigure the parent figure
+ */
+ public ContainmentCircleOnPackageLocator(IFigure parentFigure) {
+ super(parentFigure);
+ }
+
+ /**
+ * Instantiates a new containment circle on package locator.
+ *
+ * @param borderItem the border item
+ * @param parentFigure the parent figure
+ * @param constraint the constraint
+ */
+ public ContainmentCircleOnPackageLocator(IFigure borderItem, IFigure parentFigure, Rectangle constraint) {
+ super(borderItem, parentFigure, constraint);
+ }
+
+ /**
+ * Instantiates a new containment circle on package locator.
+ *
+ * @param parentFigure the parent figure
+ * @param preferredSide the preferred side
+ */
+ public ContainmentCircleOnPackageLocator(IFigure parentFigure, int preferredSide) {
+ super(parentFigure, preferredSide);
+ setConstraint(new Rectangle(new Point(0, 0), DEFAULT_SIZE));
+ }
+
+ /**
+ * @see org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator#setConstraint(org.eclipse.draw2d.geometry.Rectangle)
+ *
+ * @param theConstraint
+ */
+
+ @Override
+ public void setConstraint(Rectangle theConstraint) {
+ super.setConstraint(new Rectangle(theConstraint.getTopLeft(), DEFAULT_SIZE));
+ }
+
+ /**
+ * @see org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator#locateOnParent(org.eclipse.draw2d.geometry.Point, int, org.eclipse.draw2d.IFigure)
+ *
+ * @param suggestedLocation
+ * @param suggestedSide
+ * @param borderItem
+ * @return
+ */
+
+ @Override
+ protected Point locateOnParent(Point suggestedLocation, int suggestedSide, IFigure borderItem) {
+ PackageNodePlateFigure parent = (PackageNodePlateFigure)getParentFigure();
+ Rectangle headerBounds = parent.getPackageFigure().getHeader();
+ if(suggestedSide == PositionConstants.NORTH && !isOnHeader(suggestedLocation, headerBounds)) {
+ setBorderItemOffset(new Dimension(originalBorderItemOffset.width, headerBounds.height));
+ } else {
+ setBorderItemOffset(originalBorderItemOffset);
+ }
+ Point result = super.locateOnParent(suggestedLocation, suggestedSide, borderItem);
+ setBorderItemOffset(originalBorderItemOffset);
+ return result;
+ }
+
+ /**
+ * Checks if is on header.
+ *
+ * @param p the p
+ * @param headerBounds the header bounds
+ * @return true, if is on header
+ */
+ private boolean isOnHeader(Point p, Rectangle headerBounds) {
+ return p.x < headerBounds.getTopRight().x;
+ }
+
+
+}
diff --git a/plugins/uml/org.eclipse.papyrus.diagram.common/src/org/eclipse/papyrus/diagram/common/figure/node/PackageNodePlateFigure.java b/plugins/uml/org.eclipse.papyrus.diagram.common/src/org/eclipse/papyrus/diagram/common/figure/node/PackageNodePlateFigure.java
index 18b45bf1e7f..a662990b3cd 100644
--- a/plugins/uml/org.eclipse.papyrus.diagram.common/src/org/eclipse/papyrus/diagram/common/figure/node/PackageNodePlateFigure.java
+++ b/plugins/uml/org.eclipse.papyrus.diagram.common/src/org/eclipse/papyrus/diagram/common/figure/node/PackageNodePlateFigure.java
@@ -37,25 +37,36 @@ public class PackageNodePlateFigure extends DefaultSizeNodeFigure {
// TODO Auto-generated constructor stub
}
+ /**
+ * Gets the package figure, it's a child of PackageNodePlateFigure
+ *
+ * @return the package figure
+ */
+ public PackageFigure getPackageFigure() {
+ if(getChildren().size() > 0 && getChildren().get(0) instanceof PackageFigure) {
+ return (PackageFigure)getChildren().get(0);
+
+ }
+ return null;
+ }
+
// This returns as the anchoring area only the central line
@Override
public PointList getPolygonPoints() {
PointList points = new PointList(5);
Rectangle anchorableRectangle = getHandleBounds();
points.addPoint(anchorableRectangle.x, anchorableRectangle.y);
- // get the package figure, this is its soon
- if(this.getChildren().size() > 0) {
- // take in account the header of the package
- if(getChildren().get(0) instanceof PackageFigure) {
- PackageFigure packageFigure = (PackageFigure)getChildren().get(0);
- points.addPoint(anchorableRectangle.x + packageFigure.getHeader().width, anchorableRectangle.y);
- points.addPoint(anchorableRectangle.x + packageFigure.getHeader().width, anchorableRectangle.y + packageFigure.getHeader().height);
- points.addPoint(anchorableRectangle.x + anchorableRectangle.width, anchorableRectangle.y + packageFigure.getHeader().height);
- }// no header
- else {
- points.addPoint(anchorableRectangle.x + anchorableRectangle.width, anchorableRectangle.y);
- }
+ PackageFigure packageFigure = getPackageFigure();
+
+ if(packageFigure != null) {
+ // take in account the header of the package
+ points.addPoint(anchorableRectangle.x + packageFigure.getHeader().width, anchorableRectangle.y);
+ points.addPoint(anchorableRectangle.x + packageFigure.getHeader().width, anchorableRectangle.y + packageFigure.getHeader().height);
+ points.addPoint(anchorableRectangle.x + anchorableRectangle.width, anchorableRectangle.y + packageFigure.getHeader().height);
+ }// no header
+ else {
+ points.addPoint(anchorableRectangle.x + anchorableRectangle.width, anchorableRectangle.y);
}
points.addPoint(anchorableRectangle.x + anchorableRectangle.width, anchorableRectangle.y + anchorableRectangle.height);

Back to the top