From 7878527d98bafd1dc6432dae1fcbc7bcda1d2bce Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 21 Feb 2013 10:54:19 +0400 Subject: [PATCH] [vcs] optionally wrap in commit dialog when text reaches right margin IDEA-53615 * Add a checkbox to the Settings | Version Control. Keep the VcsCheckBoxWithSpinnerConfigurable structure by having it as a sub-configurable. * Add an option to the VcsConfiguration. * Add a simple editor customization and pass through the hard wrap option setter to EditorSettings & SettingsImpl. --- .../openapi/editor/EditorSettings.java | 3 +- .../openapi/editor/impl/SettingsImpl.java | 15 ++- ...TypingReachesRightMarginCustomization.java | 42 +++++++ .../openapi/vcs/VcsConfiguration.java | 1 + .../VcsCommitMessageMarginConfigurable.java | 109 ++++++++++++++---- .../openapi/vcs/ui/CommitMessage.java | 1 + 6 files changed, 144 insertions(+), 27 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/ui/WrapWhenTypingReachesRightMarginCustomization.java diff --git a/platform/platform-api/src/com/intellij/openapi/editor/EditorSettings.java b/platform/platform-api/src/com/intellij/openapi/editor/EditorSettings.java index 3a4831bc3180..5a1c694393fc 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/EditorSettings.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/EditorSettings.java @@ -28,6 +28,7 @@ public interface EditorSettings { void setRightMargin(int myRightMargin); boolean isWrapWhenTypingReachesRightMargin(Project project); + void setWrapWhenTypingReachesRightMargin(boolean val); boolean isLineNumbersShown(); void setLineNumbersShown(boolean val); @@ -114,5 +115,5 @@ public interface EditorSettings { boolean isPreselectRename(); void setPreselectRename(final boolean val); - + } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java index aa5a64b6fbc9..3a35e49e5528 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SettingsImpl.java @@ -76,6 +76,7 @@ public class SettingsImpl implements EditorSettings { private Boolean myUseCustomSoftWrapIndent = null; private Integer myCustomSoftWrapIndent = null; private Boolean myRenamePreselect = null; + private Boolean myWrapWhenTypingReachesRightMargin = null; public SettingsImpl(@Nullable EditorEx editor) { myEditor = editor; @@ -147,7 +148,19 @@ public class SettingsImpl implements EditorSettings { @Override public boolean isWrapWhenTypingReachesRightMargin(Project project) { - return CodeStyleFacade.getInstance(project).isWrapWhenTypingReachesRightMargin(); + return myWrapWhenTypingReachesRightMargin != null ? + myWrapWhenTypingReachesRightMargin.booleanValue() : + CodeStyleFacade.getInstance(project).isWrapWhenTypingReachesRightMargin(); + } + + @Override + public void setWrapWhenTypingReachesRightMargin(boolean val) { + Boolean newValue = Boolean.valueOf(val); + if (newValue.equals(myWrapWhenTypingReachesRightMargin)) { + return; + } + myWrapWhenTypingReachesRightMargin = newValue; + fireEditorRefresh(); } @Override diff --git a/platform/platform-impl/src/com/intellij/ui/WrapWhenTypingReachesRightMarginCustomization.java b/platform/platform-impl/src/com/intellij/ui/WrapWhenTypingReachesRightMarginCustomization.java new file mode 100644 index 000000000000..d4458c3d3db0 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ui/WrapWhenTypingReachesRightMarginCustomization.java @@ -0,0 +1,42 @@ +/* + * 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.ui; + +import com.intellij.openapi.editor.ex.EditorEx; +import org.jetbrains.annotations.NotNull; + +/** + * @author Kirill Likhodedov + */ +public class WrapWhenTypingReachesRightMarginCustomization extends SimpleEditorCustomization { + + public static final WrapWhenTypingReachesRightMarginCustomization ENABLED = new WrapWhenTypingReachesRightMarginCustomization(true); + public static final WrapWhenTypingReachesRightMarginCustomization DISABLED = new WrapWhenTypingReachesRightMarginCustomization(false); + + public static EditorCustomization getInstance(boolean value) { + return value ? ENABLED : DISABLED; + } + + private WrapWhenTypingReachesRightMarginCustomization(boolean enabled) { + super(enabled); + } + + @Override + public void customize(@NotNull EditorEx editor) { + editor.getSettings().setWrapWhenTypingReachesRightMargin(isEnabled()); + } + +} diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java index 0a6a73bbb679..79742a3f2899 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsConfiguration.java @@ -93,6 +93,7 @@ public final class VcsConfiguration implements PersistentStateComponent public String UPDATE_FILTER_SCOPE_NAME; public boolean USE_COMMIT_MESSAGE_MARGIN = false; public int COMMIT_MESSAGE_MARGIN_SIZE = 72; + public boolean WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN = false; public enum StandardOption { ADD(VcsBundle.message("vcs.command.name.add")), diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsCommitMessageMarginConfigurable.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsCommitMessageMarginConfigurable.java index 075501e5fbfc..9de9702d9f72 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsCommitMessageMarginConfigurable.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsCommitMessageMarginConfigurable.java @@ -15,59 +15,118 @@ */ package com.intellij.openapi.vcs.configurable; +import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vcs.VcsConfiguration; +import com.intellij.ui.components.JBCheckBox; import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -public class VcsCommitMessageMarginConfigurable extends VcsCheckBoxWithSpinnerConfigurable { +public class VcsCommitMessageMarginConfigurable implements UnnamedConfigurable { private final VcsConfiguration myConfiguration; + private final MySpinnerConfigurable mySpinnerConfigurable; + private final JBCheckBox myWrapCheckbox; + public VcsCommitMessageMarginConfigurable(Project project) { - super(project, VcsBundle.message("configuration.commit.message.margin.prompt"), ""); - myConfiguration = VcsConfiguration.getInstance(myProject); + myConfiguration = VcsConfiguration.getInstance(project); + mySpinnerConfigurable = new MySpinnerConfigurable(project); + myWrapCheckbox = new JBCheckBox(ApplicationBundle.message("checkbox.wrap.typing.on.right.margin"), false); } + @Nullable @Override - protected SpinnerNumberModel createSpinnerModel() { - final int columns = myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE; - return new SpinnerNumberModel(columns, 0, 10000, 1); - } + public JComponent createComponent() { + JComponent spinnerComponent = mySpinnerConfigurable.createComponent(); + mySpinnerConfigurable.myHighlightRecentlyChanged.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + myWrapCheckbox.setEnabled(mySpinnerConfigurable.myHighlightRecentlyChanged.isSelected()); + } + }); - @Nls - @Override - public String getDisplayName() { - return VcsBundle.message("configuration.commit.message.margin.title"); + JPanel rootPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + rootPanel.add(spinnerComponent); + rootPanel.add(myWrapCheckbox); + return rootPanel; } @Override public boolean isModified() { - if (myHighlightRecentlyChanged.isSelected() != myConfiguration.USE_COMMIT_MESSAGE_MARGIN) { - return true; - } - - if (!Comparing.equal(myHighlightInterval.getValue(), myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE)) { - return true; - } - - return false; + return mySpinnerConfigurable.isModified() || myWrapCheckbox.isSelected() != myConfiguration.WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN; } @Override public void apply() throws ConfigurationException { - myConfiguration.USE_COMMIT_MESSAGE_MARGIN = myHighlightRecentlyChanged.isSelected(); - myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE = ((Number) myHighlightInterval.getValue()).intValue(); + mySpinnerConfigurable.apply(); + myConfiguration.WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN = myWrapCheckbox.isSelected(); } @Override public void reset() { - myHighlightRecentlyChanged.setSelected(myConfiguration.USE_COMMIT_MESSAGE_MARGIN); - myHighlightInterval.setValue(myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE); - myHighlightInterval.setEnabled(myHighlightRecentlyChanged.isSelected()); + mySpinnerConfigurable.reset(); + myWrapCheckbox.setSelected(myConfiguration.WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN); + myWrapCheckbox.setEnabled(mySpinnerConfigurable.myHighlightRecentlyChanged.isSelected()); + } + + @Override + public void disposeUIResources() { + mySpinnerConfigurable.disposeUIResources(); + } + + private class MySpinnerConfigurable extends VcsCheckBoxWithSpinnerConfigurable { + + public MySpinnerConfigurable(Project project) { + super(project, VcsBundle.message("configuration.commit.message.margin.prompt"), ""); + } + + @Override + protected SpinnerNumberModel createSpinnerModel() { + final int columns = myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE; + return new SpinnerNumberModel(columns, 0, 10000, 1); + } + + @Nls + @Override + public String getDisplayName() { + return VcsBundle.message("configuration.commit.message.margin.title"); + } + + @Override + public boolean isModified() { + if (myHighlightRecentlyChanged.isSelected() != myConfiguration.USE_COMMIT_MESSAGE_MARGIN) { + return true; + } + + if (!Comparing.equal(myHighlightInterval.getValue(), myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE)) { + return true; + } + + return false; + } + + @Override + public void apply() throws ConfigurationException { + myConfiguration.USE_COMMIT_MESSAGE_MARGIN = myHighlightRecentlyChanged.isSelected(); + myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE = ((Number) myHighlightInterval.getValue()).intValue(); + } + + @Override + public void reset() { + myHighlightRecentlyChanged.setSelected(myConfiguration.USE_COMMIT_MESSAGE_MARGIN); + myHighlightInterval.setValue(myConfiguration.COMMIT_MESSAGE_MARGIN_SIZE); + myHighlightInterval.setEnabled(myHighlightRecentlyChanged.isSelected()); + } + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ui/CommitMessage.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ui/CommitMessage.java index 2057e594a56d..a1f3b7a125d3 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ui/CommitMessage.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ui/CommitMessage.java @@ -120,6 +120,7 @@ public class CommitMessage extends AbstractDataProviderPanel implements Disposab boolean enableSpellChecking = forceSpellCheckOn || configuration.CHECK_COMMIT_MESSAGE_SPELLING; features.add(SpellCheckingEditorCustomization.getInstance(enableSpellChecking)); features.add(new RightMarginEditorCustomization(configuration.USE_COMMIT_MESSAGE_MARGIN, configuration.COMMIT_MESSAGE_MARGIN_SIZE)); + features.add(WrapWhenTypingReachesRightMarginCustomization.getInstance(configuration.WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN)); } else { features.add(SpellCheckingEditorCustomization.ENABLED); features.add(new RightMarginEditorCustomization(false, -1));