From 5f3c5f6c00bfbed34d60b055c983c880e862097f Mon Sep 17 00:00:00 2001 From: Bastian Doetsch Date: Thu, 5 Dec 2024 13:25:44 +0100 Subject: [PATCH] fix: icon rendering --- .../views/snyktoolview/BaseTreeNode.java | 31 +++++++++++++++++++ .../views/snyktoolview/ContentRootNode.java | 15 +++------ .../views/snyktoolview/FileTreeNode.java | 23 ++++++-------- .../plugin/views/snyktoolview/RootNode.java | 2 +- .../providers/TreeLabelProvider.java | 9 ++++-- 5 files changed, 52 insertions(+), 28 deletions(-) diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/BaseTreeNode.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/BaseTreeNode.java index 5bdde637..2c6f6898 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/BaseTreeNode.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/BaseTreeNode.java @@ -5,8 +5,14 @@ import java.util.List; import java.util.stream.Collectors; +import org.eclipse.core.resources.IResource; import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.TreeNode; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.ImageDataProvider; +import org.eclipse.ui.model.WorkbenchLabelProvider; public class BaseTreeNode extends TreeNode { private ImageDescriptor imageDescriptor; @@ -52,6 +58,19 @@ public void removeChildren() { public void setImageDescriptor(ImageDescriptor imageDescriptor) { this.imageDescriptor = imageDescriptor; } + + protected ImageDescriptor getImageDescriptor(IResource object) { + ILabelProvider labelProvider = WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(); + try { + Image image = labelProvider.getImage(object); + if (image == null || image.isDisposed()) + return null; + + return getImageDescriptorFromImage(image); + } finally { + labelProvider.dispose(); + } + } public ImageDescriptor getImageDescriptor() { return this.imageDescriptor; @@ -85,4 +104,16 @@ public void reset() { public String getDetails() { return ""; } + + protected ImageDescriptor getImageDescriptorFromImage(Image image) { + final var data = image.getImageData(); + + ImageDataProvider provider = new ImageDataProvider() { + @Override + public ImageData getImageData(int zoom) { + return data; + } + }; + return ImageDescriptor.createFromImageDataProvider(provider); + } } diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/ContentRootNode.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/ContentRootNode.java index a08faf50..7d88881c 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/ContentRootNode.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/ContentRootNode.java @@ -7,6 +7,8 @@ import java.nio.file.Path; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.graphics.Image; @@ -28,17 +30,8 @@ public ContentRootNode(String name, Path value) { @Override public ImageDescriptor getImageDescriptor() { - ILabelProvider labelProvider = WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(); - try { - var object = ResourceUtils.getProjectByPath(path); - Image image = labelProvider.getImage(object); - if (image == null || image.isDisposed()) - return null; - - return ImageDescriptor.createFromImage(image); - } finally { - labelProvider.dispose(); - } + var iResource = ResourceUtils.getProjectByPath(path); + return getImageDescriptor(iResource); } public ProductTreeNode getProductNode(String product) { diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/FileTreeNode.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/FileTreeNode.java index 72d40b66..d04409bf 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/FileTreeNode.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/FileTreeNode.java @@ -2,12 +2,16 @@ import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Iterator; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.TreeNode; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.ImageDataProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; public class FileTreeNode extends BaseTreeNode { @@ -21,21 +25,14 @@ public FileTreeNode(String value) { @Override public ImageDescriptor getImageDescriptor() { - ILabelProvider labelProvider = WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(); - try { - var files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(getPath().toUri()); - var object = files[0]; - if (object == null) { - return null; + var files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(getPath().toUri()); + for (IFile file : files) { + var descriptor = getImageDescriptor(file); + if (descriptor != null) { + return descriptor; } - Image image = labelProvider.getImage(object); - if (image == null) - return null; - - return ImageDescriptor.createFromImage(image); - } finally { - labelProvider.dispose(); } + return null; } @Override diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/RootNode.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/RootNode.java index 5dddd214..e4c2fd0e 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/RootNode.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/RootNode.java @@ -25,7 +25,7 @@ public void reset() { for (IProject project : openProjects) { Path path = ResourceUtils.getFullPath(project); - var contentRoot = new ContentRootNode(project.getName(), path); + BaseTreeNode contentRoot = new ContentRootNode(project.getName(), path); this.addChild(contentRoot); } } diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/providers/TreeLabelProvider.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/providers/TreeLabelProvider.java index 727e3fc5..0f9ec531 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/providers/TreeLabelProvider.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/providers/TreeLabelProvider.java @@ -38,10 +38,13 @@ public Image getImage(Object element) { return null; } - if (images.get(imageDescriptor) == null) { - images.putIfAbsent(imageDescriptor, imageDescriptor.createImage()); + synchronized (images) { + Image image = images.get(imageDescriptor); + if (image == null || image.isDisposed()) { + images.put(imageDescriptor, imageDescriptor.createImage()); + } + return images.get(imageDescriptor); } - return images.get(imageDescriptor); } @Override