blob: 45a7267d758726226542a409a306a13f55c09703 [file] [log] [blame]
/*
* Copyright 2000-2013 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.openapi.vcs.configurable;
import com.intellij.ide.actions.ShowFilePathAction;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.ex.ProjectLevelVcsManagerEx;
import com.intellij.openapi.vcs.readOnlyHandler.ReadonlyStatusHandlerImpl;
import com.intellij.openapi.vfs.ReadonlyStatusHandler;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;
public class VcsGeneralConfigurationPanel {
private JCheckBox myForceNonEmptyComment;
private JCheckBox myShowReadOnlyStatusDialog;
private JRadioButton myShowDialogOnAddingFile;
private JRadioButton myPerformActionOnAddingFile;
private JRadioButton myDoNothingOnAddingFile;
private JRadioButton myShowDialogOnRemovingFile;
private JRadioButton myPerformActionOnRemovingFile;
private JRadioButton myDoNothingOnRemovingFile;
private JPanel myPanel;
private final JRadioButton[] myOnFileAddingGroup;
private final JRadioButton[] myOnFileRemovingGroup;
private final Project myProject;
private JPanel myPromptsPanel;
Map<VcsShowOptionsSettingImpl, JCheckBox> myPromptOptions = new LinkedHashMap<VcsShowOptionsSettingImpl, JCheckBox>();
private JPanel myRemoveConfirmationPanel;
private JPanel myAddConfirmationPanel;
private JCheckBox myCbOfferToMoveChanges;
private JComboBox myFailedCommitChangelistCombo;
private JComboBox myOnPatchCreation;
private JCheckBox myClearInitialCommitMessage;
private ButtonGroup myEmptyChangelistRemovingGroup;
public VcsGeneralConfigurationPanel(final Project project) {
myProject = project;
myOnFileAddingGroup = new JRadioButton[]{
myShowDialogOnAddingFile,
myPerformActionOnAddingFile,
myDoNothingOnAddingFile
};
myOnFileRemovingGroup = new JRadioButton[]{
myShowDialogOnRemovingFile,
myPerformActionOnRemovingFile,
myDoNothingOnRemovingFile
};
myPromptsPanel.setLayout(new GridLayout(3, 0));
List<VcsShowOptionsSettingImpl> options = ProjectLevelVcsManagerEx.getInstanceEx(project).getAllOptions();
for (VcsShowOptionsSettingImpl setting : options) {
if (!setting.getApplicableVcses().isEmpty() || project.isDefault()) {
final JCheckBox checkBox = new JCheckBox(setting.getDisplayName());
myPromptsPanel.add(checkBox);
myPromptOptions.put(setting, checkBox);
}
}
myPromptsPanel.setSize(myPromptsPanel.getPreferredSize()); // todo check text!
myOnPatchCreation.setName((SystemInfo.isMac ? "Reveal patch in" : "Show patch in ") +
ShowFilePathAction.getFileManagerName() + " after creation:");
}
public void apply() throws ConfigurationException {
VcsConfiguration settings = VcsConfiguration.getInstance(myProject);
settings.FORCE_NON_EMPTY_COMMENT = myForceNonEmptyComment.isSelected();
settings.CLEAR_INITIAL_COMMIT_MESSAGE = myClearInitialCommitMessage.isSelected();
settings.OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT = myCbOfferToMoveChanges.isSelected();
settings.REMOVE_EMPTY_INACTIVE_CHANGELISTS = getSelected(myEmptyChangelistRemovingGroup);
settings.MOVE_TO_FAILED_COMMIT_CHANGELIST = getFailedCommitConfirm();
for (VcsShowOptionsSettingImpl setting : myPromptOptions.keySet()) {
setting.setValue(myPromptOptions.get(setting).isSelected());
}
getAddConfirmation().setValue(getSelected(myOnFileAddingGroup));
getRemoveConfirmation().setValue(getSelected(myOnFileRemovingGroup));
applyPatchOption(settings);
getReadOnlyStatusHandler().getState().SHOW_DIALOG = myShowReadOnlyStatusDialog.isSelected();
}
private void applyPatchOption(VcsConfiguration settings) {
settings.SHOW_PATCH_IN_EXPLORER = getShowPatchValue();
}
@Nullable
private Boolean getShowPatchValue() {
final int index = myOnPatchCreation.getSelectedIndex();
if (index == 0) {
return null;
} else if (index == 1) {
return true;
} else {
return false;
}
}
private VcsShowConfirmationOption.Value getFailedCommitConfirm() {
switch(myFailedCommitChangelistCombo.getSelectedIndex()) {
case 0: return VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY;
case 1: return VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY;
default: return VcsShowConfirmationOption.Value.SHOW_CONFIRMATION;
}
}
private VcsShowConfirmationOption getAddConfirmation() {
return ProjectLevelVcsManagerEx.getInstanceEx(myProject)
.getConfirmation(VcsConfiguration.StandardConfirmation.ADD);
}
private VcsShowConfirmationOption getRemoveConfirmation() {
return ProjectLevelVcsManagerEx.getInstanceEx(myProject)
.getConfirmation(VcsConfiguration.StandardConfirmation.REMOVE);
}
private static VcsShowConfirmationOption.Value getSelected(JRadioButton[] group) {
if (group[0].isSelected()) return VcsShowConfirmationOption.Value.SHOW_CONFIRMATION;
if (group[1].isSelected()) return VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY;
return VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY;
}
private static VcsShowConfirmationOption.Value getSelected(ButtonGroup group) {
switch (UIUtil.getSelectedButton(group)) {
case 0:
return VcsShowConfirmationOption.Value.SHOW_CONFIRMATION;
case 1:
return VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY;
}
return VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY;
}
private ReadonlyStatusHandlerImpl getReadOnlyStatusHandler() {
return ((ReadonlyStatusHandlerImpl)ReadonlyStatusHandler.getInstance(myProject));
}
public boolean isModified() {
VcsConfiguration settings = VcsConfiguration.getInstance(myProject);
if (settings.FORCE_NON_EMPTY_COMMENT != myForceNonEmptyComment.isSelected()){
return true;
}
if (settings.CLEAR_INITIAL_COMMIT_MESSAGE != myClearInitialCommitMessage.isSelected()){
return true;
}
if (settings.OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT != myCbOfferToMoveChanges.isSelected()){
return true;
}
if (settings.REMOVE_EMPTY_INACTIVE_CHANGELISTS != getSelected(myEmptyChangelistRemovingGroup)){
return true;
}
if (!Comparing.equal(getFailedCommitConfirm(), settings.MOVE_TO_FAILED_COMMIT_CHANGELIST)) {
return true;
}
if (getReadOnlyStatusHandler().getState().SHOW_DIALOG != myShowReadOnlyStatusDialog.isSelected()) {
return true;
}
for (VcsShowOptionsSettingImpl setting : myPromptOptions.keySet()) {
if (setting.getValue() != myPromptOptions.get(setting).isSelected()) return true;
}
if (getSelected(myOnFileAddingGroup) != getAddConfirmation().getValue()) return true;
if (getSelected(myOnFileRemovingGroup) != getRemoveConfirmation().getValue()) return true;
if (! Comparing.equal(settings.SHOW_PATCH_IN_EXPLORER, getShowPatchValue())) return true;
return false;
}
public void reset() {
VcsConfiguration settings = VcsConfiguration.getInstance(myProject);
myForceNonEmptyComment.setSelected(settings.FORCE_NON_EMPTY_COMMENT);
myClearInitialCommitMessage.setSelected(settings.CLEAR_INITIAL_COMMIT_MESSAGE);
myCbOfferToMoveChanges.setSelected(settings.OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT);
VcsShowConfirmationOption.Value value = settings.REMOVE_EMPTY_INACTIVE_CHANGELISTS;
UIUtil.setSelectedButton(myEmptyChangelistRemovingGroup, value == VcsShowConfirmationOption.Value.SHOW_CONFIRMATION
? 0
: value == VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY ? 2 : 1);
myShowReadOnlyStatusDialog.setSelected(getReadOnlyStatusHandler().getState().SHOW_DIALOG);
if (settings.MOVE_TO_FAILED_COMMIT_CHANGELIST == VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY) {
myFailedCommitChangelistCombo.setSelectedIndex(0);
}
else if (settings.MOVE_TO_FAILED_COMMIT_CHANGELIST == VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY) {
myFailedCommitChangelistCombo.setSelectedIndex(1);
}
else {
myFailedCommitChangelistCombo.setSelectedIndex(2);
}
for (VcsShowOptionsSettingImpl setting : myPromptOptions.keySet()) {
myPromptOptions.get(setting).setSelected(setting.getValue());
}
selectInGroup(myOnFileAddingGroup, getAddConfirmation());
selectInGroup(myOnFileRemovingGroup, getRemoveConfirmation());
if (settings.SHOW_PATCH_IN_EXPLORER == null) {
myOnPatchCreation.setSelectedIndex(0);
} else if (Boolean.TRUE.equals(settings.SHOW_PATCH_IN_EXPLORER)) {
myOnPatchCreation.setSelectedIndex(1);
} else {
myOnPatchCreation.setSelectedIndex(2);
}
}
private static void selectInGroup(final JRadioButton[] group, final VcsShowConfirmationOption confirmation) {
final VcsShowConfirmationOption.Value value = confirmation.getValue();
final int index;
//noinspection EnumSwitchStatementWhichMissesCases
switch(value) {
case SHOW_CONFIRMATION: index = 0; break;
case DO_ACTION_SILENTLY: index = 1; break;
default: index = 2;
}
group[index].setSelected(true);
}
public JComponent getPanel() {
return myPanel;
}
public void updateAvailableOptions(final Collection<AbstractVcs> activeVcses) {
for (VcsShowOptionsSettingImpl setting : myPromptOptions.keySet()) {
final JCheckBox checkBox = myPromptOptions.get(setting);
checkBox.setEnabled(setting.isApplicableTo(activeVcses) || myProject.isDefault());
if (!myProject.isDefault()) {
checkBox.setToolTipText(VcsBundle.message("tooltip.text.action.applicable.to.vcses", composeText(setting.getApplicableVcses())));
}
}
if (!myProject.isDefault()) {
final ProjectLevelVcsManagerEx vcsManager = ProjectLevelVcsManagerEx.getInstanceEx(myProject);
final VcsShowConfirmationOptionImpl addConfirmation = vcsManager.getConfirmation(VcsConfiguration.StandardConfirmation.ADD);
UIUtil.setEnabled(myAddConfirmationPanel, addConfirmation.isApplicableTo(activeVcses), true);
myAddConfirmationPanel.setToolTipText(
VcsBundle.message("tooltip.text.action.applicable.to.vcses", composeText(addConfirmation.getApplicableVcses())));
final VcsShowConfirmationOptionImpl removeConfirmation = vcsManager.getConfirmation(VcsConfiguration.StandardConfirmation.REMOVE);
UIUtil.setEnabled(myRemoveConfirmationPanel, removeConfirmation.isApplicableTo(activeVcses), true);
myRemoveConfirmationPanel.setToolTipText(
VcsBundle.message("tooltip.text.action.applicable.to.vcses", composeText(removeConfirmation.getApplicableVcses())));
}
}
private static String composeText(final List<AbstractVcs> applicableVcses) {
final TreeSet<String> result = new TreeSet<String>();
for (AbstractVcs abstractVcs : applicableVcses) {
result.add(abstractVcs.getDisplayName());
}
return StringUtil.join(result, ", ");
}
}