/*
* Copyright 2000-2012 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.codeInsight.actions;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.lang.LanguageImportStatements;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.arrangement.Rearranger;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.vcsUtil.VcsUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class LayoutCodeDialog extends DialogWrapper {
@NotNull private final Project myProject;
@NotNull private final PsiFile myFile;
private final boolean myTextSelected;
private final String myHelpId;
private final LastRunReformatCodeOptionsProvider myLastRunOptions;
private JPanel myButtonsPanel;
private JCheckBox myOptimizeImportsCb;
private JCheckBox myRearrangeCodeCb;
private JRadioButton myOnlyVCSChangedTextRb;
private JRadioButton mySelectedTextRadioButton;
private JRadioButton myWholeFileRadioButton;
private JPanel myActionsPanel;
private JPanel myScopePanel;
private JLabel myOptionalLabel;
private LayoutCodeOptions myRunOptions;
public LayoutCodeDialog(@NotNull Project project,
@NotNull PsiFile file,
boolean textSelected,
final String helpId) {
super(project, true);
myFile = file;
myProject = project;
myTextSelected = textSelected;
myHelpId = helpId;
myLastRunOptions = new LastRunReformatCodeOptionsProvider(PropertiesComponent.getInstance());
myRunOptions = createOptionsBundledOnDialog();
setOKButtonText(CodeInsightBundle.message("reformat.code.accept.button.text"));
setTitle("Reformat File: " + file.getName());
init();
}
protected void init() {
super.init();
setUpActions();
setUpTextRangeMode();
}
private void setUpTextRangeMode() {
mySelectedTextRadioButton.setEnabled(myTextSelected);
if (!myTextSelected) {
mySelectedTextRadioButton.setToolTipText("No text selected in editor");
}
final boolean fileHasChanges = FormatChangedTextUtil.hasChanges(myFile);
if (myFile.getVirtualFile() instanceof LightVirtualFile) {
myOnlyVCSChangedTextRb.setVisible(false);
}
else {
myOnlyVCSChangedTextRb.setEnabled(fileHasChanges);
if (!fileHasChanges) {
String hint = getChangesNotAvailableHint();
if (hint != null) myOnlyVCSChangedTextRb.setToolTipText(hint);
}
}
myWholeFileRadioButton.setEnabled(true);
if (myTextSelected) {
mySelectedTextRadioButton.setSelected(true);
}
else {
boolean lastRunProcessedChangedText = myLastRunOptions.getLastTextRangeType() == TextRangeType.VCS_CHANGED_TEXT;
if (lastRunProcessedChangedText && fileHasChanges) {
myOnlyVCSChangedTextRb.setSelected(true);
}
else {
myWholeFileRadioButton.setSelected(true);
}
}
}
private void setUpActions() {
boolean canOptimizeImports = !LanguageImportStatements.INSTANCE.forFile(myFile).isEmpty();
myOptimizeImportsCb.setVisible(canOptimizeImports);
if (canOptimizeImports) {
myOptimizeImportsCb.setSelected(myLastRunOptions.getLastOptimizeImports());
}
boolean canRearrangeCode = Rearranger.EXTENSION.forLanguage(myFile.getLanguage()) != null;
myRearrangeCodeCb.setVisible(canRearrangeCode);
if (canRearrangeCode) {
myRearrangeCodeCb.setSelected(myLastRunOptions.isRearrangeCode(myFile.getLanguage()));
}
myOptionalLabel.setVisible(canOptimizeImports || canRearrangeCode);
}
@Nullable
private String getChangesNotAvailableHint() {
if (!VcsUtil.isFileUnderVcs(myProject, VcsUtil.getFilePath(myFile.getVirtualFile()))) {
return "File not under VCS root";
}
else if (!FormatChangedTextUtil.hasChanges(myFile)) {
return "File was not changed since last revision";
}
return null;
}
private void saveCurrentConfiguration() {
if (myOptimizeImportsCb.isEnabled()) {
myLastRunOptions.saveOptimizeImportsState(myRunOptions.isOptimizeImports());
}
if (myRearrangeCodeCb.isEnabled()) {
myLastRunOptions.saveRearrangeState(myFile.getLanguage(), myRunOptions.isRearrangeCode());
}
if (!mySelectedTextRadioButton.isSelected() && myOnlyVCSChangedTextRb.isEnabled()) {
myLastRunOptions.saveProcessVcsChangedTextState(myOnlyVCSChangedTextRb.isSelected());
}
}
@NotNull
private LayoutCodeOptions createOptionsBundledOnDialog() {
return new LayoutCodeOptions() {
@Override
public TextRangeType getTextRangeType() {
if (myOnlyVCSChangedTextRb.isSelected()) {
return TextRangeType.VCS_CHANGED_TEXT;
}
if (mySelectedTextRadioButton.isSelected()) {
return TextRangeType.SELECTED_TEXT;
}
return TextRangeType.WHOLE_FILE;
}
@Override
public boolean isRearrangeCode() {
return myRearrangeCodeCb.isEnabled() && myRearrangeCodeCb.isSelected();
}
@Override
public boolean isOptimizeImports() {
return myOptimizeImportsCb.isEnabled() && myOptimizeImportsCb.isSelected();
}
};
}
@Nullable
@Override
protected JComponent createCenterPanel() {
return myButtonsPanel;
}
@NotNull
@Override
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
}
@Override
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(myHelpId);
}
@Override
protected void doOKAction() {
saveCurrentConfiguration();
super.doOKAction();
}
public LayoutCodeOptions getRunOptions() {
return myRunOptions;
}
}