diff --git a/platform/diff-impl/src/com/intellij/diff/editor/GraphViewVirtualFile.kt b/platform/diff-impl/src/com/intellij/diff/editor/GraphViewVirtualFile.kt index ae45d80f81e2..832a02ae6788 100644 --- a/platform/diff-impl/src/com/intellij/diff/editor/GraphViewVirtualFile.kt +++ b/platform/diff-impl/src/com/intellij/diff/editor/GraphViewVirtualFile.kt @@ -10,8 +10,7 @@ class GraphViewVirtualFile(val toolbarsAndTable: JComponent, val getTabNameFunc: companion object { @JvmField val TabContentId: Key = Key("TabContentId") - @JvmField - val GraphVirtualFile: Key = Key("GraphVirtualFile") + } init { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentUtil.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentUtil.java index dcb4e2143de0..b0f1e098c6d1 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentUtil.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentUtil.java @@ -45,7 +45,7 @@ public class VcsLogContentUtil { private static final Logger LOG = Logger.getInstance(VcsLogContentUtil.class); @Nullable - private static AbstractVcsLogUi getLogUi(@NotNull JComponent c) { + public static AbstractVcsLogUi getLogUi(@NotNull JComponent c) { VcsLogPanel vcsLogPanel = null; if (c instanceof VcsLogPanel) { vcsLogPanel = (VcsLogPanel)c; diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsWatcher.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsWatcher.java index 2b57fd17063c..b65e1abfadcd 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsWatcher.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsWatcher.java @@ -5,7 +5,6 @@ import com.intellij.diff.editor.GraphViewVirtualFile; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.FileEditorManagerEvent; import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; @@ -13,7 +12,6 @@ import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; import com.intellij.openapi.wm.ex.ToolWindowManagerListener; import com.intellij.ui.content.Content; @@ -25,14 +23,13 @@ import com.intellij.util.messages.MessageBusConnection; import com.intellij.vcs.log.impl.PostponableLogRefresher.VcsLogWindow; import com.intellij.vcs.log.statistics.VcsLogUsageTriggerCollector; import com.intellij.vcs.log.ui.AbstractVcsLogUi; -import com.intellij.vcs.log.ui.VcsLogPanel; +import com.intellij.vcs.log.ui.VcsLogUiImpl; import com.intellij.vcs.log.ui.frame.MainFrame; import com.intellij.vcs.log.visible.VisiblePackRefresher; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Arrays; @@ -108,30 +105,6 @@ public class VcsLogTabsWatcher implements Disposable { } } - private void processVirtualFile(VirtualFile file) { - if (file instanceof GraphViewVirtualFile) { - ToolWindow window = ToolWindowManager.getInstance(myProject).getToolWindow(ChangesViewContentManager.TOOLWINDOW_ID); - - if (window != null) { - for (Content content : window.getContentManager().getContents()) { - JComponent component = content.getComponent(); - String logId = file.getUserData(GraphViewVirtualFile.TabContentId); - - if (component instanceof VcsLogPanel) { - AbstractVcsLogUi ui = ((VcsLogPanel)component).getUi(); - if (ui.getId().equals(logId)) { - content.putUserData(GraphViewVirtualFile.GraphVirtualFile, (GraphViewVirtualFile)file); - } - } - else if (VcsLogContentProvider.TAB_NAME.equals(content.getDisplayName()) && - VcsLogProjectTabsProperties.MAIN_LOG_ID.equals(logId)) { - content.putUserData(GraphViewVirtualFile.GraphVirtualFile, (GraphViewVirtualFile)file); - } - } - } - } - } - private void installLogEditorListeners() { if (!Registry.is("show.log.as.editor.tab")) { return; @@ -155,11 +128,6 @@ public class VcsLogTabsWatcher implements Disposable { } } } - - @Override - public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - processVirtualFile(file); - } }); } } @@ -300,9 +268,10 @@ public class VcsLogTabsWatcher implements Disposable { } private void selectEditorTab(Content content) { - GraphViewVirtualFile file = content.getUserData(GraphViewVirtualFile.GraphVirtualFile); - if (file != null) { - MainFrame.openLogEditorTab(file, myProject); + AbstractVcsLogUi ui = VcsLogContentUtil.getLogUi(content.getComponent()); + if (ui instanceof VcsLogUiImpl) { + MainFrame frame = ((VcsLogUiImpl)ui).getMainFrame(); + frame.openLogEditorTab(); } } 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 cb881b41d196..692140383f43 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 @@ -26,10 +26,12 @@ import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.DiffPreviewProvider; import com.intellij.openapi.vcs.changes.PreviewDiffVirtualFile; import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager; +import com.intellij.openapi.vcs.history.VcsRevisionNumber; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.*; import com.intellij.ui.components.JBLoadingPanel; import com.intellij.ui.components.panels.Wrapper; +import com.intellij.ui.navigation.History; import com.intellij.util.ContentUtilEx; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.JBUI; @@ -75,6 +77,8 @@ import java.util.List; import static com.intellij.openapi.vfs.VfsUtilCore.toVirtualFileArray; import static com.intellij.util.ObjectUtils.notNull; import static com.intellij.util.containers.ContainerUtil.getFirstItem; +import static com.intellij.vcs.log.VcsLogDataKeys.VCS_LOG; +import static com.intellij.vcs.log.VcsLogDataKeys.VCS_LOG_UI; public class MainFrame extends JPanel implements DataProvider, Disposable { private static final String DIFF_SPLITTER_PROPORTION = "vcs.log.diff.splitter.proportion"; @@ -98,9 +102,11 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { @NotNull private final VcsLogCommitDetailsListPanel myDetailsPanel; @NotNull private final Splitter myDetailsSplitter; @NotNull private final EditorNotificationPanel myNotificationLabel; + @NotNull private final AbstractVcsLogUi myLogUi; @Nullable DiffPreviewProvider myDiffPreviewProvider; @Nullable private GraphViewVirtualFile myGraphViewFile; + @NotNull private final JComponent myToolbarsAndTable; public MainFrame(@NotNull VcsLogData logData, @NotNull AbstractVcsLogUi logUi, @@ -110,6 +116,7 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { myUiProperties = uiProperties; myFilterUi = filterUi; + myLogUi = logUi; myGraphTable = new MyVcsLogGraphTable(logUi, logData); myGraphTable.setCompactReferencesView(myUiProperties.get(MainVcsLogUiProperties.COMPACT_REFERENCES_VIEW)); @@ -154,17 +161,17 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { JComponent toolbars = new JPanel(new BorderLayout()); toolbars.add(myToolbar, BorderLayout.NORTH); toolbars.add(myNotificationLabel, BorderLayout.CENTER); - JComponent toolbarsAndTable = new JPanel(new BorderLayout()); - toolbarsAndTable.add(toolbars, BorderLayout.NORTH); - toolbarsAndTable.add(VcsLogUiUtil.installProgress(VcsLogUiUtil.setupScrolledGraph(myGraphTable, SideBorder.TOP), - myLogData, logUi.getId(), this), BorderLayout.CENTER); + myToolbarsAndTable = new JPanel(new BorderLayout()); + myToolbarsAndTable.add(toolbars, BorderLayout.NORTH); + myToolbarsAndTable.add(VcsLogUiUtil.installProgress(VcsLogUiUtil.setupScrolledGraph(myGraphTable, SideBorder.TOP), + myLogData, logUi.getId(), this), BorderLayout.CENTER); myDetailsSplitter = new OnePixelSplitter(true, DETAILS_SPLITTER_PROPORTION, 0.7f); myDetailsSplitter.setFirstComponent(changesLoadingPane); showDetails(myUiProperties.get(CommonUiProperties.SHOW_DETAILS)); myChangesBrowserSplitter = new OnePixelSplitter(false, CHANGES_SPLITTER_PROPORTION, 0.7f); - installGraphView(toolbarsAndTable, logUi); + installGraphView(); myChangesBrowserSplitter.setSecondComponent(myDetailsSplitter); myPreviewDiffSplitter = new OnePixelSplitter(false, DIFF_SPLITTER_PROPORTION, 0.7f); @@ -220,22 +227,23 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { }, this); } - private void installGraphView(JComponent toolbarsAndTable, AbstractVcsLogUi logUi) { + private void installGraphView() { if (Registry.is("show.log.as.editor.tab")) { - DataManager.registerDataProvider(toolbarsAndTable, this); + DataManager.registerDataProvider(myToolbarsAndTable, this); ApplicationManager.getApplication().invokeLater(() -> { - VirtualFile file = getOrCreateGraphViewFile(toolbarsAndTable, logUi); - openLogEditorTab(file, myLogData.getProject()); + openLogEditorTab(); }, ModalityState.NON_MODAL); } else { - myChangesBrowserSplitter.setFirstComponent(toolbarsAndTable); + myChangesBrowserSplitter.setFirstComponent(myToolbarsAndTable); } } - public static void openLogEditorTab(@NotNull VirtualFile file, @NotNull Project project) { - FileEditor[] editors = FileEditorManager.getInstance(project).openFile(file, true); + public void openLogEditorTab() { + VirtualFile file = getOrCreateGraphViewFile(); + + FileEditor[] editors = FileEditorManager.getInstance(myLogData.getProject()).openFile(file, true); assert editors.length == 1 : "opened multiple log editors for " + file; FileEditor editor = editors[0]; final JComponent component = editor.getComponent(); @@ -248,15 +256,15 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { editorWindow.setFilePinned(file, true); } - public VirtualFile getOrCreateGraphViewFile(JComponent logViewComponent, AbstractVcsLogUi logUi) { + private VirtualFile getOrCreateGraphViewFile() { ApplicationManager.getApplication().assertIsDispatchThread(); if (myGraphViewFile == null || !myGraphViewFile.isValid()) { - myGraphViewFile = new GraphViewVirtualFile(logViewComponent, () -> { + myGraphViewFile = new GraphViewVirtualFile(myToolbarsAndTable, () -> { return getTabName(); }); - myGraphViewFile.putUserData(GraphViewVirtualFile.TabContentId, logUi.getId()); + myGraphViewFile.putUserData(GraphViewVirtualFile.TabContentId, myLogUi.getId()); } Disposer.register(this, () -> myGraphViewFile = null); @@ -385,6 +393,30 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { else if (ShowPreviewEditorAction.DATA_KEY.is(dataId)) { return myDiffPreviewProvider; } + else if (VCS_LOG.is(dataId)) { + return myLogUi.getVcsLog(); + } + else if (VCS_LOG_UI.is(dataId)) { + return myLogUi; + } + else if (VcsDataKeys.VCS_REVISION_NUMBER.is(dataId)) { + List hashes = myLogUi.getVcsLog().getSelectedCommits(); + if (hashes.isEmpty()) return null; + return VcsLogUtil.convertToRevisionNumber(notNull(getFirstItem(hashes)).getHash()); + } + else if (VcsDataKeys.VCS_REVISION_NUMBERS.is(dataId)) { + List hashes = myLogUi.getVcsLog().getSelectedCommits(); + if (hashes.size() > VcsLogUtil.MAX_SELECTED_COMMITS) return null; + return ContainerUtil.map(hashes, + commitId -> VcsLogUtil.convertToRevisionNumber(commitId.getHash())).toArray(new VcsRevisionNumber[0]); + } + else if (PlatformDataKeys.HELP_ID.is(dataId)) { + return myLogUi.getHelpId(); + } + else if (History.KEY.is(dataId)) { + return myLogUi.getNavigationHistory(); + } + return null; }