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();