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