From d3ad6136cd83e92967ada1d847a9707e54989026 Mon Sep 17 00:00:00 2001 From: Heiko Klare Date: Thu, 4 Jun 2026 18:38:29 +0200 Subject: [PATCH 1/2] Add method for providing disabled image descriptors Image descriptors are often shared and used with a ResourceManager to share an image created from the same descriptor. To do this with the disabled version of the image of a descriptor, a descriptor for the disabled image has to be managed in addition to the descriptor for the ordinary image. This change adds a method to an image descriptor for providing a shared image descriptor for the disabled version of the same image. This allows to only manage the original image's descriptor while also sharing the disabled version of that image. It is applied as a replacement at all places which used the createWithFlags() operation of an image descriptor for creating an image descriptor for the disabled version of the image to ensure that a shared image descriptor is used there. In case the descriptor already represents a disabled version of an image, it returns itself. --- .../swt/AbstractContributionItem.java | 2 +- .../org.eclipse.jface/META-INF/MANIFEST.MF | 2 +- .../jface/action/ActionContributionItem.java | 2 +- .../resource/DerivedImageDescriptor.java | 8 +++++ .../jface/resource/ImageDescriptor.java | 29 ++++++++++++++----- .../ide/application/IDEWorkbenchAdvisor.java | 2 +- .../templates/TemplatesPageImages.java | 3 +- .../eclipse/ui/internal/WorkbenchImages.java | 3 +- .../cpd/GrayOutUnavailableLabelProvider.java | 2 +- .../internal/progress/ProgressInfoItem.java | 3 +- 10 files changed, 38 insertions(+), 18 deletions(-) diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/AbstractContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/AbstractContributionItem.java index 020601182d7..7d8030aa64e 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/AbstractContributionItem.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/AbstractContributionItem.java @@ -158,7 +158,7 @@ private Image createImage(String iconURI, LocalResourceManager resourceManager, if (iconURI != null && iconURI.length() > 0) { ImageDescriptor iconDescriptor = resUtils.imageDescriptorFromURI(URI.createURI(iconURI)); if (disabled) { - iconDescriptor = ImageDescriptor.createWithFlags(iconDescriptor, SWT.IMAGE_DISABLE); + iconDescriptor = iconDescriptor.asDisabledDescriptor(); } if (iconDescriptor != null) { try { diff --git a/bundles/org.eclipse.jface/META-INF/MANIFEST.MF b/bundles/org.eclipse.jface/META-INF/MANIFEST.MF index b8363aafb9a..a627f5c1706 100644 --- a/bundles/org.eclipse.jface/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.jface/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jface;singleton:=true -Bundle-Version: 3.39.200.qualifier +Bundle-Version: 3.40.0.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: org.eclipse.jface, diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ActionContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ActionContributionItem.java index 7cc82c7d5db..a283c78dd7c 100644 --- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ActionContributionItem.java +++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ActionContributionItem.java @@ -1000,7 +1000,7 @@ private boolean updateImages(boolean forceImage) { // If there is no disabled image, but there is a regular image generate a // disabled one if (disabledImage == null && image != null) { - disabledImage = ImageDescriptor.createWithFlags(image, SWT.IMAGE_DISABLE); + disabledImage = image.asDisabledDescriptor(); } if (image != null && !USE_COLOR_ICONS) { image = ImageDescriptor.createWithFlags(image, SWT.IMAGE_GRAY); diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DerivedImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DerivedImageDescriptor.java index 1965a4f3746..5dfaa45c151 100644 --- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DerivedImageDescriptor.java +++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DerivedImageDescriptor.java @@ -92,4 +92,12 @@ public ImageData getImageData(int zoom) { image.dispose(); return result; } + + @Override + public ImageDescriptor asDisabledDescriptor() { + if ((flags & SWT.IMAGE_DISABLE) != 0) { + return this; + } + return super.asDisabledDescriptor(); + } } diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDescriptor.java index 5c658690766..231f9b71db5 100644 --- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDescriptor.java +++ b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDescriptor.java @@ -20,6 +20,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.jface.util.Policy; +import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Image; @@ -68,6 +69,8 @@ public abstract class ImageDescriptor extends DeviceResourceDescriptor { */ protected static final ImageData DEFAULT_IMAGE_DATA = new ImageData(6, 6, 1, new PaletteData(new RGB(255, 0, 0))); + private ImageDescriptor disabledImageDescriptor; + /** * Constructs an image descriptor. */ @@ -151,13 +154,6 @@ public static ImageDescriptor createFromImage(Image img) { * Creates an ImageDescriptor based on the given original descriptor, but with additional * SWT flags. * - *

- * Note that this sort of ImageDescriptor is slower and consumes more resources than - * a regular image descriptor. It will also never generate results that look as nice as - * a hand-drawn image. Clients are encouraged to supply their own disabled/grayed/etc. images - * rather than using a default image and transforming it. - *

