merged from HEAD: cache & dispose images
diff --git a/plugins/org.eclipse.dltk.ruby.ui/src/org/eclipse/dltk/ruby/internal/ui/editor/RubyOutlineLabelDecorator.java b/plugins/org.eclipse.dltk.ruby.ui/src/org/eclipse/dltk/ruby/internal/ui/editor/RubyOutlineLabelDecorator.java
index 7a50091..1642e2d 100644
--- a/plugins/org.eclipse.dltk.ruby.ui/src/org/eclipse/dltk/ruby/internal/ui/editor/RubyOutlineLabelDecorator.java
+++ b/plugins/org.eclipse.dltk.ruby.ui/src/org/eclipse/dltk/ruby/internal/ui/editor/RubyOutlineLabelDecorator.java
@@ -10,106 +10,91 @@
 package org.eclipse.dltk.ruby.internal.ui.editor;
 
 import org.eclipse.dltk.ast.Modifiers;
+import org.eclipse.dltk.core.DLTKCore;
 import org.eclipse.dltk.core.IMember;
-import org.eclipse.dltk.core.IMethod;
 import org.eclipse.dltk.core.ModelException;
-import org.eclipse.dltk.internal.ui.editor.AnnotatedImageDescriptor;
 import org.eclipse.dltk.ruby.core.RubyConstants;
 import org.eclipse.dltk.ruby.internal.ui.RubyImages;
 import org.eclipse.dltk.ui.DLTKPluginImages;
-import org.eclipse.dltk.ui.viewsupport.ImageImageDescriptor;
+import org.eclipse.dltk.ui.viewsupport.ImageDescriptorRegistry;
 import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.DecorationOverlayIcon;
+import org.eclipse.jface.viewers.IDecoration;
 import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
 
-public class RubyOutlineLabelDecorator extends LabelProvider implements
+public class RubyOutlineLabelDecorator extends BaseLabelProvider implements
 		ILabelDecorator {
-	protected static class RubyOutlineImageDescriptor extends
-			AnnotatedImageDescriptor {
-
-		private int flags;
-
-		public RubyOutlineImageDescriptor(ImageDescriptor baseImageDescriptor,
-				Point size, int flags) {
-			super(baseImageDescriptor, size);
-									
-			this.flags = flags;
-		}
-
-		protected void drawAnnotations() {
-			ImageData data = null;
-			
-			// Need more correct handling of flags
-			// Label generation will be moved in ruby specific class
-			if ((flags & Modifiers.AccStatic) != 0) {
-				data = getImageData(RubyImages.DESC_OVR_STATIC_FIELD);
-			} 
-			else if ((flags & Modifiers.AccConstant) !=0 ) {
-				data = getImageData(RubyImages.DESC_OVR_CONST_FIELD);
-			}
-			
-			if (data != null) {
-				drawImageTopRight(data);
-			}
-			
-			if ((flags & RubyConstants.RubyAttributeModifier) != 0) {
-				data = getImageData(DLTKPluginImages.DESC_OVR_ABSTRACT);
-				drawImageTopLeft(data);
-			}
-			
-			if ((flags & RubyConstants.RubyAliasModifier) != 0) {
-				data = getImageData(DLTKPluginImages.DESC_OVR_CALLER);
-				drawImageTopLeft(data);
-			}
-			
-		}
-	}
-
-	public RubyOutlineLabelDecorator() {
-	}
 
 	public String decorateText(String text, Object element) {
-		if (element instanceof IMethod) {
-			IMethod method = (IMethod) element;
-			try {
-				if (method.exists() && (method.getFlags() & RubyConstants.RubyAliasModifier) != 0) {
-					String oldName = method.getParameters()[0];
-					return method.getElementName();// + " [alias for " + oldName + "]";
-				}
-			} catch (ModelException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-		}
+		// if (element instanceof IMethod) {
+		// IMethod method = (IMethod) element;
+		// try {
+		// if (method.exists() && (method.getFlags() &
+		// RubyConstants.RubyAliasModifier) != 0) {
+		// String oldName = method.getParameters()[0];
+		// return method.getElementName();// + " [alias for " + oldName + "]";
+		// }
+		// } catch (ModelException e) {
+		// // Auto-generated catch block
+		// e.printStackTrace();
+		// }
+		// }
 		return text;
 	}
 
-	public Image decorateImage(Image image, Object obj) {
+	private static ImageDescriptor getTopRight(int flags) {
+		if ((flags & Modifiers.AccStatic) != 0) {
+			return RubyImages.DESC_OVR_STATIC_FIELD;
+		} else if ((flags & Modifiers.AccConstant) != 0) {
+			return RubyImages.DESC_OVR_CONST_FIELD;
+		} else {
+			return null;
+		}
+	}
 
+	private static ImageDescriptor getTopLeft(int flags) {
+		if ((flags & RubyConstants.RubyAttributeModifier) != 0) {
+			return DLTKPluginImages.DESC_OVR_ABSTRACT;
+		} else if ((flags & RubyConstants.RubyAliasModifier) != 0) {
+			return DLTKPluginImages.DESC_OVR_CALLER;
+		} else {
+			return null;
+		}
+	}
+
+	public Image decorateImage(Image image, Object obj) {
 		try {
 			if (obj instanceof IMember) {
-				IMember member = (IMember) obj;
+				final IMember member = (IMember) obj;
 				if (member.exists()) {
-					int flags = member.getFlags();
-
-					ImageDescriptor baseImage = new ImageImageDescriptor(image);
-					Rectangle bounds = image.getBounds();
-
-					ImageDescriptor dsc = new RubyOutlineImageDescriptor(baseImage,
-							new Point(bounds.width, bounds.height), flags);
-
-					return dsc.createImage();
+					final int flags = member.getFlags();
+					final ImageDescriptor left = getTopLeft(flags);
+					final ImageDescriptor right = getTopRight(flags);
+					if (left != null || right != null) {
+						final ImageDescriptor[] decorations = new ImageDescriptor[5];
+						decorations[IDecoration.TOP_LEFT] = left;
+						decorations[IDecoration.TOP_RIGHT] = right;
+						return registry.get(new DecorationOverlayIcon(image,
+								decorations));
+					}
 				}
 			}
-
 		} catch (ModelException e) {
-			e.printStackTrace();
+			if (DLTKCore.DEBUG) {
+				e.printStackTrace();
+			}
 		}
-
 		return image;
 	}
+
+	private final ImageDescriptorRegistry registry = new ImageDescriptorRegistry(
+			false);
+
+	@Override
+	public void dispose() {
+		super.dispose();
+		registry.dispose();
+	}
 }