blob: 2c1fd837661995074b09fe2fca6c9524b7ebce9f [file] [log] [blame]
/*
* Copyright 2000-2009 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.
*/
/*
* Created by IntelliJ IDEA.
* User: dsl
* Date: 06.05.2002
* Time: 16:54:19
* To change template for new class use
* Code Style | Class Templates options (Tools | IDE Options).
*/
package com.intellij.refactoring.introduceParameter;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.ui.*;
import com.intellij.ui.NonFocusableCheckBox;
import com.intellij.usageView.UsageInfo;
import gnu.trove.TIntArrayList;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.util.List;
public class IntroduceParameterDialog extends RefactoringDialog {
private TypeSelector myTypeSelector;
private NameSuggestionsManager myNameSuggestionsManager;
private final Project myProject;
private final List<UsageInfo> myClassMembersList;
private final int myOccurenceNumber;
private final PsiMethod myMethodToSearchFor;
private final PsiMethod myMethodToReplaceIn;
private final boolean myMustBeFinal;
private final PsiExpression myExpression;
private final PsiLocalVariable myLocalVar;
protected JCheckBox myCbDeclareFinal = null;
// private JComponent myParameterNameField = null;
private NameSuggestionsField myParameterNameField;
private final NameSuggestionsGenerator myNameSuggestionsGenerator;
private final TypeSelectorManager myTypeSelectorManager;
private static final String REFACTORING_NAME = RefactoringBundle.message("introduce.parameter.title");
private NameSuggestionsField.DataChanged myParameterNameChangedListener;
private final IntroduceParameterSettingsPanel myPanel;
private boolean myHasWriteAccess = false;
IntroduceParameterDialog(@NotNull Project project,
@NotNull List<UsageInfo> classMembersList,
PsiExpression[] occurences,
PsiLocalVariable onLocalVariable,
PsiExpression onExpression,
@NotNull NameSuggestionsGenerator generator,
@NotNull TypeSelectorManager typeSelectorManager,
@NotNull PsiMethod methodToSearchFor,
@NotNull PsiMethod methodToReplaceIn,
@NotNull TIntArrayList parametersToRemove,
final boolean mustBeFinal) {
super(project, true);
myPanel = new IntroduceParameterSettingsPanel(onLocalVariable, onExpression, methodToReplaceIn, parametersToRemove);
myProject = project;
myClassMembersList = classMembersList;
myOccurenceNumber = occurences.length;
for (PsiExpression occurence : occurences) {
if (PsiUtil.isAccessedForWriting(occurence)) {
myHasWriteAccess = true;
break;
}
}
myExpression = onExpression;
myLocalVar = onLocalVariable;
myMethodToReplaceIn = methodToReplaceIn;
myMustBeFinal = mustBeFinal;
myMethodToSearchFor = methodToSearchFor;
myNameSuggestionsGenerator = generator;
myTypeSelectorManager = typeSelectorManager;
setTitle(REFACTORING_NAME);
init();
}
protected void dispose() {
myParameterNameField.removeDataChangedListener(myParameterNameChangedListener);
super.dispose();
}
private boolean isDeclareFinal() {
return myCbDeclareFinal != null && myCbDeclareFinal.isSelected();
}
private String getParameterName() {
return myParameterNameField.getEnteredName().trim();
}
public JComponent getPreferredFocusedComponent() {
return myParameterNameField.getFocusableComponent();
}
private PsiType getSelectedType() {
return myTypeSelector.getSelectedType();
}
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(HelpID.INTRODUCE_PARAMETER);
}
protected JComponent createNorthPanel() {
GridBagConstraints gbConstraints = new GridBagConstraints();
JPanel panel = new JPanel(new GridBagLayout());
gbConstraints.anchor = GridBagConstraints.WEST;
gbConstraints.fill = GridBagConstraints.NONE;
gbConstraints.gridx = 0;
gbConstraints.insets = new Insets(4, 4, 4, 0);
gbConstraints.gridwidth = 1;
gbConstraints.weightx = 0;
gbConstraints.weighty = 0;
gbConstraints.gridy = 0;
JLabel type = new JLabel(RefactoringBundle.message("parameter.of.type"));
panel.add(type, gbConstraints);
gbConstraints.insets = new Insets(4, 4, 4, 8);
gbConstraints.gridx++;
gbConstraints.weightx = 1;
gbConstraints.fill = GridBagConstraints.BOTH;
myTypeSelector = myTypeSelectorManager.getTypeSelector();
panel.add(myTypeSelector.getComponent(), gbConstraints);
gbConstraints.insets = new Insets(4, 4, 4, 8);
gbConstraints.gridwidth = 1;
gbConstraints.weightx = 0;
gbConstraints.gridx = 0;
gbConstraints.gridy = 1;
gbConstraints.fill = GridBagConstraints.NONE;
myParameterNameField = new NameSuggestionsField(myProject);
final JLabel nameLabel = new JLabel(RefactoringBundle.message("name.prompt"));
nameLabel.setLabelFor(myParameterNameField.getComponent());
panel.add(nameLabel, gbConstraints);
/*
if (myNameSuggestions.length > 1) {
myParameterNameField = createComboBoxForName();
}
else {
myParameterNameField = createTextFieldForName();
}
*/
gbConstraints.gridx++;
gbConstraints.insets = new Insets(4, 4, 4, 8);
gbConstraints.weightx = 1;
gbConstraints.fill = GridBagConstraints.BOTH;
panel.add(myParameterNameField.getComponent(), gbConstraints);
myParameterNameChangedListener = new NameSuggestionsField.DataChanged() {
public void dataChanged() {
validateButtons();
}
};
myParameterNameField.addDataChangedListener(myParameterNameChangedListener);
myNameSuggestionsManager =
new NameSuggestionsManager(myTypeSelector, myParameterNameField, myNameSuggestionsGenerator);
myNameSuggestionsManager.setLabelsFor(type, nameLabel);
gbConstraints.gridx = 0;
gbConstraints.insets = new Insets(4, 0, 4, 8);
gbConstraints.gridwidth = 2;
if (myOccurenceNumber > 1 && !myPanel.myIsInvokedOnDeclaration) {
gbConstraints.gridy++;
myPanel.createOccurrencesCb(gbConstraints, panel, myOccurenceNumber);
}
if(myPanel.myCbReplaceAllOccurences != null) {
gbConstraints.insets = new Insets(0, 16, 4, 8);
}
JavaRefactoringSettings settings = JavaRefactoringSettings.getInstance();
myPanel.createLocalVariablePanel(gbConstraints, panel, settings);
myPanel.createRemoveParamsPanel(gbConstraints, panel);
gbConstraints.insets = new Insets(4, 0, 4, 8);
gbConstraints.gridy++;
myCbDeclareFinal = new NonFocusableCheckBox(RefactoringBundle.message("declare.final"));
final Boolean settingsFinals = settings.INTRODUCE_PARAMETER_CREATE_FINALS;
myCbDeclareFinal.setSelected(settingsFinals == null ?
CodeStyleSettingsManager.getSettings(myProject).GENERATE_FINAL_PARAMETERS :
settingsFinals.booleanValue());
panel.add(myCbDeclareFinal, gbConstraints);
if (myMustBeFinal) {
myCbDeclareFinal.setSelected(true);
myCbDeclareFinal.setEnabled(false);
} else if (myHasWriteAccess && myPanel.isReplaceAllOccurences()) {
myCbDeclareFinal.setSelected(false);
myCbDeclareFinal.setEnabled(false);
}
gbConstraints.gridy++;
myPanel.createDelegateCb(gbConstraints, panel);
return panel;
}
protected JComponent createCenterPanel() {
if(Util.anyFieldsWithGettersPresent(myClassMembersList)) {
return myPanel.createReplaceFieldsWithGettersPanel();
}
else
return null;
}
protected void doAction() {
final JavaRefactoringSettings settings = JavaRefactoringSettings.getInstance();
settings.INTRODUCE_PARAMETER_REPLACE_FIELDS_WITH_GETTERS =
myPanel.getReplaceFieldsWithGetters();
if (myCbDeclareFinal != null && myCbDeclareFinal.isEnabled()) {
settings.INTRODUCE_PARAMETER_CREATE_FINALS = Boolean.valueOf(myCbDeclareFinal.isSelected());
}
myPanel.saveSettings(settings);
myNameSuggestionsManager.nameSelected();
boolean isDeleteLocalVariable = false;
PsiExpression parameterInitializer = myExpression;
if (myLocalVar != null) {
if (myPanel.isUseInitializer()) {
parameterInitializer = myLocalVar.getInitializer(); }
isDeleteLocalVariable = myPanel.isDeleteLocalVariable();
}
final IntroduceParameterProcessor processor = new IntroduceParameterProcessor(
myProject, myMethodToReplaceIn, myMethodToSearchFor,
parameterInitializer, myExpression,
myLocalVar, isDeleteLocalVariable,
getParameterName(), myPanel.isReplaceAllOccurences(),
myPanel.getReplaceFieldsWithGetters(), isDeclareFinal(), myPanel.isGenerateDelegate(), getSelectedType(), myPanel.getParametersToRemove());
invokeRefactoring(processor);
myParameterNameField.requestFocusInWindow();
}
private void updateFinalState() {
if (myHasWriteAccess && myCbDeclareFinal != null) {
myCbDeclareFinal.setEnabled(!myPanel.isReplaceAllOccurences());
if (myPanel.isReplaceAllOccurences()) {
myCbDeclareFinal.setSelected(false);
}
}
}
@Override
protected void canRun() throws ConfigurationException {
String name = getParameterName();
if (name == null || !PsiNameHelper.getInstance(myProject).isIdentifier(name)) {
throw new ConfigurationException("\'" + (name != null ? name : "") + "\' is invalid parameter name");
}
}
public void setReplaceAllOccurrences(boolean replaceAllOccurrences) {
myPanel.setReplaceAllOccurrences(replaceAllOccurrences);
}
public void setGenerateDelegate(boolean delegate) {
myPanel.setGenerateDelegate(delegate);
}
private class IntroduceParameterSettingsPanel extends IntroduceParameterSettingsUI {
public IntroduceParameterSettingsPanel(PsiLocalVariable onLocalVariable,
PsiExpression onExpression,
PsiMethod methodToReplaceIn, TIntArrayList parametersToRemove) {
super(onLocalVariable, onExpression, methodToReplaceIn, parametersToRemove);
}
@Override
protected TypeSelectorManager getTypeSelectionManager() {
return myTypeSelectorManager;
}
@Override
protected void updateControls(JCheckBox[] removeParamsCb) {
super.updateControls(removeParamsCb);
updateFinalState();
}
public void setGenerateDelegate(boolean delegate) {
myCbGenerateDelegate.setSelected(delegate);
}
}
}