From ab1b55827a1a16322ccaa406d122c430a0ba9784 Mon Sep 17 00:00:00 2001 From: Gesa HENTSCHKE Date: Wed, 2 Aug 2023 17:35:41 +0200 Subject: [PATCH] [#484] Add extension point for custom icons of C/C++ source files fixes #484 --- core/org.eclipse.cdt.ui/plugin.xml | 1 + .../schema/CFileImageProvider.exsd | 102 ++++++++++++++++++ .../ui/viewsupport/CElementImageProvider.java | 60 ++++++++++- .../DefaultCFileImageDescriptor.java | 32 ++++++ .../eclipse/cdt/ui/ICFileImageDescriptor.java | 34 ++++++ 5 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/schema/CFileImageProvider.exsd create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/DefaultCFileImageDescriptor.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/ICFileImageDescriptor.java diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml index 35d54d85a08..d9c72b532fc 100644 --- a/core/org.eclipse.cdt.ui/plugin.xml +++ b/core/org.eclipse.cdt.ui/plugin.xml @@ -33,6 +33,7 @@ + diff --git a/core/org.eclipse.cdt.ui/schema/CFileImageProvider.exsd b/core/org.eclipse.cdt.ui/schema/CFileImageProvider.exsd new file mode 100644 index 00000000000..fbcbb2020f3 --- /dev/null +++ b/core/org.eclipse.cdt.ui/schema/CFileImageProvider.exsd @@ -0,0 +1,102 @@ + + + + + + + + + This extension point can be used to provide custom icons for C/C++ source files. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Class which implements ICFileImageDescriptor interface. + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java index 50b5a652a75..b227b8dec5a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java @@ -16,7 +16,9 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.viewsupport; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -48,11 +50,15 @@ import org.eclipse.cdt.ui.CDTSharedImages; import org.eclipse.cdt.ui.CElementImageDescriptor; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.ui.ICFileImageDescriptor; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Platform; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; @@ -64,8 +70,12 @@ /** * Default strategy of the C plugin for the construction of C element icons. */ + public class CElementImageProvider { + private final ICFileImageDescriptor[] descriptors; + private final ICFileImageDescriptor defaultCFileImageDescriptor = new DefaultCFileImageDescriptor(); + /** * Flags for the CElementImageProvider: * Generate images with overlays. @@ -125,8 +135,52 @@ public class CElementImageProvider { * the Eclipse platform, see Bug 563454 */ private final Map allDescriptors = new HashMap<>(); + private static final String EXTENSION_POINT_ID = "org.eclipse.cdt.ui.CFileImageProvider"; //$NON-NLS-1$ + public static final String ELEMENT_NAME = "imageDescriptor"; //$NON-NLS-1$ + public static final String CLASS_NAME = "class"; //$NON-NLS-1$ public CElementImageProvider() { + descriptors = getCFileImageDescriptors(); + } + + private static ICFileImageDescriptor[] getCFileImageDescriptors() { + List list = new ArrayList<>(); + + IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID); + if (extensionPoint == null) { + return list.toArray(new ICFileImageDescriptor[0]); + } + + for (var extension : extensionPoint.getExtensions()) { + var elements = extension.getConfigurationElements(); + for (var element : elements) { + if (element.getName().equals(ELEMENT_NAME)) { + ICFileImageDescriptor descriptor = null; + try { + descriptor = (ICFileImageDescriptor) element.createExecutableExtension(CLASS_NAME); + } catch (CoreException e) { + } + if (descriptor != null) { + list.add(descriptor); + } + } + } + } + return list.toArray(new ICFileImageDescriptor[list.size()]); + } + + private ICFileImageDescriptor getDescriptor(ITranslationUnit unit) { + if (descriptors.length > 0 && unit.getCProject() != null) { + var project = unit.getCProject().getProject(); + if (project != null) { + for (var descriptor : descriptors) { + if (descriptor.isEnabled(project)) { + return descriptor; + } + } + } + } + return defaultCFileImageDescriptor; } /** @@ -383,13 +437,15 @@ public ImageDescriptor getBaseImageDescriptor(ICElement celement, int renderFlag case ICElement.C_UNIT: { ITranslationUnit unit = (ITranslationUnit) celement; if (unit.isHeaderUnit()) { - return CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT_HEADER); + return getDescriptor(unit).getHeaderImageDescriptor(); } else if (unit.isSourceUnit()) { if (unit.isASMLanguage()) { return CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT_ASM); + } else if (unit.isCXXLanguage()) { + return getDescriptor(unit).getCXXImageDescriptor(); } } - return CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT); + return getDescriptor(unit).getCImageDescriptor(); } case ICElement.C_CCONTAINER: diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/DefaultCFileImageDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/DefaultCFileImageDescriptor.java new file mode 100644 index 00000000000..2d52fbcc3fc --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/DefaultCFileImageDescriptor.java @@ -0,0 +1,32 @@ +package org.eclipse.cdt.internal.ui.viewsupport; + +import org.eclipse.cdt.ui.CDTSharedImages; +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.ui.ICFileImageDescriptor; +import org.eclipse.cdt.ui.SharedImagesFactory; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.resource.ImageDescriptor; + +public class DefaultCFileImageDescriptor implements ICFileImageDescriptor { + private SharedImagesFactory imagesFactory = new SharedImagesFactory(CUIPlugin.getDefault()); + + @Override + public ImageDescriptor getCImageDescriptor() { + return imagesFactory.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT); + } + + @Override + public ImageDescriptor getCXXImageDescriptor() { + return imagesFactory.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT); + } + + @Override + public ImageDescriptor getHeaderImageDescriptor() { + return imagesFactory.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT_HEADER); + } + + @Override + public boolean isEnabled(IProject project) { + return true; + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/ICFileImageDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/ICFileImageDescriptor.java new file mode 100644 index 00000000000..800dc4898f9 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/ICFileImageDescriptor.java @@ -0,0 +1,34 @@ +package org.eclipse.cdt.ui; + +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.resource.ImageDescriptor; + +/** + * C Image Descriptor Provider + * @since 8.1 + */ +public interface ICFileImageDescriptor { + + /** + * @return ImageDescriptor for a C source file + */ + public ImageDescriptor getCImageDescriptor(); + + /** + * @return ImageDescriptor for a C++ source file + */ + public ImageDescriptor getCXXImageDescriptor(); + + /** + * @return ImageDescriptor for a C/C++ header file + */ + public ImageDescriptor getHeaderImageDescriptor(); + + /** + * Checks whether the descriptor can be used for the given project. + * @param project + * @return true if the descriptor can be used for the given project. + */ + public boolean isEnabled(IProject project); + +}