vcs: Allow switching between modal/non-modal commit without restart

GitOrigin-RevId: e16f23d602f4a7a2c321615b92d4dd13cae07348
This commit is contained in:
Konstantin Kolosovsky
2019-06-08 22:08:46 +03:00
committed by intellij-monorepo-bot
parent c67a1b0bbd
commit 476bccdd71
7 changed files with 64 additions and 42 deletions
@@ -515,7 +515,6 @@ vcs.skip.single.default.changelist.description=Don't show changelist node in Loc
vcs.non.modal.commit=false
vcs.non.modal.commit.description=Allow to commit directly from Local Changes
vcs.non.modal.commit.restartRequired=true
vcs.unversioned.files.max.intree=1000
vcs.unversioned.files.max.intree.description=Maximum number of unversioned and ignored files displayed in the Local Changes file tree. \
@@ -14,7 +14,6 @@ import com.intellij.openapi.vcs.changes.*
import com.intellij.openapi.vcs.changes.ui.CommitChangeListDialog
import com.intellij.util.containers.ContainerUtil.concat
import com.intellij.util.ui.UIUtil.removeMnemonic
import com.intellij.vcsUtil.VcsImplUtil.isNonModalCommit
private val LOG = logger<AbstractCommonCheckinAction>()
@@ -97,9 +96,9 @@ abstract class AbstractCommonCheckinAction : AbstractVcsAction(), UpdateInBackgr
}
val executor = getExecutor(project)
if (executor == null && isNonModalCommit()) {
val workflowHandler = (ChangesViewManager.getInstance(project) as? ChangesViewManager)?.commitWorkflowHandler
workflowHandler?.run {
val workflowHandler = (ChangesViewManager.getInstance(project) as? ChangesViewManager)?.commitWorkflowHandler
if (executor == null && workflowHandler != null) {
workflowHandler.run {
setCommitState(included, isForceUpdateNotEmptyCommitState())
activate()
}
@@ -23,6 +23,8 @@ import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Factory;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.registry.RegistryValue;
import com.intellij.openapi.util.registry.RegistryValueListener;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsBundle;
@@ -77,7 +79,6 @@ import static com.intellij.ui.ScrollPaneFactory.createScrollPane;
import static com.intellij.util.containers.ContainerUtil.set;
import static com.intellij.util.ui.JBUI.Panels.simplePanel;
import static com.intellij.util.ui.UIUtil.addBorder;
import static com.intellij.vcsUtil.VcsImplUtil.isNonModalCommit;
import static java.util.stream.Collectors.toList;
@State(
@@ -91,6 +92,8 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
@NotNull private final ChangesListView myView;
private ChangesViewCommitPanel myCommitPanel;
private BorderLayoutPanel myContentPanel;
private SimpleToolWindowPanel myToolWindowPanel;
private ChangesViewCommitWorkflowHandler myCommitWorkflowHandler;
private final VcsConfiguration myVcsConfiguration;
private JPanel myProgressLabel;
@@ -114,6 +117,8 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
private boolean myModelUpdateInProgress;
private final MyTreeExpander myTreeExpander;
@NotNull private final RegistryValue myIsNonModalCommit = Registry.get("vcs.non.modal.commit");
@NotNull
public static ChangesViewI getInstance(@NotNull Project project) {
return project.getComponent(ChangesViewI.class);
@@ -157,12 +162,19 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
ChangeListManager.getInstance(myProject).addChangeListListener(new MyChangeListListener(), myProject);
if (ApplicationManager.getApplication().isHeadlessEnvironment()) return;
JComponent panel = createChangeViewComponent();
myContent = new MyChangeViewContent(panel, ChangesViewContentManager.LOCAL_CHANGES, false);
myToolWindowPanel = createChangeViewComponent();
myContent = new MyChangeViewContent(myToolWindowPanel, ChangesViewContentManager.LOCAL_CHANGES, false);
myContent.setHelpId(ChangesListView.HELP_ID);
myContent.setCloseable(false);
myContentManager.addContent(myContent);
if (myCommitPanel != null) Disposer.register(myContent, myCommitPanel);
myIsNonModalCommit.addListener(new RegistryValueListener.Adapter() {
@Override
public void afterValueChanged(@NotNull RegistryValue value) {
updateCommitWorkflow(value.asBoolean());
}
}, myProject);
updateCommitWorkflow(myIsNonModalCommit.asBoolean());
scheduleRefresh();
myProject.getMessageBus().connect().subscribe(RemoteRevisionsCache.REMOTE_VERSION_CHANGED, () -> scheduleRefresh());
@@ -192,27 +204,44 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
return myCommitWorkflowHandler;
}
private JComponent createChangeViewComponent() {
private void updateCommitWorkflow(boolean isNonModal) {
if (isNonModal) {
if (myCommitPanel == null) {
myCommitPanel = new ChangesViewCommitPanel(myView);
myCommitWorkflowHandler = new ChangesViewCommitWorkflowHandler(new ChangesViewCommitWorkflow(myProject), myCommitPanel);
Disposer.register(myContent, myCommitPanel);
myContentPanel.addToBottom(myCommitPanel);
myContentPanel.validate();
myCommitPanel.setupShortcuts(myToolWindowPanel);
}
}
else if (myCommitPanel != null) {
myContentPanel.remove(myCommitPanel);
myContentPanel.validate();
Disposer.dispose(myCommitPanel);
myCommitPanel = null;
myCommitWorkflowHandler = null;
}
}
@NotNull
private SimpleToolWindowPanel createChangeViewComponent() {
ActionToolbar changesToolbar = createChangesToolbar();
addBorder(changesToolbar.getComponent(), createBorder(JBColor.border(), SideBorder.RIGHT));
BorderLayoutPanel changesPanel = simplePanel(createScrollPane(myView)).addToLeft(changesToolbar.getComponent());
BorderLayoutPanel contentPanel = new BorderLayoutPanel() {
myContentPanel = new BorderLayoutPanel() {
@Override
public Dimension getMinimumSize() {
return isMinimumSizeSet() ? super.getMinimumSize() : changesToolbar.getComponent().getPreferredSize();
}
};
contentPanel.addToCenter(changesPanel);
if (isNonModalCommit()) {
myCommitPanel = new ChangesViewCommitPanel(myView);
contentPanel.addToBottom(myCommitPanel);
myCommitWorkflowHandler = new ChangesViewCommitWorkflowHandler(new ChangesViewCommitWorkflow(myProject), myCommitPanel);
}
myContentPanel.addToCenter(changesPanel);
MyChangeProcessor changeProcessor = new MyChangeProcessor(myProject);
mySplitterComponent = new PreviewDiffSplitterComponent(contentPanel, changeProcessor, CHANGES_VIEW_PREVIEW_SPLITTER_PROPORTION,
mySplitterComponent = new PreviewDiffSplitterComponent(myContentPanel, changeProcessor, CHANGES_VIEW_PREVIEW_SPLITTER_PROPORTION,
myVcsConfiguration.LOCAL_CHANGES_DETAILS_PREVIEW_SHOWN);
myView.installPopupHandler((DefaultActionGroup)ActionManager.getInstance().getAction("ChangesViewPopupMenu"));
@@ -243,13 +272,11 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
return panel;
}
private void registerShortcuts(@NotNull JComponent component) {
private static void registerShortcuts(@NotNull JComponent component) {
registerWithShortcutSet("ChangesView.Refresh", CommonShortcuts.getRerun(), component);
registerWithShortcutSet("ChangesView.NewChangeList", CommonShortcuts.getNew(), component);
registerWithShortcutSet("ChangesView.RemoveChangeList", CommonShortcuts.getDelete(), component);
registerWithShortcutSet(IdeActions.MOVE_TO_ANOTHER_CHANGE_LIST, CommonShortcuts.getMove(), component);
if (myCommitPanel != null) myCommitPanel.setupShortcuts(component);
}
@NotNull
@@ -2,10 +2,11 @@
package com.intellij.openapi.vcs.changes.ui
import com.intellij.icons.AllIcons
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.vcs.changes.Change
import com.intellij.openapi.vcs.changes.ChangesUtil.getFilePath
import com.intellij.vcs.commit.CommitWorkflowUi
import com.intellij.openapi.vcs.changes.ui.ChangesGroupingSupport.Companion.REPOSITORY_GROUPING
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.ui.ColorUtil
@@ -17,9 +18,11 @@ import com.intellij.util.ui.UIUtil.rightArrow
import com.intellij.vcs.branch.BranchData
import com.intellij.vcs.branch.BranchStateProvider
import com.intellij.vcs.branch.LinkedBranchData
import com.intellij.vcs.commit.CommitWorkflowUi
import com.intellij.vcsUtil.VcsUtil.getFilePath
import java.awt.Color
import java.awt.Dimension
import java.beans.PropertyChangeListener
import javax.swing.JTree.TREE_MODEL_PROPERTY
import javax.swing.UIManager
@@ -38,14 +41,19 @@ class CurrentBranchComponent(
}
init {
isVisible = false
icon = AllIcons.Vcs.Branch
foreground = TEXT_COLOR
tree.addPropertyChangeListener { e ->
val treeChangeListener = PropertyChangeListener { e ->
if (e.propertyName == TREE_MODEL_PROPERTY) {
refresh()
}
}
tree.addPropertyChangeListener(treeChangeListener)
Disposer.register(commitWorkflowUi, Disposable { tree.removePropertyChangeListener(treeChangeListener) })
refresh()
}
override fun getPreferredSize(): Dimension? = if (isVisible) super.getPreferredSize() else emptySize()
@@ -144,10 +144,10 @@ class ChangesViewCommitPanel(private val changesView: ChangesListView) : BorderL
private fun fireDefaultExecutorCalled() = executorEventDispatcher.multicaster.executorCalled(null)
fun setupShortcuts(component: JComponent) {
DefaultCommitAction().registerCustomShortcutSet(DEFAULT_COMMIT_ACTION_SHORTCUT, component)
DefaultCommitAction().registerCustomShortcutSet(DEFAULT_COMMIT_ACTION_SHORTCUT, component, this)
DumbAwareAction.create {
if (commitButton.isEnabled) commitButton.showPopup()
}.registerCustomShortcutSet(getDefaultShowPopupShortcut(), component)
}.registerCustomShortcutSet(getDefaultShowPopupShortcut(), component, this)
}
override val commitMessageUi: CommitMessageUi get() = commitMessage
@@ -4,20 +4,19 @@ package com.intellij.vcs.commit
import com.intellij.openapi.application.runInEdt
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.vcs.ProjectLevelVcsManager
import com.intellij.openapi.vcs.ProjectLevelVcsManager.VCS_CONFIGURATION_CHANGED
import com.intellij.openapi.vcs.VcsListener
import com.intellij.openapi.vcs.changes.*
import com.intellij.openapi.vcs.checkin.CheckinHandler
import com.intellij.openapi.vcs.impl.PartialChangesUtil
import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl
import com.intellij.openapi.vcs.impl.VcsInitObject
private val LOG = logger<ChangesViewCommitWorkflow>()
internal class CommitState(val changes: List<Change>, val commitMessage: String)
class ChangesViewCommitWorkflow(project: Project) : AbstractCommitWorkflow(project) {
private val vcsManager = ProjectLevelVcsManager.getInstance(project)
private val vcsManager = ProjectLevelVcsManager.getInstance(project) as ProjectLevelVcsManagerImpl
private val changeListManager = ChangeListManager.getInstance(project)
override val isDefaultCommitEnabled: Boolean get() = true
@@ -26,12 +25,7 @@ class ChangesViewCommitWorkflow(project: Project) : AbstractCommitWorkflow(proje
internal lateinit var commitState: CommitState
init {
val connection = project.messageBus.connect()
connection.subscribe(VCS_CONFIGURATION_CHANGED, VcsListener {
Disposer.dispose(connection)
runInEdt { updateVcses(vcsManager.allActiveVcss.toSet()) }
})
vcsManager.addInitializationRequest(VcsInitObject.AFTER_COMMON) { runInEdt { updateVcses(vcsManager.allActiveVcss.toSet()) } }
}
internal fun getAffectedChangeList(changes: Collection<Change>): LocalChangeList =
@@ -1,4 +1,4 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.vcsUtil;
import com.intellij.openapi.application.ReadAction;
@@ -6,7 +6,6 @@ import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.changes.ChangeListManager;
@@ -62,10 +61,6 @@ public class VcsImplUtil {
return repositoryPath.isEmpty() ? root.getName() : repositoryPath;
}
public static boolean isNonModalCommit() {
return Registry.is("vcs.non.modal.commit");
}
@Nullable
public static IgnoredFileContentProvider findIgnoredFileContentProvider(@NotNull Project project,
@NotNull AbstractVcs vcs) {