blob: 6f7064045ce9ca2475765386224dd81d1b030dd7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.refactoring.java.ui;
import com.sun.source.doctree.DocCommentTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.Tree;
import com.sun.source.tree.VariableTree;
import com.sun.source.util.TreePath;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.*;
import javax.lang.model.element.Element;
import javax.lang.model.element.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.text.*;
import org.netbeans.api.editor.DialogBinding;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.java.source.*;
import org.netbeans.api.java.source.ui.TypeElementFinder;
import org.netbeans.editor.Utilities;
import org.netbeans.modules.refactoring.java.RefactoringModule;
import org.netbeans.modules.refactoring.java.RefactoringUtils;
import org.netbeans.modules.refactoring.java.api.ChangeParametersRefactoring.ParameterInfo;
import org.netbeans.modules.refactoring.java.api.JavaRefactoringUtils;
import org.netbeans.modules.refactoring.java.plugins.LocalVarScanner;
import org.netbeans.modules.refactoring.spi.ui.CustomRefactoringPanel;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
/**
* Panel contains components for signature change. There is table with
* parameters, you can add parameters, reorder parameters, rename parameters
* or remove parameters. You can also change the methods access modifier, name
* and return type.
*
* @author Pavel Flaska, Jan Becicka, Ralph Ruijs
*/
public class ChangeParametersPanel extends JPanel implements CustomRefactoringPanel {
private static final String MIME_JAVA = "text/x-java"; // NOI18N
private static final String UPDATEJAVADOC = "updateJavadoc.changeParameters"; // NOI18N
private static final String GENJAVADOC = "generateJavadoc.changeParameters"; // NOI18N
private static final String OVERLOADMETHOD = "overloadmethod.changeParameters"; // NOI18N
TreePathHandle refactoredObj;
private int[] parameterSpan;
ParamTableModel model;
private ChangeListener parent;
private TableTabAction tableTabAction;
private TableTabAction tableShiftTabAction;
private static Action editAction = null;
private Action returnTypeAction;
@NbBundle.Messages({
"LBL_ModifierNoChange=<do not change>",
"LBL_ModifierDefault=<default>"
})
private static final String[] modifierNames = {
"public", // NOI18N
"protected", // NOI18N
Bundle.LBL_ModifierDefault(),
"private", // NOI18N
Bundle.LBL_ModifierNoChange(),
};
private ParameterInfo[] preConfiguration;
private final ReturnTypeDocListener returnTypeDocListener;
private final MethodNameDocListener methodNameDocListener;
private final JComponent[] singleLineEditor;
private boolean methodNameChanged;
private boolean returnTypeChanged;
private boolean isConstructor;
private final String paramname;
@Override
public Component getComponent() {
return this;
}
private static final String[] columnNames = {
getString("LBL_ChangeParsColType"), // NOI18N
getString("LBL_ChangeParsColName"), // NOI18N
getString("LBL_ChangeParsColDefVal"), // NOI18N
getString("LBL_ChangeParsColOrigIdx"), // NOI18N
getString("LBL_ChangeParsParUsed") // NOI18N
};
// modifier items in combo - indexes
private static final int MOD_PUBLIC_INDEX = 0;
private static final int MOD_PROTECTED_INDEX = 1;
private static final int MOD_DEFAULT_INDEX = 2;
private static final int MOD_PRIVATE_INDEX = 3;
private static final int MOD_NOCHANGE_INDEX = 4;
private static final String ACTION_INLINE_EDITOR = "invokeInlineEditor"; //NOI18N
/** Creates new form ChangeMethodSignature */
public ChangeParametersPanel(TreePathHandle refactoredObj, ChangeListener parent, ParameterInfo[] preConfiguration, CodeStyle cs) {
returnTypeDocListener = new ReturnTypeDocListener();
methodNameDocListener = new MethodNameDocListener();
this.refactoredObj = refactoredObj;
this.parent = parent;
this.preConfiguration = preConfiguration;
model = new ParamTableModel(columnNames, 0) {
@Override
public void addRow(Object[] rowData) {
int row = paramTable.getRowCount();
super.addRow(rowData);
for (int i = 0; i < paramTable.getColumnCount(); i++) {
TableCellEditor cellEditor = paramTable.getCellEditor(row, i);
int rowHeight = cellEditor.getTableCellEditorComponent(paramTable, rowData[0], true, row, i).getPreferredSize().height;
if(paramTable.getRowHeight() < rowHeight) {
paramTable.setRowHeight(rowHeight);
}
}
}
};
this.returnTypeAction = new ReturnTypeAction();
singleLineEditor = Utilities.createSingleLineEditor(MIME_JAVA);
paramname = CodeStyleUtils.addPrefixSuffix("par", cs.getParameterNamePrefix(), cs.getParameterNameSuffix());
initComponents();
InputMap im = paramTable.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap ptActionMap = paramTable.getActionMap();
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
Action oldTabAction = ptActionMap.get(im.get(tab));
tableTabAction = new TableTabAction(oldTabAction);
ptActionMap.put(im.get(tab), tableTabAction);
KeyStroke shiftTab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_MASK);
Action oldShiftTabAction = ptActionMap.get(im.get(shiftTab));
tableShiftTabAction = new TableTabAction(oldShiftTabAction);
ptActionMap.put(im.get(shiftTab), tableShiftTabAction);
methodNameText.getDocument().addDocumentListener(methodNameDocListener);
}
private boolean initialized = false;
@Override
public void initialize() {
try {
if (initialized) {
return;
}
JavaSource source = JavaSource.forFileObject(refactoredObj.getFileObject());
source.runUserActionTask(new CancellableTask<CompilationController>() {
@Override
public void run(org.netbeans.api.java.source.CompilationController info) {
try {
info.toPhase(org.netbeans.api.java.source.JavaSource.Phase.RESOLVED);
ExecutableElement e = (ExecutableElement) refactoredObj.resolveElement(info);
isConstructor = e.getKind() == ElementKind.CONSTRUCTOR;
TreePath enclosingClass = JavaRefactoringUtils.findEnclosingClass(info, refactoredObj.resolve(info), true, true, true, true, true);
TreePathHandle tph = TreePathHandle.create(enclosingClass, info);
Element enclosingElement = tph.resolveElement(info);
methodNameText.setText(isConstructor ?
enclosingElement.getSimpleName().toString() :
e.getSimpleName().toString());
final FileObject fileObject = refactoredObj.getFileObject();
final String returnType = e.getReturnType().toString();
final long[] returnSpan = {-1, -1};
if(!isConstructor) {
MethodTree methodTree = (MethodTree) refactoredObj.resolve(info).getLeaf();
final long methodStart = info.getTreeUtilities().findNameSpan(methodTree)[0];
Tree tree = methodTree.getReturnType();
returnSpan[0] = tree == null ? methodStart -1 : info.getTrees().getSourcePositions().getStartPosition(info.getCompilationUnit(), tree);
returnSpan[1] = tree == null ? methodStart -1 : info.getTrees().getSourcePositions().getEndPosition(info.getCompilationUnit(), tree);
DataObject dob = DataObject.find(fileObject);
((JEditorPane)singleLineEditor[1]).getDocument().putProperty(
Document.StreamDescriptionProperty,
dob);
}
DocCommentTree javadocDoc = info.getDocTrees().getDocCommentTree(e);
if(javadocDoc != null && !javadocDoc.getFullBody().isEmpty()) {
chkGenJavadoc.setEnabled(true);
chkGenJavadoc.setVisible(true);
chkUpdateJavadoc.setVisible(false);
} else {
chkUpdateJavadoc.setEnabled(true);
chkUpdateJavadoc.setVisible(true);
chkGenJavadoc.setVisible(false);
}
if (enclosingElement.getKind().isInterface() || inheritedFromInterface(e, info.getElementUtilities())) {
modifiersCombo.setEnabled(false);
}
initTableData(info);
setModifier(e.getModifiers());
for (TypeParameterElement typeParameterElement : e.getTypeParameters()) {
Tree typeParameterTree = info.getTrees().getTree(typeParameterElement);
typeParameters.add(typeParameterTree.toString());
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if(isConstructor) {
methodNameText.setEnabled(false);
singleLineEditor[1].setEnabled(false);
returnTypeAction.setEnabled(false);
} else {
DialogBinding.bindComponentToFile(fileObject, (int) returnSpan[0], (int) (returnSpan[1] - returnSpan[0]), ((JEditorPane)singleLineEditor[1]));
}
((JEditorPane)singleLineEditor[1]).setText(returnType);
((JEditorPane)singleLineEditor[1]).getDocument().addDocumentListener(returnTypeDocListener);
initialized = true;
methodNameChanged = false;
returnTypeChanged = false;
updatePreview();
}});
}
catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
@Override
public void cancel() {
}
}, true);
}
catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
private static boolean inheritedFromInterface(ExecutableElement e, ElementUtilities utils) {
while (e != null) {
if (utils.implementsMethod(e)) {
return true;
}
e = utils.getOverriddenMethod(e);
}
return false;
}
protected DefaultTableModel getTableModel() {
return model;
}
protected Set<Modifier> getModifier() {
Set<Modifier> modifiers = new HashSet<Modifier>(1);
// modifiers.remove(Modifier.PRIVATE);
// modifiers.remove(Modifier.PUBLIC);
// modifiers.remove(Modifier.PROTECTED);
switch (modifiersCombo.getSelectedIndex()) {
case MOD_PRIVATE_INDEX: modifiers.add(Modifier.PRIVATE);break;
case MOD_DEFAULT_INDEX: break; /* no modifier */
case MOD_PROTECTED_INDEX: modifiers.add(Modifier.PROTECTED); break;
case MOD_PUBLIC_INDEX: modifiers.add(Modifier.PUBLIC); break;
case MOD_NOCHANGE_INDEX:
return null;
}
return modifiers;
}
protected Javadoc getJavadoc() {
if(chkUpdateJavadoc.isVisible() && chkUpdateJavadoc.isSelected()) {
return Javadoc.UPDATE;
} else if(chkGenJavadoc.isVisible() && chkGenJavadoc.isSelected()) {
return Javadoc.GENERATE;
} else {
return Javadoc.NONE;
}
}
public enum Javadoc {
NONE,
UPDATE,
GENERATE
}
protected String getMethodName() {
return methodNameChanged? methodNameText.getText() : null;
}
protected String getReturnType() {
return returnTypeChanged? ((JEditorPane)singleLineEditor[1]).getText() : null;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
bgOverloadMethod = new javax.swing.ButtonGroup();
modifiersPanel = new javax.swing.JPanel();
modifiersLabel = new javax.swing.JLabel();
modifiersCombo = new javax.swing.JComboBox();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
methodNameText = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jScrollPane2 = (JScrollPane)singleLineEditor[0];
westPanel = new javax.swing.JScrollPane();
paramTable = new javax.swing.JTable();
paramTitle = new javax.swing.JLabel();
chkUpdateJavadoc = new javax.swing.JCheckBox();
chkGenJavadoc = new javax.swing.JCheckBox();
addButton = new javax.swing.JButton();
removeButton = new javax.swing.JButton();
moveUpButton = new javax.swing.JButton();
moveDownButton = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
previewChange = new javax.swing.JLabel();
rbUpdateMethod = new javax.swing.JRadioButton();
rbOverloadMethod = new javax.swing.JRadioButton();
lblCodeGeneration = new javax.swing.JLabel();
setBorder(javax.swing.BorderFactory.createEmptyBorder(12, 12, 11, 11));
setAutoscrolls(true);
setName(getString("LBL_TitleChangeParameters"));
modifiersLabel.setLabelFor(modifiersCombo);
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/netbeans/modules/refactoring/java/ui/Bundle"); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(modifiersLabel, bundle.getString("LBL_ChangeParsMods")); // NOI18N
modifiersCombo.setModel(new DefaultComboBoxModel(modifierNames));
modifiersCombo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
modifiersComboActionPerformed(evt);
}
});
jLabel1.setLabelFor(jScrollPane2);
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "ChangeParametersPanel.jLabel1.text")); // NOI18N
jLabel2.setLabelFor(methodNameText);
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "ChangeParametersPanel.jLabel2.text")); // NOI18N
methodNameText.setPreferredSize(new java.awt.Dimension(112, 27));
jButton1.setAction(getReturnTypeAction());
org.openide.awt.Mnemonics.setLocalizedText(jButton1, "…"); // NOI18N
javax.swing.GroupLayout modifiersPanelLayout = new javax.swing.GroupLayout(modifiersPanel);
modifiersPanel.setLayout(modifiersPanelLayout);
modifiersPanelLayout.setHorizontalGroup(
modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(modifiersPanelLayout.createSequentialGroup()
.addGroup(modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(modifiersPanelLayout.createSequentialGroup()
.addGap(4, 4, 4)
.addComponent(modifiersLabel))
.addComponent(modifiersCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(modifiersPanelLayout.createSequentialGroup()
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 216, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton1))
.addComponent(jLabel1))
.addGap(18, 18, 18)
.addGroup(modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(modifiersPanelLayout.createSequentialGroup()
.addComponent(jLabel2)
.addContainerGap())
.addComponent(methodNameText, javax.swing.GroupLayout.DEFAULT_SIZE, 297, Short.MAX_VALUE)))
);
modifiersPanelLayout.setVerticalGroup(
modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, modifiersPanelLayout.createSequentialGroup()
.addGroup(modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(modifiersLabel)
.addComponent(jLabel1)
.addComponent(jLabel2))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 31, Short.MAX_VALUE)
.addGroup(modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(modifiersCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(modifiersPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(methodNameText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
.addContainerGap())
);
modifiersCombo.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_modifiersCombo")); // NOI18N
westPanel.setPreferredSize(new java.awt.Dimension(453, 100));
paramTable.setModel(model);
initRenderer();
paramTable.getSelectionModel().addListSelectionListener(getListener1());
paramTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
model.addTableModelListener(getListener2());
paramTable.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), ACTION_INLINE_EDITOR); //NOI18N
paramTable.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), ACTION_INLINE_EDITOR); //NOI18N
paramTable.getActionMap().put(ACTION_INLINE_EDITOR, getEditAction()); //NOI18N
paramTable.setSurrendersFocusOnKeystroke(true);
paramTable.setCellSelectionEnabled(false);
paramTable.setRowSelectionAllowed(true);
// paramTable.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE); //NOI18N
paramTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); //NOI18N
westPanel.setViewportView(paramTable);
paramTable.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_paramTable")); // NOI18N
paramTitle.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
paramTitle.setLabelFor(paramTable);
org.openide.awt.Mnemonics.setLocalizedText(paramTitle, bundle.getString("LBL_ChangeParsParameters")); // NOI18N
chkUpdateJavadoc.setSelected(((Boolean) RefactoringModule.getOption(UPDATEJAVADOC, Boolean.FALSE)).booleanValue());
org.openide.awt.Mnemonics.setLocalizedText(chkUpdateJavadoc, org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "LBL_UpdateJavadoc")); // NOI18N
chkUpdateJavadoc.setEnabled(false);
chkUpdateJavadoc.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
chkUpdateJavadocItemStateChanged(evt);
}
});
chkGenJavadoc.setSelected(((Boolean) RefactoringModule.getOption(GENJAVADOC, Boolean.FALSE)).booleanValue());
org.openide.awt.Mnemonics.setLocalizedText(chkGenJavadoc, org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "LBL_GenJavadoc")); // NOI18N
chkGenJavadoc.setEnabled(false);
chkGenJavadoc.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
chkGenJavadocItemStateChanged(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(addButton, bundle.getString("LBL_ChangeParsAdd")); // NOI18N
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(removeButton, bundle.getString("LBL_ChangeParsRemove")); // NOI18N
removeButton.setEnabled(false);
removeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(moveUpButton, bundle.getString("LBL_ChangeParsMoveUp")); // NOI18N
moveUpButton.setEnabled(false);
moveUpButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
moveUpButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(moveDownButton, bundle.getString("LBL_ChangeParsMoveDown")); // NOI18N
moveDownButton.setEnabled(false);
moveDownButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
moveDownButtonActionPerformed(evt);
}
});
jScrollPane1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 0));
jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
previewChange.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "LBL_ChangeParsPreview"))); // NOI18N
previewChange.setOpaque(true);
jScrollPane1.setViewportView(previewChange);
bgOverloadMethod.add(rbUpdateMethod);
rbUpdateMethod.setSelected(!((Boolean) RefactoringModule.getOption(OVERLOADMETHOD, Boolean.FALSE)).booleanValue());
org.openide.awt.Mnemonics.setLocalizedText(rbUpdateMethod, org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "ChangeParametersPanel.rbUpdateMethod.text")); // NOI18N
bgOverloadMethod.add(rbOverloadMethod);
rbOverloadMethod.setSelected(((Boolean) RefactoringModule.getOption(OVERLOADMETHOD, Boolean.FALSE)).booleanValue());
org.openide.awt.Mnemonics.setLocalizedText(rbOverloadMethod, org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "ChangeParametersPanel.rbOverloadMethod.text")); // NOI18N
rbOverloadMethod.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
rbOverloadMethodItemStateChanged(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(lblCodeGeneration, org.openide.util.NbBundle.getMessage(ChangeParametersPanel.class, "ChangeParametersPanel.lblCodeGeneration.text")); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(paramTitle)
.addGroup(layout.createSequentialGroup()
.addComponent(westPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 559, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(moveDownButton)
.addComponent(addButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE)
.addComponent(removeButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(moveUpButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(modifiersPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(chkUpdateJavadoc)
.addComponent(chkGenJavadoc))
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 665, Short.MAX_VALUE)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addComponent(lblCodeGeneration)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(rbUpdateMethod)
.addContainerGap(486, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(rbOverloadMethod)
.addContainerGap(288, Short.MAX_VALUE))
);
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {addButton, moveDownButton, moveUpButton, removeButton});
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(paramTitle)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(addButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(removeButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(moveUpButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(moveDownButton))
.addComponent(westPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 142, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(modifiersPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(chkUpdateJavadoc)
.addComponent(chkGenJavadoc))
.addGap(18, 18, 18)
.addComponent(lblCodeGeneration)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(rbUpdateMethod)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(rbOverloadMethod)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
addButton.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_ChangeParsAdd")); // NOI18N
removeButton.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_ChangeParsRemove")); // NOI18N
moveUpButton.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_ChangeParsMoveUp")); // NOI18N
moveDownButton.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_ChangeParsMoveDown")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void modifiersComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_modifiersComboActionPerformed
updatePreview();
}//GEN-LAST:event_modifiersComboActionPerformed
private void removeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeButtonActionPerformed
acceptEditedValue();
int[] selectedRows = paramTable.getSelectedRows();
ListSelectionModel selectionModel = paramTable.getSelectionModel();
for (int i = 0; i < selectedRows.length; ++i) {
boolean b = ((Boolean) ((Vector) model.getDataVector().get(selectedRows[i] - i)).get(4)).booleanValue();
if (!b) {
String title = getString("LBL_ChangeParsCannotDeleteTitle");
String mes = MessageFormat.format(getString("LBL_ChangeParsCannotDelete"),((Vector) model.getDataVector().get(selectedRows[i] - i)).get(1));
int a = new JOptionPane().showConfirmDialog(this, mes, title, JOptionPane.YES_NO_OPTION);
if (a==JOptionPane.YES_OPTION) {
model.removeRow(selectedRows[i] - i);
selectionModel.clearSelection();
}
} else {
model.removeRow(selectedRows[i] - i);
selectionModel.clearSelection();
}
}
}//GEN-LAST:event_removeButtonActionPerformed
private void moveDownButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveDownButtonActionPerformed
doMove(1);
}//GEN-LAST:event_moveDownButtonActionPerformed
private void moveUpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveUpButtonActionPerformed
doMove(-1);
}//GEN-LAST:event_moveUpButtonActionPerformed
private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
acceptEditedValue();
int rowCount = model.getRowCount();
model.addRow(new Object[] { "Object", paramname + rowCount, "null", new Integer(-1), Boolean.TRUE }); // NOI18N
paramTable.scrollRectToVisible(paramTable.getCellRect(rowCount, 0, false));
paramTable.changeSelection(rowCount, 0, false, false);
autoEdit(paramTable);
}//GEN-LAST:event_addButtonActionPerformed
private void chkUpdateJavadocItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkUpdateJavadocItemStateChanged
Boolean b = evt.getStateChange() == ItemEvent.SELECTED ? Boolean.TRUE : Boolean.FALSE;
RefactoringModule.setOption(UPDATEJAVADOC, b); // NOI18N
updatePreview();
}//GEN-LAST:event_chkUpdateJavadocItemStateChanged
private void chkGenJavadocItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkGenJavadocItemStateChanged
Boolean b = evt.getStateChange() == ItemEvent.SELECTED ? Boolean.TRUE : Boolean.FALSE;
RefactoringModule.setOption(GENJAVADOC, b); // NOI18N
updatePreview();
}//GEN-LAST:event_chkGenJavadocItemStateChanged
private void rbOverloadMethodItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_rbOverloadMethodItemStateChanged
Boolean b = evt.getStateChange() == ItemEvent.SELECTED ? Boolean.TRUE : Boolean.FALSE;
RefactoringModule.setOption(OVERLOADMETHOD, b);
updatePreview();
}//GEN-LAST:event_rbOverloadMethodItemStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addButton;
private javax.swing.ButtonGroup bgOverloadMethod;
private javax.swing.JCheckBox chkGenJavadoc;
private javax.swing.JCheckBox chkUpdateJavadoc;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JLabel lblCodeGeneration;
private javax.swing.JTextField methodNameText;
private javax.swing.JComboBox modifiersCombo;
private javax.swing.JLabel modifiersLabel;
private javax.swing.JPanel modifiersPanel;
private javax.swing.JButton moveDownButton;
private javax.swing.JButton moveUpButton;
private javax.swing.JTable paramTable;
private javax.swing.JLabel paramTitle;
private javax.swing.JLabel previewChange;
private javax.swing.JRadioButton rbOverloadMethod;
private javax.swing.JRadioButton rbUpdateMethod;
private javax.swing.JButton removeButton;
private javax.swing.JScrollPane westPanel;
// End of variables declaration//GEN-END:variables
protected boolean isCompatible() {
return rbOverloadMethod.isSelected();
}
private ListSelectionListener getListener1() {
return new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
if (!lsm.isSelectionEmpty()) {
// Find out which indexes are selected.
int minIndex = lsm.getMinSelectionIndex();
int maxIndex = lsm.getMaxSelectionIndex();
setButtons(minIndex, maxIndex);
boolean enableRemoveBtn = true;
for (int i = minIndex; i <= maxIndex; i++) {
enableRemoveBtn = model.isRemovable(i);
if (!enableRemoveBtn) {
break;
}
}
removeButton.setEnabled(enableRemoveBtn);
}
else {
moveDownButton.setEnabled(false);
moveUpButton.setEnabled(false);
removeButton.setEnabled(false);
}
}
};
}
private TableModelListener getListener2() {
return new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
// update buttons availability
int[] selectedRows = paramTable.getSelectedRows();
if (selectedRows.length == 0) {
removeButton.setEnabled(false);
}
else {
boolean enableRemoveBtn = true;
for (int i = 0; i < selectedRows.length; i++) {
if (selectedRows[i] < model.getRowCount()) {
enableRemoveBtn = model.isCellEditable(selectedRows[i], 0);
if (!enableRemoveBtn) {
break;
}
}
}
removeButton.setEnabled(enableRemoveBtn);
int min = selectedRows[0];
int max = selectedRows[selectedRows.length - 1];
setButtons(min, max);
}
updatePreview();
}
};
}
private void updatePreview() {
if(initialized) {
// update preview
previewChange.setText(genDeclarationString());
previewChange.setToolTipText(genDeclarationString());
parent.stateChanged(null);
}
}
private void initTableData(CompilationController info) {
List<Object[]> newModel = new LinkedList<>();
TreePath path = refactoredObj.resolve(info);
if (path == null) {
return;
}
Element e = info.getTrees().getElement(path);
if (!RefactoringUtils.isExecutableElement(e)) {
parameterSpan = new int[] { 0, 0 }; // stub information
return;
}
ExecutableElement method = (ExecutableElement)e;
MethodTree tree = info.getTrees().getTree(method);
parameterSpan = info.getTreeUtilities().findMethodParameterSpan(tree);
List<? extends VariableElement> pars = method.getParameters();
int originalIndex = 0;
for (VariableElement par : pars) {
VariableTree parTree = (VariableTree) info.getTrees().getTree(par);
String typeRepresentation;
if (method.isVarArgs() && originalIndex == pars.size() - 1) {
typeRepresentation = getTypeStringRepresentation(parTree).replace("[]", "..."); // NOI18N
} else {
typeRepresentation = getTypeStringRepresentation(parTree);
}
LocalVarScanner scan = new LocalVarScanner(info, null);
scan.scan(path, par);
Boolean removable = !scan.hasRefernces();
// Used to check if var was user in overridden/overriding methods
// if (model.getRowCount()<=originalIndex) {
newModel.add(new Object[]{typeRepresentation, par.toString(), "", new Integer(originalIndex), removable});
// } else {
// removable = Boolean.valueOf(model.isRemovable(originalIndex) && removable.booleanValue());
// ((Vector) model.getDataVector().get(originalIndex)).set(4, removable);
// }
originalIndex++;
}
if (preConfiguration != null) {
List<Object[]> preModel = new LinkedList<>();
for (int i = 0; i < preConfiguration.length; i++) {
ParameterInfo parameterInfo = preConfiguration[i];
preModel.add(new Object[]{parameterInfo.getType(),
parameterInfo.getName(),
parameterInfo.getDefaultValue() == null ? "" : parameterInfo.getDefaultValue(),
parameterInfo.getOriginalIndex(),
parameterInfo.getOriginalIndex() < 0 ? Boolean.TRUE :
newModel.get(parameterInfo.getOriginalIndex())[4]});
}
newModel = preModel;
}
final List<Object[]> todo = newModel;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
while (model.getRowCount() > 0) {
model.removeRow(0);
}
for (Object[] row : todo) {
model.addRow(row);
}
}
});
}
private static String getTypeStringRepresentation(VariableTree desc) {
return desc.getType().toString();
}
private boolean acceptEditedValue() {
TableCellEditor tce = paramTable.getCellEditor();
if (tce != null) {
return paramTable.getCellEditor().stopCellEditing();
}
return false;
}
private void doMove(int step) {
acceptEditedValue();
ListSelectionModel selectionModel = paramTable.getSelectionModel();
int min = selectionModel.getMinSelectionIndex();
int max = selectionModel.getMaxSelectionIndex();
selectionModel.clearSelection();
model.moveRow(min, max, min + step);
selectionModel.addSelectionInterval(min + step, max + step);
}
private void setButtons(int min, int max) {
int r = model.getRowCount() - 1;
moveUpButton.setEnabled(min > 0 ? true : false);
moveDownButton.setEnabled(max < r ? true : false);
}
private void initRenderer() {
TableColumnModel tcm = paramTable.getColumnModel();
paramTable.removeColumn(tcm.getColumn(3));
paramTable.removeColumn(tcm.getColumn(3));
Enumeration columns = paramTable.getColumnModel().getColumns();
TableColumn tc = null;
while (columns.hasMoreElements()) {
tc = (TableColumn) columns.nextElement();
tc.setCellRenderer(new ParamRenderer(paramTable.getDefaultRenderer(String.class)));
tc.setCellEditor(new ParamEditor(paramTable.getDefaultEditor(String.class)));
}
}
private Set<Modifier> modifiers = new HashSet<Modifier>();
private List<String> typeParameters = new LinkedList<String>();
private Modifier currentModifier = null;
private void setModifier(Set<Modifier> mods) {
modifiers.clear();
modifiers.addAll(mods);
modifiers.remove(Modifier.PRIVATE);
modifiers.remove(Modifier.PUBLIC);
modifiers.remove(Modifier.PROTECTED);
if (mods.contains(Modifier.PUBLIC)) {
currentModifier = Modifier.PUBLIC;
} else if (mods.contains(Modifier.PROTECTED)) {
currentModifier = Modifier.PROTECTED;
} else if (mods.contains(Modifier.PRIVATE)) {
currentModifier = Modifier.PRIVATE;
}
modifiersCombo.setSelectedIndex(MOD_NOCHANGE_INDEX);
}
public String genDeclarationString() {
StringBuilder buf = new StringBuilder("<html>");
// generate preview for modifiers
// access modifiers
String mod;
int idx = modifiersCombo.getSelectedIndex();
if (idx == MOD_NOCHANGE_INDEX) {
if (currentModifier != null) {
buf.append(currentModifier.toString()).append(' ');
}
} else {
buf.append(
idx != MOD_DEFAULT_INDEX /*default modifier?*/ ?
(String) modifiersCombo.getSelectedItem() + ' ' : ""
);
}
// other than access modifiers - using data provided by the element
for (Modifier modifier : modifiers) {
buf.append(modifier.toString());
buf.append(' '); //NOI18N
}
// Type parameters opt
for (String typeParameterElement : typeParameters) {
buf.append("&lt;").append(typeParameterElement).append("&gt;"); //NOI18N
buf.append(' '); //NOI18N
}
// generate the return type for the method and name
// for the both - method and constructor
if (refactoredObj.getElementHandle().getKind() == ElementKind.METHOD) {
buf.append(((JEditorPane)singleLineEditor[1]).getText());
buf.append(' '); //NOI18N
}
buf.append(methodNameText.getText());
buf.append('('); //NOI18N
// generate parameters to the preview string
List[] parameters = (List[]) model.getDataVector().toArray(new List[0]);
if (parameters.length > 0) {
int i;
for (i = 0; i < parameters.length - 1; i++) {
buf.append((String) parameters[i].get(0));
buf.append(' '); //NOI18N
buf.append((String) parameters[i].get(1));
buf.append(',').append(' '); //NOI18N
}
buf.append((String) parameters[i].get(0));
buf.append(' '); //NOI18N
buf.append((String) parameters[i].get(1));
}
buf.append(")</html>"); //NOI18N
return buf.toString();
}
private static String getString(String key) {
return NbBundle.getMessage(ChangeParametersPanel.class, key);
}
private static Action getEditAction() {
if (editAction == null) {
editAction = new EditAction();
}
return editAction;
}
private static void autoEdit(JTable tab) {
Component editorComponent;
if (tab.editCellAt(tab.getSelectedRow(), tab.getSelectedColumn(), null)
&& (editorComponent = tab.getEditorComponent()) != null) {
JTextComponent field;
if (editorComponent instanceof ChangeParametersButtonPanel) {
field = (JTextComponent) ((JScrollPane) ((ChangeParametersButtonPanel) editorComponent).getComp()).getViewport().getView();
} else if(editorComponent instanceof JScrollPane) {
field = (JTextComponent) ((JScrollPane) editorComponent).getViewport().getView();
} else {
field = (JTextComponent) editorComponent;
}
field.requestFocusInWindow();
}
}
////////////////////////////////////////////////////////////////////////////
// INNER CLASSES
////////////////////////////////////////////////////////////////////////////
// this class is used for marking rows as read-only. If the user uses
// standard DefaultTableModel, rows added through its methods is added
// as a read-write. -- Use methods with Boolean paramater to add
// rows marked as read-only.
static class ParamTableModel extends DefaultTableModel {
public ParamTableModel(Object[] data, int rowCount) {
super(data, rowCount);
}
@Override
public boolean isCellEditable(int row, int column) {
if (column > 2) {
// check box indicating usage of parameter is not editable
return false;
}
// otherwise, check that user can only change the default value
// for new parameters.
if(column > 1) {
Integer origIdx = (Integer) ((Vector) getDataVector().get(row)).get(3);
return origIdx.intValue() == -1 ? true : false;
}
return true;
}
public boolean isRemovable(int row) {
return true;//((Boolean) ((Vector) getDataVector().get(row)).get(4)).booleanValue();
}
@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
} // end ParamTableModel
private static class EditAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent ae) {
autoEdit((JTable) ae.getSource());
}
}
private class ReturnTypeAction extends AbstractAction {
public ReturnTypeAction() {
}
@Override
public void actionPerformed(ActionEvent e) {
FileObject file = RefactoringUtils.getFileObject(refactoredObj);
ElementHandle<TypeElement> type = TypeElementFinder.find(ClasspathInfo.create(file), ((JEditorPane)singleLineEditor[1]).getText(), null);
if (type != null) {
String fqn = type.getQualifiedName().toString();
((JEditorPane)singleLineEditor[1]).setText(fqn);
((JEditorPane)singleLineEditor[1]).selectAll();
}
}
}
private Action getReturnTypeAction() {
return returnTypeAction;
}
private class TypeAction extends AbstractAction {
private final JTable table;
private final Object value;
private final int row;
private final int col;
private TypeAction(JTable table, Object value, int row, int col) {
this.table = table;
this.value = value;
this.row = row;
this.col = col;
}
@Override
public void actionPerformed(ActionEvent e) {
ElementHandle<TypeElement> type = TypeElementFinder.find(null, table.getValueAt(row, col).toString(), null);
if (type != null) {
String fqn = type.getQualifiedName().toString();
acceptEditedValue();
table.setValueAt(fqn, row, col);
}
}
}
private class TableTabAction extends AbstractAction {
private final Action originalTabAction;
public TableTabAction(Action originalTabAction) {
this.originalTabAction = originalTabAction;
}
@Override
public void actionPerformed(ActionEvent e) {
boolean acceptEditedValue = acceptEditedValue();
originalTabAction.actionPerformed(e);
if(acceptEditedValue) {
JTable table = (JTable) e.getSource();
autoEdit(table);
}
}
}
class ParamRenderer implements TableCellRenderer {
Color origBackground;
ChangeParametersButtonPanel buttonpanel;
private final TableCellRenderer original;
public ParamRenderer(TableCellRenderer original) {
setOpaque(true);
origBackground = getBackground();
buttonpanel = new ChangeParametersButtonPanel();
this.original = original;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column)
{
boolean isEditable = model.isCellEditable(row, column);
JComponent comp = (JComponent) original.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(column == 0 && table.isCellEditable(row, column)) {
buttonpanel.setComp(comp);
comp = buttonpanel;
}
if (!isSelected) {
if (!isEditable) {
comp.setBackground(UIManager.getColor("Panel.background")); // NOI18N
} else {
comp.setBackground(origBackground);
}
}
return comp;
}
}
class ParamEditor implements TableCellEditor {
private static final String NO_ACTION = "no-action"; //NOI18N
private final TableCellEditor original;
private JEditorPane editorPane;
private int startOffset;
public ParamEditor(TableCellEditor original) {
this.original = original;
((DefaultCellEditor) original).setClickCountToStart(1);
startOffset = 0;
}
// This method is called when a cell value is edited by the user.
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int col) {
JTextComponent tableCellEditorComponent = (JTextComponent) original.getTableCellEditorComponent(table, value, isSelected, row, col);
Component returnValue = tableCellEditorComponent;
tableCellEditorComponent.setCaretPosition(tableCellEditorComponent.getText().length());
tableCellEditorComponent.selectAll();
if (col < 2 && parameterSpan != null) {
try {
editorPane = new JEditorPane() {
@Override
public boolean isFocusCycleRoot() {
return false; // EditorPane should not be focusRoot when it is inside a table.
}
@Override
protected void processKeyEvent(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_TAB) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
if (e.getModifiers() == KeyEvent.SHIFT_DOWN_MASK
|| e.getModifiers() == KeyEvent.SHIFT_MASK) {
tableShiftTabAction.actionPerformed(new ActionEvent(paramTable,
ActionEvent.ACTION_PERFORMED,
null,
e.getWhen(), ActionEvent.SHIFT_MASK));
} else {
tableTabAction.actionPerformed(new ActionEvent(paramTable,
ActionEvent.ACTION_PERFORMED,
null,
e.getWhen(), e.getModifiers()));
}
}
} else {
super.processKeyEvent(e);
}
}
};
EditorKit kit = MimeLookup.getLookup(MIME_JAVA).lookup(EditorKit.class);
if (kit == null) {
throw new IllegalStateException("No EditorKit for '" + MIME_JAVA + "' mimetype."); //NOI18N
}
editorPane.putClientProperty(
"HighlightsLayerExcludes", //NOI18N
".*(?<!TextSelectionHighlighting)$" //NOI18N
);
editorPane.setEditorKit(kit);
KeyStroke enterKs = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
KeyStroke escKs = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
KeyStroke tabKs = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
InputMap im = editorPane.getInputMap();
im.put(enterKs, NO_ACTION);
im.put(escKs, NO_ACTION);
im.put(tabKs, NO_ACTION);
FileObject fileObject = refactoredObj.getFileObject();
DataObject dob = DataObject.find(fileObject);
editorPane.getDocument().putProperty(
Document.StreamDescriptionProperty,
dob);
DialogBinding.bindComponentToFile(fileObject, parameterSpan[0] + 1, parameterSpan[1] - parameterSpan[0], editorPane);
if(col == 1) {
editorPane.setText(model.getValueAt(row, col-1) + " " + value.toString()); //NOI18N
startOffset = ((String)model.getValueAt(row, col - 1)).length() + 1;
int endOffset = value.toString().length() + startOffset;
editorPane.select(startOffset, endOffset);
try {
Position startPos = editorPane.getDocument().createPosition(startOffset);
Position endPos = editorPane.getDocument().createPosition(endOffset);
editorPane.putClientProperty("document-view-start-position", startPos); //NOI18N
editorPane.putClientProperty("document-view-end-position", endPos); //NOI18N
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
if (col == 0) {
editorPane.setText(value.toString());
editorPane.selectAll();
}
JScrollPane scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane.setBackground(table.getBackground());
scrollPane.setViewportView(editorPane);
returnValue = scrollPane;
} catch (DataObjectNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
}
if(col == 0) {
ChangeParametersButtonPanel buttonPanel = new ChangeParametersButtonPanel();
buttonPanel.setButtonAction(new TypeAction(table, value, row, col));
buttonPanel.setComp((JComponent)returnValue);
returnValue = buttonPanel;
}
return returnValue;
}
@Override
public Object getCellEditorValue() {
if(editorPane != null) {
String text = editorPane.getText();
String substring;
if(text.length() < startOffset) {
// try to recover from not fully implemented document-view-start-position #204788
substring = text;
} else {
substring = text.substring(startOffset);
}
return substring.replace(System.getProperty("line.separator"), "").trim(); //NOI18N
}
return original.getCellEditorValue();
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return original.isCellEditable(anEvent);
}
@Override
public boolean stopCellEditing() {
return original.stopCellEditing();
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return original.shouldSelectCell(anEvent);
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
original.removeCellEditorListener(l);
}
@Override
public void cancelCellEditing() {
original.cancelCellEditing();
}
@Override
public void addCellEditorListener(CellEditorListener l) {
original.addCellEditorListener(l);
}
}
class ChangeParametersButtonPanel extends JPanel {
public static final String ELLIPSIS = "\u2026"; //NOI18N
private JComponent comp;
private JButton button;
public ChangeParametersButtonPanel() {
button = new JButton(ELLIPSIS) {
@Override
public boolean isFocusable() {
return (ChangeParametersButtonPanel.this.getParent() != null);
}
};
setLayout(new BorderLayout(0, 0));
add(button, BorderLayout.EAST);
}
public void setComp(JComponent comp) {
this.comp = comp;
add(comp, BorderLayout.CENTER);
}
public JComponent getComp() {
return comp;
}
private void setButtonAction(Action action) {
button.setAction(action);
button.setText(ELLIPSIS);
}
@Override
public void setBackground(Color bg) {
super.setBackground(bg);
}
}
private class ReturnTypeDocListener implements DocumentListener {
public ReturnTypeDocListener() {
}
@Override
public void insertUpdate(DocumentEvent e) {
returnTypeChanged = true;
updatePreview();
}
@Override
public void removeUpdate(DocumentEvent e) {
returnTypeChanged = true;
updatePreview();
}
@Override
public void changedUpdate(DocumentEvent e) {
returnTypeChanged = true;
updatePreview();
}
}
private class MethodNameDocListener implements DocumentListener {
public MethodNameDocListener() {
}
@Override
public void insertUpdate(DocumentEvent e) {
methodNameChanged = true;
updatePreview();
}
@Override
public void removeUpdate(DocumentEvent e) {
methodNameChanged = true;
updatePreview();
}
@Override
public void changedUpdate(DocumentEvent e) {
methodNameChanged = true;
updatePreview();
}
}
// end INNERCLASSES
}