JBTableRowEditor (ParameterTableModelItemBase<PyParameterInfo> item) { return new JBTableRowEditor() { private EditorTextField myNameEditor; private EditorTextField myDefaultValueEditor; private JCheckBox myDefaultInSignature; @Override public void prepareEditor(JTable table, int row) { setLayout(new GridLayout(1, 3)); final JPanel parameterPanel = createParameterPanel(); add(parameterPanel); final JPanel defaultValuePanel = createDefaultValuePanel(); add(defaultValuePanel); final JPanel defaultValueCheckBox = createDefaultValueCheckBox(); add(defaultValueCheckBox); final String nameText = myNameEditor.getText(); final boolean couldHaveDefaultValue = ParamHelper.couldHaveDefaultValue(nameText) && !CANONICAL_SELF.equals(nameText); myDefaultValueEditor.setEnabled(couldHaveDefaultValue); myDefaultInSignature.setEnabled(couldHaveDefaultValue); } private JPanel createDefaultValueCheckBox() { final JPanel defaultValuePanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 4, 2, true, false)); final JBLabel inSignatureLabel = new JBLabel(PyBundle.message("refactoring.change.signature.dialog.default.value.checkbox"), UIUtil.ComponentStyle.SMALL); defaultValuePanel.add(inSignatureLabel, BorderLayout.WEST); myDefaultInSignature = new JCheckBox(); myDefaultInSignature.setSelected(((PyParameterTableModelItem)item).isDefaultInSignature()); myDefaultInSignature.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent event) { ((PyParameterTableModelItem)item).setDefaultInSignature(myDefaultInSignature.isSelected()); } }); myDefaultInSignature.addChangeListener(mySignatureUpdater); myDefaultInSignature.setEnabled(item.parameter.isNew()); defaultValuePanel.add(myDefaultInSignature, BorderLayout.EAST); return defaultValuePanel; } private JPanel createDefaultValuePanel() { final JPanel defaultValuePanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 4, 2, true, false)); final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(item.defaultValueCodeFragment); myDefaultValueEditor = new EditorTextField(doc, getProject(), getFileType()); final JBLabel defaultValueLabel = new JBLabel(RefactoringBundle.message("changeSignature.default.value.label"), UIUtil.ComponentStyle.SMALL); defaultValuePanel.add(defaultValueLabel); defaultValuePanel.add(myDefaultValueEditor); myDefaultValueEditor.setPreferredWidth(getTable().getWidth() / 2); myDefaultValueEditor.setFont(EditorUtil.getEditorFont()); // The corresponding PyParameterInfo field can't be updated by just RowEditorChangeListener(1) // because the corresponding column value is not String but Pair<PsiCodeFragment, Boolean>. myDefaultValueEditor.addDocumentListener(new DocumentListener() { @Override public void documentChanged(@NotNull DocumentEvent event) { item.parameter.setDefaultValue(myDefaultValueEditor.getText().trim()); } }); myDefaultValueEditor.addDocumentListener(mySignatureUpdater); return defaultValuePanel; } private JPanel createParameterPanel() { final JPanel namePanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 4, 2, true, false)); myNameEditor = new EditorTextField(item.parameter.getName(), getProject(), getFileType()); final JBLabel nameLabel = new JBLabel(PyBundle.message("refactoring.change.signature.dialog.name.label"), UIUtil.ComponentStyle.SMALL); namePanel.add(nameLabel); namePanel.add(myNameEditor); myNameEditor.setPreferredWidth(getTable().getWidth() / 2); myNameEditor.setFont(EditorUtil.getEditorFont()); myNameEditor.addDocumentListener(new RowEditorChangeListener(0)); myNameEditor.addDocumentListener(new DocumentListener() { @Override public void documentChanged(@NotNull DocumentEvent event) { final boolean couldHaveDefaultValue = ParamHelper.couldHaveDefaultValue(myNameEditor.getText()); myDefaultValueEditor.setEnabled(couldHaveDefaultValue); myDefaultInSignature.setEnabled(couldHaveDefaultValue); } }); myNameEditor.addDocumentListener(mySignatureUpdater); return namePanel; } @Override public JBTableRow getValue() { return new JBTableRow() { @Override public Object getValueAt(int column) { return switch (column) { case 0 -> myNameEditor.getText().trim(); case 1 -> new Pair<>(item.defaultValueCodeFragment, ((PyParameterTableModelItem)item).isDefaultInSignature()); default -> null; }; } }; } @Override public JComponent getPreferredFocusedComponent() { return myNameEditor.getFocusTarget(); } @Override public JComponent[] getFocusableComponents() { final List<JComponent> focusable = new ArrayList<>(); focusable.add(myNameEditor.getFocusTarget()); if (myDefaultValueEditor != null) { focusable.add(myDefaultValueEditor.getFocusTarget()); } if (myDefaultInSignature != null) { focusable.add(myDefaultInSignature); } return focusable.toArray(new JComponent[0]); } }; }