mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
cleanup: generalize ListCellRenderers
GitOrigin-RevId: 7096333541ccc2558ea60b1f8541d14c9833e064
This commit is contained in:
committed by
intellij-monorepo-bot
parent
556b434b36
commit
e347c8527c
@@ -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;
|
||||
|
||||
+32
-36
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+3
-4
@@ -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);
|
||||
|
||||
+8
-5
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user