blob: cec4a3c317e4bde713bb02c0acc0bccf154071d1 [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.introduceParameter;
import com.intellij.psi.PsiExpression;
import com.intellij.psi.PsiLocalVariable;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiParameter;
import com.intellij.refactoring.IntroduceParameterRefactoring;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.ui.TypeSelectorManager;
import com.intellij.ui.NonFocusableCheckBox;
import com.intellij.ui.StateRestoringCheckBox;
import gnu.trove.TIntArrayList;
import gnu.trove.TIntProcedure;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/**
* User: anna
* Date: 2/27/11
*/
public abstract class IntroduceParameterSettingsUI {
protected final boolean myIsInvokedOnDeclaration;
protected final boolean myHasInitializer;
protected StateRestoringCheckBox myCbDeleteLocalVariable = null;
protected StateRestoringCheckBox myCbUseInitializer = null;
protected JRadioButton myReplaceFieldsWithGettersNoneRadio = null;
protected JRadioButton myReplaceFieldsWithGettersInaccessibleRadio = null;
protected JRadioButton myReplaceFieldsWithGettersAllRadio = null;
protected final ButtonGroup myReplaceFieldsWithGettersButtonGroup = new ButtonGroup();
protected final PsiParameter[] myParametersToRemove;
protected final boolean[] myParametersToRemoveChecked;
protected final boolean myIsLocalVariable;
protected JCheckBox myCbReplaceAllOccurences = null;
protected JCheckBox myCbGenerateDelegate = null;
public IntroduceParameterSettingsUI(PsiLocalVariable onLocalVariable,
PsiExpression onExpression,
PsiMethod methodToReplaceIn,
TIntArrayList parametersToRemove) {
myHasInitializer = onLocalVariable != null && onLocalVariable.getInitializer() != null;
myIsInvokedOnDeclaration = onExpression == null;
final PsiParameter[] parameters = methodToReplaceIn.getParameterList().getParameters();
myParametersToRemove = new PsiParameter[parameters.length];
myParametersToRemoveChecked = new boolean[parameters.length];
parametersToRemove.forEach(new TIntProcedure() {
public boolean execute(final int paramNum) {
myParametersToRemove[paramNum] = parameters[paramNum];
return true;
}
});
myIsLocalVariable = onLocalVariable != null;
}
protected boolean isDeleteLocalVariable() {
return myIsInvokedOnDeclaration || myCbDeleteLocalVariable != null && myCbDeleteLocalVariable.isSelected();
}
protected boolean isUseInitializer() {
if(myIsInvokedOnDeclaration)
return myHasInitializer;
return myCbUseInitializer != null && myCbUseInitializer.isSelected();
}
protected int getReplaceFieldsWithGetters() {
if(myReplaceFieldsWithGettersAllRadio != null && myReplaceFieldsWithGettersAllRadio.isSelected()) {
return IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL;
}
else if(myReplaceFieldsWithGettersInaccessibleRadio != null
&& myReplaceFieldsWithGettersInaccessibleRadio.isSelected()) {
return IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE;
}
else if(myReplaceFieldsWithGettersNoneRadio != null && myReplaceFieldsWithGettersNoneRadio.isSelected()) {
return IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE;
}
return IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE;
}
public boolean isReplaceAllOccurences() {
return myIsInvokedOnDeclaration || myCbReplaceAllOccurences != null && myCbReplaceAllOccurences.isSelected();
}
public boolean isGenerateDelegate() {
return myCbGenerateDelegate != null && myCbGenerateDelegate.isSelected();
}
protected JPanel createReplaceFieldsWithGettersPanel() {
JPanel radioButtonPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbConstraints = new GridBagConstraints();
gbConstraints.insets = new Insets(4, 8, 4, 8);
gbConstraints.weighty = 1;
gbConstraints.weightx = 1;
gbConstraints.gridy = 0;
gbConstraints.gridwidth = GridBagConstraints.REMAINDER;
gbConstraints.fill = GridBagConstraints.BOTH;
gbConstraints.anchor = GridBagConstraints.WEST;
radioButtonPanel.add(
new JLabel(RefactoringBundle.message("replace.fields.used.in.expressions.with.their.getters")), gbConstraints);
myReplaceFieldsWithGettersNoneRadio = new JRadioButton();
myReplaceFieldsWithGettersNoneRadio.setText(RefactoringBundle.message("do.not.replace"));
myReplaceFieldsWithGettersInaccessibleRadio = new JRadioButton();
myReplaceFieldsWithGettersInaccessibleRadio.setText(RefactoringBundle.message("replace.fields.inaccessible.in.usage.context"));
myReplaceFieldsWithGettersAllRadio = new JRadioButton();
myReplaceFieldsWithGettersAllRadio.setText(RefactoringBundle.message("replace.all.fields"));
gbConstraints.gridy++;
radioButtonPanel.add(myReplaceFieldsWithGettersNoneRadio, gbConstraints);
gbConstraints.gridy++;
radioButtonPanel.add(myReplaceFieldsWithGettersInaccessibleRadio, gbConstraints);
gbConstraints.gridy++;
radioButtonPanel.add(myReplaceFieldsWithGettersAllRadio, gbConstraints);
final int currentSetting = JavaRefactoringSettings.getInstance().INTRODUCE_PARAMETER_REPLACE_FIELDS_WITH_GETTERS;
myReplaceFieldsWithGettersButtonGroup.add(myReplaceFieldsWithGettersNoneRadio);
myReplaceFieldsWithGettersButtonGroup.add(myReplaceFieldsWithGettersInaccessibleRadio);
myReplaceFieldsWithGettersButtonGroup.add(myReplaceFieldsWithGettersAllRadio);
if(currentSetting == IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL) {
myReplaceFieldsWithGettersAllRadio.setSelected(true);
}
else if(currentSetting == IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_INACCESSIBLE) {
myReplaceFieldsWithGettersInaccessibleRadio.setSelected(true);
}
else if(currentSetting == IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE) {
myReplaceFieldsWithGettersNoneRadio.setSelected(true);
}
return radioButtonPanel;
}
protected void saveSettings(JavaRefactoringSettings settings) {
if(myCbDeleteLocalVariable != null) {
settings.INTRODUCE_PARAMETER_DELETE_LOCAL_VARIABLE =
myCbDeleteLocalVariable.isSelectedWhenSelectable();
}
if (myCbUseInitializer != null) {
settings.INTRODUCE_PARAMETER_USE_INITIALIZER = myCbUseInitializer.isSelectedWhenSelectable();
}
}
protected TIntArrayList getParametersToRemove() {
TIntArrayList parameters = new TIntArrayList();
for (int i = 0; i < myParametersToRemoveChecked.length; i++) {
if (myParametersToRemoveChecked[i]) {
parameters.add(i);
}
}
return parameters;
}
protected void updateControls(JCheckBox[] removeParamsCb) {
if (myCbReplaceAllOccurences != null) {
for (JCheckBox box : removeParamsCb) {
if (box != null) {
box.setEnabled(myCbReplaceAllOccurences.isSelected());
box.setSelected(myCbReplaceAllOccurences.isSelected());
}
}
getTypeSelectionManager().setAllOccurrences(myCbReplaceAllOccurences.isSelected());
if (myCbReplaceAllOccurences.isSelected()) {
if (myCbDeleteLocalVariable != null) {
myCbDeleteLocalVariable.makeSelectable();
}
}
else {
if (myCbDeleteLocalVariable != null) {
myCbDeleteLocalVariable.makeUnselectable(false);
}
}
}
else {
getTypeSelectionManager().setAllOccurrences(myIsInvokedOnDeclaration);
}
}
protected abstract TypeSelectorManager getTypeSelectionManager();
protected void createRemoveParamsPanel(GridBagConstraints gbConstraints, JPanel panel) {
final JCheckBox[] removeParamsCb = new JCheckBox[myParametersToRemove.length];
for (int i = 0; i < myParametersToRemove.length; i++) {
PsiParameter parameter = myParametersToRemove[i];
if (parameter == null) continue;
final NonFocusableCheckBox cb = new NonFocusableCheckBox(RefactoringBundle.message("remove.parameter.0.no.longer.used",
parameter.getName()));
removeParamsCb[i] = cb;
cb.setSelected(true);
gbConstraints.gridy++;
panel.add(cb, gbConstraints);
final int i1 = i;
cb.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
myParametersToRemoveChecked[i1] = cb.isSelected();
}
});
myParametersToRemoveChecked[i] = true;
}
updateControls(removeParamsCb);
if (myCbReplaceAllOccurences != null) {
myCbReplaceAllOccurences.addItemListener(
new ItemListener() {
public void itemStateChanged(ItemEvent e) {
updateControls(removeParamsCb);
}
}
);
}
}
public boolean isParamToRemove(PsiParameter param) {
if (param.isVarArgs()) {
return myParametersToRemove[myParametersToRemove.length - 1] != null;
}
final int parameterIndex = ((PsiMethod)param.getDeclarationScope()).getParameterList().getParameterIndex(param);
return myParametersToRemove[parameterIndex] != null;
}
protected void createLocalVariablePanel(GridBagConstraints gbConstraints, JPanel panel, JavaRefactoringSettings settings) {
if(myIsLocalVariable && !myIsInvokedOnDeclaration) {
myCbDeleteLocalVariable = new StateRestoringCheckBox();
myCbDeleteLocalVariable.setText(RefactoringBundle.message("delete.variable.declaration"));
myCbDeleteLocalVariable.setFocusable(false);
gbConstraints.gridy++;
panel.add(myCbDeleteLocalVariable, gbConstraints);
myCbDeleteLocalVariable.setSelected(settings.INTRODUCE_PARAMETER_DELETE_LOCAL_VARIABLE);
gbConstraints.insets = new Insets(0, 0, 4, 8);
if(myHasInitializer) {
myCbUseInitializer = new StateRestoringCheckBox();
myCbUseInitializer.setText(RefactoringBundle.message("use.variable.initializer.to.initialize.parameter"));
myCbUseInitializer.setSelected(settings.INTRODUCE_PARAMETER_USE_INITIALIZER);
myCbUseInitializer.setFocusable(false);
gbConstraints.gridy++;
panel.add(myCbUseInitializer, gbConstraints);
}
}
}
protected void createDelegateCb(GridBagConstraints gbConstraints, JPanel panel) {
myCbGenerateDelegate = new NonFocusableCheckBox(RefactoringBundle.message("delegation.panel.delegate.via.overloading.method"));
panel.add(myCbGenerateDelegate, gbConstraints);
}
protected void createOccurrencesCb(GridBagConstraints gbConstraints, JPanel panel, final int occurenceNumber) {
myCbReplaceAllOccurences = new NonFocusableCheckBox();
myCbReplaceAllOccurences.setText(RefactoringBundle.message("replace.all.occurences", occurenceNumber));
panel.add(myCbReplaceAllOccurences, gbConstraints);
myCbReplaceAllOccurences.setSelected(false);
}
public void setReplaceAllOccurrences(boolean replaceAll) {
if (myCbReplaceAllOccurences != null) {
myCbReplaceAllOccurences.setSelected(replaceAll);
}
}
}