diff --git a/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/ContentProviderImpl.java b/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/ContentProviderImpl.java index 5052b8b33e7f..a01b32ad6557 100644 --- a/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/ContentProviderImpl.java +++ b/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/ContentProviderImpl.java @@ -28,6 +28,7 @@ import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; @@ -38,7 +39,6 @@ import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JList; -import javax.swing.ListCellRenderer; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -103,6 +103,7 @@ protected String getItemValue(@NonNull final SymbolDescriptor item) { } @Override + @SuppressWarnings("unchecked") protected void update(@NonNull final SymbolDescriptor item) { String searchText = getSearchText(); if (searchText == null) { @@ -111,8 +112,8 @@ protected void update(@NonNull final SymbolDescriptor item) { SymbolProviderAccessor.DEFAULT.setHighlightText(item, searchText); final SymbolDescriptorAttrCopier copier = currentSearch.getAttribute(SymbolDescriptorAttrCopier.class); if (copier != null) { - if (item instanceof AsyncDescriptor && !((AsyncDescriptor)item).hasCorrectCase()) { - copier.reportWrongCase((AsyncDescriptor)item); + if (item instanceof AsyncDescriptor ad && !ad.hasCorrectCase()) { + copier.reportWrongCase(ad); } } } @@ -139,8 +140,8 @@ void setDialog(final Dialog dialog) { @Override - public ListCellRenderer getListCellRenderer( - @NonNull final JList list, + public ItemRenderer getListCellRenderer( + @NonNull final JList list, @NonNull final ButtonModel caseSensitive) { Parameters.notNull("list", list); //NOI18N Parameters.notNull("caseSensitive", caseSensitive); //NOI18N @@ -151,7 +152,7 @@ public ListCellRenderer getListCellRenderer( } @Override - public boolean setListModel(GoToPanel panel, String text) { + public boolean setListModel(GoToPanel panel, String text) { enableOK(false); final Worker workToCancel; final RequestProcessor.Task taskToCancel; @@ -170,7 +171,7 @@ public boolean setListModel(GoToPanel panel, String text) { if ( text == null ) { currentSearch.resetFilter(); - panel.setModel(new DefaultListModel(), true); + panel.setModel(new DefaultListModel<>(), true); return false; } final boolean exact = text.endsWith(" "); // NOI18N @@ -180,7 +181,7 @@ public boolean setListModel(GoToPanel panel, String text) { currentSearch.filter( SearchType.EXACT_NAME, text, - Collections.singletonMap(AbstractModelFilter.OPTION_CLEAR, Boolean.TRUE)); + Map.of(AbstractModelFilter.OPTION_CLEAR, Boolean.TRUE)); panel.revalidateModel(true); return false; } @@ -197,7 +198,7 @@ public boolean setListModel(GoToPanel panel, String text) { if (name.isEmpty()) { //Empty name, wait for next char currentSearch.resetFilter(); - panel.setModel(new DefaultListModel(), true); + panel.setModel(new DefaultListModel<>(), true); return false; } // Compute in other thread @@ -245,7 +246,7 @@ public boolean hasValidContent() { Runnable createWorker( @NonNull final String text, @NonNull final SearchType searchType, - @NonNull final GoToPanel panel) { + @NonNull final GoToPanel panel) { return new Worker(text, text, searchType, panel); } @@ -268,7 +269,7 @@ private void cleanUp() { private Collection getTypeProviders() { Collection res = typeProviders.get(); if (res == null) { - res = Arrays.asList(Lookup.getDefault().lookupAll(SymbolProvider.class).toArray(new SymbolProvider[0])); + res = Arrays.asList(Lookup.getDefault().lookupAll(SymbolProvider.class).toArray(SymbolProvider[]::new)); if (!typeProviders.compareAndSet(null, res)) { res = typeProviders.get(); } @@ -324,7 +325,7 @@ private class Worker implements Runnable { private final String name; private final SearchType searchType; private final long createTime; - private final GoToPanel panel; + private final GoToPanel panel; private volatile boolean isCanceled = false; private volatile SymbolProvider current; @@ -333,7 +334,7 @@ private class Worker implements Runnable { @NonNull final String text, @NonNull final String name, @NonNull final SearchType searchType, - @NonNull final GoToPanel panel ) { + @NonNull final GoToPanel panel ) { this.text = text; this.name = name; this.searchType = searchType; @@ -465,7 +466,7 @@ private Result getSymbolNames( items = new HashSet<>(128); String[] message = new String[1]; int retry = 0; - final Collection nonFinishedProviders = Collections.newSetFromMap(new IdentityHashMap()); + final Collection nonFinishedProviders = Collections.newSetFromMap(new IdentityHashMap<>()); for (SymbolProvider provider : providers) { current = provider; try { @@ -553,16 +554,17 @@ public boolean removeAll(Collection c) { return modified; } }); - resolved = Collections.synchronizedSet(new HashSet()); + resolved = Collections.synchronizedSet(new HashSet<>()); } + @SuppressWarnings("unchecked") void checkWrongCase( @NonNull final Collection remove, @NonNull final Collection add) { hasWrongCase.removeAll(remove); for (SymbolDescriptor d : add) { - if (d instanceof AsyncDescriptor && !((AsyncDescriptor)d).hasCorrectCase()) { - reportWrongCase((AsyncDescriptor)d); + if (d instanceof AsyncDescriptor ad && !ad.hasCorrectCase()) { + reportWrongCase(ad); } } } @@ -593,8 +595,8 @@ public SymbolDescriptor create(@NonNull final Pair)source).hasCorrectCase()) { - hasWrongCase.remove(source); + if (source instanceof AsyncDescriptor ad && !ad.hasCorrectCase()) { + hasWrongCase.remove(ad); } SymbolProviderAccessor.DEFAULT.setHighlightText( target, diff --git a/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/GoToPanelImpl.java b/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/GoToPanelImpl.java index 6ed4dc30c7db..ac0af64dae9c 100644 --- a/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/GoToPanelImpl.java +++ b/ide/jumpto/src/org/netbeans/modules/jumpto/symbol/GoToPanelImpl.java @@ -47,7 +47,6 @@ import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.KeyStroke; -import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; @@ -61,6 +60,7 @@ import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.modules.jumpto.SearchHistory; +import org.netbeans.modules.jumpto.common.ItemRenderer; import org.netbeans.modules.jumpto.common.UiUtils; import org.netbeans.modules.jumpto.settings.GoToSettings; import org.netbeans.modules.jumpto.type.UiOptions; @@ -165,7 +165,7 @@ public long getStartTime() { */ @Override public boolean setModel( - @NonNull final ListModel model, + @NonNull ListModel model, final boolean finished) { assert SwingUtilities.isEventDispatchThread(); matchesList.setModel(model); @@ -560,7 +560,6 @@ public void itemStateChanged(ItemEvent e) { @Override public void valueChanged(@NonNull final ListSelectionEvent ev) { - // got "Not computed yet" text sometimes SymbolDescriptor selected = dialog.matchesList.getSelectedValue(); if (selected != null) { dialog.jTextFieldLocation.setText(selected.getFileDisplayPath()); @@ -588,9 +587,9 @@ private void update(boolean restart) { public static interface ContentProvider { - public ListCellRenderer getListCellRenderer(JList list, ButtonModel caseSensitive); + public ItemRenderer getListCellRenderer(JList list, ButtonModel caseSensitive); - public boolean setListModel( GoToPanel panel, String text ); + public boolean setListModel(GoToPanel panel, String text); public void closeDialog(); diff --git a/ide/jumpto/src/org/netbeans/modules/jumpto/type/Bundle.properties b/ide/jumpto/src/org/netbeans/modules/jumpto/type/Bundle.properties index e8f7c471690e..150fc6aa9a7a 100644 --- a/ide/jumpto/src/org/netbeans/modules/jumpto/type/Bundle.properties +++ b/ide/jumpto/src/org/netbeans/modules/jumpto/type/Bundle.properties @@ -43,7 +43,6 @@ TXT_GoToType_MatchesList_Label=Types &Found : LBL_GoToType_LocationJLabel=Location\: TXT_GoToType_CaseSensitive=Case &Sensitive TXT_GoToType_PreferOpenProjects=Prefer &Open Projects -LBL_Computing=Computing... CTL_OK=OK diff --git a/ide/jumpto/src/org/netbeans/modules/jumpto/type/FilteredListModel.java b/ide/jumpto/src/org/netbeans/modules/jumpto/type/FilteredListModel.java index f4af4c09a32c..8ce40d069eac 100644 --- a/ide/jumpto/src/org/netbeans/modules/jumpto/type/FilteredListModel.java +++ b/ide/jumpto/src/org/netbeans/modules/jumpto/type/FilteredListModel.java @@ -18,9 +18,12 @@ */ package org.netbeans.modules.jumpto.type; +import java.util.Arrays; import java.util.BitSet; +import java.util.concurrent.atomic.AtomicReference; import javax.swing.ListModel; import javax.swing.SwingUtilities; +import javax.swing.event.EventListenerList; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import org.netbeans.api.annotations.common.NonNull; @@ -28,20 +31,20 @@ import org.netbeans.modules.jumpto.common.Models.Filter; -final class FilteredListModel implements ListModel, Runnable, ListDataListener { +final class FilteredListModel implements ListModel, Runnable, ListDataListener { /** means that the value has not yet been assigned */ - private static int NOT_TESTED = Short.MIN_VALUE - 1; - private static int EMPTY_VALUE = Short.MIN_VALUE - 2; + private static final int NOT_TESTED = Short.MIN_VALUE - 1; + private static final int EMPTY_VALUE = Short.MIN_VALUE - 2; /** skips extensive asserts - needed for performance tests */ - private static final boolean skipExpensiveAsserts = Boolean.getBoolean ("org.openide.explorer.view.LazyListModel.skipExpensiveAsserts"); // NOI18N + private static final boolean SKIP_EXPENSIVE_ASSERTS = Boolean.getBoolean ("org.openide.explorer.view.LazyListModel.skipExpensiveAsserts"); // NOI18N private boolean log; - private ListModel listModel; - private Filter filter; + private final ListModel listModel; + private final Filter filter; /** the value to return when nothing else can be returned */ - private Object defaultValue; + private final E defaultValue; /** simple event listener list */ - private javax.swing.event.EventListenerList list = new javax.swing.event.EventListenerList (); + private final EventListenerList list = new javax.swing.event.EventListenerList (); /** the size of the original list we now know it has */ private int originalSize; @@ -57,7 +60,7 @@ final class FilteredListModel implements ListModel, Runnable, ListDataListener { /** dirty means that we should really update assumptions */ private boolean markDirty; - private FilteredListModel (ListModel m, Filter f, Object defaultValue) { + private FilteredListModel (ListModel m, Filter f, E defaultValue) { this.listModel = m; this.filter = f; this.defaultValue = defaultValue; @@ -66,10 +69,6 @@ private FilteredListModel (ListModel m, Filter f, Object defaultValue) { m.addListDataListener (this); } - final Filter getFilter () { - return filter; - } - /** Makes itself dirty and schedules an update. */ private void markDirty () { @@ -182,7 +181,7 @@ final void updateYourAssumeptions () { private boolean externalContraints () { assert external != null : "Not null"; // NOI18N assert external.length >= size : "Length " + external.length + " >= " + size; // NOI18N - if (!skipExpensiveAsserts) { + if (!SKIP_EXPENSIVE_ASSERTS) { for (int i = 1; i < size; i++) { assert external[i - 1] != NOT_TESTED || external[i] != EMPTY_VALUE : "There cannot be empty value after not tested value"; // NOI18N assert external[i - 1] != EMPTY_VALUE || external[i] != NOT_TESTED : "Not tested cannot immediatelly follow empty value"; // NOI18N @@ -202,11 +201,11 @@ private static void removeInterval (int[] array, int index0, int index1) { /** Factory method to create new filtering lazy model. */ @NonNull - static FilteredListModel create ( - @NonNull final ListModel listModel, - @NonNull final Filter filter, - @NullAllowed final Object defValue) { - return new FilteredListModel(listModel, filter, defValue); + static FilteredListModel create ( + @NonNull final ListModel listModel, + @NonNull final Filter filter, + @NullAllowed final E defValue) { + return new FilteredListModel<>(listModel, filter, defValue); } // @@ -231,21 +230,20 @@ private void fireChange (ListDataEvent ev) { for (int i = arr.length - 1; i >= 0; i -= 2) { ListDataListener l = (ListDataListener)arr[i]; switch (ev.getType ()) { - case ListDataEvent.CONTENTS_CHANGED: l.contentsChanged (ev); break; - case ListDataEvent.INTERVAL_ADDED: l.intervalAdded (ev); break; - case ListDataEvent.INTERVAL_REMOVED: l.intervalRemoved (ev); break; - default: - throw new IllegalArgumentException ("Unknown type: " + ev.getType ()); + case ListDataEvent.CONTENTS_CHANGED -> l.contentsChanged (ev); + case ListDataEvent.INTERVAL_ADDED -> l.intervalAdded (ev); + case ListDataEvent.INTERVAL_REMOVED -> l.intervalRemoved (ev); + default -> throw new IllegalArgumentException ("Unknown type: " + ev.getType ()); } } } /** Is this index accepted. */ - private boolean accepted (int indx, Object[] result) { - Object v = listModel.getElementAt (indx); + private boolean accepted (int indx, AtomicReference result) { + E v = listModel.getElementAt (indx); if (filter.accept (v)) { - result[0] = v; + result.set(v); return true; } @@ -260,9 +258,7 @@ private void initialize () { originalSize = listModel.getSize (); size = listModel.getSize (); external = new int[size]; - for (int i = 0; i < size; i++) { - external[i] = NOT_TESTED; - } + Arrays.fill(external, 0, size, NOT_TESTED); checked = new BitSet (size); } assert externalContraints () : "Constraints failed"; // NOI18N @@ -275,7 +271,7 @@ private void initialize () { /** If value is not know for given index and CREATE.get() is Boolean.FALSE it returns defaultValue. */ @Override - public Object getElementAt(int index) { + public E getElementAt(int index) { initialize (); if (log) { @@ -292,7 +288,7 @@ public Object getElementAt(int index) { return defaultValue; } - if (CREATE != null && !CREATE.booleanValue()) { + if (CREATE != null && !CREATE) { assert Thread.holdsLock(CREATE) : "Only one thread (from tests) can access this"; // NOI18N return defaultValue; } @@ -323,12 +319,12 @@ public Object getElementAt(int index) { myIndex = myMaxIndex - 1; } - Object[] result = new Object[1]; + AtomicReference result = new AtomicReference<>(); if (accepted (myIndex, result)) { assert external[index] == NOT_TESTED : "External index " + index + " still needs to be unset: " + external[index]; external[index] = myIndex; checked.set (index); - return result[0]; + return result.get(); } boolean checkBefore = true; @@ -339,7 +335,7 @@ public Object getElementAt(int index) { if (checkBefore && accepted (myIndex - i, result)) { external[index] = myIndex - i; checked.set (index); - return result[0]; + return result.get(); } } if (checkAfter) { @@ -347,7 +343,7 @@ public Object getElementAt(int index) { if (checkAfter && accepted (myIndex + i, result)) { external[index] = myIndex + i; checked.set (index); - return result[0]; + return result.get(); } } } @@ -382,9 +378,7 @@ public void contentsChanged (@NonNull final ListDataEvent listDataEvent) { } size = originalSize; external = new int[size]; - for (int i = 0; i < size; i++) { - external[i] = NOT_TESTED; - } + Arrays.fill(external, 0, size, NOT_TESTED); checked = new BitSet (size); assert externalContraints () : "Constraints failed"; // NOI18N } diff --git a/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToPanel.java b/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToPanel.java index b2d28a0dd9d2..93f58ef2955d 100644 --- a/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToPanel.java +++ b/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToPanel.java @@ -38,7 +38,6 @@ import javax.swing.JLabel; import javax.swing.JList; import javax.swing.KeyStroke; -import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; @@ -53,6 +52,7 @@ import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.annotations.common.NullAllowed; import org.netbeans.modules.jumpto.SearchHistory; +import org.netbeans.modules.jumpto.common.ItemRenderer; import org.netbeans.modules.jumpto.common.UiUtils; import org.netbeans.modules.jumpto.settings.GoToSettings; import org.netbeans.spi.jumpto.type.TypeDescriptor; @@ -142,7 +142,7 @@ public void removeNotify() { /** Sets the model from different thread */ - boolean setModel( final ListModel model) { + boolean setModel(ListModel model) { assert SwingUtilities.isEventDispatchThread(); matchesList.setModel(model); if (model.getSize() > 0 || getText() == null || getText().isBlank()) { @@ -550,7 +550,6 @@ public void itemStateChanged (final ItemEvent e) { @Override public void valueChanged(@NonNull final ListSelectionEvent ev) { - // got "Not computed yet" text sometimes TypeDescriptor selected = dialog.matchesList.getSelectedValue(); if (selected != null) { dialog.jTextFieldLocation.setText(selected.getFileDisplayPath()); @@ -579,7 +578,7 @@ private void update(boolean restart) { public static interface ContentProvider { @NonNull - public ListCellRenderer getListCellRenderer( + public ItemRenderer getListCellRenderer( @NonNull JList list, @NonNull ButtonModel caseSensitive); diff --git a/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java b/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java index 1a053ed2c8d9..2dd1cde5c335 100644 --- a/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java +++ b/ide/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java @@ -50,7 +50,6 @@ import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.JButton; -import javax.swing.ListCellRenderer; import javax.swing.JEditorPane; import javax.swing.JList; import javax.swing.ListModel; @@ -92,7 +91,7 @@ public class GoToTypeAction extends AbstractAction implements GoToPanel.ContentP static final Logger LOGGER = Logger.getLogger(GoToTypeAction.class.getName()); // Used from the panel as well private SearchType nameKind; - private static ListModel EMPTY_LIST_MODEL = new DefaultListModel(); + private static ListModel EMPTY_LIST_MODEL = new DefaultListModel<>(); private static final RequestProcessor rp = new RequestProcessor ("GoToTypeAction-RequestProcessor",1); //NOI18N private static final RequestProcessor PROFILE_RP = new RequestProcessor("GoToTypeAction-Profile",1); //NOI18N private Worker running; @@ -119,25 +118,27 @@ public GoToTypeAction() { public GoToTypeAction(String title, TypeBrowser.Filter typeFilter, boolean multiSelection, TypeProvider... typeProviders) { super( NbBundle.getMessage( GoToTypeAction.class,"TXT_GoToType") ); - putValue("PopupMenuText", NbBundle.getBundle(GoToTypeAction.class).getString("editor-popup-TXT_GoToType")); // NOI18N + putValue("PopupMenuText", NbBundle.getMessage(GoToTypeAction.class, "editor-popup-TXT_GoToType")); // NOI18N this.title = title; this.typeFilter = typeFilter; this.implicitTypeProviders = typeProviders.length == 0 ? null : List.of(typeProviders); this.multiSelection = multiSelection; - this.currentSearch = new CurrentSearch(() -> new AbstractModelFilter() { - @Override - protected String getItemValue(@NonNull final TypeDescriptor item) { - return item.getSimpleName(); - } - @Override - protected void update(@NonNull final TypeDescriptor item) { - String searchText = getSearchText(); - if (searchText == null) { - searchText = ""; //NOI18N + this.currentSearch = new CurrentSearch<>( + () -> new AbstractModelFilter<>() { + @Override + protected String getItemValue(@NonNull final TypeDescriptor item) { + return item.getSimpleName(); + } + @Override + protected void update(@NonNull final TypeDescriptor item) { + String searchText = getSearchText(); + if (searchText == null) { + searchText = ""; //NOI18N + } + TypeProviderAccessor.DEFAULT.setHighlightText(item, searchText); + } } - TypeProviderAccessor.DEFAULT.setHighlightText(item, searchText); - } - }); + ); } @Override @@ -203,17 +204,15 @@ public boolean isEnabled () { @Override - @SuppressWarnings("unchecked") - public ListCellRenderer getListCellRenderer( + public ItemRenderer getListCellRenderer( @NonNull final JList list, @NonNull final ButtonModel caseSensitive) { Parameters.notNull("list", list); //NOI18N Parameters.notNull("caseSensitive", caseSensitive); //NOI18N - ItemRenderer renderer = ItemRenderer.Builder.create( + return ItemRenderer.Builder.create( list, caseSensitive, new TypeDescriptorConvertor()).build(); - return (ListCellRenderer) renderer; } @Override @@ -498,13 +497,13 @@ public void run() { caseSensitive, GoToSettings.getDefault().isSortingPreferOpenProjects()); itemsComparator = ic; - final Models.MutableListModel baseModel = Models.mutable( + final Models.MutableListModel baseModel = Models.mutable( ic, currentSearch.resetFilter(), null); - final ListModel model = typeFilter != null ? - FilteredListModel.create(baseModel, new FilterAdaptor(typeFilter), NbBundle.getMessage(GoToTypeAction.class, "LBL_Computing")) : - baseModel; + ListModel model = typeFilter != null + ? FilteredListModel.create(baseModel, new FilterAdaptor(typeFilter), null) + : baseModel; for (;;) { final int[] retry = new int[1]; @@ -651,7 +650,7 @@ final void waitSearchFinished() { private class DialogButtonListener implements ActionListener { - private GoToPanel panel; + private final GoToPanel panel; public DialogButtonListener( GoToPanel panel ) { this.panel = panel;