# HG changeset patch # Parent 6a1cf22606b9f8d2258fee3576bdf7b72455097c #222406: Find/Replace dialog: Show scope icons like in the find usages dialog diff --git a/api.search/apichanges.xml b/api.search/apichanges.xml --- a/api.search/apichanges.xml +++ b/api.search/apichanges.xml @@ -105,6 +105,27 @@ + + + Added method getIcon to class SearchScopeDefinition + + + + + +

+ Search scope can define an icon that will be shown in the + UI, usually in the combo box for search scope selection. +

+

+ To use a custom scope icon, override method + SearchScopeDefinition.getIcon(). +

+
+ + +
+ Added ReplacePattern and replace history to SearchHistory class diff --git a/api.search/manifest.mf b/api.search/manifest.mf --- a/api.search/manifest.mf +++ b/api.search/manifest.mf @@ -1,5 +1,5 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.api.search OpenIDE-Module-Localizing-Bundle: org/netbeans/api/search/Bundle.properties -OpenIDE-Module-Specification-Version: 1.9 +OpenIDE-Module-Specification-Version: 1.10 diff --git a/api.search/src/org/netbeans/api/search/ui/ScopeController.java b/api.search/src/org/netbeans/api/search/ui/ScopeController.java --- a/api.search/src/org/netbeans/api/search/ui/ScopeController.java +++ b/api.search/src/org/netbeans/api/search/ui/ScopeController.java @@ -41,12 +41,16 @@ */ package org.netbeans.api.search.ui; +import java.awt.Component; import java.awt.Dialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; +import javax.swing.DefaultListCellRenderer; import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -84,6 +88,7 @@ this.extraSearchScopes = extraSearchScopes; component.addHierarchyListener(new ScopeComboBoxHierarchyListener()); component.setEditable(false); + component.setRenderer(new ScopeCellRenderer()); } private String chooseId() { @@ -294,4 +299,22 @@ active = false; } } + + private static class ScopeCellRenderer extends DefaultListCellRenderer { + + @Override + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) { + Component component = super.getListCellRendererComponent( + list, value, index, isSelected, cellHasFocus); + if (component instanceof JLabel) { + JLabel label = (JLabel) component; + if (value instanceof ScopeItem) { + ScopeItem item = (ScopeItem) value; + label.setIcon(item.getSearchScope().getIcon()); + } + } + return component; + } + } }; diff --git a/api.search/src/org/netbeans/modules/search/SearchScopeBrowse.java b/api.search/src/org/netbeans/modules/search/SearchScopeBrowse.java --- a/api.search/src/org/netbeans/modules/search/SearchScopeBrowse.java +++ b/api.search/src/org/netbeans/modules/search/SearchScopeBrowse.java @@ -46,6 +46,8 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import javax.swing.Icon; +import javax.swing.UIManager; import org.netbeans.api.search.SearchRoot; import org.netbeans.api.search.SearchScopeOptions; import org.netbeans.api.search.provider.SearchInfo; @@ -59,6 +61,7 @@ import org.openide.filesystems.FileChooserBuilder; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; +import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; /** @@ -71,10 +74,23 @@ */ public class SearchScopeBrowse { + private static final String ICON_KEY_UIMANAGER_NB = + "Nb.Explorer.Folder.openedIcon"; //NOI18N + private static final Icon ICON; + private static FileObject[] roots = null; private SearchScopeDefinition browseScope = new BrowseScope(); private SearchScopeDefinition getLastScope = new GetLastScope(); + static { + Icon icon = UIManager.getIcon(ICON_KEY_UIMANAGER_NB); + if (icon == null) { + icon = ImageUtilities.loadImageIcon( + "org/openide/loaders/defaultFolder.gif", false); //NOI18N + } + ICON = icon; + } + /** * Search Scope with title "Browse..." that can open file chooser to get * search roots. @@ -123,6 +139,11 @@ chooseRoots(); notifyListeners(); } + + @Override + public Icon getIcon() { + return ICON; + } } /** @@ -164,6 +185,11 @@ @Override public void clean() { } + + @Override + public Icon getIcon() { + return ICON; + } } /** diff --git a/api.search/src/org/netbeans/spi/search/SearchScopeDefinition.java b/api.search/src/org/netbeans/spi/search/SearchScopeDefinition.java --- a/api.search/src/org/netbeans/spi/search/SearchScopeDefinition.java +++ b/api.search/src/org/netbeans/spi/search/SearchScopeDefinition.java @@ -46,6 +46,7 @@ import java.util.ArrayList; import java.util.List; +import javax.swing.Icon; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.netbeans.api.annotations.common.CheckForNull; @@ -170,4 +171,15 @@ */ public void selected() { } + + /** + * Get icon to show in the combo box. The default implementation returns + * null. + * + * @since api.search/1.10 + * @return The icon, or null. + */ + public @CheckForNull Icon getIcon() { + return null; + } } diff --git a/utilities.project/nbproject/project.xml b/utilities.project/nbproject/project.xml --- a/utilities.project/nbproject/project.xml +++ b/utilities.project/nbproject/project.xml @@ -63,7 +63,7 @@ - 1.0 + 1.10 diff --git a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeCurrentProject.java b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeCurrentProject.java --- a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeCurrentProject.java +++ b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeCurrentProject.java @@ -43,6 +43,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import javax.swing.Icon; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectInformation; @@ -66,6 +67,7 @@ private PropertyChangeListener pcl; private boolean applicable = true; private String name = null; + private Icon icon; private Project project = null; public SearchScopeCurrentProject() { @@ -104,9 +106,11 @@ applicable = true; name = NbBundle.getMessage(SearchScopeCurrentProject.class, "SearchScopeCurrentProject", shortName(project)); //NOI18N + icon = ProjectUtils.getInformation(project).getIcon(); } else { applicable = false; name = ""; //NOI18N + icon = null; } notifyListeners(); } @@ -164,4 +168,9 @@ name = null; project = null; } + + @Override + public Icon getIcon() { + return icon; + } } diff --git a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeMainProject.java b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeMainProject.java --- a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeMainProject.java +++ b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeMainProject.java @@ -44,7 +44,10 @@ package org.netbeans.modules.search.project; +import javax.swing.Icon; import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectInformation; +import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.ui.OpenProjects; import org.netbeans.api.search.provider.SearchInfo; import org.netbeans.api.search.provider.SearchInfoUtils; @@ -103,5 +106,16 @@ public int getPriority() { return 100; } - + + @Override + public Icon getIcon() { + Project p = OpenProjects.getDefault().getMainProject(); + if (p != null) { + ProjectInformation pi = ProjectUtils.getInformation(p); + if (pi != null) { + return pi.getIcon(); + } + } + return null; + } } diff --git a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeNodeSelection.java b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeNodeSelection.java --- a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeNodeSelection.java +++ b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeNodeSelection.java @@ -44,15 +44,21 @@ package org.netbeans.modules.search.project; +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.beans.BeanInfo; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.swing.Icon; +import org.netbeans.api.annotations.common.StaticResource; import org.netbeans.api.search.provider.SearchInfo; import org.netbeans.api.search.provider.SearchInfoUtils; import org.netbeans.spi.search.SearchScopeDefinition; import org.openide.nodes.Node; +import org.openide.util.ImageUtilities; import org.openide.util.Lookup; import org.openide.util.LookupEvent; import org.openide.util.LookupListener; @@ -69,10 +75,23 @@ */ final class SearchScopeNodeSelection extends SearchScopeDefinition implements LookupListener { - + @StaticResource + private static final String MORE_ICON_ID = + "org/netbeans/modules/search/project/resources/more.png"; //NOI18N + + @StaticResource + private static final String MULTI_SELECTION_ID = + "org/netbeans/modules/search/project/resources/pages_qualifier.png"; //NOI18N + private static final Icon MULTI_SELECTION_ICON; + private final Lookup.Result lookupResult; private LookupListener lookupListener; + static { + MULTI_SELECTION_ICON = ImageUtilities.loadImageIcon( + MULTI_SELECTION_ID, false); + } + public SearchScopeNodeSelection() { Lookup lookup = Utilities.actionsGlobalContext(); lookupResult = lookup.lookupResult(Node.class); @@ -324,4 +343,22 @@ public void resultChanged(LookupEvent ev) { notifyListeners(); } + + @Override + public Icon getIcon() { + Node[] nodes = getNodes(); + if (nodes.length > 1) { + return MULTI_SELECTION_ICON; + } else if (nodes.length == 1 && nodes[0] != null) { + Node n = nodes[0]; + Image image = n.getIcon(BeanInfo.ICON_COLOR_16x16); + if (image != null) { + return ImageUtilities.image2Icon(image); + } else { + return null; + } + } else { + return null; + } + } } diff --git a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeOpenProjects.java b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeOpenProjects.java --- a/utilities.project/src/org/netbeans/modules/search/project/SearchScopeOpenProjects.java +++ b/utilities.project/src/org/netbeans/modules/search/project/SearchScopeOpenProjects.java @@ -44,10 +44,13 @@ package org.netbeans.modules.search.project; +import javax.swing.Icon; +import org.netbeans.api.annotations.common.StaticResource; import org.netbeans.api.project.Project; import org.netbeans.api.project.ui.OpenProjects; import org.netbeans.api.search.provider.SearchInfo; import org.netbeans.api.search.provider.SearchInfoUtils; +import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; /** @@ -56,7 +59,16 @@ * @author Marian Petras */ final class SearchScopeOpenProjects extends AbstractProjectSearchScope { - + + @StaticResource + private static final String ALL_PROJECTS_ICON = + "org/netbeans/modules/search/project/resources/all_projects.png"; //NOI18N + private static final Icon ICON; + + static { + ICON = ImageUtilities.loadImageIcon(ALL_PROJECTS_ICON, false); + } + SearchScopeOpenProjects() { super(OpenProjects.PROPERTY_OPEN_PROJECTS); } @@ -111,4 +123,9 @@ public int getPriority() { return 200; } + + @Override + public Icon getIcon() { + return ICON; + } } diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/resources/all_projects.png b/utilities.project/src/org/netbeans/modules/search/project/resources/all_projects.png copy from refactoring.java/src/org/netbeans/modules/refactoring/java/resources/all_projects.png copy to utilities.project/src/org/netbeans/modules/search/project/resources/all_projects.png diff --git a/utilities.project/src/org/netbeans/modules/search/project/resources/more.png b/utilities.project/src/org/netbeans/modules/search/project/resources/more.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a359ff49187cebafdb7e881542ba9702bb6465 GIT binary patch literal 246 zc%17D@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhY)RhkE(~Ds(|LD2km4-xh%5%G z5(Z&LhFNnYfP(BLp1!W^cNr!5Gz^&K)qenmWHUn|N}Tg^b5rw5!1|qwQWHy3QxwWG zOEMJPJ$(aG^itV@;!&P1jv*44w@%#1*$}|vqJOiVBX{lALeAp?(c%?i_O2bR@kiJd zCs?0o^bP0l+XkKE)z-7 diff --git a/utilities.project/src/org/netbeans/modules/search/project/resources/pages_qualifier.png b/utilities.project/src/org/netbeans/modules/search/project/resources/pages_qualifier.png new file mode 100644 index 0000000000000000000000000000000000000000..cc48ca0a2adecde6f6169fb01dfc591f004fc5d8 GIT binary patch literal 3319 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