close corresponding tabs when untoggling the preview button

annotations

fix action usages

move out ui logic from MainFrame

GitOrigin-RevId: 130986c6433d89b293b591dfa382e1176361efc2
This commit is contained in:
Kirill.Skrygan
2019-10-12 12:32:25 +00:00
committed by intellij-monorepo-bot
parent 7da6b9e82a
commit 212c83cdd8
8 changed files with 73 additions and 45 deletions
@@ -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)
})
@@ -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
}
@@ -10,7 +10,7 @@ class GraphViewVirtualFile(val toolbarsAndTable: JComponent, val getTabNameFunc:
: LightVirtualFile(getTabNameFunc(), GraphViewFileType.INSTANCE, "") {
companion object {
@JvmField
val TabContent: Key<Content> = Key("TabContent")
val TabContentId: Key<String> = Key("TabContentId")
@JvmField
val GraphVirtualFile: Key<GraphViewVirtualFile> = Key("GraphVirtualFile")
}
@@ -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();
@@ -182,7 +182,6 @@
<group id="Vcs.Log.ChangesBrowser.Toolbar">
<reference id="Vcs.RepositoryChangesBrowserToolbar"/>
<reference id="Vcs.Log.ShowOnlyAffectedChanges"/>
<reference id="Vcs.Log.ShowDiffPreviewInEditor"/>
<separator/>
<reference id="ChangesView.GroupBy"/>
<separator/>
@@ -214,7 +213,6 @@
<reference id="Vcs.Log.Refresh"/>
<reference id="Diff.ShowDiff"/>
<reference id="Vcs.Log.ShowAllAffected"/>
<reference id="Vcs.Log.ShowDiffPreviewInEditor"/>
<separator/>
<reference id="Vcs.Log.ShowOtherBranches"/>
<reference id="Vcs.FileHistory.PresentationSettings"/>
@@ -242,7 +240,6 @@
<reference ref="Vcs.Log.ShowDetailsAction"/>
<reference ref="Vcs.Log.ShowChangesFromParents"/>
<reference ref="Vcs.Log.ShowDiffPreview"/>
<reference ref="Vcs.Log.ShowDiffPreviewInEditor"/>
<separator/>
<reference ref="Vcs.Log.Refresh"/>
<reference ref="Vcs.Log.OpenAnotherTab"/>
@@ -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()));
};
@@ -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);
}
});
}
}
@@ -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;
}