From 44ab710d614ab8f729ed50dbd4384c083546a341 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 12 May 2017 12:05:37 +0300 Subject: [PATCH] filter images by tags --- images/src/META-INF/ImagesPlugin.xml | 11 +- .../images/search/ImageTagManager.java | 111 ++++++++++++++++++ .../org/intellij/images/search/TagFilter.java | 51 ++++++++ .../images/thumbnail/ThumbnailView.java | 9 ++ .../images/thumbnail/actions/AddTagGroup.java | 90 ++++++++++++++ .../images/thumbnail/actions/Filter.java | 30 +++++ .../actions/FilterByTagComboBoxAction.java | 74 ++++++++++++ .../actions/FilterByThemeComboBoxAction.java | 9 +- ...emeAction.java => FilterImagesAction.java} | 10 +- .../thumbnail/actions/RemoveTagGroup.java | 69 +++++++++++ .../images/thumbnail/actions/ThemeFilter.java | 8 +- .../thumbnail/impl/ThumbnailViewImpl.java | 15 +++ .../thumbnail/impl/ThumbnailViewUI.java | 6 +- .../devkit/src/icons/AbstractThemeFilter.java | 6 + plugins/devkit/src/icons/Theme.java | 5 + 15 files changed, 488 insertions(+), 16 deletions(-) create mode 100644 images/src/org/intellij/images/search/ImageTagManager.java create mode 100644 images/src/org/intellij/images/search/TagFilter.java create mode 100644 images/src/org/intellij/images/thumbnail/actions/AddTagGroup.java create mode 100644 images/src/org/intellij/images/thumbnail/actions/Filter.java create mode 100644 images/src/org/intellij/images/thumbnail/actions/FilterByTagComboBoxAction.java rename images/src/org/intellij/images/thumbnail/actions/{FilterByThemeAction.java => FilterImagesAction.java} (86%) create mode 100644 images/src/org/intellij/images/thumbnail/actions/RemoveTagGroup.java diff --git a/images/src/META-INF/ImagesPlugin.xml b/images/src/META-INF/ImagesPlugin.xml index c8967cdb8bfd..85f6c3a89569 100644 --- a/images/src/META-INF/ImagesPlugin.xml +++ b/images/src/META-INF/ImagesPlugin.xml @@ -22,6 +22,8 @@ + @@ -132,7 +134,12 @@ id="Images.Thumbnails.FilterByTheme" text="Filter by Theme" description="Filter images by theme"/> - + + + + diff --git a/images/src/org/intellij/images/search/ImageTagManager.java b/images/src/org/intellij/images/search/ImageTagManager.java new file mode 100644 index 000000000000..0fd96ae57226 --- /dev/null +++ b/images/src/org/intellij/images/search/ImageTagManager.java @@ -0,0 +1,111 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.images.search; + +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.xmlb.annotations.AbstractCollection; +import com.intellij.util.xmlb.annotations.MapAnnotation; +import com.intellij.util.xmlb.annotations.Property; +import com.intellij.util.xmlb.annotations.Tag; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +@State(name = "ImageTags", storages = @Storage("imageTags.xml")) +public class ImageTagManager implements PersistentStateComponent { + + private State myState = new State(); + + public static ImageTagManager getInstance(Project project) { + return ServiceManager.getService(project, ImageTagManager.class); + } + + public boolean hasTag(String tag, VirtualFile file) { + State.Files files = myState.myTags.get(tag); + return files != null && files.contains(file.getPath()); + } + + public void addTag(String tag, VirtualFile file) { + State.Files files = myState.myTags.get(tag); + if (files == null) { + files = new State.Files(); + myState.myTags.put(tag, files); + } + files.add(file.getPath()); + } + + public void removeTag(String tag, VirtualFile file) { + State.Files files = myState.myTags.get(tag); + if (files != null) { + files.remove(file.getPath()); + } + } + + public List getTags(VirtualFile file) { + return myState.myTags.keySet() + .stream() + .filter(tag -> hasTag(tag, file)) + .collect(Collectors.toList()); + } + + public List getAllTags() { + return new ArrayList<>(myState.myTags.keySet()); + } + + @Nullable + @Override + public State getState() { + return myState; + } + + @Override + public void loadState(State state) { + myState = state; + } + + public static class State { + @Property(surroundWithTag = false) + @MapAnnotation(surroundKeyWithTag = false, surroundWithTag = false, + entryTagName = "tag", keyAttributeName = "name", valueAttributeName = "values") + public final Map myTags = new LinkedHashMap<>(); + + @Property(surroundWithTag = false) + @Tag("files") + public static class Files { + @Property(surroundWithTag = false) + @AbstractCollection(surroundWithTag = false, elementTag = "file", elementValueAttribute = "path") + public final Set myFiles = new LinkedHashSet<>(); + + public void remove(String path) { + myFiles.remove(path); + } + + public void add(String path) { + myFiles.add(path); + } + + public boolean contains(String path) { + return myFiles.contains(path); + } + } + } +} diff --git a/images/src/org/intellij/images/search/TagFilter.java b/images/src/org/intellij/images/search/TagFilter.java new file mode 100644 index 000000000000..15c3e9ca5ec9 --- /dev/null +++ b/images/src/org/intellij/images/search/TagFilter.java @@ -0,0 +1,51 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.images.search; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.intellij.images.thumbnail.ThumbnailView; +import org.intellij.images.thumbnail.actions.Filter; + +public class TagFilter implements Filter { + private String myTag; + private ImageTagManager myManager; + + public TagFilter(String tag, ImageTagManager manager) { + myTag = tag; + myManager = manager; + } + + @Override + public String getDisplayName() { + return myTag; + } + + @Override + public boolean accepts(VirtualFile file) { + return myManager.hasTag(myTag, file); + } + + @Override + public boolean isApplicableToProject(Project project) { + return true; + } + + @Override + public void setFilter(ThumbnailView view) { + view.setTagFilter(this); + } +} diff --git a/images/src/org/intellij/images/thumbnail/ThumbnailView.java b/images/src/org/intellij/images/thumbnail/ThumbnailView.java index a63526fa607b..718bad8ec431 100644 --- a/images/src/org/intellij/images/thumbnail/ThumbnailView.java +++ b/images/src/org/intellij/images/thumbnail/ThumbnailView.java @@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import org.intellij.images.ImagesBundle; +import org.intellij.images.search.TagFilter; import org.intellij.images.thumbnail.actions.ThemeFilter; import org.intellij.images.ui.ImageComponentDecorator; import org.jetbrains.annotations.NotNull; @@ -82,4 +83,12 @@ public interface ThumbnailView extends Disposable, ImageComponentDecorator { */ @Nullable ThemeFilter getFilter(); + + void setTagFilter(TagFilter filter); + + /** + * null means all files accepted + */ + @Nullable + TagFilter getTagFilter(); } diff --git a/images/src/org/intellij/images/thumbnail/actions/AddTagGroup.java b/images/src/org/intellij/images/thumbnail/actions/AddTagGroup.java new file mode 100644 index 000000000000..0e85bd7345dc --- /dev/null +++ b/images/src/org/intellij/images/thumbnail/actions/AddTagGroup.java @@ -0,0 +1,90 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.images.thumbnail.actions; + +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; +import org.intellij.images.search.ImageTagManager; +import org.intellij.images.thumbnail.ThumbnailView; +import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; + +public class AddTagGroup extends ActionGroup { + public AddTagGroup() { + setPopup(true); + } + + @NotNull + @Override + public AnAction[] getChildren(@Nullable AnActionEvent e) { + if (e == null) return EMPTY_ARRAY; + Project project = e.getProject(); + ImageTagManager tagManager = ImageTagManager.getInstance(project); + List tags = tagManager.getAllTags(); + int tagsNumber = tags.size(); + AnAction[] actions = new AnAction[tagsNumber + 1]; + for (int i = 0; i < tagsNumber; i++) { + String tag = tags.get(i); + actions[i] = new AnAction(tag) { + @Override + public void actionPerformed(AnActionEvent e) { + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + if (view != null) { + for (VirtualFile file : view.getSelection()) { + tagManager.addTag(tag, file); + } + } + } + + @Override + public void update(AnActionEvent e) { + e.getPresentation().setEnabledAndVisible(false); + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + if (view != null) { + e.getPresentation().setEnabledAndVisible(Arrays.stream(view.getSelection()).noneMatch(file -> tagManager.hasTag(tag, file))); + } + } + }; + } + actions[tagsNumber] = new AnAction("New Tag") { + @Override + public void actionPerformed(AnActionEvent e) { + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + if (view != null) { + VirtualFile[] selection = view.getSelection(); + if (selection.length > 0) { + String tag = Messages.showInputDialog("", "New Tag Name", null); + if (tag != null) { + for (VirtualFile file : selection) { + tagManager.addTag(tag, file); + } + } + } + } + } + }; + + return actions; + } +} diff --git a/images/src/org/intellij/images/thumbnail/actions/Filter.java b/images/src/org/intellij/images/thumbnail/actions/Filter.java new file mode 100644 index 000000000000..0db74d96d7be --- /dev/null +++ b/images/src/org/intellij/images/thumbnail/actions/Filter.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.images.thumbnail.actions; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.intellij.images.thumbnail.ThumbnailView; + +public interface Filter { + String getDisplayName(); + + boolean accepts(VirtualFile file); + + boolean isApplicableToProject(Project project); + + void setFilter(ThumbnailView view); +} diff --git a/images/src/org/intellij/images/thumbnail/actions/FilterByTagComboBoxAction.java b/images/src/org/intellij/images/thumbnail/actions/FilterByTagComboBoxAction.java new file mode 100644 index 000000000000..88788ef136ec --- /dev/null +++ b/images/src/org/intellij/images/thumbnail/actions/FilterByTagComboBoxAction.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.images.thumbnail.actions; + +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.actionSystem.ex.ComboBoxAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.intellij.images.search.ImageTagManager; +import org.intellij.images.search.TagFilter; +import org.intellij.images.thumbnail.ThumbnailView; +import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +public final class FilterByTagComboBoxAction extends ComboBoxAction { + + public void update(final AnActionEvent e) { + Project project = e.getProject(); + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + ImageTagManager tagManager = ImageTagManager.getInstance(project); + e.getPresentation().setVisible(view != null && !tagManager.getAllTags().isEmpty()); + TagFilter filter = view != null ? view.getTagFilter() : null; + e.getPresentation().setText(filter == null ? "All" : filter.getDisplayName()); + } + + @NotNull + @Override + protected DefaultActionGroup createPopupActionGroup(JComponent button) { + DefaultActionGroup group = new DefaultActionGroup(); + Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(button)); + ImageTagManager tagManager = ImageTagManager.getInstance(project); + group.add(new FilterImagesAction(new TagFilter("All", tagManager) { + @Override + public String getDisplayName() { + return "All"; + } + + @Override + public boolean accepts(VirtualFile file) { + return true; + } + + @Override + public boolean isApplicableToProject(Project project) { + return true; + } + })); + + for (String tag : tagManager.getAllTags()) { + group.add(new FilterImagesAction(new TagFilter(tag, tagManager))); + } + + return group; + } +} diff --git a/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java b/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java index 7333fe74ba64..ce923d3b5688 100644 --- a/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java @@ -45,7 +45,7 @@ public final class FilterByThemeComboBoxAction extends ComboBoxAction { @Override protected DefaultActionGroup createPopupActionGroup(JComponent button) { DefaultActionGroup group = new DefaultActionGroup(); - group.add(new FilterByThemeAction(new ThemeFilter() { + group.add(new FilterImagesAction(new ThemeFilter() { @Override public String getDisplayName() { return "All"; @@ -60,9 +60,14 @@ public final class FilterByThemeComboBoxAction extends ComboBoxAction { public boolean isApplicableToProject(Project project) { return true; } + + @Override + public void setFilter(ThumbnailView view) { + view.setFilter(this); + } })); for (ThemeFilter filter : ThemeFilter.EP_NAME.getExtensions()) { - group.add(new FilterByThemeAction(filter)); + group.add(new FilterImagesAction(filter)); } return group; diff --git a/images/src/org/intellij/images/thumbnail/actions/FilterByThemeAction.java b/images/src/org/intellij/images/thumbnail/actions/FilterImagesAction.java similarity index 86% rename from images/src/org/intellij/images/thumbnail/actions/FilterByThemeAction.java rename to images/src/org/intellij/images/thumbnail/actions/FilterImagesAction.java index 43777ab6c71a..41cf8cc18856 100644 --- a/images/src/org/intellij/images/thumbnail/actions/FilterByThemeAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/FilterImagesAction.java @@ -20,10 +20,10 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import org.intellij.images.thumbnail.ThumbnailView; import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil; -public class FilterByThemeAction extends AnAction { - private final ThemeFilter myFilter; +public class FilterImagesAction extends AnAction { + private final Filter myFilter; - public FilterByThemeAction(ThemeFilter filter) { + public FilterImagesAction(Filter filter) { myFilter = filter; } @@ -37,7 +37,7 @@ public class FilterByThemeAction extends AnAction { ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); if (view != null) { - view.setFilter(myFilter); - } + myFilter.setFilter(view); + } } } diff --git a/images/src/org/intellij/images/thumbnail/actions/RemoveTagGroup.java b/images/src/org/intellij/images/thumbnail/actions/RemoveTagGroup.java new file mode 100644 index 000000000000..8ac37f8fcd7f --- /dev/null +++ b/images/src/org/intellij/images/thumbnail/actions/RemoveTagGroup.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.images.thumbnail.actions; + +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.intellij.images.search.ImageTagManager; +import org.intellij.images.thumbnail.ThumbnailView; +import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class RemoveTagGroup extends ActionGroup { + public RemoveTagGroup() { + setPopup(true); + } + + @NotNull + @Override + public AnAction[] getChildren(@Nullable AnActionEvent e) { + if (e == null) return EMPTY_ARRAY; + Project project = e.getProject(); + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + ImageTagManager tagManager = ImageTagManager.getInstance(project); + if (view != null) { + List tags = null; + for (VirtualFile file : view.getSelection()) { + List newTags = tagManager.getTags(file); + if (newTags.isEmpty()) return EMPTY_ARRAY; + if (tags == null) { + tags = new ArrayList<>(newTags); + } + else { + tags.retainAll(newTags); + } + } + if (tags == null) return EMPTY_ARRAY; + return tags.stream().map(tag -> new AnAction(tag) { + @Override + public void actionPerformed(AnActionEvent e) { + for (VirtualFile file : view.getSelection()) { + tagManager.removeTag(tag, file); + } + } + }).toArray(AnAction[]::new); + } + + return EMPTY_ARRAY; + } +} diff --git a/images/src/org/intellij/images/thumbnail/actions/ThemeFilter.java b/images/src/org/intellij/images/thumbnail/actions/ThemeFilter.java index 9785164abe23..690fa9cbcc51 100644 --- a/images/src/org/intellij/images/thumbnail/actions/ThemeFilter.java +++ b/images/src/org/intellij/images/thumbnail/actions/ThemeFilter.java @@ -16,13 +16,7 @@ package org.intellij.images.thumbnail.actions; import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -public interface ThemeFilter { +public interface ThemeFilter extends Filter { ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.images.themeFilter"); - - String getDisplayName(); - boolean accepts(VirtualFile file); - boolean isApplicableToProject(Project project); } diff --git a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java index 51122a837e2e..05388a2a61cc 100644 --- a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java +++ b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java @@ -27,10 +27,12 @@ import com.intellij.openapi.wm.ToolWindowManager; import icons.ImagesIcons; import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.editor.actionSystem.ImageEditorActions; +import org.intellij.images.search.TagFilter; import org.intellij.images.thumbnail.ThumbnailView; import org.intellij.images.thumbnail.actions.ThemeFilter; import org.intellij.images.vfs.IfsUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -48,6 +50,7 @@ final class ThumbnailViewImpl implements ThumbnailView { private VirtualFile root = null; private final ThumbnailViewUI myThubmnailViewUi; private ThemeFilter myFilter; + private TagFilter myTagFilter; public ThumbnailViewImpl(Project project) { this.project = project; @@ -131,6 +134,18 @@ final class ThumbnailViewImpl implements ThumbnailView { return myFilter; } + @Override + public void setTagFilter(TagFilter filter) { + myTagFilter = filter; + updateUI(); + } + + @Nullable + @Override + public TagFilter getTagFilter() { + return myTagFilter; + } + public void setVisible(boolean visible) { toolWindow.setAvailable(visible, null); if (visible) { diff --git a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java index 91c854834d19..998fe83dc293 100644 --- a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java +++ b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java @@ -40,6 +40,7 @@ import com.intellij.ui.SideBorder; import com.intellij.ui.components.JBList; import org.intellij.images.fileTypes.ImageFileTypeManager; import org.intellij.images.options.*; +import org.intellij.images.search.TagFilter; import org.intellij.images.thumbnail.ThumbnailView; import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActions; import org.intellij.images.thumbnail.actions.ThemeFilter; @@ -177,9 +178,12 @@ final class ThumbnailViewUI extends JPanel implements DataProvider, Disposable { model.ensureCapacity(model.size() + virtualFiles.length + 1); ThemeFilter filter = thumbnailView.getFilter(); + TagFilter tagFilter = thumbnailView.getTagFilter(); for (VirtualFile virtualFile : virtualFiles) { if (filter == null || filter.accepts(virtualFile)) { - model.addElement(virtualFile); + if (tagFilter == null || tagFilter.accepts(virtualFile)) { + model.addElement(virtualFile); + } } } if (model.size() > 0) { diff --git a/plugins/devkit/src/icons/AbstractThemeFilter.java b/plugins/devkit/src/icons/AbstractThemeFilter.java index 06c4cddaf29c..01a250073b62 100644 --- a/plugins/devkit/src/icons/AbstractThemeFilter.java +++ b/plugins/devkit/src/icons/AbstractThemeFilter.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.devkit.icons; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import org.intellij.images.thumbnail.ThumbnailView; import org.intellij.images.thumbnail.actions.ThemeFilter; import org.jetbrains.idea.devkit.util.PsiUtil; @@ -41,4 +42,9 @@ public abstract class AbstractThemeFilter implements ThemeFilter { public boolean isApplicableToProject(Project project) { return PsiUtil.isIdeaProject(project) || PsiUtil.isPluginProject(project); } + + @Override + public void setFilter(ThumbnailView view) { + view.setFilter(this); + } } diff --git a/plugins/devkit/src/icons/Theme.java b/plugins/devkit/src/icons/Theme.java index 646d5efcd170..e35c576d476e 100644 --- a/plugins/devkit/src/icons/Theme.java +++ b/plugins/devkit/src/icons/Theme.java @@ -18,6 +18,7 @@ package org.jetbrains.idea.devkit.icons; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; +import org.intellij.images.thumbnail.ThumbnailView; import org.intellij.images.thumbnail.actions.ThemeFilter; public enum Theme implements ThemeFilter{ @@ -90,5 +91,9 @@ public enum Theme implements ThemeFilter{ return true; } + @Override + public void setFilter(ThumbnailView view) { + view.setFilter(this); + } }