package com.intellij.lang.javascript.flex; import com.intellij.execution.ExecutionBundle; import com.intellij.lang.javascript.psi.JSFunction; import com.intellij.lang.javascript.psi.ecmal4.JSClass; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Condition; import com.intellij.ui.*; import com.intellij.ui.components.JBList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.MouseEvent; import java.util.Comparator; public class FlexMethodChooserDialog extends DialogWrapper { private static final Comparator<JSFunction> METHOD_NAME_COMPARATOR = (method1, method2) -> { //noinspection ConstantConditions return method1.getName().compareToIgnoreCase(method2.getName()); }; private final SortedListModel<JSFunction> myListModel = new SortedListModel<>(METHOD_NAME_COMPARATOR); private final JList myList = new JBList(myListModel); private final JPanel myWholePanel = new JPanel(new BorderLayout()); public FlexMethodChooserDialog(final JSClass clazz, final Condition<JSFunction> filter, final JComponent parent, @Nullable String initialSelection) { super(parent, false); createList(clazz.getFunctions(), filter); myWholePanel.add(ScrollPaneFactory.createScrollPane(myList)); myList.setCellRenderer(new ColoredListCellRenderer() { protected void customizeCellRenderer(@NotNull final JList list, final Object value, final int index, final boolean selected, final boolean hasFocus) { final JSFunction method = (JSFunction)value; //noinspection ConstantConditions append(method.getName()); } }); myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); new DoubleClickListener() { @Override protected boolean onDoubleClick(MouseEvent e) { FlexMethodChooserDialog.this.close(OK_EXIT_CODE); return true; } }.installOn(myList); int index = getIndexToSelect(clazz, initialSelection); if (index == -1) { myList.clearSelection(); } else { ScrollingUtil.selectItem(myList, index); } setTitle(ExecutionBundle.message("choose.test.method.dialog.title")); init(); myList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { updateOkAction(); } }); updateOkAction(); } private void updateOkAction() { setOKActionEnabled(myList.getSelectedIndex() != -1); } private int getIndexToSelect(JSClass clazz, @Nullable String methodName) { if (methodName == null) { return -1; } else { final JSFunction method = clazz.findFunctionByName(methodName); if (method == null) { return -1; } return myListModel.indexOf(method); } } private void createList(final JSFunction[] methods, final Condition<JSFunction> filter) { for (final JSFunction method : methods) { if (filter.value(method)) myListModel.add(method); } } protected JComponent createCenterPanel() { return myWholePanel; } public JSFunction getSelectedMethod() { return (JSFunction)myList.getSelectedValue(); } }