- * * @param originalImage image to transform * @param swtFlags any flag that can be passed to the flags argument of Image#Image(Device, Image, int) * @return an ImageDescriptor that creates new images by transforming the given image descriptor @@ -351,6 +347,25 @@ public Image createImage(Device device) { return createImage(true, device); } + /** + * Returns an image descriptor representing a disabled version of the icon of + * this descriptor. The descriptor is shared, i.e., calling this method multiple + * times will return the same descriptor every time. In case the descriptor + * already represents a disabled version of the icon (created using + * {@link #createWithFlags(ImageDescriptor, int)} with the + * {@code SWT.IMAGE_DISABLE} flag), this method returns this. + * + * @since 3.40 + * @return a shared image descriptor for a disabled version of the icon for this + * descriptor + */ + public ImageDescriptor asDisabledDescriptor() { + if (disabledImageDescriptor == null) { + disabledImageDescriptor = createWithFlags(this, SWT.IMAGE_DISABLE); + } + return disabledImageDescriptor; + } + /** * Creates and returns a new SWT image for this image descriptor. The * returned image must be explicitly disposed using the image's dispose diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java index 1cba5423e2d..ac4eb6e7b2a 100644 --- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java +++ b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java @@ -855,7 +855,7 @@ private void declareWorkbenchImage(Bundle ideBundle, String symbolicName, String ImageDescriptor desc = ImageDescriptor.createFromURL(url); getWorkbenchConfigurer().declareImage(symbolicName, desc, shared); if (disabledSymbolicName != null) { - ImageDescriptor disabledDescriptor = ImageDescriptor.createWithFlags(desc, SWT.IMAGE_DISABLE); + ImageDescriptor disabledDescriptor = desc.asDisabledDescriptor(); getWorkbenchConfigurer().declareImage(disabledSymbolicName, disabledDescriptor, shared); } } diff --git a/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesPageImages.java b/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesPageImages.java index 9311d7acbe3..fa6d7564305 100644 --- a/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesPageImages.java +++ b/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/TemplatesPageImages.java @@ -17,7 +17,6 @@ import org.osgi.framework.Bundle; -import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.core.runtime.FileLocator; @@ -118,7 +117,7 @@ private final static void declareRegistryImage(String key, String disabledKey, S } fgImageRegistry.put(key, desc); if (disabledKey != null) { - ImageDescriptor disabledDescriptor = ImageDescriptor.createWithFlags(desc, SWT.IMAGE_DISABLE); + ImageDescriptor disabledDescriptor = desc.asDisabledDescriptor(); fgImageRegistry.put(disabledKey, disabledDescriptor); } } diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchImages.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchImages.java index 8c64c27f996..ac82ff4110f 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchImages.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchImages.java @@ -20,7 +20,6 @@ import org.eclipse.core.runtime.Assert; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; @@ -106,7 +105,7 @@ private static final void declareImage(String key, String disabledKey, String pa () -> BundleUtility.find(PlatformUI.PLUGIN_ID, path)); declareImage(key, desc, shared); if (disabledKey != null) { - ImageDescriptor disabledImageDescriptor = ImageDescriptor.createWithFlags(desc, SWT.IMAGE_DISABLE); + ImageDescriptor disabledImageDescriptor = desc.asDisabledDescriptor(); declareImage(disabledKey, disabledImageDescriptor, shared); } } diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/cpd/GrayOutUnavailableLabelProvider.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/cpd/GrayOutUnavailableLabelProvider.java index 0e1739ab362..255a8a1650b 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/cpd/GrayOutUnavailableLabelProvider.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/cpd/GrayOutUnavailableLabelProvider.java @@ -73,7 +73,7 @@ public Image getImage(Object element) { if (element instanceof DisplayItem item && actual != null) { if (!CustomizePerspectiveDialog.isEffectivelyAvailable(item, filter)) { ImageDescriptor original = ImageDescriptor.createFromImage(actual); - ImageDescriptor disable = ImageDescriptor.createWithFlags(original, SWT.IMAGE_DISABLE); + ImageDescriptor disable = original.asDisabledDescriptor(); Image newImage = disable.createImage(); toDispose.add(newImage); return newImage; diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/progress/ProgressInfoItem.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/progress/ProgressInfoItem.java index bab4d87ce2b..279e3cf38bb 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/progress/ProgressInfoItem.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/progress/ProgressInfoItem.java @@ -155,8 +155,7 @@ interface IndexListener { static { ImageDescriptor processStopDescriptor = WorkbenchImages.getWorkbenchImageDescriptor("elcl16/progress_stop.svg"); //$NON-NLS-1$ JFaceResources.getImageRegistry().put(STOP_IMAGE_KEY, processStopDescriptor); - ImageDescriptor disabledProcessStopDescriptor = ImageDescriptor.createWithFlags(processStopDescriptor, - SWT.IMAGE_DISABLE); + ImageDescriptor disabledProcessStopDescriptor = processStopDescriptor.asDisabledDescriptor(); JFaceResources.getImageRegistry().put(DISABLED_STOP_IMAGE_KEY, disabledProcessStopDescriptor); JFaceResources.getImageRegistry().put(DEFAULT_JOB_KEY, From b391659daf0365cd2aba66082732562f4a9b5f27 Mon Sep 17 00:00:00 2001 From: Eclipse Platform Bot Date: Sun, 14 Jun 2026 07:52:42 +0000 Subject: [PATCH 2/2] Version bump(s) for 4.41 stream --- bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF index 7c3f352aad7..5099c924160 100644 --- a/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Plugin.name Bundle-SymbolicName: org.eclipse.ui.ide.application;singleton:=true -Bundle-Version: 1.6.100.qualifier +Bundle-Version: 1.6.200.qualifier Bundle-Vendor: %Plugin.providerName Bundle-Localization: plugin Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.21.0,4.0.0)",