From d20edb14968b16009c8a990389de0150c756d829 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 26 Nov 2009 12:14:01 +0300 Subject: [PATCH] IDEADEV-31082 - Cursor position in file is not saved on closing editor without save --- .../fileEditor/FileEditorManagerListener.java | 17 +++++++++++++++++ .../fileEditor/impl/EditorHistoryManager.java | 9 +++++++++ .../openapi/fileEditor/impl/EditorWindow.java | 10 ++++++++-- .../fileEditor/impl/FileEditorManagerImpl.java | 2 ++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/fileEditor/FileEditorManagerListener.java b/platform/platform-api/src/com/intellij/openapi/fileEditor/FileEditorManagerListener.java index b2043be90788..fb1e589b28df 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileEditor/FileEditorManagerListener.java +++ b/platform/platform-api/src/com/intellij/openapi/fileEditor/FileEditorManagerListener.java @@ -37,4 +37,21 @@ public interface FileEditorManagerListener extends EventListener{ * TODO[vova] write javadoc */ void selectionChanged(FileEditorManagerEvent event); + + interface Before extends EventListener { + Topic FILE_EDITOR_MANAGER = new Topic("file editor before events", Before.class); + + void beforeFileOpened(FileEditorManager source, VirtualFile file); + void beforeFileClosed(FileEditorManager source, VirtualFile file); + + public static class Adapter implements Before { + + public void beforeFileOpened(FileEditorManager source, VirtualFile file) { + } + + public void beforeFileClosed(FileEditorManager source, VirtualFile file) { + } + } + + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java index c79d847c7132..4c034522dac0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorHistoryManager.java @@ -65,6 +65,8 @@ public final class EditorHistoryManager extends AbstractProjectComponent impleme final MyUISettingsListener myUISettingsListener = new MyUISettingsListener(); fileEditorManager.addFileEditorManagerListener(editorManagerListener, project); + project.getMessageBus().connect().subscribe(FileEditorManagerListener.Before.FILE_EDITOR_MANAGER, new MyEditorManagerBeforeListener()); + uiSettings.addUISettingsListener(myUISettingsListener); Disposer.register(project, new Disposable() { public void dispose() { @@ -314,6 +316,13 @@ public final class EditorHistoryManager extends AbstractProjectComponent impleme } } + private final class MyEditorManagerBeforeListener extends FileEditorManagerListener.Before.Adapter { + @Override + public void beforeFileClosed(FileEditorManager source, VirtualFile file) { + updateHistoryEntry(file, false); + } + } + /** * Cuts/extends history length */ diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java index 898e93765db0..df1a03e5958b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java @@ -131,6 +131,11 @@ public class EditorWindow { if (editors.isEmpty()) return; final EditorWithProviderComposite editor = findFileComposite(file); + final FileEditorManagerListener.Before beforePublisher = + editorManager.getProject().getMessageBus().syncPublisher(FileEditorManagerListener.Before.FILE_EDITOR_MANAGER); + + beforePublisher.beforeFileClosed(editorManager, file); + if (myTabbedPane != null) { final int componentIndex = findComponentIndex(editor.getComponent()); if (componentIndex >= 0) { // editor could close itself on decomposition @@ -157,9 +162,10 @@ public class EditorWindow { } } finally { - final FileEditorManagerListener publisher = + final FileEditorManagerListener afterPublisher = editorManager.getProject().getMessageBus().syncPublisher(FileEditorManagerListener.FILE_EDITOR_MANAGER); - publisher.fileClosed(editorManager, file); + + afterPublisher.fileClosed(editorManager, file); } } }); 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 1334fb6d399d..4d01dc9b58d2 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 @@ -491,6 +491,8 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec } newEditorCreated = true; + getProject().getMessageBus().syncPublisher(FileEditorManagerListener.Before.FILE_EDITOR_MANAGER).beforeFileOpened(this, file); + editors = new FileEditor[providers.length]; for (int i = 0; i < providers.length; i++) { try {