2 * Copyright 2000-2012 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.jetbrains.plugins.groovy.annotator.intentions.dynamic.ui;
18 import com.intellij.psi.PsiType;
19 import com.intellij.util.IncorrectOperationException;
20 import com.intellij.util.ui.AbstractTableCellEditor;
21 import com.intellij.util.ui.ColumnInfo;
22 import com.intellij.util.ui.ListTableModel;
23 import org.jetbrains.plugins.groovy.GroovyBundle;
24 import org.jetbrains.plugins.groovy.annotator.intentions.QuickfixUtil;
25 import org.jetbrains.plugins.groovy.annotator.intentions.dynamic.ParamInfo;
26 import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory;
27 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
28 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
29 import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesProvider;
32 import javax.swing.event.CellEditorListener;
33 import javax.swing.event.ChangeEvent;
34 import javax.swing.table.TableColumn;
36 import java.util.EventObject;
37 import java.util.List;
40 * User: Dmitry.Krasilschikov
43 public class DynamicMethodDialog extends DynamicDialog {
45 public DynamicMethodDialog(GrReferenceExpression referenceExpression) {
46 super(referenceExpression, QuickfixUtil.createSettings(referenceExpression),
47 GroovyExpectedTypesProvider.calculateTypeConstraints((GrExpression)referenceExpression.getParent()), true);
48 assert getSettings().isMethod();
50 final List<ParamInfo> pairs = getSettings().getParams();
51 setupParameterTable(pairs);
52 setupParameterList(pairs);
53 setTitle(GroovyBundle.message("add.dynamic.method"));
54 setUpTypeLabel(GroovyBundle.message("dynamic.method.return.type"));
57 private void setupParameterTable(final List<ParamInfo> pairs) {
59 MySuggestedNameCellEditor suggestedNameCellEditor = new MySuggestedNameCellEditor(QuickfixUtil.getArgumentsNames(pairs));
60 myParametersTable.setDefaultEditor(String.class, suggestedNameCellEditor);
62 suggestedNameCellEditor.addCellEditorListener(new CellEditorListener() {
63 public void editingStopped(ChangeEvent e) {
64 final int editingColumn = myParametersTable.getSelectedColumn();
65 if (editingColumn != 0) return;
67 final int editingRow = myParametersTable.getSelectedRow();
68 if (editingRow < 0 || editingRow >= pairs.size()) return;
70 String newNameValue = ((MySuggestedNameCellEditor)e.getSource()).getCellEditorValue();
72 final ParamInfo editingPair = pairs.get(editingRow);
73 editingPair.name = newNameValue;
76 public void editingCanceled(ChangeEvent e) {
81 private void setupParameterList(List<ParamInfo> arguments) {
82 final ListTableModel<ParamInfo> dataModel = new ListTableModel<ParamInfo>(new NameColumnInfo(), new TypeColumnInfo());
83 dataModel.setItems(arguments);
84 myParametersTable.setModel(dataModel);
86 if (arguments.isEmpty()) return;
88 String max0 = arguments.get(0).name;
89 String max1 = arguments.get(0).type;
90 for (ParamInfo argument : arguments) {
91 if (argument.name.length() > max0.length()) max0 = argument.name;
92 if (argument.type.length() > max1.length()) max1 = argument.type;
95 final FontMetrics metrics = myParametersTable.getFontMetrics(myParametersTable.getFont());
96 final TableColumn column0 = myParametersTable.getColumnModel().getColumn(0);
97 column0.setPreferredWidth(metrics.stringWidth(max0 + " "));
99 final TableColumn column1 = myParametersTable.getColumnModel().getColumn(1);
100 column1.setPreferredWidth(metrics.stringWidth(max1 + " "));
104 private class TypeColumnInfo extends ColumnInfo<ParamInfo, String> {
105 public TypeColumnInfo() {
106 super(GroovyBundle.message("dynamic.name"));
109 public String valueOf(ParamInfo pair) {
113 public boolean isCellEditable(ParamInfo stringPsiTypeMyPair) {
117 public void setValue(ParamInfo pair, String value) {
120 type = GroovyPsiElementFactory.getInstance(myProject).createTypeElement(value).getType();
122 catch (IncorrectOperationException e) {
126 if (type == null) return;
127 pair.type =type.getCanonicalText();
131 private static class NameColumnInfo extends ColumnInfo<ParamInfo, String> {
132 public NameColumnInfo() {
133 super(GroovyBundle.message("dynamic.type"));
136 public boolean isCellEditable(ParamInfo myPair) {
140 public String valueOf(ParamInfo pair) {
145 private static class MySuggestedNameCellEditor extends AbstractTableCellEditor {
146 JTextField myNameField;
148 public MySuggestedNameCellEditor(String[] names) {
149 myNameField = names.length == 0 ? new JTextField() : new JTextField(names[0]);
152 public String getCellEditorValue() {
153 return myNameField.getText();
156 public boolean isCellEditable(EventObject e) {
160 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
161 if (value instanceof String) {
162 myNameField.setText((String)value);