From 816cdfcb1331df7201260e13e3a11f10e72d79b3 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 20 Nov 2015 15:55:17 +0100 Subject: [PATCH] FileEditorManagerImpl as PersistentStateComponent --- .../impl/PsiAwareFileEditorManagerImpl.java | 18 ++-- .../impl/FileEditorManagerImpl.java | 96 +++++++++---------- .../src/componentSets/PlatformComponents.xml | 1 - .../HeavyFileEditorManagerTestCase.java | 3 +- .../FileEditorManagerTestCase.java | 27 +++--- .../context/OpenEditorsContextProvider.java | 30 +++--- 6 files changed, 86 insertions(+), 89 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java index 31b38ef816f8..939640063a77 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,7 +35,7 @@ import com.intellij.problems.WolfTheProblemSolver; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.ui.docking.DockManager; -import com.intellij.util.messages.MessageBus; +import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; /** @@ -56,10 +56,9 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl { public PsiAwareFileEditorManagerImpl(final Project project, final PsiManager psiManager, final WolfTheProblemSolver problemSolver, - DockManager dockManager, - MessageBus messageBus, - EditorHistoryManager editorHistoryManager) { - super(project, dockManager, editorHistoryManager); + DockManager dockManager) { + super(project, dockManager); + myPsiManager = psiManager; myProblemSolver = problemSolver; myPsiTreeChangeListener = new MyPsiTreeChangeListener(); @@ -68,7 +67,7 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl { // reinit syntax highlighter for Groovy. In power save mode keywords are highlighted by GroovySyntaxHighlighter insteadof // GrKeywordAndDeclarationHighlighter. So we need to drop caches for token types attributes in LayeredLexerEditorHighlighter - messageBus.connect().subscribe(PowerSaveMode.TOPIC, new PowerSaveMode.Listener() { + project.getMessageBus().connect().subscribe(PowerSaveMode.TOPIC, new PowerSaveMode.Listener() { @Override public void powerSaveStateChanged() { for (Editor editor : EditorFactory.getInstance().getAllEditors()) { @@ -79,8 +78,9 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl { } @Override - public void projectOpened() { - super.projectOpened(); //To change body of overridden methods use File | Settings | File Templates. + protected void projectOpened(@NotNull MessageBusConnection connection) { + super.projectOpened(connection); + myPsiManager.addPsiTreeChangeListener(myPsiTreeChangeListener); myProblemSolver.addProblemListener(myProblemListener); } 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 4926b4d9644e..6f289edb092a 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 @@ -26,7 +26,10 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.command.CommandProcessor; -import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; @@ -43,10 +46,7 @@ import com.intellij.openapi.fileTypes.FileTypeListener; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.preview.PreviewManager; import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.project.DumbAwareRunnable; -import com.intellij.openapi.project.DumbService; -import com.intellij.openapi.project.PossiblyDumbAware; -import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.*; import com.intellij.openapi.project.impl.ProjectImpl; import com.intellij.openapi.roots.ModuleRootAdapter; import com.intellij.openapi.roots.ModuleRootEvent; @@ -100,7 +100,11 @@ import java.util.concurrent.atomic.AtomicInteger; * @author Eugene Belyaev * @author Vladimir Kondratyev */ -public class FileEditorManagerImpl extends FileEditorManagerEx implements ProjectComponent, JDOMExternalizable { +@State( + name = "FileEditorManager", + storages = @Storage(file = StoragePathMacros.WORKSPACE_FILE) +) +public class FileEditorManagerImpl extends FileEditorManagerEx implements PersistentStateComponent { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl"); private static final Key DUMB_AWARE = Key.create("DUMB_AWARE"); @@ -126,7 +130,6 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec private final PropertyChangeListener myEditorPropertyChangeListener = new MyEditorPropertyChangeListener(); private final DockManager myDockManager; private DockableEditorContainerFactory myContentFactory; - private final EditorHistoryManager myEditorHistoryManager; private static final AtomicInteger ourOpenFilesSetModificationCount = new AtomicInteger(); public static final ModificationTracker OPEN_FILE_SET_MODIFICATION_COUNT = new ModificationTracker() { @@ -137,11 +140,10 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec }; - public FileEditorManagerImpl(final Project project, DockManager dockManager, EditorHistoryManager editorHistoryManager) { + public FileEditorManagerImpl(@NotNull Project project, DockManager dockManager) { /* ApplicationManager.getApplication().assertIsDispatchThread(); */ myProject = project; myDockManager = dockManager; - myEditorHistoryManager = editorHistoryManager; myListenerList = new MessageListenerList(myProject.getMessageBus(), FileEditorManagerListener.FILE_EDITOR_MANAGER); @@ -157,22 +159,41 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec myQueue.setTrackUiActivity(true); - project.getMessageBus().connect().subscribe(DumbService.DUMB_MODE, new DumbService.DumbModeListener() { - + final MessageBusConnection connection = project.getMessageBus().connect(); + connection.subscribe(DumbService.DUMB_MODE, new DumbService.DumbModeListener() { + @Override public void enteredDumbMode() { } + @Override public void exitDumbMode() { // can happen under write action, so postpone to avoid deadlock on FileEditorProviderManager.getProviders() ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - if (!project.isDisposed()) - dumbModeFinished(project); + if (!myProject.isDisposed()) + dumbModeFinished(myProject); } }); } }); + connection.subscribe(ProjectManager.TOPIC, new ProjectManagerAdapter() { + @Override + public void projectOpened(Project project) { + if (project == myProject) { + FileEditorManagerImpl.this.projectOpened(connection); + } + } + + @Override + public void projectClosed(Project project) { + if (project == myProject) { + // Dispose created editors. We do not use use closeEditor method because + // it fires event and changes history. + closeAllFiles(); + } + } + }); } private void dumbModeFinished(Project project) { @@ -912,7 +933,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec final FileEditorProvider selectedProvider; if (entry == null) { selectedProvider = ((FileEditorProviderManagerImpl)FileEditorProviderManager.getInstance()) - .getSelectedFileEditorProvider(myEditorHistoryManager, file, providers); + .getSelectedFileEditorProvider(EditorHistoryManager.getInstance(myProject), file, providers); } else { selectedProvider = entry.getSelectedProvider(); @@ -1018,7 +1039,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec // We have to try to get state from the history only in case // if editor is not opened. Otherwise history entry might have a state // out of sync with the current editor state. - state = myEditorHistoryManager.getState(file, provider); + state = EditorHistoryManager.getInstance(myProject).getState(file, provider); } if (state != null) { if (!isDumbAware(editor)) { @@ -1455,15 +1476,10 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec myListenerList.remove(listener); } -// ProjectComponent methods - - @Override - public void projectOpened() { + protected void projectOpened(@NotNull MessageBusConnection connection) { //myFocusWatcher.install(myWindows.getComponent ()); getMainSplitters().startListeningFocus(); - MessageBusConnection connection = myProject.getMessageBus().connect(myProject); - final FileStatusManager fileStatusManager = FileStatusManager.getInstance(myProject); if (fileStatusManager != null) { /** @@ -1510,7 +1526,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec } } }, myProject.getDisposed()); -// group 1 + // group 1 } }, "", null); } @@ -1519,39 +1535,17 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec }); } + @Nullable @Override - public void projectClosed() { - // Dispose created editors. We do not use use closeEditor method because - // it fires event and changes history. - closeAllFiles(); - } - -// BaseCompomemnt methods - - @Override - @NotNull - public String getComponentName() { - return FILE_EDITOR_MANAGER; + public Element getState() { + Element state = new Element("state"); + getMainSplitters().writeExternal(state); + return state; } @Override - public void initComponent() { - - } - - @Override - public void disposeComponent() { /* really do nothing */ } - -//JDOMExternalizable methods - - @Override - public void writeExternal(final Element element) { - getMainSplitters().writeExternal(element); - } - - @Override - public void readExternal(final Element element) { - getMainSplitters().readExternal(element); + public void loadState(Element state) { + getMainSplitters().readExternal(state); } @Nullable diff --git a/platform/platform-resources/src/componentSets/PlatformComponents.xml b/platform/platform-resources/src/componentSets/PlatformComponents.xml index 049f4bda43cc..9ce3cbde5c1c 100644 --- a/platform/platform-resources/src/componentSets/PlatformComponents.xml +++ b/platform/platform-resources/src/componentSets/PlatformComponents.xml @@ -44,7 +44,6 @@ com.intellij.openapi.fileEditor.FileEditorManager com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl com.intellij.openapi.fileEditor.impl.TestEditorManagerImpl -