Extract Function: Implement UI for parameter type selection
This commit is contained in:
+1
-1
@@ -45,7 +45,7 @@ trait Parameter {
|
|||||||
|
|
||||||
val nameForRef: String get() = mirrorVarName ?: name
|
val nameForRef: String get() = mirrorVarName ?: name
|
||||||
|
|
||||||
fun copy(name: String): Parameter
|
fun copy(name: String, parameterType: JetType): Parameter
|
||||||
}
|
}
|
||||||
|
|
||||||
data class TypeParameter(
|
data class TypeParameter(
|
||||||
|
|||||||
+4
-3
@@ -349,14 +349,15 @@ private class MutableParameter(
|
|||||||
CommonSupertypes.commonSupertype(defaultTypes)
|
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(
|
private class DelegatingParameter(
|
||||||
val original: Parameter,
|
val original: Parameter,
|
||||||
override val name: String
|
override val name: String,
|
||||||
|
override val parameterType: JetType
|
||||||
): Parameter by original {
|
): 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(
|
private fun ExtractionData.inferParametersInfo(
|
||||||
|
|||||||
+82
-15
@@ -19,18 +19,25 @@ package org.jetbrains.jet.plugin.refactoring.extractFunction.ui;
|
|||||||
import com.intellij.ui.BooleanTableCellRenderer;
|
import com.intellij.ui.BooleanTableCellRenderer;
|
||||||
import com.intellij.ui.TableUtil;
|
import com.intellij.ui.TableUtil;
|
||||||
import com.intellij.ui.ToolbarDecorator;
|
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.ui.table.JBTable;
|
||||||
|
import com.intellij.util.Function;
|
||||||
|
import com.intellij.util.ui.AbstractTableCellEditor;
|
||||||
import com.intellij.util.ui.EditableModel;
|
import com.intellij.util.ui.EditableModel;
|
||||||
import kotlin.Function1;
|
import kotlin.Function1;
|
||||||
import kotlin.KotlinPackage;
|
import kotlin.KotlinPackage;
|
||||||
import org.jetbrains.annotations.NonNls;
|
import org.jetbrains.annotations.NonNls;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.JetNameSuggester;
|
||||||
import org.jetbrains.jet.plugin.refactoring.extractFunction.Parameter;
|
import org.jetbrains.jet.plugin.refactoring.extractFunction.Parameter;
|
||||||
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.table.AbstractTableModel;
|
import javax.swing.table.AbstractTableModel;
|
||||||
|
import javax.swing.table.DefaultTableCellRenderer;
|
||||||
import javax.swing.table.TableCellEditor;
|
import javax.swing.table.TableCellEditor;
|
||||||
import javax.swing.table.TableColumn;
|
import javax.swing.table.TableColumn;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
@@ -42,11 +49,13 @@ public class KotlinParameterTablePanel extends JPanel {
|
|||||||
public static class ParameterInfo {
|
public static class ParameterInfo {
|
||||||
private final Parameter originalParameter;
|
private final Parameter originalParameter;
|
||||||
private String name;
|
private String name;
|
||||||
|
private JetType type;
|
||||||
private boolean enabled = true;
|
private boolean enabled = true;
|
||||||
|
|
||||||
public ParameterInfo(Parameter originalParameter) {
|
public ParameterInfo(Parameter originalParameter) {
|
||||||
this.originalParameter = originalParameter;
|
this.originalParameter = originalParameter;
|
||||||
this.name = originalParameter.getName();
|
this.name = originalParameter.getName();
|
||||||
|
this.type = originalParameter.getParameterType();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Parameter getOriginalParameter() {
|
public Parameter getOriginalParameter() {
|
||||||
@@ -69,12 +78,16 @@ public class KotlinParameterTablePanel extends JPanel {
|
|||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTypeAsString() {
|
public JetType getType() {
|
||||||
return DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(getOriginalParameter().getParameterTypeCandidates().get(0));
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(JetType type) {
|
||||||
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Parameter toParameter() {
|
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<Object, String>() {
|
||||||
|
@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.setPreferredScrollableViewportSize(new Dimension(250, myTable.getRowHeight() * 5));
|
||||||
myTable.setShowGrid(false);
|
myTable.setShowGrid(false);
|
||||||
myTable.setIntercellSpacing(new Dimension(0, 0));
|
myTable.setIntercellSpacing(new Dimension(0, 0));
|
||||||
@@ -260,32 +322,29 @@ public class KotlinParameterTablePanel extends JPanel {
|
|||||||
@Override
|
@Override
|
||||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||||
switch (columnIndex) {
|
switch (columnIndex) {
|
||||||
case CHECKMARK_COLUMN: {
|
case CHECKMARK_COLUMN:
|
||||||
return parameterInfos.get(rowIndex).isEnabled();
|
return parameterInfos.get(rowIndex).isEnabled();
|
||||||
}
|
case PARAMETER_NAME_COLUMN:
|
||||||
case PARAMETER_NAME_COLUMN: {
|
|
||||||
return parameterInfos.get(rowIndex).getName();
|
return parameterInfos.get(rowIndex).getName();
|
||||||
}
|
case PARAMETER_TYPE_COLUMN:
|
||||||
case PARAMETER_TYPE_COLUMN: {
|
return parameterInfos.get(rowIndex).getType();
|
||||||
return parameterInfos.get(rowIndex).getTypeAsString();
|
default:
|
||||||
}
|
return null;
|
||||||
}
|
}
|
||||||
assert false;
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
||||||
|
ParameterInfo info = parameterInfos.get(rowIndex);
|
||||||
switch (columnIndex) {
|
switch (columnIndex) {
|
||||||
case CHECKMARK_COLUMN: {
|
case CHECKMARK_COLUMN: {
|
||||||
parameterInfos.get(rowIndex).setEnabled((Boolean) aValue);
|
info.setEnabled((Boolean) aValue);
|
||||||
fireTableRowsUpdated(rowIndex, rowIndex);
|
fireTableRowsUpdated(rowIndex, rowIndex);
|
||||||
myTable.getSelectionModel().setSelectionInterval(rowIndex, rowIndex);
|
myTable.getSelectionModel().setSelectionInterval(rowIndex, rowIndex);
|
||||||
updateSignature();
|
updateSignature();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PARAMETER_NAME_COLUMN: {
|
case PARAMETER_NAME_COLUMN: {
|
||||||
ParameterInfo info = parameterInfos.get(rowIndex);
|
|
||||||
String name = (String) aValue;
|
String name = (String) aValue;
|
||||||
if (JetNameSuggester.isIdentifier(name)) {
|
if (JetNameSuggester.isIdentifier(name)) {
|
||||||
info.setName(name);
|
info.setName(name);
|
||||||
@@ -293,16 +352,24 @@ public class KotlinParameterTablePanel extends JPanel {
|
|||||||
updateSignature();
|
updateSignature();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PARAMETER_TYPE_COLUMN: {
|
||||||
|
info.setType((JetType) aValue);
|
||||||
|
updateSignature();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
||||||
|
ParameterInfo info = parameterInfos.get(rowIndex);
|
||||||
switch (columnIndex) {
|
switch (columnIndex) {
|
||||||
case CHECKMARK_COLUMN:
|
case CHECKMARK_COLUMN:
|
||||||
return isEnabled();
|
return isEnabled();
|
||||||
case PARAMETER_NAME_COLUMN:
|
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:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user