Bug 464857 - Images created by GFImageFigure are not destroyed

Change-Id: I017d036a6cc38d7bc39bba1ebd71faf22c6423b4
diff --git a/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/figures/GFImageFigure.java b/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/figures/GFImageFigure.java
index 045496e..b0baafd 100644
--- a/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/figures/GFImageFigure.java
+++ b/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/figures/GFImageFigure.java
@@ -1,7 +1,7 @@
 /*******************************************************************************
  * <copyright>
  *
- * Copyright (c) 2005, 2012 SAP AG.
+ * Copyright (c) 2005, 2015 SAP AG.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,6 +10,7 @@
  * Contributors:
  *    SAP AG - initial API, implementation and documentation
  *    Veit Hoffmann (mwenz) - Bug 342869 - Image doesn't scale the contained SWT Image on resize
+ *    mwenz - Bug 464857 - Images created by GFImageFigure are not destroyed
  *
  * </copyright>
  *
@@ -32,6 +33,7 @@
 	private GraphicsAlgorithm graphicsAlgorithm;
 
 	private Image fillImage = null;
+	private boolean isSelfCreatedImage = false;
 
 	public GFImageFigure(GraphicsAlgorithm graphicsAlgorithm) {
 		this.graphicsAlgorithm = graphicsAlgorithm;
@@ -39,6 +41,7 @@
 
 	@Override
 	public void setImage(Image image) {
+		disposeSelfCreatedImage();
 		if (image != null
 				&& graphicsAlgorithm instanceof org.eclipse.graphiti.mm.algorithms.Image) {
 			org.eclipse.graphiti.mm.algorithms.Image imageGA = (org.eclipse.graphiti.mm.algorithms.Image) graphicsAlgorithm;
@@ -75,25 +78,30 @@
 				// create scaled image
 				double d = imageWidth * scalefactorX;
 				double e = imageHeight * scalefactorY;
-				Image oldFillImage = fillImage;
-				fillImage = new Image(Display.getCurrent(),
-						originalImageData.scaledTo((int) d, (int) e));
-				super.setImage(fillImage);
-				// keep track of the old fill image on resize and dispose it to
-				// avoid memory leaks
 				// We don't change the image in
 				// GraphitiUIPlugin.getDefault().getImageRegistry() because
 				// scaling down makes image quality bad
-				if (oldFillImage != null && !oldFillImage.isDisposed()) {
-					oldFillImage.dispose();
-				}
+				fillImage = new Image(Display.getCurrent(),
+						originalImageData.scaledTo((int) d, (int) e));
+				isSelfCreatedImage = true;
 			} else {
-				super.setImage(image);
+				fillImage = image;
 			}
 		} else {
-			super.setImage(image);
+			fillImage = image;
 		}
+		super.setImage(fillImage);
+	}
 
+	private void disposeSelfCreatedImage() {
+		// keep track of any self-created fill image and dispose it to avoid
+		// resource leaks
+		if (isSelfCreatedImage) {
+			if (fillImage != null && !fillImage.isDisposed()) {
+				fillImage.dispose();
+			}
+			isSelfCreatedImage = false;
+		}
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/parts/PictogramElementDelegate.java b/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/parts/PictogramElementDelegate.java
index 5a77bf7..9a7a8f4 100644
--- a/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/parts/PictogramElementDelegate.java
+++ b/plugins/org.eclipse.graphiti.ui/src/org/eclipse/graphiti/ui/internal/parts/PictogramElementDelegate.java
@@ -1,7 +1,7 @@
 /*******************************************************************************
  * <copyright>
  *
- * Copyright (c) 2005, 2014 SAP AG.
+ * Copyright (c) 2005, 2015 SAP AG.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -25,6 +25,7 @@
  *    pjpaulin - Bug 352120 - Now uses IDiagramContainerUI interface
  *    mwenz - Bug 412858 - canUpdate is not consulted before calling updateNeeded during startup
  *    mwenz - Bug 434458 - Connections don't support Color decorators
+ *    mwenz - Bug 464857 - Images created by GFImageFigure are not destroyed
  *
  * </copyright>
  *
@@ -231,6 +232,10 @@
 
 		for (IFigure figure : elementFigureHash.values()) {
 			removeDecorators(figure);
+			if (figure instanceof ImageFigure) {
+				// Trigger disposal of currently displayed image (bug 464857)
+				((ImageFigure) figure).setImage(null);
+			}
 		}
 
 		disposeFonts();