https://bugs.eclipse.org/bugs/show_bug.cgi?id=385433 - added ability to override shape sizes with default values
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIImport.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIImport.java
index a28e22f..b548ee0 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIImport.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIImport.java
@@ -44,10 +44,13 @@
 import org.eclipse.bpmn2.di.BpmnDiFactory;
 import org.eclipse.bpmn2.modeler.core.Activator;
 import org.eclipse.bpmn2.modeler.core.ModelHandler;
+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
+import org.eclipse.bpmn2.modeler.core.preferences.ShapeStyle;
 import org.eclipse.bpmn2.modeler.core.utils.AnchorUtil;
 import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
 import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
 import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Size;
 import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -67,6 +70,7 @@
 import org.eclipse.graphiti.features.context.impl.AddContext;
 import org.eclipse.graphiti.features.context.impl.AreaContext;
 import org.eclipse.graphiti.features.context.impl.LayoutContext;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
 import org.eclipse.graphiti.mm.algorithms.Rectangle;
 import org.eclipse.graphiti.mm.pictograms.AnchorContainer;
 import org.eclipse.graphiti.mm.pictograms.Connection;
@@ -93,6 +97,7 @@
 	private ModelHandler modelHandler;
 	private IFeatureProvider featureProvider;
 	private HashMap<BaseElement, PictogramElement> elements;
+	private Bpmn2Preferences preferences;
 	private final IPeService peService = Graphiti.getPeService();
 	private final IGaService gaService = Graphiti.getGaService();
 
@@ -137,6 +142,9 @@
 				
 				// do the import
 				for (BPMNDiagram d : bpmnDiagrams) {
+					if (preferences==null)
+						preferences = Bpmn2Preferences.getInstance(d);
+					
 					diagram = DIUtils.getOrCreateDiagram(editor,d);
 					editor.getDiagramTypeProvider().init(diagram, editor);
 
@@ -160,20 +168,20 @@
 	}
 	
 	private void layoutAll() {
-//		final List<BPMNDiagram> diagrams = modelHandler.getAll(BPMNDiagram.class);
+		final List<BPMNDiagram> diagrams = modelHandler.getAll(BPMNDiagram.class);
 //		for (BPMNDiagram d : diagrams) {
 //			BPMNPlane plane = d.getPlane();
 //			for (DiagramElement de : plane.getPlaneElement()) {
 //				if (de instanceof BPMNShape) {
 //					BaseElement be = ((BPMNShape) de).getBpmnElement();
-//					PictogramElement pe = elements.get(businessObject);
+//					PictogramElement pe = elements.get(be);
 //					if (pe instanceof Shape ) {
 //						Graphiti.getPeService().sendToFront((Shape)pe);
 //					}
 //				}
 //			}
 //		}
-		
+
 		for (BaseElement be : elements.keySet()) {
 			if (be instanceof SubProcess) { // we need the layout to hide children if collapsed
 				PictogramElement pe = elements.get(be);
@@ -185,6 +193,13 @@
 				if (feature.canLayout(context))
 					feature.layout(context);
 			}
+			else if (be instanceof FlowNode) {
+				PictogramElement pe = elements.get(be);
+				LayoutContext context = new LayoutContext(pe);
+				ILayoutFeature feature = featureProvider.getLayoutFeature(context);
+				if (feature!=null && feature.canLayout(context))
+					feature.layout(context);
+			}
 		}
 	}
 
@@ -368,8 +383,22 @@
 
 		context.putProperty(IMPORT_PROPERTY, true);
 		context.setNewObject(bpmnElement);
-
-		context.setSize((int) shape.getBounds().getWidth(), (int) shape.getBounds().getHeight());
+		boolean defaultSize = false;
+		ShapeStyle ss = preferences.getShapeStyle(bpmnElement);
+		if (ss!=null)
+			defaultSize = ss.isDefaultSize();
+		
+		if (defaultSize) {
+			Size size = GraphicsUtil.getShapeSize(bpmnElement,diagram);
+			if (size!=null)
+				context.setSize(size.getWidth(),size.getHeight());
+			else
+				defaultSize = false;
+		}
+		
+		if (!defaultSize) {
+			context.setSize((int) shape.getBounds().getWidth(), (int) shape.getBounds().getHeight());
+		}
 
 		if ( (bpmnElement instanceof SubProcess) && !shape.isIsExpanded()) {
 			context.setSize(GraphicsUtil.getActivitySize(diagram).getWidth(), GraphicsUtil.getActivitySize(diagram).getHeight());
@@ -401,13 +430,14 @@
 					if (o instanceof Participant)
 						elements.put((Participant)o, pe);
 				}
