From 612c0758867410adca4ecfcf9b8dfb2c484d4121 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 2 Nov 2013 20:24:31 +0400 Subject: [PATCH] [log] Hide the Branches Panel by default, introduce log quick settings Motivation: The panel with branch labels and ability to navigate to the selected branch by clicking on it seems to be not designed well enough, especially when there are many local branches, and in the multi-repo case. Introduce "Quick Settings" button at the log toolbar. Add "Show Branches Panel" action there. --- .../com/intellij/vcs/log/VcsLogSettings.java | 7 ++ .../vcs-log/impl/src/META-INF/vcs-log.xml | 5 +- .../vcs/log/impl/VcsLogSettingsImpl.java | 11 +++ .../log/ui/VcsLogQuickSettingsActions.java | 87 +++++++++++++++++++ .../src/com/intellij/vcs/log/ui/VcsLogUI.java | 6 +- .../vcs/log/ui/frame/ActiveSurface.java | 9 +- .../intellij/vcs/log/ui/frame/MainFrame.java | 9 +- 7 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogQuickSettingsActions.java diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java index 4d73ca6b2fa4..a370379b4d77 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java @@ -18,4 +18,11 @@ public interface VcsLogSettings { */ int getRecentCommitsCount(); + /** + * Checks if the branches panel should be displayed or hidden. + */ + boolean isShowBranchesPanel(); + + void setShowBranchesPanel(boolean show); + } diff --git a/platform/vcs-log/impl/src/META-INF/vcs-log.xml b/platform/vcs-log/impl/src/META-INF/vcs-log.xml index d5596f2daf88..3ae9b30c7bcc 100644 --- a/platform/vcs-log/impl/src/META-INF/vcs-log.xml +++ b/platform/vcs-log/impl/src/META-INF/vcs-log.xml @@ -18,9 +18,12 @@ - + + + diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java index 42ac17687493..88b2b449ac69 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java @@ -17,6 +17,7 @@ public class VcsLogSettingsImpl implements VcsLogSettings, PersistentStateCompon public static class State { public int RECENT_COMMITS_COUNT = 1000; + public boolean SHOW_BRANCHES_PANEL = false; } @Nullable @@ -35,6 +36,16 @@ public class VcsLogSettingsImpl implements VcsLogSettings, PersistentStateCompon return myState.RECENT_COMMITS_COUNT; } + @Override + public boolean isShowBranchesPanel() { + return myState.SHOW_BRANCHES_PANEL; + } + + @Override + public void setShowBranchesPanel(boolean show) { + myState.SHOW_BRANCHES_PANEL = show; + } + public void setRecentCommitsBlockSize(int commitCount) { myState.RECENT_COMMITS_COUNT = commitCount; } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogQuickSettingsActions.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogQuickSettingsActions.java new file mode 100644 index 000000000000..36ce6fdac616 --- /dev/null +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogQuickSettingsActions.java @@ -0,0 +1,87 @@ +/* + * 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.vcs.log.ui; + +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.wm.impl.content.ToolWindowContentUi; +import com.intellij.vcs.log.VcsLogSettings; +import com.intellij.vcs.log.impl.VcsLogManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; + +public class VcsLogQuickSettingsActions extends DumbAwareAction { + + @Override + public void actionPerformed(AnActionEvent e) { + Project project = e.getProject(); + if (project == null) { + return; + } + VcsLogSettings settings = ServiceManager.getService(project, VcsLogSettings.class); + VcsLogManager logManager = ServiceManager.getService(project, VcsLogManager.class); + if (settings == null || logManager == null) { + return; + } + VcsLogUI logUi = logManager.getLogUi(); + + ActionGroup settingsGroup = new MySettingsActionGroup(settings, logUi); + ActionPopupMenu popupMenu = ActionManager.getInstance().createActionPopupMenu(ToolWindowContentUi.POPUP_PLACE, settingsGroup); + int x = 0; + int y = 0; + InputEvent inputEvent = e.getInputEvent(); + if (inputEvent instanceof MouseEvent) { + x = ((MouseEvent)inputEvent).getX(); + y = ((MouseEvent)inputEvent).getY(); + } + popupMenu.getComponent().show(inputEvent.getComponent(), x, y); + } + + private static class MySettingsActionGroup extends ActionGroup { + + private final VcsLogSettings mySettings; + private final VcsLogUI myUi; + + public MySettingsActionGroup(VcsLogSettings settings, VcsLogUI ui) { + mySettings = settings; + myUi = ui; + } + + @NotNull + @Override + public AnAction[] getChildren(@Nullable AnActionEvent e) { + return new AnAction[] { + new ToggleAction("Show Branches Panel") { + @Override + public boolean isSelected(AnActionEvent e) { + return mySettings.isShowBranchesPanel(); + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + mySettings.setShowBranchesPanel(state); + myUi.setBranchesPanelVisible(state); + } + } + }; + } + } +} diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java index 14e01a5da6fd..a046355dda27 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java @@ -52,7 +52,7 @@ public class VcsLogUI { myColorManager = manager; myUiProperties = uiProperties; myFilterer = new VcsLogFilterer(logDataHolder, this); - myMainFrame = new MainFrame(myLogDataHolder, this, project, uiProperties); + myMainFrame = new MainFrame(myLogDataHolder, this, project, settings, uiProperties); project.getMessageBus().connect(project).subscribe(VcsLogDataHolder.REFRESH_COMPLETED, new Runnable() { @Override public void run() { @@ -247,4 +247,8 @@ public class VcsLogUI { ProgressManager.getInstance().runProcessWithProgressSynchronously(runnable, task, false, null, this.getMainFrame().getMainComponent()); } + public void setBranchesPanelVisible(boolean visible) { + myMainFrame.setBranchesPanelVisible(visible); + } + } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java index d31357198d63..ebbe543da928 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java @@ -12,6 +12,7 @@ import com.intellij.openapi.vcs.changes.ui.ChangesBrowser; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.components.JBLoadingPanel; import com.intellij.util.ArrayUtil; +import com.intellij.vcs.log.VcsLogSettings; import com.intellij.vcs.log.data.VcsLogDataHolder; import com.intellij.vcs.log.ui.VcsLogUI; import org.jetbrains.annotations.NotNull; @@ -38,10 +39,16 @@ public class ActiveSurface extends JPanel implements TypeSafeDataProvider { @NotNull private final Splitter myDetailsSplitter; @NotNull private final JBLoadingPanel myChangesLoadingPane; - ActiveSurface(@NotNull VcsLogDataHolder logDataHolder, @NotNull VcsLogUI vcsLogUI, @NotNull Project project) { + ActiveSurface(@NotNull VcsLogDataHolder logDataHolder, @NotNull VcsLogUI vcsLogUI, + @NotNull VcsLogSettings settings, @NotNull Project project) { myLogDataHolder = logDataHolder; myGraphTable = new VcsLogGraphTable(vcsLogUI, logDataHolder); myBranchesPanel = new BranchesPanel(logDataHolder, vcsLogUI); + + if (!settings.isShowBranchesPanel()) { + myBranchesPanel.setVisible(false); + } + myDetailsPanel = new DetailsPanel(logDataHolder, myGraphTable, vcsLogUI.getColorManager()); final ChangesBrowser changesBrowser = new ChangesBrowser(project, null, Collections.emptyList(), null, false, false, null, diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java index f44746b10f9d..83970bec324a 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java @@ -8,6 +8,7 @@ import com.intellij.openapi.project.Project; import com.intellij.ui.JBColor; import com.intellij.ui.SeparatorComponent; import com.intellij.ui.SeparatorOrientation; +import com.intellij.vcs.log.VcsLogSettings; import com.intellij.vcs.log.data.VcsLogDataHolder; import com.intellij.vcs.log.data.VcsLogUiProperties; import com.intellij.vcs.log.ui.VcsLogUI; @@ -33,13 +34,13 @@ public class MainFrame { @NotNull private final VcsLogFilterUi myFilterUi; public MainFrame(@NotNull VcsLogDataHolder logDataHolder, @NotNull VcsLogUI vcsLogUI, @NotNull Project project, - @NotNull VcsLogUiProperties uiProperties) { + @NotNull VcsLogSettings settings, @NotNull VcsLogUiProperties uiProperties) { myLogDataHolder = logDataHolder; myUI = vcsLogUI; myProject = project; myUiProperties = uiProperties; - myActiveSurface = new ActiveSurface(logDataHolder, vcsLogUI, project); + myActiveSurface = new ActiveSurface(logDataHolder, vcsLogUI, settings, project); myActiveSurface.setupDetailsSplitter(myUiProperties.isShowDetails()); JComponent toolbar = Box.createHorizontalBox(); @@ -135,4 +136,8 @@ public class MainFrame { myActiveSurface.getBranchesPanel().rebuild(); } + public void setBranchesPanelVisible(boolean visible) { + myActiveSurface.getBranchesPanel().setVisible(visible); + } + }