blob: 519d92b901685b1488224c882cceaf8f9e08e9ce [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.constant;
import com.intellij.psi.*;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.introduce.inplace.OccurrencesChooser;
import com.intellij.refactoring.introduceField.IntroduceConstantHandler;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil;
import org.jetbrains.plugins.groovy.refactoring.introduce.GrAbstractInplaceIntroducer;
import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext;
import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceHandlerBase;
import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo;
import org.jetbrains.plugins.groovy.refactoring.introduce.field.GroovyInplaceFieldValidator;
import javax.swing.*;
import java.util.ArrayList;
/**
* Created by Max Medvedev on 8/29/13
*/
public class GrInplaceConstantIntroducer extends GrAbstractInplaceIntroducer<GrIntroduceConstantSettings> {
private final GrInplaceIntroduceConstantPanel myPanel;
private final GrIntroduceContext myContext;
private final String[] mySuggestedNames;
public GrInplaceConstantIntroducer(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) {
super(IntroduceConstantHandler.REFACTORING_NAME, choice, context);
myContext = context;
myPanel = new GrInplaceIntroduceConstantPanel();
GrVariable localVar = GrIntroduceHandlerBase.resolveLocalVar(context);
if (localVar != null) {
ArrayList<String> result = ContainerUtil.newArrayList(localVar.getName());
GrExpression initializer = localVar.getInitializerGroovy();
if (initializer != null) {
ContainerUtil.addAll(result, GroovyNameSuggestionUtil.suggestVariableNames(initializer, new GroovyInplaceFieldValidator(context), true));
}
mySuggestedNames = ArrayUtil.toStringArray(result);
}
else {
GrExpression expression = context.getExpression();
assert expression != null;
mySuggestedNames = GroovyNameSuggestionUtil.suggestVariableNames(expression, new GroovyInplaceFieldValidator(context), true);
}
}
@Override
protected String getActionName() {
return GrIntroduceConstantHandler.REFACTORING_NAME;
}
@Override
protected String[] suggestNames(boolean replaceAll, @Nullable GrVariable variable) {
return mySuggestedNames;
}
@Nullable
@Override
protected JComponent getComponent() {
return myPanel.getRootPane();
}
@Override
protected void saveSettings(@NotNull GrVariable variable) {
}
@Override
protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceConstantSettings settings, boolean processUsages) {
if (processUsages) {
return new GrIntroduceConstantProcessor(context, settings).run();
}
else {
PsiElement scope = context.getScope();
return new GrIntroduceConstantProcessor(context, settings).addDeclaration(scope instanceof GroovyFileBase ? ((GroovyFileBase)scope).getScriptClass() : (PsiClass)scope).getVariables()[0];
}
}
@Nullable
@Override
protected GrIntroduceConstantSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context,
@NotNull final OccurrencesChooser.ReplaceChoice choice,
final String[] names) {
return new GrIntroduceConstantSettings() {
@Override
public String getVisibilityModifier() {
return PsiModifier.PUBLIC;
}
@Nullable
@Override
public PsiClass getTargetClass() {
return (PsiClass)context.getScope();
}
@Nullable
@Override
public String getName() {
return names[0];
}
@Override
public boolean replaceAllOccurrences() {
return isReplaceAllOccurrences();
}
@Nullable
@Override
public PsiType getSelectedType() {
GrExpression expression = context.getExpression();
GrVariable var = context.getVar();
StringPartInfo stringPart = context.getStringPart();
return var != null ? var.getDeclaredType() :
expression != null ? expression.getType() :
stringPart != null ? stringPart.getLiteral().getType() :
null;
}
};
}
@Override
protected GrIntroduceConstantSettings getSettings() {
return new GrIntroduceConstantSettings() {
@Override
public String getVisibilityModifier() {
return PsiModifier.PUBLIC;
}
@Nullable
@Override
public String getName() {
return getInputName();
}
@Override
public boolean replaceAllOccurrences() {
return isReplaceAllOccurrences();
}
@Nullable
@Override
public PsiType getSelectedType() {
return GrInplaceConstantIntroducer.this.getSelectedType();
}
@Nullable
@Override
public PsiClass getTargetClass() {
return (PsiClass)myContext.getScope();
}
};
}
@Nullable
@Override
protected PsiElement checkLocalScope() {
return ((PsiField)getVariable()).getContainingClass();
}
@Override
protected boolean performRefactoring() {
JavaRefactoringSettings.getInstance().INTRODUCE_CONSTANT_MOVE_TO_ANOTHER_CLASS = myPanel.isMoveToAnotherClass();
if (myPanel.isMoveToAnotherClass()) {
try {
myEditor.putUserData(INTRODUCE_RESTART, true);
myEditor.putUserData(ACTIVE_INTRODUCE, this);
final GrIntroduceConstantHandler constantHandler = new GrIntroduceConstantHandler();
final PsiLocalVariable localVariable = (PsiLocalVariable)getLocalVariable();
constantHandler.getContextAndInvoke(myProject, myEditor, ((GrExpression)myExpr), (GrVariable)localVariable, null);
}
finally {
myEditor.putUserData(INTRODUCE_RESTART, false);
myEditor.putUserData(ACTIVE_INTRODUCE, null);
releaseResources();
if (myLocalMarker != null) {
myLocalMarker.dispose();
}
if (myExprMarker != null) {
myExprMarker.dispose();
}
}
return false;
}
return super.performRefactoring();
}
/**
* Created by Max Medvedev on 8/29/13
*/
public class GrInplaceIntroduceConstantPanel {
private JBCheckBox myMoveToAnotherClassJBCheckBox;
private JPanel myRootPane;
private JComponent myPreview;
public boolean isMoveToAnotherClass() {
return myMoveToAnotherClassJBCheckBox.isSelected();
}
public JComponent getRootPane() {
return myRootPane;
}
private void createUIComponents() {
myPreview = getPreviewComponent();
}
}
}