-			} else if (bpmnElement instanceof Event) {
-				GraphicsUtil.setEventSize(context.getWidth(), context.getHeight(), diagram);
-			} else if (bpmnElement instanceof Gateway) {
-				GraphicsUtil.setGatewaySize(context.getWidth(), context.getHeight(), diagram);
-			} else if (bpmnElement instanceof Activity && !(bpmnElement instanceof SubProcess)) {
-				GraphicsUtil.setActivitySize(context.getWidth(), context.getHeight(), diagram);
 			}
+//			else if (bpmnElement instanceof Event) {
+//				GraphicsUtil.setEventSize(context.getWidth(), context.getHeight(), diagram);
+//			} else if (bpmnElement instanceof Gateway) {
+//				GraphicsUtil.setGatewaySize(context.getWidth(), context.getHeight(), diagram);
+//			} else if (bpmnElement instanceof Activity && !(bpmnElement instanceof SubProcess)) {
+//				GraphicsUtil.setActivitySize(context.getWidth(), context.getHeight(), diagram);
+//			}
 			
 			elements.put(bpmnElement, newContainer);
 			handleEvents(bpmnElement, newContainer);
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ShapeStyle.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ShapeStyle.java
index c01db8d..6a62568 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ShapeStyle.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ShapeStyle.java
@@ -38,6 +38,7 @@
 	IColorConstant shapeForeground;
 	Font textFont;
 	IColorConstant textColor;
+	boolean defaultSize;
 	boolean dirty;
 
 	public ShapeStyle() {
@@ -62,16 +63,27 @@
 		if (font==null || font.isEmpty())
 			font = DEFAULT_FONT_STRING;
 		textFont = stringToFont(font);
+		defaultSize = true;
 	}
 	
 	protected ShapeStyle(String s) {
 		String[] a = s.trim().split(";");
-		shapeBackground = stringToColor(a[0]);
-		shapePrimarySelectedColor = stringToColor(a[1]);
-		shapeSecondarySelectedColor = stringToColor(a[2]);
-		shapeForeground = stringToColor(a[3]);
-		textFont = stringToFont(a[4]);
-		textColor = stringToColor(a[5]);
+		if (a.length>0)
+			shapeBackground = stringToColor(a[0]);
+		if (a.length>1)
+			shapePrimarySelectedColor = stringToColor(a[1]);
+		if (a.length>2)
+			shapeSecondarySelectedColor = stringToColor(a[2]);
+		if (a.length>3)
+			shapeForeground = stringToColor(a[3]);
+		if (a.length>4)
+			textFont = stringToFont(a[4]);
+		if (a.length>5)
+			textColor = stringToColor(a[5]);
+		if (a.length>6)
+			defaultSize = stringToBoolean(a[6]);
+		else
+			defaultSize = true;
 	}
 	
 	public void setDefaultColors(IColorConstant defaultColor) {
@@ -156,6 +168,17 @@
 		}
 	}
 	
+	public boolean isDefaultSize() {
+		return defaultSize;
+	}
+	
+	public void setDefaultSize(boolean b) {
+		if (defaultSize != b) {
+			defaultSize = b;
+			setDirty(true);
+		}
+	}
+	
 	public static String colorToString(IColorConstant c) {
 		return new String(
 				String.format("%02X",c.getRed()) +
@@ -181,6 +204,14 @@
 				);
 	}
 	
+	public static String booleanToString(boolean b) {
+		return b ? "1" : "0";
+	}
+	
+	public static boolean stringToBoolean(String s) {
+		return "1".equals(s);
+	}
+	
 	public static RGB colorToRGB(IColorConstant c) {
 		return new RGB(c.getRed(),c.getGreen(),c.getBlue());
 	}
@@ -235,12 +266,13 @@
 				colorToString(sp.shapeSecondarySelectedColor) + ";" +
 				colorToString(sp.shapeForeground) + ";" +
 				fontToString(sp.textFont) + ";" +
-				colorToString(sp.textColor)
+				colorToString(sp.textColor) + ";" +
+				booleanToString(sp.defaultSize)
 				);
 	}
 	
 	public static ShapeStyle decode(String s) {
-		if (s==null || s.trim().split(";").length!=6)
+		if (s==null || s.trim().split(";").length<6)
 			return new ShapeStyle();
 		return new ShapeStyle(s);
 	}
