summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java54
1 files changed, 51 insertions, 3 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java
index bab6d2b2fa4f..65adf52041b9 100644
--- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java
@@ -58,6 +58,7 @@ import com.intellij.openapi.vcs.FileStatusListener;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vfs.*;
import com.intellij.openapi.wm.IdeFocusManager;
+import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.ex.StatusBarEx;
@@ -90,6 +91,7 @@ import java.beans.PropertyChangeListener;
import java.lang.ref.WeakReference;
import java.util.*;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author Anton Katilin
@@ -106,10 +108,12 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
public static final String FILE_EDITOR_MANAGER = "FileEditorManager";
private volatile JPanel myPanels;
+ private PreviewPanel myPreviewPanel;
private EditorsSplitters mySplitters;
private final Project myProject;
private final List<Pair<VirtualFile, EditorWindow>> mySelectionHistory = new ArrayList<Pair<VirtualFile, EditorWindow>>();
private WeakReference<EditorComposite> myLastSelectedComposite = new WeakReference<EditorComposite>(null);
+ private final AtomicBoolean myPreviewBlocker = new AtomicBoolean(false);
private final MergingUpdateQueue myQueue = new MergingUpdateQueue("FileEditorManagerUpdateQueue", 50, true, null);
@@ -174,7 +178,11 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
}
public Set<EditorsSplitters> getAllSplitters() {
- HashSet<EditorsSplitters> all = new HashSet<EditorsSplitters>();
+ HashSet<EditorsSplitters> all = new LinkedHashSet<EditorsSplitters>();
+ if (Registry.is("editor.use.preview")) {
+ initUI();
+ all.add(myPreviewPanel.getWindow().getOwner());
+ }
all.add(getMainSplitters());
Set<DockContainer> dockContainers = myDockManager.getContainers();
for (DockContainer each : dockContainers) {
@@ -247,6 +255,11 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
}
}
}
+ if (myPreviewPanel == null && Registry.is("editor.use.preview")) {
+ synchronized (myInitLock) {
+ myPreviewPanel = new PreviewPanel(myProject, this, myDockManager);
+ }
+ }
}
private static class MyBorder implements Border {
@@ -595,7 +608,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
@NotNull
public Pair<FileEditor[], FileEditorProvider[]> openFileWithProviders(@NotNull final VirtualFile file,
final boolean focusEditor,
- boolean searchForSplitter) {
+ final boolean searchForSplitter) {
if (!file.isValid()) {
throw new IllegalArgumentException("file is not valid: " + file);
}
@@ -628,6 +641,13 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
wndToOpenIn = getSplitters().getCurrentWindow();
}
+ if (wndToOpenIn == null || !wndToOpenIn.isFileOpen(file)) {
+ EditorWindow previewWindow = getPreviewWindow(file, focusEditor, searchForSplitter);
+ if (previewWindow != null) {
+ wndToOpenIn = previewWindow;
+ }
+ }
+
EditorsSplitters splitters = getSplitters();
if (wndToOpenIn == null) {
@@ -638,6 +658,31 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
return openFileImpl2(wndToOpenIn, file, focusEditor);
}
+ @Nullable
+ private EditorWindow getPreviewWindow(@NotNull VirtualFile virtualFile, final boolean focusEditor, final boolean searchForSplitter) {
+ EditorWindow wndToOpenIn = null;
+ if (Registry.is("editor.use.preview") && !myPreviewBlocker.get()) {
+ wndToOpenIn = myPreviewPanel.getWindow();
+ if (virtualFile.equals(myPreviewPanel.getCurrentFile())) return wndToOpenIn;
+ final VirtualFile modifiedFile = myPreviewPanel.closeCurrentFile();
+ ToolWindowManager.getInstance(myProject).getToolWindow(ToolWindowId.PREVIEW).activate(null, false);
+ if (modifiedFile != null) {
+ CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
+ @Override
+ public void run() {
+ myPreviewBlocker.set(true);
+ try {
+ openFileWithProviders(modifiedFile, focusEditor, searchForSplitter);
+ } finally {
+ myPreviewBlocker.set(false);
+ }
+ }
+ }, "", null);
+ }
+ }
+ return wndToOpenIn;
+ }
+
public Pair<FileEditor[], FileEditorProvider[]> openFileInNewWindow(@NotNull VirtualFile file) {
return ((DockManagerImpl)DockManager.getInstance(getProject())).createNewDockContainerFor(file, this);
}
@@ -1610,7 +1655,10 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
return null;
}
- public void runChange(FileEditorManagerChange change, EditorsSplitters splitters) {
+ /**
+ * @param splitters - taken getAllSplitters() value if parameter is null
+ */
+ public void runChange(@NotNull FileEditorManagerChange change, @Nullable EditorsSplitters splitters) {
Set<EditorsSplitters> target = new HashSet<EditorsSplitters>();
if (splitters == null) {
target.addAll(getAllSplitters());