Extract Function: Implement UI for parameter type selection

This commit is contained in:
Alexey Sedunov
2014-06-20 18:01:33 +04:00
parent ca16f4231f
commit 0a89b26030
3 changed files with 87 additions and 19 deletions
@@ -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(
@@ -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(
@@ -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<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.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;
}