From ae5e0a74f3ca7b0da6ca950a0dc20756f039ef7c Mon Sep 17 00:00:00 2001 From: James Blackburn Date: Tue, 20 Oct 2009 16:40:30 +0000 Subject: [PATCH] Bug 243907 - AbstractCPropertyTab#dispose() never called - AbstractPage leaks Tab icon SWT Images - AbstractCPropertyTab uses reflection for setGrayed API --- .../cdt/ui/newui/AbstractCPropertyTab.java | 16 ++++----- .../eclipse/cdt/ui/newui/AbstractPage.java | 33 +++++++++++++++---- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java index 42639ad36a2..113f29781cb 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java @@ -8,10 +8,10 @@ * Contributors: * Intel Corporation - initial API and implementation * Markus Schorn (Wind River Systems) + * James Blackburn (Broadcom Corp.) *******************************************************************************/ package org.eclipse.cdt.ui.newui; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.eclipse.core.resources.IContainer; @@ -533,6 +533,7 @@ public abstract class AbstractCPropertyTab implements ICPropertyTab { if (canBeVisible()) configChanged((ICResourceDescription)data); break; case ICPropertyTab.DISPOSE: + dispose(); break; case ICPropertyTab.VISIBLE: if (canBeVisible()) @@ -599,7 +600,7 @@ public abstract class AbstractCPropertyTab implements ICPropertyTab { break; } } - + /** * This method will be simplified after M5 release, * when Button.setGrayed() method will be accessible. @@ -607,16 +608,11 @@ public abstract class AbstractCPropertyTab implements ICPropertyTab { * * @param b * @param value + * @deprecated call {@link Button#setGrayed(boolean)} instead */ + @Deprecated public static void setGrayed(Button b, boolean value) { - // TODO: uncomment before M5 - // b.setGrayed(value); - if (GRAY_METHOD != null) - try { - GRAY_METHOD.invoke(b, new Object[] { new Boolean(value) }); - } - catch (InvocationTargetException e) {} - catch (IllegalAccessException e) {} + b.setGrayed(value); } /** diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java index 82f8bde431b..9cdc1e6610c 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java @@ -10,6 +10,7 @@ * Markus Schorn (Wind River Systems) * Andrew Gvozdev * QNX Software Systems - [271628] NPE in configs for project that failed to convert + * James Blackburn (Broadcom Corp.) *******************************************************************************/ package org.eclipse.cdt.ui.newui; @@ -20,8 +21,10 @@ import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; @@ -145,6 +148,8 @@ implements private static final String PREF_ASK_REINDEX = "askReindex"; //$NON-NLS-1$ + private Map loadedIcons = new HashMap(); + private final Image IMG_WARN = CPluginImages.get(CPluginImages.IMG_OBJS_REFACTORING_WARNING); /* * Dialog widgets @@ -958,10 +963,16 @@ implements ap.forEach(ICPropertyTab.UPDATE,getResDesc()); } } - + @Override public void dispose() { - if (displayedConfig) forEach(ICPropertyTab.DISPOSE); + // Dispose the tabs + if (displayedConfig) + forEach(ICPropertyTab.DISPOSE); + // Dispose any loaded images + for (Image img : loadedIcons.values()) + img.dispose(); + loadedIcons.clear(); if (!isNewOpening) handleResize(false); // save page size @@ -1090,19 +1101,27 @@ implements itabs.add(itab); return false; } - + private Image getIcon(IConfigurationElement config) { ImageDescriptor idesc = null; + URL url = null; try { String iconName = config.getAttribute(IMAGE_NAME); if (iconName != null) { - URL pluginInstallUrl = Platform.getBundle(config.getDeclaringExtension().getContributor().getName()).getEntry("/"); //$NON-NLS-1$ - idesc = ImageDescriptor.createFromURL(new URL(pluginInstallUrl, iconName)); + URL pluginInstallUrl = Platform.getBundle(config.getDeclaringExtension().getContributor().getName()).getEntry("/"); //$NON-NLS-1$ + url = new URL(pluginInstallUrl, iconName); + if (loadedIcons.containsKey(url)) + return loadedIcons.get(url); + idesc = ImageDescriptor.createFromURL(url); } } catch (MalformedURLException exception) {} - return (idesc == null) ? null : idesc.createImage(); + if (idesc == null) + return null; + Image img = idesc.createImage(); + loadedIcons.put(url, img); + return img; } - + public void informAll(int code, Object data) { for (int i=0; i