diff options
author | Jens Ole Lauridsen <jlauridsen@google.com> | 2015-07-24 16:00:17 -0700 |
---|---|---|
committer | Jens Ole Lauridsen <jlauridsen@google.com> | 2015-07-27 17:44:29 -0700 |
commit | d16547d95531c79f870df6227524fdfdac126a0f (patch) | |
tree | cfdb891e95fe8b2b401aa1bf98a6b4e92c6aa6bd /designer | |
parent | ca36cbc9707cce24063589b86a038abba6a46eb3 (diff) | |
download | idea-d16547d95531c79f870df6227524fdfdac126a0f.tar.gz |
Nele: Fix the disposing of the palette and structure pane.
These components were not disposed as intended and it caused some
subtle bugs ex: open/close/reopen a project with a designer open
then change the color theme of AS => an exception because a palette
panel that were no longer used was still receiving notifications.
Change-Id: I261ebb12f5f1abe855d12ee16dd28d4b440da7ce
Diffstat (limited to 'designer')
8 files changed, 48 insertions, 13 deletions
diff --git a/designer/src/com/android/tools/idea/uibuilder/editor/NlEditorPanel.java b/designer/src/com/android/tools/idea/uibuilder/editor/NlEditorPanel.java index 6814d152146..d5ea78064d5 100644 --- a/designer/src/com/android/tools/idea/uibuilder/editor/NlEditorPanel.java +++ b/designer/src/com/android/tools/idea/uibuilder/editor/NlEditorPanel.java @@ -75,7 +75,6 @@ public class NlEditorPanel extends JPanel implements DesignerEditorPanelFacade, mySurface.setModel(model); myContentSplitter = new ThreeComponentsSplitter(); - Disposer.register(editor, myContentSplitter); // The {@link LightFillLayout} provides the UI for the minimized forms of the {@link LightToolWindow} // used for the palette and the structure/properties panes. @@ -141,6 +140,9 @@ public class NlEditorPanel extends JPanel implements DesignerEditorPanelFacade, } public void dispose() { + NlPaletteManager.get(mySurface.getProject()).dispose(this); + NlStructureManager.get(mySurface.getProject()).dispose(this); + myContentSplitter.dispose(); } public void activate() { diff --git a/designer/src/com/android/tools/idea/uibuilder/editor/NlPaletteManager.java b/designer/src/com/android/tools/idea/uibuilder/editor/NlPaletteManager.java index d00023fa27e..c252debcfe9 100644 --- a/designer/src/com/android/tools/idea/uibuilder/editor/NlPaletteManager.java +++ b/designer/src/com/android/tools/idea/uibuilder/editor/NlPaletteManager.java @@ -94,6 +94,12 @@ public class NlPaletteManager extends NlAbstractWindowManager { @Override protected LightToolWindow createContent(@NonNull DesignerEditorPanelFacade designer) { + LightToolWindow toolWindow = (LightToolWindow)designer.getClientProperty(getComponentName()); + if (toolWindow != null) { + // Avoid memory leaks for palettes created for the preview form (the palette is shared for all files). + return toolWindow; + } + NlPalettePanel palette = new NlPalettePanel(designer); palette.setDesignSurface(getDesignSurface(designer)); @@ -114,6 +120,13 @@ public class NlPaletteManager extends NlAbstractWindowManager { getVisibilityKeyName(designer), 180, palette.getActions()); } + @Override + public void disposeComponent() { + if (myPalette != null) { + myPalette.dispose(); + } + } + @NonNull @Override public String getComponentName() { diff --git a/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewForm.java b/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewForm.java index f29a72959a2..d06b382b184 100644 --- a/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewForm.java +++ b/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewForm.java @@ -339,8 +339,11 @@ public class NlPreviewForm implements Disposable, CaretListener, DesignerEditorP @Override public void putClientProperty(Object key, Object value) { + Project project = myManager.getProject(); + NlPaletteManager paletteManager = NlPaletteManager.get(project); + String paletteKey = paletteManager.getComponentName(); myContentSplitter.putClientProperty(key, value); - if (value instanceof LightToolWindow) { + if (key.equals(paletteKey)) { myToolWindow = (LightToolWindow) value; } } diff --git a/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewManager.java b/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewManager.java index 3c5ed611c73..7ac7dd9ae6f 100644 --- a/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewManager.java +++ b/designer/src/com/android/tools/idea/uibuilder/editor/NlPreviewManager.java @@ -143,6 +143,13 @@ public class NlPreviewManager implements ProjectComponent { public void projectClosed() { if (myToolWindowForm != null) { Disposer.dispose(myToolWindowForm); + NlPaletteManager paletteManager = NlPaletteManager.get(myProject); + String paletteKey = paletteManager.getComponentName(); + LightToolWindow toolWindow = (LightToolWindow)myToolWindowForm.getClientProperty(paletteKey); + if (toolWindow != null) { + myToolWindowForm.putClientProperty(paletteKey, null); + toolWindow.dispose(); + } myToolWindowForm = null; myToolWindow = null; myToolWindowDisposed = true; diff --git a/designer/src/com/android/tools/idea/uibuilder/editor/NlStructureManager.java b/designer/src/com/android/tools/idea/uibuilder/editor/NlStructureManager.java index b7cd99634b3..afdf5e04ab8 100644 --- a/designer/src/com/android/tools/idea/uibuilder/editor/NlStructureManager.java +++ b/designer/src/com/android/tools/idea/uibuilder/editor/NlStructureManager.java @@ -77,16 +77,22 @@ public class NlStructureManager extends NlAbstractWindowManager { @Override protected LightToolWindow createContent(@NotNull DesignerEditorPanelFacade designer) { + if (!(designer instanceof NlEditorPanel)) { + // The preview tool window does not have a structure pane. + return null; + } NlStructurePanel structurePanel = new NlStructurePanel(getDesignSurface(designer)); - return createContent(designer, - structurePanel, - "Structure", - AllIcons.Toolwindows.ToolWindowStructure, - structurePanel.getPanel(), - structurePanel.getPanel(), - 320, - null); } + return createContent(designer, structurePanel, "Structure", AllIcons.Toolwindows.ToolWindowStructure, structurePanel.getPanel(), + structurePanel.getPanel(), 320, null); + } + + @Override + public void disposeComponent() { + if (myStructurePanel != null) { + myStructurePanel.dispose(); + } + } @NotNull @Override diff --git a/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java b/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java index 93205830cd6..2bf05f1930d 100644 --- a/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java +++ b/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java @@ -65,8 +65,6 @@ import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; -import java.util.Collections; -import java.util.List; import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER; import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED; diff --git a/designer/src/com/android/tools/idea/uibuilder/structure/NlComponentTree.java b/designer/src/com/android/tools/idea/uibuilder/structure/NlComponentTree.java index d618e187198..1c96c44695d 100644 --- a/designer/src/com/android/tools/idea/uibuilder/structure/NlComponentTree.java +++ b/designer/src/com/android/tools/idea/uibuilder/structure/NlComponentTree.java @@ -23,6 +23,7 @@ import com.android.tools.idea.uibuilder.surface.DesignSurface; import com.android.tools.idea.uibuilder.surface.DesignSurfaceListener; import com.android.tools.idea.uibuilder.surface.ScreenView; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Disposer; import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.IJSwingUtilities; @@ -71,7 +72,7 @@ public class NlComponentTree extends Tree implements DesignSurfaceListener, Mode myId2Node = new HashMap<String, DefaultMutableTreeNode>(); mySelectionIsUpdating = new AtomicBoolean(false); myUpdateQueue = new MergingUpdateQueue( - "android.layout.structure-pane", UPDATE_DELAY_MSECS, true, null, designSurface, null, SWING_THREAD); + "android.layout.structure-pane", UPDATE_DELAY_MSECS, true, null, null, null, SWING_THREAD); DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(null); DefaultTreeModel treeModel = new DefaultTreeModel(rootNode); setModel(treeModel); @@ -133,6 +134,7 @@ public class NlComponentTree extends Tree implements DesignSurfaceListener, Mode myModel.getSelectionModel().removeListener(this); myModel = null; } + Disposer.dispose(myUpdateQueue); } private void createCellRenderer() { diff --git a/designer/src/com/android/tools/idea/uibuilder/surface/DesignSurface.java b/designer/src/com/android/tools/idea/uibuilder/surface/DesignSurface.java index 9c17f53f284..6905b69068b 100644 --- a/designer/src/com/android/tools/idea/uibuilder/surface/DesignSurface.java +++ b/designer/src/com/android/tools/idea/uibuilder/surface/DesignSurface.java @@ -167,6 +167,10 @@ public class DesignSurface extends JPanel implements Disposable, ScalableDesignS Disposer.register(project, this); } + public Project getProject() { + return myProject; + } + public boolean isCentered() { return myCentered; } |