From 3a8c007ddcc27ec3a3f1842647ad8ab7a2b7a742 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Mon, 25 Feb 2013 12:54:09 +0400 Subject: [PATCH] IDEA-101768 Avoid memory leak in 'editor tabs: none' mode --- .../openapi/fileEditor/impl/EditorComposite.java | 5 +++++ .../fileEditor/impl/FileEditorManagerImpl.java | 6 ++++++ .../impl/text/TextEditorComponent.java | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java index 14dca00e485d..a21d7e2cb349 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java @@ -405,6 +405,11 @@ public abstract class EditorComposite implements Disposable { } public void dispose() { + for (FileEditor editor : myEditors) { + if (!Disposer.isDisposed(editor)) { + Disposer.dispose(editor); + } + } } private static class TopBottomPanel extends JPanel { 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 5017b9e4b2a3..ed39011cc635 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 @@ -719,6 +719,12 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec providers = newSelectedComposite.getProviders(); } else { + if (UISettings.getInstance().EDITOR_TAB_PLACEMENT == UISettings.TABS_NONE) { + for (EditorWithProviderComposite composite : window.getEditors()) { + Disposer.dispose(composite); + } + } + // File is not opened yet. In this case we have to create editors // and select the created EditorComposite. final FileEditorProviderManager editorProviderManager = FileEditorProviderManager.getInstance(); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java index 89129280b1f8..960e977d294e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java @@ -23,7 +23,10 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.colors.EditorColorsManager; -import com.intellij.openapi.editor.event.*; +import com.intellij.openapi.editor.event.DocumentAdapter; +import com.intellij.openapi.editor.event.DocumentEvent; +import com.intellij.openapi.editor.event.EditorMouseEvent; +import com.intellij.openapi.editor.event.EditorMouseEventArea; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.EditorMarkupModel; import com.intellij.openapi.editor.highlighter.EditorHighlighter; @@ -59,7 +62,7 @@ import java.beans.PropertyChangeListener; * @author Anton Katilin * @author Vladimir Kondratyev */ -class TextEditorComponent extends JBLoadingPanel implements DataProvider{ +class TextEditorComponent extends JBLoadingPanel implements DataProvider { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.fileEditor.impl.text.TextEditorComponent"); private final Project myProject; @@ -160,14 +163,19 @@ class TextEditorComponent extends JBLoadingPanel implements DataProvider{ Editor getEditor(){ return myEditor; } - + /** * @return created editor. This editor should be released by {@link #disposeEditor(Editor) } * method. */ @NotNull private Editor createEditor(){ - Editor editor = EditorFactory.getInstance().createEditor(myDocument, myProject); + EditorFactory editorFactory = EditorFactory.getInstance(); + Editor[] editors = editorFactory.getEditors(myDocument); + if (editors.length == 1) { + return editors[0]; + } + final Editor editor = editorFactory.createEditor(myDocument, myProject); ((EditorMarkupModel) editor.getMarkupModel()).setErrorStripeVisible(true); EditorHighlighter highlighter = EditorHighlighterFactory.getInstance().createEditorHighlighter(myFile, EditorColorsManager.getInstance().getGlobalScheme(), myProject); ((EditorEx) editor).setHighlighter(highlighter);