From 2ec458805ab78bfc61ce5d3cb0b9d51fe76a474d Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 2 Nov 2011 12:41:01 +0400 Subject: [PATCH] fixed project leak in debugger configurables --- .../CompoundRendererConfigurable.java | 41 ++++++++----------- .../DebuggerDataViewsConfigurable.java | 16 ++++++-- .../DebuggerSteppingConfigurable.java | 12 +++--- .../settings/UserRenderersConfigurable.java | 3 +- .../debugger/ui/JavaDebuggerSupport.java | 20 +++++++-- .../DebuggerConfigurableProvider.java | 11 +---- .../DebuggerSettingsPanelProvider.java | 3 +- .../XDebuggerSettingsPanelProviderImpl.java | 2 +- 8 files changed, 55 insertions(+), 53 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java index df2b69812114..f068f11df306 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java @@ -23,6 +23,7 @@ import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.debugger.engine.evaluation.TextWithImportsImpl; import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.ui.DebuggerExpressionTextField; +import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.debugger.ui.tree.render.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.options.ConfigurationException; @@ -37,6 +38,7 @@ import com.intellij.ui.TableUtil; import com.intellij.util.ui.AbstractTableCellEditor; import com.intellij.util.ui.Table; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.ListSelectionEvent; @@ -47,7 +49,6 @@ import javax.swing.table.TableColumn; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; /** @@ -57,7 +58,7 @@ import java.util.List; public class CompoundRendererConfigurable implements UnnamedConfigurable{ private CompoundReferenceRenderer myRenderer; private CompoundReferenceRenderer myOriginalRenderer; - private final Project myProject; + private Project myProject; private TextFieldWithBrowseButton myClassNameField; private JRadioButton myRbDefaultLabel; private JRadioButton myRbExpressionLabel; @@ -81,7 +82,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable{ private static final int NAME_TABLE_COLUMN = 0; private static final int EXPRESSION_TABLE_COLUMN = 1; - public CompoundRendererConfigurable(Project project) { + public CompoundRendererConfigurable(@Nullable Project project) { myProject = project; } @@ -101,6 +102,9 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable{ } public JComponent createComponent() { + if (myProject == null) { + myProject = JavaDebuggerSupport.getCurrentProject(); + } final JPanel panel = new JPanel(new GridBagLayout()); myClassNameField = new TextFieldWithBrowseButton(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -373,6 +377,11 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable{ myChildrenEditor.dispose(); myChildrenExpandedEditor.dispose(); myListChildrenEditor.dispose(); + myLabelEditor = null; + myChildrenEditor = null; + myChildrenExpandedEditor = null; + myListChildrenEditor = null; + myProject = null; } private MyTableModel getTableModel() { @@ -380,19 +389,14 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable{ } private final class MyTableModel extends AbstractTableModel { - private final java.util.List myData = new ArrayList(); - - public MyTableModel(java.util.List> data) { - init(data); - } + private final List myData = new ArrayList(); public MyTableModel() { } - public void init(java.util.List> data) { + public void init(List> data) { myData.clear(); - for (Iterator> it = data.iterator(); it.hasNext();) { - final Pair pair = it.next(); + for (final Pair pair : data) { myData.add(new Row(pair.getFirst(), pair.getSecond())); } } @@ -465,14 +469,6 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable{ } } - public String getNameAt(int row) { - return (row >= 0 && row < myData.size())? myData.get(row).name : null; - } - - public TextWithImports getExpressionAt(int row) { - return (row >= 0 && row < myData.size())? myData.get(row).value : null; - } - public void clear() { myData.clear(); fireTableDataChanged(); @@ -480,8 +476,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable{ public List> getExpressions() { final ArrayList> pairs = new ArrayList>(myData.size()); - for (Iterator it = myData.iterator(); it.hasNext();) { - final Row row = it.next(); + for (final Row row : myData) { pairs.add(new Pair(row.name, row.value)); } return pairs; @@ -495,10 +490,6 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable{ this.name = name; this.value = value; } - - public Row() { - this("", new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, "")); - } } } } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java index 463f2ac9df5c..a0d706ddca0b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java @@ -17,6 +17,7 @@ package com.intellij.debugger.settings; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.impl.DebuggerUtilsEx; +import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.debugger.ui.tree.render.ClassRenderer; import com.intellij.debugger.ui.tree.render.ToStringRenderer; import com.intellij.openapi.options.SearchableConfigurable; @@ -28,6 +29,7 @@ import com.intellij.ui.StateRestoringCheckBox; import com.intellij.ui.classFilter.ClassFilterEditor; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.ChangeEvent; @@ -58,16 +60,18 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { private ClassFilterEditor myToStringFilterEditor; private JTextField myValueTooltipDelayField; - private final Project myProject; + private Project myProject; private RegistryCheckBox myAutoTooltip; - public DebuggerDataViewsConfigurable(Project project) { + public DebuggerDataViewsConfigurable(@Nullable Project project) { myProject = project; myArrayRendererConfigurable = new ArrayRendererConfigurable(NodeRendererSettings.getInstance().getArrayRenderer()); } public void disposeUIResources() { myArrayRendererConfigurable.disposeUIResources(); + myToStringFilterEditor = null; + myProject = null; } public String getDisplayName() { @@ -75,6 +79,9 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { } public JComponent createComponent() { + if (myProject == null) { + myProject = JavaDebuggerSupport.getCurrentProject(); + } final JPanel panel = new JPanel(new GridBagLayout()); myCbAutoscroll = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.autoscroll")); @@ -174,7 +181,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { try { DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY = Integer.parseInt(myValueTooltipDelayField.getText().trim()); } - catch (NumberFormatException e) { + catch (NumberFormatException ignored) { } generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myCbAutoscroll.isSelected(); rendererSettings.setAlternateCollectionViewsEnabled(myCbEnableAlternateViews.isSelected()); @@ -243,7 +250,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { try { return DebuggerSettings.getInstance().VALUE_LOOKUP_DELAY != Integer.parseInt(myValueTooltipDelayField.getText().trim()); } - catch (NumberFormatException e) { + catch (NumberFormatException ignored) { } return false; } @@ -289,6 +296,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { return false; } + @NotNull public String getHelpTopic() { return "reference.idesettings.debugger.dataviews"; } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java index 22ef9e5cb8d8..a8141be6e9e7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSteppingConfigurable.java @@ -16,6 +16,7 @@ package com.intellij.debugger.settings; import com.intellij.debugger.DebuggerBundle; +import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.ui.classFilter.ClassFilterEditor; @@ -33,11 +34,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable { private JCheckBox myCbSkipClassLoaders; private ClassFilterEditor mySteppingFilterEditor; private JCheckBox myCbSkipSimpleGetters; - private final Project myProject; - - public DebuggerSteppingConfigurable(Project project) { - myProject = project; - } + private Project myProject; public void reset() { final DebuggerSettings settings = DebuggerSettings.getInstance(); @@ -84,6 +81,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable { return null; } + @NotNull public String getHelpTopic() { return "reference.idesettings.debugger.stepping"; } @@ -99,7 +97,7 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable { public JComponent createComponent() { final JPanel panel = new JPanel(new GridBagLayout()); - + myProject = JavaDebuggerSupport.getCurrentProject(); myCbSkipSyntheticMethods = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.synthetic.methods")); myCbSkipConstructors = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.constructors")); myCbSkipClassLoaders = new JCheckBox(DebuggerBundle.message("label.debugger.general.configurable.skip.classloaders")); @@ -123,6 +121,8 @@ public class DebuggerSteppingConfigurable implements SearchableConfigurable { } public void disposeUIResources() { + mySteppingFilterEditor = null; + myProject = null; } } \ No newline at end of file diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java index 8629cfa09a2b..1ef9ce1d580d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/UserRenderersConfigurable.java @@ -28,6 +28,7 @@ import com.intellij.openapi.util.IconLoader; import com.intellij.ui.DocumentAdapter; import com.intellij.util.containers.InternalIterator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -53,7 +54,7 @@ public class UserRenderersConfigurable implements SearchableConfigurable { private NodeRenderer myCurrentRenderer = null; private final CompoundRendererConfigurable myRendererDataConfigurable; - public UserRenderersConfigurable(Project project) { + public UserRenderersConfigurable(@Nullable Project project) { myRendererDataConfigurable = new CompoundRendererConfigurable(project); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java index 71646e033b74..0a8eaa55aa8b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java @@ -22,10 +22,13 @@ import com.intellij.debugger.settings.*; import com.intellij.debugger.ui.breakpoints.Breakpoint; import com.intellij.debugger.ui.breakpoints.BreakpointFactory; import com.intellij.debugger.ui.breakpoints.BreakpointPanel; +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.xdebugger.AbstractDebuggerSession; import com.intellij.xdebugger.impl.DebuggerSupport; @@ -206,11 +209,11 @@ public class JavaDebuggerSupport extends DebuggerSupport { return new DebuggerLaunchingConfigurable(); } - public Collection getConfigurables(final Project project) { + public Collection getConfigurables() { final ArrayList configurables = new ArrayList(); - configurables.add(new DebuggerDataViewsConfigurable(project)); - configurables.add(new DebuggerSteppingConfigurable(project)); - configurables.add(new UserRenderersConfigurable(project)); + configurables.add(new DebuggerDataViewsConfigurable(null)); + configurables.add(new DebuggerSteppingConfigurable()); + configurables.add(new UserRenderersConfigurable(null)); configurables.add(new DebuggerHotswapConfigurable()); return configurables; } @@ -219,4 +222,13 @@ public class JavaDebuggerSupport extends DebuggerSupport { NodeRendererSettings.getInstance().fireRenderersChanged(); } } + + public static Project getCurrentProject() { + //todo[nik] improve + Project project = PlatformDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext()); + if (project != null) { + return project; + } + return ProjectManager.getInstance().getDefaultProject(); + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java index 2469d49f3cb7..84f20cbc1544 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java @@ -15,12 +15,8 @@ */ package com.intellij.xdebugger.impl.settings; -import com.intellij.ide.DataManager; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableProvider; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; import com.intellij.xdebugger.impl.DebuggerSupport; import java.util.ArrayList; @@ -47,14 +43,9 @@ public class DebuggerConfigurableProvider extends ConfigurableProvider { } }); - Project project = PlatformDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext()); - if(project == null) { - project = ProjectManager.getInstance().getDefaultProject(); - } - Configurable rootConfigurable = null; for (DebuggerSettingsPanelProvider provider : providers) { - configurables.addAll(provider.getConfigurables(project)); + configurables.addAll(provider.getConfigurables()); final Configurable aRootConfigurable = provider.getRootConfigurable(); if (aRootConfigurable != null) { if (rootConfigurable != null) { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java index 318f522857eb..ba0bb43621e9 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerSettingsPanelProvider.java @@ -16,7 +16,6 @@ package com.intellij.xdebugger.impl.settings; import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.project.Project; import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -28,7 +27,7 @@ public abstract class DebuggerSettingsPanelProvider { public abstract int getPriority(); - public abstract Collection getConfigurables(final Project project); + public abstract Collection getConfigurables(); public void apply() { } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java index bb1a6793ff7a..6dc0a5bc21d9 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/XDebuggerSettingsPanelProviderImpl.java @@ -30,7 +30,7 @@ public class XDebuggerSettingsPanelProviderImpl extends DebuggerSettingsPanelPro return 0; } - public Collection getConfigurables(final Project project) { + public Collection getConfigurables() { ArrayList list = new ArrayList(); for (XDebuggerSettings settings : XDebuggerSettingsManager.getInstance().getSettingsList()) { list.add(settings.createConfigurable());