Skip to content

Commit e1f9a95

Browse files
Michael BangasHannesWell
authored andcommitted
Add SVG support to ImageBrowser
This commit enables the display of SVGs in the `ImageBrowser`. When both a PNG and an SVG version of an icon are present, only the SVG will be shown. To allow this behavior a new filter is introduced which decides depending on the coming icons in the cache and existing filters if a PNG should be added or suppressed. Using the existing text pattern filter to only view specific icons (e.g. "*.png" for only PNGs) continues to work as expected with this implementation.
1 parent 7a6a70c commit e1f9a95

4 files changed

Lines changed: 37 additions & 14 deletions

File tree

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/ImageBrowserView.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Collection;
2323
import java.util.LinkedList;
2424
import java.util.List;
25+
import java.util.regex.Pattern;
2526

2627
import org.eclipse.core.commands.ExecutionException;
2728
import org.eclipse.core.commands.NotEnabledException;
@@ -91,6 +92,7 @@ public class ImageBrowserView extends ViewPart implements IImageTarget {
9192

9293
private static final String COMMAND_SAVE_TO_WORKSPACE = "org.eclipse.pde.ui.imagebrowser.saveToWorkspace"; //$NON-NLS-1$
9394
protected final static String VIEW_ID = "org.eclipse.pde.ui.ImageBrowserView"; //$NON-NLS-1$
95+
private static final Pattern FILE_EXTENSION = Pattern.compile("\\.[^.]+$"); //$NON-NLS-1$
9496

9597
private final UpdateUI mUIJob = new UpdateUI();
9698

@@ -118,6 +120,7 @@ public class ImageBrowserView extends ViewPart implements IImageTarget {
118120

119121
private Text txtFilter;
120122
private IFilter textPatternFilter;
123+
private IFilter svgFilter = null;
121124
private PageNavigationControl pageNavigationControl;
122125

123126
private ImageElement imageElement;
@@ -144,6 +147,20 @@ public ImageBrowserView() {
144147
mFilters.add(enabledIcons);
145148
textPatternFilter = new StringFilter("*"); //$NON-NLS-1$
146149
mFilters.add(textPatternFilter);
150+
svgFilter = element -> {
151+
String fileName = element.getPath();
152+
if (!fileName.endsWith(".svg")) { //$NON-NLS-1$
153+
String replacementSVGName = FILE_EXTENSION.matcher(fileName).replaceAll(".svg"); //$NON-NLS-1$
154+
ImageElement replacementSVG = repository.getImageElement(replacementSVGName);
155+
if (replacementSVG != null) {
156+
return new ArrayList<>(mFilters).stream()
157+
.anyMatch(filter -> filter != svgFilter && !filter.accept(replacementSVG));
158+
}
159+
return true;
160+
}
161+
return true;
162+
};
163+
mFilters.add(svgFilter);
147164
}
148165

149166
@Override
@@ -191,11 +208,15 @@ public void createPartControl(final Composite parent) {
191208
mFilters.clear();
192209
mFilters.add(textPatternFilter);
193210
Combo source = (Combo) e.getSource();
194-
switch (source.getSelectionIndex()) {
211+
int selectionIndex = source.getSelectionIndex();
212+
switch (selectionIndex) {
195213
case 0 -> mFilters.add(enabledIcons);
196214
case 1 -> mFilters.add(disabledIcons);
197215
case 2 -> mFilters.add(wizard);
198216
}
217+
if (selectionIndex != source.getItemCount() - 1) {
218+
mFilters.add(svgFilter);
219+
}
199220
page = 0; // reset to 1st page
200221
scanImages();
201222
}));

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/AbstractRepository.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
import java.util.Collection;
2323
import java.util.Enumeration;
2424
import java.util.HashSet;
25-
import java.util.LinkedList;
26-
import java.util.List;
25+
import java.util.LinkedHashMap;
2726
import java.util.Optional;
2827
import java.util.Properties;
28+
import java.util.SequencedMap;
2929
import java.util.zip.ZipEntry;
3030
import java.util.zip.ZipFile;
3131

@@ -45,7 +45,7 @@
4545

4646
public abstract class AbstractRepository extends Job {
4747

48-
protected List<ImageElement> mElementsCache = new LinkedList<>();
48+
private SequencedMap<String, ImageElement> mElementsCache = new LinkedHashMap<>();
4949

5050
private final IImageTarget mTarget;
5151

@@ -55,7 +55,7 @@ public AbstractRepository(IImageTarget target) {
5555
mTarget = target;
5656
}
5757

58-
private static final String[] KNOWN_EXTENSIONS = new String[] {".gif", ".png"}; //$NON-NLS-1$ //$NON-NLS-2$
58+
private static final String[] KNOWN_EXTENSIONS = new String[] { ".gif", ".png", ".svg" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
5959

6060
@Override
6161
protected synchronized IStatus run(IProgressMonitor monitor) {
@@ -69,15 +69,21 @@ protected synchronized IStatus run(IProgressMonitor monitor) {
6969
}
7070
} else {
7171
// return 1 image from cache
72-
mTarget.notifyImage(mElementsCache.remove(0));
72+
mTarget.notifyImage(mElementsCache.sequencedValues().removeFirst());
7373
}
7474
}
7575

7676
return Status.OK_STATUS;
7777
}
7878

7979
public synchronized void clearCache() {
80-
mElementsCache.clear();
80+
if (mElementsCache != null) {
81+
mElementsCache.clear();
82+
}
83+
}
84+
85+
public ImageElement getImageElement(String key) {
86+
return mElementsCache.get(key);
8187
}
8288

8389
protected abstract boolean populateCache(IProgressMonitor monitor);
@@ -211,6 +217,6 @@ protected Optional<String> getPluginName(final InputStream manifest) throws IOEx
211217
}
212218

213219
protected void addImageElement(ImageElement element) {
214-
mElementsCache.add(element);
220+
mElementsCache.put(element.getPath(), element);
215221
}
216222
}

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/TargetPlatformRepository.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,7 @@ protected synchronized IStatus run(IProgressMonitor monitor) {
122122
fBundles.clear();
123123
fBundles = null;
124124
}
125-
if (mElementsCache != null) {
126-
mElementsCache.clear();
127-
}
125+
clearCache();
128126
return Status.OK_STATUS;
129127
}
130128

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/WorkspaceRepository.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,7 @@ protected synchronized IStatus run(IProgressMonitor monitor) {
118118
fProjects.clear();
119119
fProjects = null;
120120
}
121-
if (mElementsCache != null) {
122-
mElementsCache.clear();
123-
}
121+
clearCache();
124122
return Status.OK_STATUS;
125123
}
126124

0 commit comments

Comments
 (0)