blob: d6b3dc96812639181d4a8fa6b7971ed399b5dfde [file] [log] [blame]
/*
* Copyright 2000-2014 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 org.jetbrains.plugins.groovy.refactoring.introduce.variable;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.psi.PsiType;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.ui.NameSuggestionsField;
import com.intellij.util.ui.GridBag;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyNamesUtil;
import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle;
import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext;
import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceDialog;
import org.jetbrains.plugins.groovy.refactoring.ui.GrTypeComboBox;
import org.jetbrains.plugins.groovy.settings.GroovyApplicationSettings;
import javax.swing.*;
import java.awt.*;
import java.util.LinkedHashSet;
public class GroovyIntroduceVariableDialog extends DialogWrapper implements GrIntroduceDialog<GroovyIntroduceVariableSettings> {
private static final String REFACTORING_NAME = GroovyRefactoringBundle.message("introduce.variable.title");
private final Project myProject;
private final GrExpression myExpression;
private final int myOccurrencesCount;
private final GrIntroduceVariableHandler.Validator myValidator;
private final GrIntroduceContext myContext;
private NameSuggestionsField myNameField;
private JCheckBox myCbIsFinal;
private JCheckBox myCbReplaceAllOccurrences;
private GrTypeComboBox myTypeComboBox;
public GroovyIntroduceVariableDialog(GrIntroduceContext context, GrIntroduceVariableHandler.Validator validator) {
super(context.getProject(), true);
myContext = context;
myProject = context.getProject();
myExpression = context.getStringPart() != null ? context.getStringPart().getLiteral() : context.getExpression();
myOccurrencesCount = context.getOccurrences().length;
myValidator = validator;
init();
}
@Override
protected void init() {
super.init();
setModal(true);
setTitle(REFACTORING_NAME);
myCbReplaceAllOccurrences.setFocusable(false);
myCbIsFinal.setFocusable(false);
myCbIsFinal.setSelected(GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_CREATE_FINALS);
// Replace occurrences
if (myOccurrencesCount > 1) {
myCbReplaceAllOccurrences.setSelected(false);
myCbReplaceAllOccurrences.setEnabled(true);
myCbReplaceAllOccurrences.setText(myCbReplaceAllOccurrences.getText() + " (" + myOccurrencesCount + " occurrences)");
}
else {
myCbReplaceAllOccurrences.setSelected(false);
myCbReplaceAllOccurrences.setEnabled(false);
}
pack();
}
@Override
@Nullable
protected JComponent createCenterPanel() {
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(createNamePanel(), BorderLayout.CENTER);
contentPane.add(createCBPanel(), BorderLayout.SOUTH);
return contentPane;
}
@Override
protected ValidationInfo doValidate() {
String text = getEnteredName();
if (!GroovyNamesUtil.isIdentifier(text)) {
return new ValidationInfo(GroovyRefactoringBundle.message("name.is.wrong", text), myNameField);
}
return null;
}
private JPanel createCBPanel() {
final JPanel panel = new JPanel(new FlowLayout());
myCbIsFinal = new JCheckBox(UIUtil.replaceMnemonicAmpersand("Declare &final"));
panel.add(myCbIsFinal);
myCbReplaceAllOccurrences = new JCheckBox(UIUtil.replaceMnemonicAmpersand("Replace &all occurrences"));
panel.add(myCbReplaceAllOccurrences);
return panel;
}
private JPanel createNamePanel() {
final GridBag c = new GridBag().setDefaultAnchor(GridBagConstraints.WEST).setDefaultInsets(1, 1, 1, 1);
final JPanel namePanel = new JPanel(new GridBagLayout());
final JLabel typeLabel = new JLabel(UIUtil.replaceMnemonicAmpersand("&Type:"));
c.nextLine().next().weightx(0).fillCellNone();
namePanel.add(typeLabel, c);
myTypeComboBox = GrTypeComboBox.createTypeComboBoxFromExpression(myExpression, GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_SELECT_DEF);
c.next().weightx(1).fillCellHorizontally();
namePanel.add(myTypeComboBox, c);
typeLabel.setLabelFor(myTypeComboBox);
final JLabel nameLabel = new JLabel(UIUtil.replaceMnemonicAmpersand("&Name:"));
c.nextLine().next().weightx(0).fillCellNone();
namePanel.add(nameLabel, c);
myNameField = setUpNameComboBox();
c.next().weightx(1).fillCellHorizontally();
namePanel.add(myNameField, c);
nameLabel.setLabelFor(myNameField);
GrTypeComboBox.registerUpDownHint(myNameField, myTypeComboBox);
return namePanel;
}
@Nullable
protected String getEnteredName() {
return myNameField.getEnteredName();
}
protected boolean isReplaceAllOccurrences() {
return myCbReplaceAllOccurrences.isSelected();
}
private boolean isDeclareFinal() {
return myCbIsFinal.isSelected();
}
@Nullable
private PsiType getSelectedType() {
return myTypeComboBox.getSelectedType();
}
private NameSuggestionsField setUpNameComboBox() {
LinkedHashSet<String> names = suggestNames();
return new NameSuggestionsField(names.toArray(new String[names.size()]), myProject, GroovyFileType.GROOVY_FILE_TYPE);
}
@Override
public JComponent getPreferredFocusedComponent() {
return myNameField;
}
@Override
protected void doOKAction() {
if (!myValidator.isOK(this)) {
return;
}
if (myCbIsFinal.isEnabled()) {
GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_CREATE_FINALS = myCbIsFinal.isSelected();
}
GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_SELECT_DEF = (myTypeComboBox.getSelectedType() == null);
super.doOKAction();
}
@Override
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(HelpID.INTRODUCE_VARIABLE);
}
private void createUIComponents() {
}
@Override
public GroovyIntroduceVariableSettings getSettings() {
return new MyGroovyIntroduceVariableSettings(this);
}
@NotNull
@Override
public LinkedHashSet<String> suggestNames() {
return new GrVariableNameSuggester(myContext, myValidator).suggestNames();
}
private static class MyGroovyIntroduceVariableSettings implements GroovyIntroduceVariableSettings {
String myEnteredName;
boolean myIsReplaceAllOccurrences;
boolean myIsDeclareFinal;
PsiType mySelectedType;
public MyGroovyIntroduceVariableSettings(GroovyIntroduceVariableDialog dialog) {
myEnteredName = dialog.getEnteredName();
myIsReplaceAllOccurrences = dialog.isReplaceAllOccurrences();
myIsDeclareFinal = dialog.isDeclareFinal();
mySelectedType = dialog.getSelectedType();
}
@Override
public String getName() {
return myEnteredName;
}
@Override
public boolean replaceAllOccurrences() {
return myIsReplaceAllOccurrences;
}
@Override
public boolean isDeclareFinal() {
return myIsDeclareFinal;
}
@Override
public PsiType getSelectedType() {
return mySelectedType;
}
}
}