diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 6e49b73b3f65..bbe236c14224 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -302,6 +302,8 @@ vcs.log.highlight.not.indexed=false vcs.log.highlight.not.indexed.description=Highlight commits that are not indexed vcs.log.index.git=false vcs.log.index.git.description=Index all commits in Git repository for fast search +vcs.log.graph.history=false +vcs.log.graph.history.description=Action in context menu that opens a new log tab filtered by file in context vcs.executable.validator.timeout.sec=60 vcs.unversioned.files.in.commit=true diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogFilterUi.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogFilterUi.java index 93faf610e9a2..66eeb3a19b0f 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogFilterUi.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogFilterUi.java @@ -15,7 +15,7 @@ public interface VcsLogFilterUi { /** * Sets the given filter to the given value and updates the log view.
- * Note: only VcsLogBranchFilter is currently supported. + * Note: only VcsLogBranchFilter and VcsLogStructureFilter are currently supported. */ void setFilter(@NotNull VcsLogFilter filter); } 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 6060cde93774..4f29c871f8ba 100644 --- a/platform/vcs-log/impl/src/META-INF/vcs-log.xml +++ b/platform/vcs-log/impl/src/META-INF/vcs-log.xml @@ -52,6 +52,8 @@ + diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java index fbb1ac2d3e96..1c738649b26a 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java @@ -93,8 +93,12 @@ public class VcsLogContentProvider implements ChangesViewContentProvider { public static void openAnotherLogTab(@NotNull VcsLogManager logManager, @NotNull Project project) { ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.VCS); + openLogTab(logManager, project, generateShortName(toolWindow)); + } + + public static VcsLogUiImpl openLogTab(@NotNull VcsLogManager logManager, @NotNull Project project, @NotNull String shortName) { + ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.VCS); - String shortName = generateShortName(toolWindow); String name = ContentUtilEx.getFullName(TAB_NAME, shortName); VcsLogUiImpl logUi = logManager.createLogUi(name, name); @@ -104,6 +108,7 @@ public class VcsLogContentProvider implements ChangesViewContentProvider { toolWindow.activate(null); logManager.scheduleInitialization(); + return logUi; } @NotNull diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/ShowGraphHistoryAction.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/ShowGraphHistoryAction.java new file mode 100644 index 000000000000..068875a00cba --- /dev/null +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/actions/ShowGraphHistoryAction.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2016 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.actions; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.vcs.ProjectLevelVcsManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.vcs.log.data.VcsLogData; +import com.intellij.vcs.log.data.VcsLogStructureFilterImpl; +import com.intellij.vcs.log.impl.VcsLogContentProvider; +import com.intellij.vcs.log.impl.VcsLogManager; +import com.intellij.vcs.log.impl.VcsProjectLog; +import com.intellij.vcs.log.ui.VcsLogUiImpl; +import com.intellij.vcsUtil.VcsUtil; + +import java.util.Collections; + +public class ShowGraphHistoryAction extends DumbAwareAction { + + @Override + public void actionPerformed(AnActionEvent e) { + Project project = e.getProject(); + assert project != null; + VirtualFile file = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE); + VcsLogManager logManager = VcsProjectLog.getInstance(project).getLogManager(); + assert logManager != null; + VcsLogUiImpl ui = VcsLogContentProvider.openLogTab(logManager, project, file.getName()); + ui.getFilterUi().setFilter(new VcsLogStructureFilterImpl(Collections.singleton(VcsUtil.getFilePath(file)))); + } + + @Override + public void update(AnActionEvent e) { + Presentation presentation = e.getPresentation(); + if (!Registry.is("vcs.log.graph.history")) { + presentation.setEnabledAndVisible(false); + } + else { + VirtualFile file = e.getData(CommonDataKeys.VIRTUAL_FILE); + Project project = e.getProject(); + if (file == null || project == null) { + presentation.setEnabledAndVisible(false); + } + else { + VirtualFile root = ProjectLevelVcsManager.getInstance(project).getVcsRootFor(file); + VcsLogData dataManager = VcsProjectLog.getInstance(project).getDataManager(); + if (root == null || dataManager == null) { + presentation.setEnabledAndVisible(false); + } + else { + presentation.setEnabledAndVisible(dataManager.getIndex().isIndexed(root)); + } + } + } + } +} diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java index d074368837cd..791ba46e166a 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java @@ -51,6 +51,9 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.*; /** */ @@ -207,10 +210,13 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { ApplicationManager.getApplication().assertIsDispatchThread(); if (filter instanceof VcsLogBranchFilter) { myBranchFilterModel.setFilter((VcsLogBranchFilter)filter); - JComponent toolbar = myUi.getToolbar(); - toolbar.revalidate(); - toolbar.repaint(); } + else if (filter instanceof VcsLogStructureFilter) { + myStructureFilterModel.setFilter(new VcsLogFileFilter((VcsLogStructureFilter)filter, null)); + } + JComponent toolbar = myUi.getToolbar(); + toolbar.revalidate(); + toolbar.repaint(); } private static class FilterActionComponent extends DumbAwareAction implements CustomComponentAction { diff --git a/plugins/git4idea/src/META-INF/plugin.xml b/plugins/git4idea/src/META-INF/plugin.xml index f6de93c77659..97215c651c1f 100644 --- a/plugins/git4idea/src/META-INF/plugin.xml +++ b/plugins/git4idea/src/META-INF/plugin.xml @@ -49,6 +49,7 @@ +