From c58368d1484be42f3412cfc15bfab25b660d667b Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 24 Apr 2013 18:58:19 +0400 Subject: [PATCH] restoring selected editor on project reopening --- .../impl/FileEditorManagerImpl.java | 2 +- .../fileEditor/FileEditorManagerTest.java | 164 +++++++++++++----- 2 files changed, 125 insertions(+), 41 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 3b4bed5808aa..00bdcf158897 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 @@ -847,7 +847,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec } // Restore selected editor - final FileEditorProvider selectedProvider = getSelectedFileEditorProvider(editorHistoryManager, file); + final FileEditorProvider selectedProvider = entry == null ? getSelectedFileEditorProvider(editorHistoryManager, file) : entry.mySelectedProvider; if (selectedProvider != null) { final FileEditor[] _editors = newSelectedComposite.getEditors(); final FileEditorProvider[] _providers = newSelectedComposite.getProviders(); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java index c8f4c78a9ba1..58e489d06e44 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/FileEditorManagerTest.java @@ -16,11 +16,14 @@ package com.intellij.openapi.fileEditor; import com.intellij.ide.ui.UISettings; +import com.intellij.mock.Mock; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.fileEditor.impl.EditorWithProviderComposite; import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; @@ -30,8 +33,10 @@ import com.intellij.util.containers.ContainerUtil; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.serialization.PathMacroUtil; +import javax.swing.*; import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -46,7 +51,6 @@ import java.util.concurrent.Future; public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCase { private FileEditorManagerImpl myManager; - @SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors") public FileEditorManagerTest() { PlatformTestCase.initPlatformLangPrefix(); @@ -54,7 +58,7 @@ public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCa public void testTabOrder() throws Exception { - openFiles(); + openFiles(STRING); assertOpenFiles("1.txt", "foo.xml", "2.txt", "3.txt"); } @@ -63,7 +67,7 @@ public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCa int limit = UISettings.getInstance().EDITOR_TAB_LIMIT; try { UISettings.getInstance().EDITOR_TAB_LIMIT = 2; - openFiles(); + openFiles(STRING); // note that foo.xml is pinned assertOpenFiles("foo.xml", "3.txt"); } @@ -72,6 +76,65 @@ public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCa } } + public void testOpenRecentEditorTab() throws Exception { + PlatformTestUtil.registerExtension(FileEditorProvider.EP_FILE_EDITOR_PROVIDER, new MyFileEditorProvider(), getTestRootDisposable()); + + openFiles(" \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n"); + FileEditor[] selectedEditors = myManager.getSelectedEditors(); + assertEquals(1, selectedEditors.length); + assertEquals("mockEditor", selectedEditors[0].getName()); + } + + private static final String STRING = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n"; + private void assertOpenFiles(String... fileNames) { EditorWithProviderComposite[] files = myManager.getSplitters().getEditorsComposites(); List names = ContainerUtil.map(files, new Function() { @@ -83,43 +146,8 @@ public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCa assertEquals(Arrays.asList(fileNames), names); } - private void openFiles() throws IOException, JDOMException, InterruptedException, ExecutionException { - Document document = JDOMUtil.loadDocument(" \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n"); + private void openFiles(String s) throws IOException, JDOMException, InterruptedException, ExecutionException { + Document document = JDOMUtil.loadDocument(s); Element rootElement = document.getRootElement(); ExpandMacroToPathMap map = new ExpandMacroToPathMap(); map.addMacroExpand(PathMacroUtil.PROJECT_DIR_MACRO_NAME, getTestDataPath()); @@ -156,4 +184,60 @@ public class FileEditorManagerTest extends LightPlatformCodeInsightFixtureTestCa protected boolean isWriteActionRequired() { return false; } + + private static class MyFileEditorProvider implements FileEditorProvider { + @NotNull + @Override + public String getEditorTypeId() { + return "mock"; + } + + @NotNull + @Override + public FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) { + return FileEditorState.INSTANCE; + } + + @Override + public void writeState(@NotNull FileEditorState state, @NotNull Project project, @NotNull Element targetElement) { + } + + @Override + public boolean accept(@NotNull Project project, @NotNull VirtualFile file) { + return true; + } + + @NotNull + @Override + public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) { + return new Mock.MyFileEditor() { + @Override + public boolean isValid() { + return true; + } + + @NotNull + @Override + public JComponent getComponent() { + return new JLabel(); + } + + @NotNull + @Override + public String getName() { + return "mockEditor"; + } + }; + } + + @Override + public void disposeEditor(@NotNull FileEditor editor) { + } + + @NotNull + @Override + public FileEditorPolicy getPolicy() { + return FileEditorPolicy.PLACE_AFTER_DEFAULT_EDITOR; + } + } }