diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog index 92f754f641c..27975cbaf41 100644 --- a/debug/org.eclipse.cdt.debug.ui/ChangeLog +++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog @@ -1,3 +1,7 @@ +2005-10-19 Mikhail Khodjaiants + Bug 113114: Expanding Modules View throws SWTError: No more handles. + * ModulesView.java + 2005-09-06 Mikhail Khodjaiants Cleanup: replaced "new Boolean" by the static Boolean objects (Java 1.4). * QuestionStatusHandler.java diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java index ee65ab16c3d..2a2c401f69a 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.debug.internal.ui.views.modules; import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import org.eclipse.cdt.core.IAddress; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.debug.core.model.ICDebugElement; @@ -123,7 +125,7 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug if ( de != null ) { ImageDescriptor descriptor = de.getImageDescriptor( element ); if ( descriptor != null ) { - image = descriptor.createImage(); + image = ModulesView.this.getImage( descriptor ); } } } @@ -327,6 +329,8 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug private HashMap fSelectionStates = new HashMap( 10 ); private AbstractViewerState fLastState = null; + + private HashMap fImageCache = new HashMap( 10 ); /* (non-Javadoc) * @see org.eclipse.debug.ui.AbstractDebugView#createViewer(org.eclipse.swt.widgets.Composite) @@ -989,10 +993,29 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug if ( viewer != null ) { getDetailDocument().removeDocumentListener( getDetailDocumentListener() ); } + disposeImageCache(); super.dispose(); } private AbstractViewerState getViewerState() { return new ModulesViewerState( getModulesViewer() ); } + + protected Image getImage( ImageDescriptor desc ) { + Image image = (Image)fImageCache.get( desc ); + if ( image == null ) { + image = desc.createImage(); + fImageCache.put( desc, image ); + } + return image; + } + + private void disposeImageCache() { + Iterator it = fImageCache.values().iterator(); + while( it.hasNext() ) { + Map.Entry entry = (Map.Entry)it.next(); + ((Image)entry.getValue()).dispose(); + } + fImageCache.clear(); + } }