From 0a89b260300c641f0cd031947a9aa88a0cbfbafc Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 20 Jun 2014 18:01:33 +0400 Subject: [PATCH] Extract Function: Implement UI for parameter type selection --- .../extractFunction/ExtractionDescriptor.kt | 2 +- .../extractFunction/extractFunctionUtils.kt | 7 +- .../ui/KotlinParameterTablePanel.java | 97 ++++++++++++++++--- 3 files changed, 87 insertions(+), 19 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionDescriptor.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionDescriptor.kt index aa3ea32f116..8ea801675c4 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionDescriptor.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionDescriptor.kt @@ -45,7 +45,7 @@ trait Parameter { val nameForRef: String get() = mirrorVarName ?: name - fun copy(name: String): Parameter + fun copy(name: String, parameterType: JetType): Parameter } data class TypeParameter( diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt index d2e8bcf7635..5e732b9d507 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt @@ -349,14 +349,15 @@ private class MutableParameter( CommonSupertypes.commonSupertype(defaultTypes) } - override fun copy(name: String): Parameter = DelegatingParameter(this, name) + override fun copy(name: String, parameterType: JetType): Parameter = DelegatingParameter(this, name, parameterType) } private class DelegatingParameter( val original: Parameter, - override val name: String + override val name: String, + override val parameterType: JetType ): Parameter by original { - override fun copy(name: String): Parameter = DelegatingParameter(original, name) + override fun copy(name: String, parameterType: JetType): Parameter = DelegatingParameter(original, name, parameterType) } private fun ExtractionData.inferParametersInfo( diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinParameterTablePanel.java b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinParameterTablePanel.java index 2de47490a08..0781b39f848 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinParameterTablePanel.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ui/KotlinParameterTablePanel.java @@ -19,18 +19,25 @@ package org.jetbrains.jet.plugin.refactoring.extractFunction.ui; import com.intellij.ui.BooleanTableCellRenderer; import com.intellij.ui.TableUtil; import com.intellij.ui.ToolbarDecorator; +import com.intellij.ui.components.JBComboBoxLabel; +import com.intellij.ui.components.editors.JBComboBoxTableCellEditorComponent; import com.intellij.ui.table.JBTable; +import com.intellij.util.Function; +import com.intellij.util.ui.AbstractTableCellEditor; import com.intellij.util.ui.EditableModel; import kotlin.Function1; import kotlin.KotlinPackage; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.plugin.refactoring.JetNameSuggester; import org.jetbrains.jet.plugin.refactoring.extractFunction.Parameter; import org.jetbrains.jet.renderer.DescriptorRenderer; import javax.swing.*; import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableColumn; import java.awt.*; @@ -42,11 +49,13 @@ public class KotlinParameterTablePanel extends JPanel { public static class ParameterInfo { private final Parameter originalParameter; private String name; + private JetType type; private boolean enabled = true; public ParameterInfo(Parameter originalParameter) { this.originalParameter = originalParameter; this.name = originalParameter.getName(); + this.type = originalParameter.getParameterType(); } public Parameter getOriginalParameter() { @@ -69,12 +78,16 @@ public class KotlinParameterTablePanel extends JPanel { this.name = name; } - public String getTypeAsString() { - return DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(getOriginalParameter().getParameterTypeCandidates().get(0)); + public JetType getType() { + return type; + } + + public void setType(JetType type) { + this.type = type; } public Parameter toParameter() { - return originalParameter.copy(name); + return originalParameter.copy(name, type); } } @@ -122,6 +135,55 @@ public class KotlinParameterTablePanel extends JPanel { } ); + myTable.getColumnModel().getColumn(MyTableModel.PARAMETER_TYPE_COLUMN).setCellRenderer(new DefaultTableCellRenderer() { + private final JBComboBoxLabel myLabel = new JBComboBoxLabel(); + + @Override + @NotNull + public Component getTableCellRendererComponent( + @NotNull JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column + ) { + myLabel.setText(String.valueOf(value)); + myLabel.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + myLabel.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground()); + if (isSelected) { + myLabel.setSelectionIcon(); + } else { + myLabel.setRegularIcon(); + } + return myLabel; + } + }); + + myTable.getColumnModel().getColumn(MyTableModel.PARAMETER_TYPE_COLUMN).setCellEditor(new AbstractTableCellEditor() { + final JBComboBoxTableCellEditorComponent myEditorComponent = new JBComboBoxTableCellEditorComponent(); + + @Override + @Nullable + public Object getCellEditorValue() { + return myEditorComponent.getEditorValue(); + } + + @Override + public Component getTableCellEditorComponent( + JTable table, Object value, boolean isSelected, int row, int column + ) { + ParameterInfo info = parameterInfos.get(row); + + myEditorComponent.setCell(table, row, column); + myEditorComponent.setOptions(info.getOriginalParameter().getParameterTypeCandidates().toArray()); + myEditorComponent.setDefaultValue(info.getType()); + myEditorComponent.setToString(new Function() { + @Override + public String fun(Object o) { + return DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType((JetType) o); + } + }); + + return myEditorComponent; + } + }); + myTable.setPreferredScrollableViewportSize(new Dimension(250, myTable.getRowHeight() * 5)); myTable.setShowGrid(false); myTable.setIntercellSpacing(new Dimension(0, 0)); @@ -260,32 +322,29 @@ public class KotlinParameterTablePanel extends JPanel { @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (columnIndex) { - case CHECKMARK_COLUMN: { + case CHECKMARK_COLUMN: return parameterInfos.get(rowIndex).isEnabled(); - } - case PARAMETER_NAME_COLUMN: { + case PARAMETER_NAME_COLUMN: return parameterInfos.get(rowIndex).getName(); - } - case PARAMETER_TYPE_COLUMN: { - return parameterInfos.get(rowIndex).getTypeAsString(); - } + case PARAMETER_TYPE_COLUMN: + return parameterInfos.get(rowIndex).getType(); + default: + return null; } - assert false; - return null; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + ParameterInfo info = parameterInfos.get(rowIndex); switch (columnIndex) { case CHECKMARK_COLUMN: { - parameterInfos.get(rowIndex).setEnabled((Boolean) aValue); + info.setEnabled((Boolean) aValue); fireTableRowsUpdated(rowIndex, rowIndex); myTable.getSelectionModel().setSelectionInterval(rowIndex, rowIndex); updateSignature(); break; } case PARAMETER_NAME_COLUMN: { - ParameterInfo info = parameterInfos.get(rowIndex); String name = (String) aValue; if (JetNameSuggester.isIdentifier(name)) { info.setName(name); @@ -293,16 +352,24 @@ public class KotlinParameterTablePanel extends JPanel { updateSignature(); break; } + case PARAMETER_TYPE_COLUMN: { + info.setType((JetType) aValue); + updateSignature(); + break; + } } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { + ParameterInfo info = parameterInfos.get(rowIndex); switch (columnIndex) { case CHECKMARK_COLUMN: return isEnabled(); case PARAMETER_NAME_COLUMN: - return isEnabled() && parameterInfos.get(rowIndex).isEnabled(); + return isEnabled() && info.isEnabled(); + case PARAMETER_TYPE_COLUMN: + return isEnabled() && info.isEnabled() && info.getOriginalParameter().getParameterTypeCandidates().size() > 1; default: return false; }