/*
* Copyright 2013-2017 consulo.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package consulo.csharp.ide.refactoring.changeSignature;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.border.LineBorder;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import org.jetbrains.annotations.Nullable;
import consulo.csharp.lang.CSharpFileType;
import consulo.csharp.lang.psi.CSharpModifier;
import consulo.csharp.lang.psi.impl.fragment.CSharpFragmentFactory;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiCodeFragment;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.changeSignature.ParameterTableModelBase;
import com.intellij.refactoring.ui.StringTableCellEditor;
import com.intellij.ui.ColoredTableCellRenderer;
import com.intellij.ui.EditorTextField;
import com.intellij.ui.SimpleTextAttributes;
/**
* @author VISTALL
* @since 20.05.14
*/
public class CSharpParameterTableModel extends ParameterTableModelBase<CSharpParameterInfo, CSharpParameterTableModelItem>
{
private static class VariableCompletionTableCellEditor extends StringTableCellEditor
{
public VariableCompletionTableCellEditor(Project project)
{
super(project);
}
@Override
public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, final int row, int column)
{
final EditorTextField textField = (EditorTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
/*textField.registerKeyboardAction(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
PsiType type = getRowType(table, row);
if(type != null)
{
completeVariable(textField, type);
}
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.CTRL_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW);*/
textField.setBorder(new LineBorder(table.getSelectionBackground()));
return textField;
}
/*private static void completeVariable(EditorTextField editorTextField, PsiType type)
{
Editor editor = editorTextField.getEditor();
String prefix = editorTextField.getText();
if(prefix == null)
{
prefix = "";
}
Set<LookupElement> set = new LinkedHashSet<LookupElement>();
JavaCompletionUtil.completeVariableNameForRefactoring(editorTextField.getProject(), set, prefix, type, VariableKind.PARAMETER);
LookupElement[] lookupItems = set.toArray(new LookupElement[set.size()]);
editor.getCaretModel().moveToOffset(prefix.length());
editor.getSelectionModel().removeSelection();
LookupManager.getInstance(editorTextField.getProject()).showLookup(editor, lookupItems, prefix);
} */
}
private static class MyNameColumn extends NameColumn<CSharpParameterInfo, CSharpParameterTableModelItem>
{
private Project myProject;
public MyNameColumn(Project project)
{
super(project);
myProject = project;
}
@Override
public TableCellEditor doCreateEditor(CSharpParameterTableModelItem o)
{
return new VariableCompletionTableCellEditor(myProject);
}
@Override
public TableCellRenderer doCreateRenderer(CSharpParameterTableModelItem cSharpParameterTableModelItem)
{
return new ColoredTableCellRenderer()
{
@Override
public void customizeCellRenderer(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if(value == null)
{
return;
}
if(isSelected || hasFocus)
{
acquireState(table, true, false, row, column);
getCellState().updateRenderer(this);
setPaintFocusBorder(false);
}
append((String) value, new SimpleTextAttributes(Font.PLAIN, null));
}
};
}
}
private static class ModifierColumn extends ColumnInfoBase<CSharpParameterInfo, CSharpParameterTableModelItem, CSharpModifier>
{
public ModifierColumn()
{
super("Modifier");
}
@Nullable
@Override
public CSharpModifier valueOf(CSharpParameterTableModelItem item)
{
return item.parameter.getModifier();
}
@Override
public void setValue(CSharpParameterTableModelItem tableModelItem, CSharpModifier value)
{
tableModelItem.parameter.setModifier(value);
}
@Override
protected TableCellRenderer doCreateRenderer(CSharpParameterTableModelItem tableModelItem)
{
return new ColoredTableCellRenderer()
{
@Override
protected void customizeCellRenderer(JTable table, Object value, boolean selected, boolean hasFocus, int row, int column)
{
append(value == null ? "" : value.toString());
}
};
}
@Override
protected TableCellEditor doCreateEditor(CSharpParameterTableModelItem item)
{
throw new UnsupportedOperationException();
}
}
private final Project myProject;
public CSharpParameterTableModel(Project project, PsiElement typeContext, PsiElement defaultValueContext)
{
super(typeContext, defaultValueContext, new TypeColumn<CSharpParameterInfo, CSharpParameterTableModelItem>(project, CSharpFileType.INSTANCE), new MyNameColumn(project),
new DefaultValueColumn<CSharpParameterInfo, CSharpParameterTableModelItem>(project, CSharpFileType.INSTANCE, "Place value:"), new ModifierColumn());
myProject = project;
}
@Override
protected CSharpParameterTableModelItem createRowItem(@Nullable CSharpParameterInfo parameterInfo)
{
if(parameterInfo == null)
{
parameterInfo = new CSharpParameterInfo("", null, getRowCount());
}
PsiCodeFragment fragment = CSharpFragmentFactory.createTypeFragment(myProject, parameterInfo.getTypeText(), myDefaultValueContext);
PsiCodeFragment defaultValue = CSharpFragmentFactory.createExpressionFragment(myProject, "", myDefaultValueContext);
return new CSharpParameterTableModelItem(parameterInfo, fragment, defaultValue);
}
}