cleanup: generalize ListCellRenderers

GitOrigin-RevId: 7096333541ccc2558ea60b1f8541d14c9833e064
This commit is contained in:
Alexey Kudravtsev
2020-03-10 13:32:01 +00:00
committed by intellij-monorepo-bot
parent 556b434b36
commit e347c8527c
22 changed files with 133 additions and 137 deletions
@@ -184,7 +184,7 @@ public class MarkerType {
private static void navigateToSiblingOverridingMethod(MouseEvent e, @NotNull PsiMethod method) {
PsiMethod superMethod = FindSuperElementsHelper.getSiblingInheritedViaSubClass(method);
if (superMethod == null) return;
PsiElementListNavigator.openTargets(e, new NavigatablePsiElement[]{superMethod},
PsiElementListNavigator.openTargets(e, new PsiMethod[]{superMethod},
DaemonBundle.message("navigation.title.super.method", method.getName()),
DaemonBundle.message("navigation.findUsages.title.super.method", method.getName()),
new MethodCellRenderer(false));
@@ -147,7 +147,7 @@ public abstract class FindJarFix<T extends PsiElement> implements IntentionActio
}
else {
JBList<String> libNames = new JBList<>(ContainerUtil.sorted(libs.keySet()));
libNames.installCellRenderer(o -> new JLabel(o.toString(), PlatformIcons.JAR_ICON, SwingConstants.LEFT));
libNames.installCellRenderer(o -> new JLabel(o, PlatformIcons.JAR_ICON, SwingConstants.LEFT));
if (libs.size() == 1) {
final String jarName = libs.keySet().iterator().next();
final String url = libs.get(jarName);
@@ -174,11 +174,11 @@ public abstract class MergeableLineMarkerInfo<T extends PsiElement> extends Line
IPopupChooserBuilder<LineMarkerInfo<?>> builder = JBPopupFactory.getInstance().createPopupChooserBuilder(myInfos);
builder.setRenderer(new SelectionAwareListCellRenderer<>(dom -> {
Icon icon = null;
final GutterIconRenderer renderer = ((LineMarkerInfo<?>)dom).createGutterRenderer();
final GutterIconRenderer renderer = dom.createGutterRenderer();
if (renderer != null) {
icon = renderer.getIcon();
}
PsiElement element = ((LineMarkerInfo<?>)dom).getElement();
PsiElement element = dom.getElement();
final String elementPresentation;
if (element == null) {
elementPresentation = IdeBundle.message("node.structureview.invalid");
@@ -82,17 +82,16 @@ public class MultipleBuildsView implements BuildProgressListener, Disposable {
myBuildsList.setModel(new DefaultListModel<>());
myBuildsList.setFixedCellHeight(UIUtil.LIST_FIXED_CELL_HEIGHT * 2);
myBuildsList.installCellRenderer(obj -> {
AbstractViewManager.BuildInfo buildInfo = (AbstractViewManager.BuildInfo)obj;
JPanel panel = new JPanel(new BorderLayout());
SimpleColoredComponent mainComponent = new SimpleColoredComponent();
mainComponent.setIcon(buildInfo.getIcon());
mainComponent.append(buildInfo.getTitle() + ": ", SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
mainComponent.append(buildInfo.message, SimpleTextAttributes.REGULAR_ATTRIBUTES);
mainComponent.setIcon(obj.getIcon());
mainComponent.append(obj.getTitle() + ": ", SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
mainComponent.append(obj.message, SimpleTextAttributes.REGULAR_ATTRIBUTES);
panel.add(mainComponent, BorderLayout.NORTH);
if (buildInfo.statusMessage != null) {
if (obj.statusMessage != null) {
SimpleColoredComponent statusComponent = new SimpleColoredComponent();
statusComponent.setIcon(EmptyIcon.ICON_16);
statusComponent.append(buildInfo.statusMessage, SimpleTextAttributes.GRAY_ATTRIBUTES);
statusComponent.append(obj.statusMessage, SimpleTextAttributes.GRAY_ATTRIBUTES);
panel.add(statusComponent, BorderLayout.SOUTH);
}
return panel;
@@ -22,7 +22,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.JBList;
import com.intellij.usages.UsageView;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -38,16 +37,16 @@ public class PsiElementListNavigator {
private PsiElementListNavigator() {
}
public static void openTargets(MouseEvent e, NavigatablePsiElement[] targets, String title, final String findUsagesTitle, ListCellRenderer listRenderer) {
public static <T extends NavigatablePsiElement> void openTargets(MouseEvent e, T[] targets, String title, final String findUsagesTitle, ListCellRenderer<? super T> listRenderer) {
openTargets(e, targets, title, findUsagesTitle, listRenderer, (BackgroundUpdaterTask)null);
}
public static void openTargets(MouseEvent e,
NavigatablePsiElement[] targets,
String title,
final String findUsagesTitle,
ListCellRenderer listRenderer,
@Nullable BackgroundUpdaterTask listUpdaterTask) {
public static <T extends NavigatablePsiElement> void openTargets(MouseEvent e,
T[] targets,
String title,
final String findUsagesTitle,
ListCellRenderer<? super T> listRenderer,
@Nullable BackgroundUpdaterTask listUpdaterTask) {
JBPopup popup = navigateOrCreatePopup(targets, title, findUsagesTitle, listRenderer, listUpdaterTask);
if (popup != null) {
RelativePoint point = new RelativePoint(e);
@@ -60,12 +59,12 @@ public class PsiElementListNavigator {
}
}
public static void openTargets(Editor e, NavigatablePsiElement[] targets, String title, final String findUsagesTitle, ListCellRenderer listRenderer) {
public static <T extends NavigatablePsiElement> void openTargets(Editor e, T[] targets, String title, final String findUsagesTitle, ListCellRenderer<? super T> listRenderer) {
openTargets(e, targets, title, findUsagesTitle, listRenderer, null);
}
public static void openTargets(Editor e, NavigatablePsiElement[] targets, String title, final String findUsagesTitle,
ListCellRenderer listRenderer, @Nullable BackgroundUpdaterTask listUpdaterTask) {
public static <T extends NavigatablePsiElement> void openTargets(Editor e, T[] targets, String title, final String findUsagesTitle,
ListCellRenderer<? super T> listRenderer, @Nullable BackgroundUpdaterTask listUpdaterTask) {
final JBPopup popup = navigateOrCreatePopup(targets, title, findUsagesTitle, listRenderer, listUpdaterTask);
if (popup != null) {
if (listUpdaterTask != null) {
@@ -86,10 +85,10 @@ public class PsiElementListNavigator {
}
@Nullable
public static JBPopup navigateOrCreatePopup(final NavigatablePsiElement[] targets,
public static <T extends NavigatablePsiElement> JBPopup navigateOrCreatePopup(final T[] targets,
final String title,
final String findUsagesTitle,
final ListCellRenderer listRenderer,
final ListCellRenderer<? super T> listRenderer,
@Nullable final BackgroundUpdaterTask listUpdaterTask) {
return navigateOrCreatePopup(targets, title, findUsagesTitle, listRenderer, listUpdaterTask, selectedElements -> {
for (Object element : selectedElements) {
@@ -105,12 +104,12 @@ public class PsiElementListNavigator {
* listUpdaterTask should be started after alarm is initialized so one-item popup won't blink
*/
@Nullable
public static JBPopup navigateOrCreatePopup(final NavigatablePsiElement @NotNull [] targets,
public static <T extends NavigatablePsiElement> JBPopup navigateOrCreatePopup(final T @NotNull [] targets,
final String title,
final String findUsagesTitle,
final ListCellRenderer listRenderer,
final ListCellRenderer<? super T> listRenderer,
@Nullable final BackgroundUpdaterTask listUpdaterTask,
@NotNull final Consumer<Object[]> consumer) {
@NotNull final Consumer<? super T[]> consumer) {
return new NavigateOrPopupHelper(targets, title)
.setFindUsagesTitle(findUsagesTitle)
.setListRenderer(listRenderer)
@@ -120,20 +119,18 @@ public class PsiElementListNavigator {
}
// Helper makes it easier to customize shown popup.
public static class NavigateOrPopupHelper {
public static class NavigateOrPopupHelper<T extends NavigatablePsiElement> {
private final NavigatablePsiElement @NotNull [] myTargets;
private final T @NotNull [] myTargets;
private final String myTitle;
@NotNull
private Consumer<Object[]> myTargetsConsumer;
private Consumer<? super T[]> myTargetsConsumer;
@Nullable
private String myFindUsagesTitle;
@Nullable
private ListCellRenderer myListRenderer;
private @Nullable ListCellRenderer<? super T> myListRenderer;
@Nullable
private BackgroundUpdaterTask myListUpdaterTask;
@@ -141,14 +138,13 @@ public class PsiElementListNavigator {
@Nullable
private Project myProject;
public NavigateOrPopupHelper(NavigatablePsiElement @NotNull [] targets, String title) {
public NavigateOrPopupHelper(T @NotNull [] targets, String title) {
myTargets = targets;
myTitle = title;
myTargetsConsumer = selectedElements -> {
for (Object element : selectedElements) {
PsiElement selected = (PsiElement)element;
if (selected.isValid()) {
((NavigatablePsiElement)selected).navigate(true);
for (PsiElement element : selectedElements) {
if (element.isValid()) {
((NavigatablePsiElement)element).navigate(true);
}
}
};
@@ -161,7 +157,7 @@ public class PsiElementListNavigator {
}
@NotNull
public NavigateOrPopupHelper setListRenderer(@Nullable ListCellRenderer listRenderer) {
public NavigateOrPopupHelper setListRenderer(@Nullable ListCellRenderer<? super NavigatablePsiElement> listRenderer) {
myListRenderer = listRenderer;
return this;
}
@@ -173,7 +169,7 @@ public class PsiElementListNavigator {
}
@NotNull
public NavigateOrPopupHelper setTargetsConsumer(@NotNull Consumer<Object[]> targetsConsumer) {
public NavigateOrPopupHelper setTargetsConsumer(@NotNull Consumer<? super NavigatablePsiElement[]> targetsConsumer) {
myTargetsConsumer = targetsConsumer;
return this;
}
@@ -196,23 +192,23 @@ public class PsiElementListNavigator {
myTargetsConsumer.consume(myTargets);
return null;
}
List<NavigatablePsiElement> initialTargetsList = Arrays.asList(myTargets);
Ref<NavigatablePsiElement[]> updatedTargetsList = Ref.create(myTargets);
List<T> initialTargetsList = Arrays.asList(myTargets);
Ref<T[]> updatedTargetsList = Ref.create(myTargets);
final IPopupChooserBuilder<NavigatablePsiElement> builder = JBPopupFactory.getInstance().createPopupChooserBuilder(initialTargetsList);
final IPopupChooserBuilder<T> builder = JBPopupFactory.getInstance().createPopupChooserBuilder(initialTargetsList);
afterPopupBuilderCreated(builder);
if (myListRenderer instanceof PsiElementListCellRenderer) {
((PsiElementListCellRenderer)myListRenderer).installSpeedSearch(builder);
}
IPopupChooserBuilder<NavigatablePsiElement> popupChooserBuilder = builder.
IPopupChooserBuilder<T> popupChooserBuilder = builder.
setTitle(myTitle).
setMovable(true).
setFont(EditorUtil.getEditorFont()).
setRenderer(myListRenderer).
withHintUpdateSupply().
setResizable(true).
setItemsChosenCallback(selectedValues -> myTargetsConsumer.consume(ArrayUtil.toObjectArray(selectedValues))).
setItemsChosenCallback(elements -> myTargetsConsumer.consume((T[])elements.toArray(NavigatablePsiElement.EMPTY_NAVIGATABLE_ELEMENT_ARRAY))).
setCancelCallback(() -> {
if (myListUpdaterTask != null) {
myListUpdaterTask.cancelTask();
@@ -258,7 +254,7 @@ public class PsiElementListNavigator {
myListUpdaterTask.init(popup, new ListComponentUpdater() {
@Override
public void replaceModel(@NotNull List<? extends PsiElement> data) {
updatedTargetsList.set(data.toArray(NavigatablePsiElement.EMPTY_NAVIGATABLE_ELEMENT_ARRAY));
updatedTargetsList.set((T[])data.toArray(NavigatablePsiElement.EMPTY_NAVIGATABLE_ELEMENT_ARRAY));
popupUpdater.replaceModel(data);
}
@@ -284,7 +280,7 @@ public class PsiElementListNavigator {
return false;
}
protected void afterPopupBuilderCreated(@NotNull IPopupChooserBuilder<NavigatablePsiElement> builder) {
protected void afterPopupBuilderCreated(@NotNull IPopupChooserBuilder<T> builder) {
// Do nothing by default
}
}
@@ -62,12 +62,11 @@ public abstract class ChooseOneOrAllRunnable<T extends PsiElement> implements Ru
String selectAll = CodeInsightBundle.message("highlight.thrown.exceptions.chooser.all.entry");
model.add(0, selectAll);
final IPopupChooserBuilder builder = JBPopupFactory.getInstance()
IPopupChooserBuilder<Object> builder = JBPopupFactory.getInstance()
.createPopupChooserBuilder(model)
.setRenderer(renderer) // exploit PsiElementListCellRenderer ability to render strings too
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
.setRenderer(renderer)
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
.setItemChosenCallback((selectedValue) -> {
.setItemChosenCallback(selectedValue -> {
if (selectedValue.equals(selectAll)) {
selected(myClasses);
}
@@ -44,7 +44,8 @@ import java.util.regex.Pattern;
import static com.intellij.openapi.vfs.newvfs.VfsPresentationUtil.getFileBackgroundColor;
@DirtyUI
public abstract class PsiElementListCellRenderer<T extends PsiElement> extends JPanel implements ListCellRenderer {
// extends ListCellRenderer<Object> because it can render strings too
public abstract class PsiElementListCellRenderer<T extends PsiElement> extends JPanel implements ListCellRenderer<Object> {
private static final Logger LOG = Logger.getInstance(PsiElementListCellRenderer.class);
private static final String LEFT = BorderLayout.WEST;
private static final Pattern CONTAINER_PATTERN = Pattern.compile("(\\(in |\\()?([^)]*)(\\))?");
@@ -124,24 +124,24 @@ public class ImageDuplicateResultsDialog extends DialogWrapper {
return null;
});
final JBList list = new JBList(new ResourceModules().getModuleNames());
JBList<String> list = new JBList<>(new ResourceModules().getModuleNames());
final NotNullFunction<Object, JComponent> modulesRenderer =
dom -> new JLabel(dom instanceof Module ? ((Module)dom).getName() : dom.toString(), PlatformIcons.SOURCE_FOLDERS_ICON, SwingConstants.LEFT);
list.installCellRenderer(modulesRenderer);
final JPanel modulesPanel = ToolbarDecorator.createDecorator(list)
.setAddAction(button -> {
final Module[] all = ModuleManager.getInstance(myProject).getModules();
Arrays.sort(all, (o1, o2) -> o1.getName().compareTo(o2.getName()));
final JBList modules = new JBList(all);
Arrays.sort(all, Comparator.comparing(Module::getName));
JBList<Module> modules = new JBList<>(all);
modules.installCellRenderer(modulesRenderer);
JBPopupFactory.getInstance().createListPopupBuilder(modules)
.setTitle("Add Resource Module")
.setNamerForFiltering(o -> ((Module)o).getName())
.setNamerForFiltering(o -> o.getName())
.setItemChoosenCallback(() -> {
final Object value = modules.getSelectedValue();
if (value instanceof Module && !myResourceModules.contains((Module)value)) {
myResourceModules.add((Module)value);
((DefaultListModel)list.getModel()).addElement(((Module)value).getName());
Module value = modules.getSelectedValue();
if (value != null && !myResourceModules.contains(value)) {
myResourceModules.add(value);
((DefaultListModel<String>)list.getModel()).addElement(value.getName());
}
((DefaultTreeModel)myTree.getModel()).reload();
TreeUtil.expandAll(myTree);
@@ -151,7 +151,7 @@ public class ImageDuplicateResultsDialog extends DialogWrapper {
final Object[] values = list.getSelectedValues();
for (Object value : values) {
myResourceModules.remove((String)value);
((DefaultListModel)list.getModel()).removeElement(value);
((DefaultListModel<String>)list.getModel()).removeElement(value);
}
((DefaultTreeModel)myTree.getModel()).reload();
TreeUtil.expandAll(myTree);
@@ -34,7 +34,7 @@ public class RecentChangesPopup {
.showCenteredInCurrentWindow(project);
}
private static class RecentChangesListCellRenderer implements ListCellRenderer {
private static class RecentChangesListCellRenderer implements ListCellRenderer<RecentChange> {
private final JPanel myPanel = new JPanel(new FlowLayout(FlowLayout.LEADING,UIUtil.DEFAULT_HGAP,2));
private final JLabel myActionLabel = new JLabel("", JLabel.LEFT);
private final JLabel myDateLabel = new JLabel("", JLabel.LEFT);
@@ -52,10 +52,13 @@ public class RecentChangesPopup {
}
@Override
public Component getListCellRendererComponent(JList l, Object val, int i, boolean isSelected, boolean cellHasFocus) {
RecentChange c = (RecentChange)val;
myActionLabel.setText(c.getChangeName());
myDateLabel.setText(DateFormatUtil.formatDateTime(c.getTimestamp()));
public Component getListCellRendererComponent(JList<? extends RecentChange> list,
RecentChange value,
int index,
boolean isSelected,
boolean cellHasFocus) {
myActionLabel.setText(value.getChangeName());
myDateLabel.setText(DateFormatUtil.formatDateTime(value.getTimestamp()));
updateColors(isSelected);
return myPanel;
@@ -19,13 +19,13 @@ import java.util.Set;
public interface IPopupChooserBuilder<T> {
IPopupChooserBuilder<T> setRenderer(ListCellRenderer renderer);
IPopupChooserBuilder<T> setRenderer(ListCellRenderer<? super T> renderer);
@NotNull
IPopupChooserBuilder<T> setItemChosenCallback(@NotNull Consumer<? super T> callback);
@NotNull
IPopupChooserBuilder<T> setItemsChosenCallback(@NotNull Consumer<? super Set<T>> callback);
IPopupChooserBuilder<T> setItemsChosenCallback(@NotNull Consumer<? super Set<? extends T>> callback);
IPopupChooserBuilder<T> setCancelOnClickOutside(boolean cancelOnClickOutside);
@@ -100,8 +100,8 @@ public abstract class JBPopupFactory {
*/
@Deprecated
@NotNull
public PopupChooserBuilder createListPopupBuilder(@NotNull JList list) {
return new PopupChooserBuilder(list);
public <T> PopupChooserBuilder<T> createListPopupBuilder(@NotNull JList<T> list) {
return new PopupChooserBuilder<>(list);
}
/**
@@ -429,7 +429,10 @@ public abstract class JBPopupFactory {
@Nullable
public abstract Balloon getParentBalloonFor(@Nullable Component c);
protected abstract PopupChooserBuilder.PopupComponentAdapter createPopupComponentAdapter(PopupChooserBuilder builder, JList list);
protected abstract PopupChooserBuilder.PopupComponentAdapter createPopupComponentAdapter(PopupChooserBuilder builder, JTree tree);
protected abstract PopupChooserBuilder.PopupComponentAdapter createPopupComponentAdapter(PopupChooserBuilder builder, JTable table);
@NotNull
protected abstract <T> PopupChooserBuilder.PopupComponentAdapter<T> createPopupComponentAdapter(@NotNull PopupChooserBuilder<T> builder, @NotNull JList<T> list);
@NotNull
protected abstract <T> PopupChooserBuilder.PopupComponentAdapter<T> createPopupComponentAdapter(@NotNull PopupChooserBuilder<T> builder, @NotNull JTree tree);
@NotNull
protected abstract <T> PopupChooserBuilder.PopupComponentAdapter<T> createPopupComponentAdapter(@NotNull PopupChooserBuilder<T> builder, @NotNull JTable table);
}
@@ -55,7 +55,7 @@ public class PopupChooserBuilder<T> implements IPopupChooserBuilder<T> {
private Component mySettingsButtons;
private boolean myAutoselectOnMouseMove = true;
private Function<Object,String> myItemsNamer;
private Function<? super T, String> myItemsNamer;
private boolean myMayBeParent;
private int myAdAlignment = SwingConstants.LEFT;
private boolean myModalContext;
@@ -69,7 +69,7 @@ public class PopupChooserBuilder<T> implements IPopupChooserBuilder<T> {
public interface PopupComponentAdapter<T> {
JComponent getComponent();
default void setRenderer(ListCellRenderer renderer) {}
default void setRenderer(ListCellRenderer<? super T> renderer) {}
void setItemChosenCallback(Consumer<? super T> callback);
@@ -132,7 +132,7 @@ public class PopupChooserBuilder<T> implements IPopupChooserBuilder<T> {
private JScrollPane myScrollPane;
public PopupChooserBuilder(@NotNull JList list) {
public PopupChooserBuilder(@NotNull JList<T> list) {
myChooserComponent = JBPopupFactory.getInstance().createPopupComponentAdapter(this, list);
}
@@ -160,7 +160,7 @@ public class PopupChooserBuilder<T> implements IPopupChooserBuilder<T> {
}
@Override
public IPopupChooserBuilder<T> setRenderer(ListCellRenderer renderer) {
public IPopupChooserBuilder<T> setRenderer(ListCellRenderer<? super T> renderer) {
myChooserComponent.setRenderer(renderer);
return this;
}
@@ -178,7 +178,7 @@ public class PopupChooserBuilder<T> implements IPopupChooserBuilder<T> {
@NotNull
@Override
public IPopupChooserBuilder<T> setItemsChosenCallback(@NotNull Consumer<? super Set<T>> callback) {
public IPopupChooserBuilder<T> setItemsChosenCallback(@NotNull Consumer<? super Set<? extends T>> callback) {
myChooserComponent.setItemsChosenCallback(callback);
return this;
}
@@ -275,11 +275,11 @@ public class PopupChooserBuilder<T> implements IPopupChooserBuilder<T> {
@Override
public PopupChooserBuilder<T> setNamerForFiltering(Function<? super T, String> namer) {
myItemsNamer = (Function<Object, String>)namer;
myItemsNamer = namer;
return this;
}
public Function<Object, String> getItemsNamer() {
public Function<? super T, String> getItemsNamer() {
return myItemsNamer;
}
@@ -291,7 +291,7 @@ public class JBList<E> extends JList<E> implements ComponentWithEmptyText, Compo
super.setCellRenderer(new ExpandedItemListCellRendererWrapper<>(cellRenderer, myExpandableItemsHandler));
}
public <T> void installCellRenderer(@NotNull final NotNullFunction<? super T, ? extends JComponent> fun) {
public void installCellRenderer(@NotNull final NotNullFunction<? super E, ? extends JComponent> fun) {
setCellRenderer(new SelectionAwareListCellRenderer<>(fun));
}
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
public class SelectionAwareListCellRenderer<T> extends DefaultListCellRenderer {
public class SelectionAwareListCellRenderer<T> implements ListCellRenderer<T> {
private final NotNullFunction<? super T, ? extends JComponent> myFun;
public SelectionAwareListCellRenderer(NotNullFunction<? super T, ? extends JComponent> fun) {myFun = fun;}
@@ -115,18 +115,18 @@ public class PopupFactoryImpl extends JBPopupFactory {
}
@Override
protected PopupChooserBuilder.PopupComponentAdapter createPopupComponentAdapter(PopupChooserBuilder builder, JList list) {
return new PopupListAdapter(builder, list);
protected <T> PopupChooserBuilder.@NotNull PopupComponentAdapter<T> createPopupComponentAdapter(@NotNull PopupChooserBuilder<T> builder, @NotNull JList<T> list) {
return new PopupListAdapter<>(builder, list);
}
@Override
protected PopupChooserBuilder.PopupComponentAdapter createPopupComponentAdapter(PopupChooserBuilder builder, JTree tree) {
return new PopupTreeAdapter(builder, tree);
protected <T> PopupChooserBuilder.@NotNull PopupComponentAdapter<T> createPopupComponentAdapter(@NotNull PopupChooserBuilder<T> builder, @NotNull JTree tree) {
return new PopupTreeAdapter<>(builder, tree);
}
@Override
protected PopupChooserBuilder.PopupComponentAdapter createPopupComponentAdapter(PopupChooserBuilder builder, JTable table) {
return new PopupTableAdapter(builder, table);
protected <T> PopupChooserBuilder.@NotNull PopupComponentAdapter<T> createPopupComponentAdapter(@NotNull PopupChooserBuilder<T> builder, @NotNull JTable table) {
return new PopupTableAdapter<>(builder, table);
}
@NotNull
@@ -32,11 +32,11 @@ import java.util.Set;
* @author yole
*/
class PopupListAdapter<T> implements PopupChooserBuilder.PopupComponentAdapter<T> {
private final JList myList;
private final PopupChooserBuilder myBuilder;
private ListWithFilter myListWithFilter;
private final JList<T> myList;
private final PopupChooserBuilder<T> myBuilder;
private ListWithFilter<T> myListWithFilter;
PopupListAdapter(PopupChooserBuilder builder, JList list) {
PopupListAdapter(PopupChooserBuilder<T> builder, JList<T> list) {
myBuilder = builder;
myList = list;
}
@@ -47,16 +47,16 @@ class PopupListAdapter<T> implements PopupChooserBuilder.PopupComponentAdapter<T
}
@Override
public void setRenderer(ListCellRenderer renderer) {
public void setRenderer(ListCellRenderer<? super T> renderer) {
myList.setCellRenderer(renderer);
}
@Override
public void setItemChosenCallback(Consumer<? super T> callback) {
myBuilder.setItemChoosenCallback(() -> {
Object selectedValue = myList.getSelectedValue();
T selectedValue = myList.getSelectedValue();
if (selectedValue != null) {
callback.consume((T)selectedValue);
callback.consume(selectedValue);
}
});
}
@@ -87,7 +87,7 @@ class PopupListAdapter<T> implements PopupChooserBuilder.PopupComponentAdapter<T
@Override
public JComponent buildFinalComponent() {
myListWithFilter = (ListWithFilter)ListWithFilter.wrap(myList, new MyListWrapper(myList), myBuilder.getItemsNamer());
myListWithFilter = (ListWithFilter<T>)ListWithFilter.wrap(myList, new MyListWrapper(myList), myBuilder.getItemsNamer());
myListWithFilter.setAutoPackHeight(myBuilder.isAutoPackHeightOnFiltering());
return myListWithFilter;
}
@@ -99,7 +99,7 @@ class PopupListAdapter<T> implements PopupChooserBuilder.PopupComponentAdapter<T
@Override
public void autoSelect() {
JList list = myList;
JList<T> list = myList;
if (list.getSelectedIndex() == -1) {
list.setSelectedIndex(0);
}
@@ -118,8 +118,8 @@ class PopupListAdapter<T> implements PopupChooserBuilder.PopupComponentAdapter<T
@Override
public void setItemSelectedCallback(Consumer<? super T> c) {
myList.addListSelectionListener(e -> {
Object selectedValue = myList.getSelectedValue();
c.consume((T)selectedValue);
T selectedValue = myList.getSelectedValue();
c.consume(selectedValue);
});
}
@@ -134,9 +134,9 @@ class PopupListAdapter<T> implements PopupChooserBuilder.PopupComponentAdapter<T
}
private class MyListWrapper extends JBScrollPane implements DataProvider {
private final JList myList;
private final JList<T> myList;
private MyListWrapper(final JList list) {
private MyListWrapper(final JList<T> list) {
super(-1);
list.setVisibleRowCount(myBuilder.getVisibleRowCount());
setViewportView(list);
@@ -10,8 +10,6 @@ import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.TitledSeparator;
import com.intellij.ui.components.JBList;
import com.intellij.ui.popup.WizardPopup;
import java.util.function.Consumer;
import com.intellij.util.ui.JBUI;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -22,6 +20,7 @@ import java.awt.*;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class ComboBoxPopup<T> extends ListPopupImpl {
@@ -29,7 +28,7 @@ public class ComboBoxPopup<T> extends ListPopupImpl {
public ComboBoxPopup(@NotNull Context<T> context,
@Nullable T selectedItem,
@NotNull Consumer<T> onItemSelected) {
@NotNull Consumer<? super T> onItemSelected) {
this(context, null, popupStateFromContext(context, onItemSelected, selectedItem), null);
}
@@ -44,7 +43,7 @@ public class ComboBoxPopup<T> extends ListPopupImpl {
@NotNull
private static <T> MyBasePopupState<T> popupStateFromContext(@NotNull Context<T> context,
@NotNull Consumer<T> onItemSelected,
@NotNull Consumer<? super T> onItemSelected,
@Nullable T selectedItem) {
MyBasePopupState<T> step = new MyBasePopupState<T>(onItemSelected,
() -> context.getModel(),
@@ -173,13 +172,13 @@ public class ComboBoxPopup<T> extends ListPopupImpl {
private static class MyBasePopupState<T> extends BaseListPopupStep<T> {
private final JBList<T> myProxyList = new JBList<>();
private final Consumer<T> myOnItemSelected;
private final Supplier<ListModel<T>> myGetComboboxModel;
private final Supplier<ListCellRenderer<? super T>> myGetRenderer;
private final Consumer<? super T> myOnItemSelected;
private final @NotNull Supplier<? extends ListModel<T>> myGetComboboxModel;
private final Supplier<? extends ListCellRenderer<? super T>> myGetRenderer;
private MyBasePopupState(@NotNull Consumer<T> onItemSelected,
@NotNull Supplier<ListModel<T>> getComboboxModel,
@NotNull Supplier<ListCellRenderer<? super T>> getRenderer) {
private MyBasePopupState(@NotNull Consumer<? super T> onItemSelected,
@NotNull Supplier<? extends ListModel<T>> getComboboxModel,
@NotNull Supplier<? extends ListCellRenderer<? super T>> getRenderer) {
super(null, copyItemsFromModel(getComboboxModel.get()));
myOnItemSelected = onItemSelected;
myGetComboboxModel = getComboboxModel;
@@ -183,7 +183,7 @@ public class GroovyMarkerTypes {
Set<PsiMethod> superMethods = collectSuperMethods(method);
if (superMethods.isEmpty()) return;
PsiElementListNavigator.openTargets(e, superMethods.toArray(NavigatablePsiElement.EMPTY_NAVIGATABLE_ELEMENT_ARRAY),
PsiElementListNavigator.openTargets(e, superMethods.toArray(PsiMethod.EMPTY_ARRAY),
DaemonBundle.message("navigation.title.super.method", method.getName()),
DaemonBundle.message("navigation.findUsages.title.super.method", method.getName()),
new MethodCellRenderer(true));
@@ -6,7 +6,6 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleTextAttributes;
@@ -34,7 +33,7 @@ public class PyImportChooser implements ImportChooser {
.createPopupChooserBuilder(sources)
.setRenderer(new CellRenderer(name))
.setTitle(useQualifiedImport ? PyPsiBundle.message("ACT.qualify.with.module") : PyPsiBundle.message("ACT.from.some.module.import"))
.setItemChosenCallback((item) -> {
.setItemChosenCallback(item -> {
result.setResult(item);
})
.setNamerForFiltering(o -> o.getPresentableText(name))
@@ -45,7 +44,7 @@ public class PyImportChooser implements ImportChooser {
}
// Stolen from FQNameCellRenderer
private static class CellRenderer extends SimpleColoredComponent implements ListCellRenderer {
private static class CellRenderer extends SimpleColoredComponent implements ListCellRenderer<ImportCandidateHolder> {
private final Font FONT;
private final String myName;
@@ -56,24 +55,19 @@ public class PyImportChooser implements ImportChooser {
setOpaque(true);
}
// value is a QualifiedHolder
@Override
public Component getListCellRendererComponent(
JList list,
Object value, // expected to be
int index,
boolean isSelected,
boolean cellHasFocus
) {
public Component getListCellRendererComponent(JList<? extends ImportCandidateHolder> list,
ImportCandidateHolder value,
int index,
boolean isSelected,
boolean cellHasFocus) {
clear();
ImportCandidateHolder item = (ImportCandidateHolder)value;
PsiElement importable = ((ImportCandidateHolder)value).getImportable();
PsiElement importable = value.getImportable();
if (importable != null) {
setIcon(importable.getIcon(0));
}
String item_name = item.getPresentableText(myName);
String item_name = value.getPresentableText(myName);
append(item_name, SimpleTextAttributes.REGULAR_ATTRIBUTES);
setFont(FONT);
@@ -293,9 +293,9 @@ public class CreateNSDeclarationIntentionFix implements HintAction, LocalQuickFi
if (namespacesToChooseFrom.length > 1 && !ApplicationManager.getApplication().isUnitTestMode()) {
JBPopupFactory.getInstance()
.createPopupChooserBuilder(ContainerUtil.newArrayList(namespacesToChooseFrom))
.setRenderer(XmlNSRenderer.INSTANCE)
.setRenderer(new XmlNSRenderer<>())
.setTitle(title)
.setItemChosenCallback((selectedValue) -> {
.setItemChosenCallback(selectedValue -> {
PsiDocumentManager.getInstance(project).commitAllDocuments();
CommandProcessor.getInstance().executeCommand(
project,
@@ -28,7 +28,7 @@ import java.awt.*;
/**
* @author Dmitry Avdeev
*/
public class XmlNSRenderer extends ColoredListCellRenderer {
public class XmlNSRenderer<T> extends ColoredListCellRenderer<T> {
public static final XmlNSRenderer INSTANCE = new XmlNSRenderer();
@@ -38,8 +38,8 @@ public class XmlNSRenderer extends ColoredListCellRenderer {
}
@Override
protected void customizeCellRenderer(@NotNull final JList list,
final Object value,
protected void customizeCellRenderer(@NotNull final JList<? extends T> list,
final T value,
final int index,
final boolean selected,
final boolean hasFocus) {
@@ -297,7 +297,7 @@ public class GenerateXmlTagAction extends SimpleCodeInsightAction {
return false;
}
private static class MyListCellRenderer implements ListCellRenderer {
private static class MyListCellRenderer implements ListCellRenderer<XmlElementDescriptor> {
private final JPanel myPanel;
private final JLabel myNameLabel;
private final JLabel myNSLabel;
@@ -319,16 +319,18 @@ public class GenerateXmlTagAction extends SimpleCodeInsightAction {
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
XmlElementDescriptor descriptor = (XmlElementDescriptor)value;
public Component getListCellRendererComponent(JList<? extends XmlElementDescriptor> list,
XmlElementDescriptor value,
int index,
boolean isSelected,
boolean cellHasFocus) {
Color backgroundColor = isSelected ? list.getSelectionBackground() : list.getBackground();
myNameLabel.setText(descriptor.getName());
myNameLabel.setText(value.getName());
myNameLabel.setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
myPanel.setBackground(backgroundColor);
myNSLabel.setText(getNamespace(descriptor));
myNSLabel.setText(getNamespace(value));
myNSLabel.setForeground(LookupCellRenderer.getGrayedForeground(isSelected));
myNSLabel.setBackground(backgroundColor);