@@ -268,6 +300,7 @@
 				compare(s1.shapeSecondarySelectedColor, s2.shapeSecondarySelectedColor) ||
 				compare(s1.shapeForeground, s2.shapeForeground) ||
 				compare(s1.textFont, s2.textFont) ||
-				compare(s1.textColor, s2.textColor);
+				compare(s1.textColor, s2.textColor) ||
+				(s1.defaultSize != s2.defaultSize);
 	}
 }
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java
index 70e508f..316d302 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java
@@ -19,7 +19,11 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Event;
 import org.eclipse.bpmn2.EventDefinition;
+import org.eclipse.bpmn2.Gateway;
 import org.eclipse.bpmn2.modeler.core.features.ContextConstants;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
@@ -1136,6 +1140,16 @@
 		return new Size(TASK_DEFAULT_WIDTH, TASK_DEFAULT_HEIGHT);
 	}
 	
+	public static Size getShapeSize(BaseElement be, Diagram diagram) {
+		if (be instanceof Event)
+			return getEventSize(diagram);
+		if (be instanceof Gateway)
+			return getGatewaySize(diagram);
+		if (be instanceof Activity)
+			return getActivitySize(diagram);
+		return null;
+	}
+	
 	public static boolean intersects(Shape shape1, Shape shape2) {
 		ILayoutService layoutService = Graphiti.getLayoutService();
 		ILocation loc2 = layoutService.getLocationRelativeToDiagram(shape2);
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/preferences/Bpmn2EditorPreferencePage.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/preferences/Bpmn2EditorPreferencePage.java
index 04129b7..673d0e6 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/preferences/Bpmn2EditorPreferencePage.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/preferences/Bpmn2EditorPreferencePage.java
@@ -71,6 +71,7 @@
 	ColorControl shapePrimarySelectedColor;
 	ColorControl shapeSecondarySelectedColor;
 	ColorControl shapeForeground;
+	Button defaultSize;
 	FontControl textFont;
 	ColorControl textColor;
 	boolean debug;
@@ -131,7 +132,7 @@
         styleEditors.setVisible(false);
 
 		shapeBackground = new ColorControl("&Fill Color:",styleEditors);
-		shapeBackground.addSelectionListener( new SelectionListener() {
+		shapeBackground.addSelectionListener( new SelectionAdapter() {
 
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -146,17 +147,18 @@
 					textColor.setSelectedColor(ss.getTextColor());
 				}
 			}
-
-			@Override
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-    		
     	});
 		shapeForeground = new ColorControl("&Foreground Color:",styleEditors);
 		shapePrimarySelectedColor = new ColorControl("&Selected Color:",styleEditors);
 		shapeSecondarySelectedColor = new ColorControl("&Multi-Selected Color:",styleEditors);
 		textColor = new ColorControl("&Label Color:",styleEditors);
 		textFont = new FontControl("Label &Font:",styleEditors);
+		defaultSize = new Button(styleEditors, SWT.CHECK);
+		defaultSize.setText("Override shape size with default values");
+		GridData gd = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
+		gd.horizontalIndent = 5;
+		gd.verticalIndent = 10;
+		defaultSize.setLayoutData(gd);
 		
 		loadStyleEditors();
 
@@ -170,6 +172,7 @@
 			ss.setShapePrimarySelectedColor(shapePrimarySelectedColor.getSelectedColor());
 			ss.setShapeSecondarySelectedColor(shapeSecondarySelectedColor.getSelectedColor());
 			ss.setShapeForeground(shapeForeground.getSelectedColor());
+			ss.setDefaultSize(defaultSize.getSelection());
 			ss.setTextFont(textFont.getSelectedFont());
 			ss.setTextColor(textColor.getSelectedColor());
 		}
@@ -208,6 +211,7 @@
 			shapePrimarySelectedColor.setSelectedColor(ss.getShapePrimarySelectedColor());
 			shapeSecondarySelectedColor.setSelectedColor(ss.getShapeSecondarySelectedColor());
 			shapeForeground.setSelectedColor(ss.getShapeForeground());
+			defaultSize.setSelection(ss.isDefaultSize());
 			textFont.setSelectedFont(ss.getTextFont());
 			textColor.setSelectedColor(ss.getTextColor());
 
@@ -221,6 +225,8 @@
 			((GridData)shapePrimarySelectedColor.getLayoutData()).exclude = !visible;
 			shapeSecondarySelectedColor.setVisible(visible);
 			((GridData)shapeSecondarySelectedColor.getLayoutData()).exclude = !visible;
+			defaultSize.setVisible(visible);
+			((GridData)defaultSize.getLayoutData()).exclude = !visible;
 			container.layout();
 		}
 	}