diff --git a/platform/diff-impl/src/com/intellij/diff/editor/DiffRequestProcessorEditor.kt b/platform/diff-impl/src/com/intellij/diff/editor/DiffRequestProcessorEditor.kt index 17ef9864c66e..19bbeddb8d6f 100644 --- a/platform/diff-impl/src/com/intellij/diff/editor/DiffRequestProcessorEditor.kt +++ b/platform/diff-impl/src/com/intellij/diff/editor/DiffRequestProcessorEditor.kt @@ -31,9 +31,6 @@ class DiffRequestProcessorEditor( private val processor: DiffRequestProcessor ) : FileEditorBase() { init { - Disposer.register(this, Disposable { - Disposer.dispose(processor) - }) Disposer.register(processor, Disposable { propertyChangeSupport.firePropertyChange(FileEditor.PROP_VALID, true, false) }) diff --git a/platform/diff-impl/src/com/intellij/diff/editor/GraphViewEditorProvider.kt b/platform/diff-impl/src/com/intellij/diff/editor/GraphViewEditorProvider.kt index 50f3569edb38..f9cda1ab6e6d 100644 --- a/platform/diff-impl/src/com/intellij/diff/editor/GraphViewEditorProvider.kt +++ b/platform/diff-impl/src/com/intellij/diff/editor/GraphViewEditorProvider.kt @@ -24,5 +24,5 @@ class GraphViewEditorProvider : FileEditorProvider, DumbAware { override fun getEditorTypeId(): String = "GraphViewEditor" override fun getPolicy(): FileEditorPolicy = - FileEditorPolicy.HIDE_DEFAULT_EDITOR + FileEditorPolicy.PLACE_BEFORE_DEFAULT_EDITOR } \ No newline at end of file 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 3c5ad8298f93..2d7a75217bc0 100644 --- a/platform/diff-impl/src/com/intellij/diff/editor/GraphViewVirtualFile.kt +++ b/platform/diff-impl/src/com/intellij/diff/editor/GraphViewVirtualFile.kt @@ -10,7 +10,7 @@ class GraphViewVirtualFile(val toolbarsAndTable: JComponent, val getTabNameFunc: : LightVirtualFile(getTabNameFunc(), GraphViewFileType.INSTANCE, "") { companion object { @JvmField - val TabContent: Key = Key("TabContent") + val TabContentId: Key = Key("TabContentId") @JvmField val GraphVirtualFile: Key = Key("GraphVirtualFile") } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java index fc34ca33e50f..2159368bc040 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java @@ -491,6 +491,9 @@ public class ChangesViewManager implements ChangesViewEx, private void setDiffPreviewVisible(boolean isDiffPreviewVisible) { if (Registry.is("show.diff.preview.as.editor.tab") && !isDiffPreviewVisible) FileEditorManager.getInstance(myProject).closeFile(myPreviewDiffVirtualFile); + else { + FileEditorManager.getInstance(myProject).openFile(new PreviewDiffVirtualFile(myDiffPreviewProvider), false, true); + } myDiffPreviewSplitter.setDetailsOn(isDiffPreviewVisible); setCommitSplitOrientation(); 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 d80721a602e2..9fda6c5b62ef 100644 --- a/platform/vcs-log/impl/src/META-INF/vcs-log.xml +++ b/platform/vcs-log/impl/src/META-INF/vcs-log.xml @@ -182,7 +182,6 @@ - @@ -214,7 +213,6 @@ - @@ -242,7 +240,6 @@ - diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryPanel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryPanel.java index cb153500edac..4621bb15d844 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryPanel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryPanel.java @@ -211,6 +211,11 @@ public class FileHistoryPanel extends JPanel implements DataProvider, Disposable void showDiffPreview(boolean state) { if (Registry.is("show.diff.preview.as.editor.tab")) { + if (!state) { + FileEditorManager.getInstance(myLogData.getProject()).closeFile(new PreviewDiffVirtualFile(myDiffPreviewProvider)); + } else { + FileEditorManager.getInstance(myLogData.getProject()).openFile(new PreviewDiffVirtualFile(myDiffPreviewProvider), false, true); + } return; } @@ -223,8 +228,8 @@ public class FileHistoryPanel extends JPanel implements DataProvider, Disposable FileHistoryDiffPreview diffPreview = new FileHistoryDiffPreview(myLogData.getProject(), () -> myUi.getSelectedChange(), isInEditor, this); ListSelectionListener selectionListener = e -> { - if (!myProperties.get(CommonUiProperties.SHOW_DIFF_PREVIEW)) - return;int[] selection = myGraphTable.getSelectedRows(); + if (!myProperties.get(CommonUiProperties.SHOW_DIFF_PREVIEW)){ + return;}int[] selection = myGraphTable.getSelectedRows(); ApplicationManager.getApplication().invokeLater(() -> diffPreview.updatePreview(diffPreview.getComponent().isShowing()), o -> !Arrays.equals(selection, myGraphTable.getSelectedRows())); }; 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 3770230edb25..53abfc4cd965 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,14 +5,15 @@ 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; import com.intellij.openapi.util.registry.Registry; -import com.intellij.openapi.vcs.changes.ui.ChangesViewContentI; 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; @@ -23,12 +24,15 @@ import com.intellij.util.containers.ContainerUtil; 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.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; @@ -89,6 +93,32 @@ 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(Project project) { if (!Registry.is("show.log.as.editor.tab")) { return; @@ -98,20 +128,25 @@ public class VcsLogTabsWatcher implements Disposable { if (toolWindow != null) { toolWindow.getContentManager().addContentManagerListener(myLogEditorListener); - ChangesViewContentI changesViewManager = ChangesViewContentManager.getInstance(project); - project.getMessageBus().connect(project) .subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerListener() { @Override public void selectionChanged(@NotNull FileEditorManagerEvent e) { VirtualFile file = e.getNewFile(); if (file instanceof GraphViewVirtualFile) { - Content data = file.getUserData(GraphViewVirtualFile.TabContent); + String data = file.getUserData(GraphViewVirtualFile.TabContentId); if (data != null) { - changesViewManager.setSelectedContent(data); + VcsLogContentUtil.findAndSelect(project, AbstractVcsLogUi.class, ui -> { + return ui.getId() == data; + }); } } } + + @Override + public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { + processVirtualFile(file); + } }); } } 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 e5db5fa92fd7..cb881b41d196 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 @@ -27,12 +27,9 @@ 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.vfs.VirtualFile; -import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.ui.*; import com.intellij.ui.components.JBLoadingPanel; import com.intellij.ui.components.panels.Wrapper; -import com.intellij.ui.content.Content; import com.intellij.util.ContentUtilEx; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.JBUI; @@ -48,7 +45,10 @@ import com.intellij.vcs.log.data.VcsLogData; import com.intellij.vcs.log.impl.CommonUiProperties; import com.intellij.vcs.log.impl.MainVcsLogUiProperties; import com.intellij.vcs.log.impl.VcsLogContentProvider; -import com.intellij.vcs.log.ui.*; +import com.intellij.vcs.log.ui.AbstractVcsLogUi; +import com.intellij.vcs.log.ui.VcsLogActionPlaces; +import com.intellij.vcs.log.ui.VcsLogInternalDataKeys; +import com.intellij.vcs.log.ui.VcsLogUiImpl; import com.intellij.vcs.log.ui.actions.IntelliSortChooserPopupAction; import com.intellij.vcs.log.ui.actions.ShowPreviewEditorAction; import com.intellij.vcs.log.ui.filter.VcsLogFilterUiEx; @@ -164,7 +164,7 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { showDetails(myUiProperties.get(CommonUiProperties.SHOW_DETAILS)); myChangesBrowserSplitter = new OnePixelSplitter(false, CHANGES_SPLITTER_PROPORTION, 0.7f); - installGraphView(toolbarsAndTable); + installGraphView(toolbarsAndTable, logUi); myChangesBrowserSplitter.setSecondComponent(myDetailsSplitter); myPreviewDiffSplitter = new OnePixelSplitter(false, DIFF_SPLITTER_PROPORTION, 0.7f); @@ -220,12 +220,12 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { }, this); } - private void installGraphView(JComponent toolbarsAndTable) { + private void installGraphView(JComponent toolbarsAndTable, AbstractVcsLogUi logUi) { if (Registry.is("show.log.as.editor.tab")) { DataManager.registerDataProvider(toolbarsAndTable, this); ApplicationManager.getApplication().invokeLater(() -> { - VirtualFile file = getOrCreateGraphViewFile(toolbarsAndTable); + VirtualFile file = getOrCreateGraphViewFile(toolbarsAndTable, logUi); openLogEditorTab(file, myLogData.getProject()); }, ModalityState.NON_MODAL); } @@ -234,7 +234,7 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { } } - public static void openLogEditorTab(VirtualFile file, Project project) { + public static void openLogEditorTab(@NotNull VirtualFile file, @NotNull Project project) { FileEditor[] editors = FileEditorManager.getInstance(project).openFile(file, true); assert editors.length == 1 : "opened multiple log editors for " + file; FileEditor editor = editors[0]; @@ -248,43 +248,24 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { editorWindow.setFilePinned(file, true); } - public VirtualFile getOrCreateGraphViewFile(JComponent logViewComponent) { + public VirtualFile getOrCreateGraphViewFile(JComponent logViewComponent, AbstractVcsLogUi logUi) { ApplicationManager.getApplication().assertIsDispatchThread(); if (myGraphViewFile == null || !myGraphViewFile.isValid()) { - String name = getTabName(); myGraphViewFile = new GraphViewVirtualFile(logViewComponent, () -> { return getTabName(); }); - Project project = myLogData.getProject(); - - ToolWindow window = ToolWindowManager.getInstance(project).getToolWindow(ChangesViewContentManager.TOOLWINDOW_ID); - if (window != null) { - for (Content content : window.getContentManager().getContents()) { - JComponent component = content.getComponent(); - if (component instanceof VcsLogPanel) { - if (((VcsLogPanel)component).getUi().getMainComponent().equals(this.getMainComponent())) { - myGraphViewFile.putUserData(GraphViewVirtualFile.TabContent, content); - content.putUserData(GraphViewVirtualFile.GraphVirtualFile, myGraphViewFile); - } - } - else if (name.equals(VcsLogContentProvider.TAB_NAME) && name.equals(content.getDisplayName())) { - myGraphViewFile.putUserData(GraphViewVirtualFile.TabContent, content); - content.putUserData(GraphViewVirtualFile.GraphVirtualFile, myGraphViewFile); - } - } - } + myGraphViewFile.putUserData(GraphViewVirtualFile.TabContentId, logUi.getId()); } - Disposer.register(this, () -> myGraphViewFile = null); return myGraphViewFile; } + //todo move it out from MainFrame private String getTabName() { - VcsLogContentProvider instance = VcsLogContentProvider.getInstance(myLogData.getProject()); if (instance != null) { VcsLogUiImpl ui = instance.getUi(); @@ -430,6 +411,16 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { public void showDiffPreview(boolean state) { myPreviewDiff.updatePreview(state); if (Registry.is("show.diff.preview.as.editor.tab")) { + if (myDiffPreviewProvider != null) { + if (!state) { + //'equals' for such files is overridden and means the equality of its owner + FileEditorManager.getInstance(myLogData.getProject()).closeFile(new PreviewDiffVirtualFile(myDiffPreviewProvider)); + } + else { + FileEditorManager.getInstance(myLogData.getProject()).openFile(new PreviewDiffVirtualFile(myDiffPreviewProvider), false, true); + } + } + return; }