blob: a92ae780d2de6a7575749a9d806a009f51dc2a1f [file] [log] [blame]
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* 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 com.intellij.refactoring.changeSignature;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiCodeFragment;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.ui.CodeFragmentTableCellEditorBase;
import com.intellij.refactoring.ui.CodeFragmentTableCellRenderer;
import com.intellij.refactoring.ui.StringTableCellEditor;
import com.intellij.ui.*;
import com.intellij.util.ui.ColumnInfo;
import com.intellij.util.ui.ListTableModel;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public abstract class ParameterTableModelBase<P extends ParameterInfo, TableItem extends ParameterTableModelItemBase<P>> extends ListTableModel<TableItem> implements RowEditableTableModel {
protected final PsiElement myTypeContext;
protected final PsiElement myDefaultValueContext;
public ParameterTableModelBase(PsiElement typeContext,
PsiElement defaultValueContext,
ColumnInfo... columnInfos) {
super(columnInfos);
myTypeContext = typeContext;
myDefaultValueContext = defaultValueContext;
}
protected abstract TableItem createRowItem(@Nullable P parameterInfo);
@Override
public void addRow() {
addRow(createRowItem(null));
}
public void setParameterInfos(List<P> parameterInfos) {
List<TableItem> items = new ArrayList<TableItem>(parameterInfos.size());
for (P parameterInfo : parameterInfos) {
items.add(createRowItem(parameterInfo));
}
setItems(items);
}
public void setValueAtWithoutUpdate(Object aValue, int rowIndex, int columnIndex) {
super.setValueAt(aValue, rowIndex, columnIndex);
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
super.setValueAt(aValue, rowIndex, columnIndex);
fireTableCellUpdated(rowIndex, columnIndex); // to update signature
}
protected static abstract class ColumnInfoBase<P extends ParameterInfo, TableItem extends ParameterTableModelItemBase<P>, Aspect>
extends ColumnInfo<TableItem, Aspect> {
private TableCellRenderer myRenderer;
private TableCellEditor myEditor;
public ColumnInfoBase(String name) {
super(name);
}
@Override
public final TableCellEditor getEditor(TableItem o) {
if (myEditor == null) {
myEditor = doCreateEditor(o);
}
return myEditor;
}
@Override
public final TableCellRenderer getRenderer(TableItem item) {
if (myRenderer == null) {
final TableCellRenderer original = doCreateRenderer(item);
myRenderer = new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
Component component = original.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!table.isCellEditable(row, table.convertColumnIndexToModel(column))) {
Color bg = table.getBackground().darker();
component.setBackground(ColorUtil.toAlpha(bg, 230));
}
if (component instanceof SimpleColoredComponent) {
((SimpleColoredComponent)component).setIpad(new Insets(0, 0, 0, 0));
}
return component;
}
};
}
return myRenderer;
}
protected abstract TableCellRenderer doCreateRenderer(TableItem item);
protected abstract TableCellEditor doCreateEditor(TableItem item);
}
protected static class TypeColumn<P extends ParameterInfo, TableItem extends ParameterTableModelItemBase<P>> extends ColumnInfoBase<P, TableItem, PsiCodeFragment> {
protected final Project myProject;
private final FileType myFileType;
public TypeColumn(Project project, FileType fileType) {
this(project, fileType, RefactoringBundle.message("column.name.type"));
}
public TypeColumn(Project project, FileType fileType, String title) {
super(title);
myProject = project;
myFileType = fileType;
}
@Override
public PsiCodeFragment valueOf(TableItem item) {
return item.typeCodeFragment;
}
@Override
public boolean isCellEditable(TableItem pParameterTableModelItemBase) {
return true;
}
@Override
public TableCellRenderer doCreateRenderer(TableItem pParameterTableModelItemBase) {
return new CodeFragmentTableCellRenderer(myProject, myFileType);
}
@Override
public TableCellEditor doCreateEditor(TableItem o) {
return new CodeFragmentTableCellEditorBase(myProject, myFileType);
}
}
protected static class NameColumn<P extends ParameterInfo, TableItem extends ParameterTableModelItemBase<P>> extends ColumnInfoBase<P, TableItem, String> {
private final Project myProject;
public NameColumn(Project project) {
this(project, RefactoringBundle.message("column.name.name"));
}
public NameColumn(Project project, String title) {
super(title);
myProject = project;
}
@Override
public String valueOf(TableItem item) {
return item.parameter.getName();
}
@Override
public void setValue(TableItem item, String value) {
item.parameter.setName(value);
}
@Override
public boolean isCellEditable(TableItem pParameterTableModelItemBase) {
return true;
}
@Override
public TableCellRenderer doCreateRenderer(TableItem item) {
return new ColoredTableCellRenderer() {
@Override
public void customizeCellRenderer(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (value == null) return;
append((String)value, new SimpleTextAttributes(Font.PLAIN, null));
}
};
}
@Override
public TableCellEditor doCreateEditor(TableItem o) {
return new StringTableCellEditor(myProject);
}
}
protected static class DefaultValueColumn<P extends ParameterInfo, TableItem extends ParameterTableModelItemBase<P>> extends ColumnInfoBase<P, TableItem, PsiCodeFragment> {
private final Project myProject;
private final FileType myFileType;
public DefaultValueColumn(Project project, FileType fileType) {
this(project, fileType, RefactoringBundle.message("column.name.default.value"));
}
public DefaultValueColumn(Project project, FileType fileType, String title) {
super(title);
myProject = project;
myFileType = fileType;
}
@Override
public boolean isCellEditable(TableItem item) {
return !item.isEllipsisType() && item.parameter.getOldIndex() == -1;
}
@Override
public PsiCodeFragment valueOf(TableItem item) {
return item.defaultValueCodeFragment;
}
@Override
public TableCellRenderer doCreateRenderer(TableItem item) {
return new CodeFragmentTableCellRenderer(myProject, myFileType);
}
@Override
public TableCellEditor doCreateEditor(TableItem item) {
return new CodeFragmentTableCellEditorBase(myProject, myFileType);
}
}
protected static class AnyVarColumn<P extends ParameterInfo, TableItem extends ParameterTableModelItemBase<P>> extends ColumnInfoBase<P, TableItem, Boolean> {
public AnyVarColumn() {
super(RefactoringBundle.message("column.name.any.var"));
}
@Override
public boolean isCellEditable(TableItem item) {
return !item.isEllipsisType() && item.parameter.getOldIndex() == -1;
}
@Override
public Boolean valueOf(TableItem item) {
return item.parameter.isUseAnySingleVariable();
}
@Override
public void setValue(TableItem item, Boolean value) {
item.parameter.setUseAnySingleVariable(value);
}
@Override
public TableCellRenderer doCreateRenderer(TableItem item) {
return new BooleanTableCellRenderer();
}
@Override
public TableCellEditor doCreateEditor(TableItem item) {
return new BooleanTableCellEditor(false);
}
@Override
public int getWidth(JTable table) {
final int headerWidth = table.getFontMetrics(table.getFont()).stringWidth(getName()) + 8;
return Math.max(new JCheckBox().getPreferredSize().width, headerWidth);
}
}
}