From 41d73b1d07ffab4e8755237faf8ef054f8f97cc5 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 18 Feb 2005 19:59:59 +0300 Subject: [PATCH] (no message) --- .../debugger/engine/DebuggerUtils.java | 23 +- .../actions/AdjustArrayRangeAction.java | 55 +++- .../actions/CustomizeContextViewAction.java | 9 +- .../actions/CustomizeThreadsViewAction.java | 6 +- .../debugger/engine/DebugProcessImpl.java | 34 ++- .../debugger/impl/DebuggerUtilsEx.java | 12 +- ...cDebuggerParametersRunnerConfigurable.java | 11 +- .../settings/ArrayRendererConfigurable.java | 86 ++++-- .../settings/BaseRenderersConfigurable.java | 229 ++++++++++++++++ .../settings/CompositeConfigurable.java | 29 +- .../settings/DebuggerConfigurable.java | 1 - .../settings/DebuggerGeneralConfigurable.java | 253 ++++++++++++------ .../debugger/settings/DebuggerSettings.java | 28 +- .../settings/NodeRendererSettings.java | 123 ++++++++- .../settings/RendererConfiguration.java | 11 - .../settings/ViewsGeneralConfigurable.java | 130 --------- .../settings/ViewsGeneralSettings.java | 1 - .../debugger/ui/ClassFilterEditor.java | 21 +- .../ui/tree/render/CompoundNodeRenderer.java | 2 +- .../render/CompoundReferenceRenderer.java | 7 +- .../ui/tree/render/ToStringRenderer.java | 89 +++++- .../openapi/util/JDOMExternalizerUtil.java | 7 - 22 files changed, 792 insertions(+), 375 deletions(-) create mode 100644 source/com/intellij/debugger/settings/BaseRenderersConfigurable.java delete mode 100644 source/com/intellij/debugger/settings/ViewsGeneralConfigurable.java diff --git a/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java b/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java index d5c032ced6b3..5f6c2c48514d 100644 --- a/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java +++ b/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java @@ -206,27 +206,38 @@ public abstract class DebuggerUtils implements ApplicationComponent { private static Type getSuperTypeInt(Type subType, String superType) { Type result; - if (subType == null) return null; + if (subType == null) { + return null; + } - if (subType.name().equals(superType)) return subType; + if (subType.name().equals(superType)) { + return subType; + } if (subType instanceof ClassType) { result = getSuperType(((ClassType)subType).superclass(), superType); - if (result != null) return result; + if (result != null) { + return result; + } List ifaces = ((ClassType)subType).allInterfaces(); for (Iterator iterator = ifaces.iterator(); iterator.hasNext();) { InterfaceType interfaceType = (InterfaceType)iterator.next(); - if (interfaceType.name().equals(superType)) return interfaceType; + if (interfaceType.name().equals(superType)) { + return interfaceType; + } } return null; } - else if (subType instanceof InterfaceType) { + + if (subType instanceof InterfaceType) { List ifaces = ((InterfaceType)subType).superinterfaces(); for (Iterator iterator = ifaces.iterator(); iterator.hasNext();) { InterfaceType interfaceType = (InterfaceType)iterator.next(); result = getSuperType(interfaceType, superType); - if (result != null) return result; + if (result != null) { + return result; + } } } else if (subType instanceof ArrayType) { diff --git a/source/com/intellij/debugger/actions/AdjustArrayRangeAction.java b/source/com/intellij/debugger/actions/AdjustArrayRangeAction.java index dfb7b47b3553..b037fff72b7c 100644 --- a/source/com/intellij/debugger/actions/AdjustArrayRangeAction.java +++ b/source/com/intellij/debugger/actions/AdjustArrayRangeAction.java @@ -8,18 +8,27 @@ import com.intellij.debugger.ui.tree.render.ArrayRenderer; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.events.SuspendContextCommandImpl; +import com.intellij.debugger.settings.ArrayRendererConfigurable; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataConstants; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.options.ex.SingleConfigurableEditor; +import com.intellij.openapi.options.Configurable; + +import javax.swing.*; public class AdjustArrayRangeAction extends DebuggerAction { public void actionPerformed(AnActionEvent e) { DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(e.getDataContext()); - if(debuggerContext == null) return; + if(debuggerContext == null) { + return; + } DebugProcessImpl debugProcess = debuggerContext.getDebugProcess(); - if(debugProcess == null) return; + if(debugProcess == null) { + return; + } Project project = debuggerContext.getProject(); @@ -28,7 +37,9 @@ public class AdjustArrayRangeAction extends DebuggerAction { return; } NodeDescriptorImpl descriptor = selectedNode.getDescriptor(); - if(!(descriptor instanceof ValueDescriptorImpl && ((ValueDescriptorImpl)descriptor).isArray())) return; + if(!(descriptor instanceof ValueDescriptorImpl && ((ValueDescriptorImpl)descriptor).isArray())) { + return; + } ArrayRenderer renderer = (ArrayRenderer)((ValueDescriptorImpl)selectedNode.getDescriptor()).getLastRenderer(); @@ -39,10 +50,17 @@ public class AdjustArrayRangeAction extends DebuggerAction { title = title + " " + label.substring(index); } final ArrayRenderer cloneRenderer = renderer.clone(); - AdjustRangeDialog dialog = new AdjustRangeDialog(project, title, cloneRenderer); - dialog.show(); - - if(dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { + SingleConfigurableEditor editor = new SingleConfigurableEditor(project, new NamedArrayConfigurable(title, cloneRenderer)) { + protected Action[] createActions() { + final String helpTopic = myConfigurable.getHelpTopic(); + return (helpTopic != null)? + new Action[]{getOKAction(), getCancelAction(), getHelpAction()} : + new Action[]{getOKAction(), getCancelAction()}; + } + }; + editor.show(); + + if(editor.getExitCode() == DialogWrapper.OK_EXIT_CODE) { debugProcess.getManagerThread().invokeLater(new SuspendContextCommandImpl(debuggerContext.getSuspendContext()) { public void contextAction() throws Exception { selectedNode.setRenderer(cloneRenderer); @@ -63,7 +81,7 @@ public class AdjustArrayRangeAction extends DebuggerAction { private static String createNodeTitle(String prefix, DebuggerTreeNodeImpl node) { if (node != null) { - DebuggerTreeNodeImpl parent = (DebuggerTreeNodeImpl)node.getParent(); + DebuggerTreeNodeImpl parent = node.getParent(); NodeDescriptorImpl descriptor = parent.getDescriptor(); if (descriptor instanceof ValueDescriptorImpl && ((ValueDescriptorImpl)descriptor).isArray()) { int index = parent.getIndex(node); @@ -74,4 +92,25 @@ public class AdjustArrayRangeAction extends DebuggerAction { } return prefix; } + + private static class NamedArrayConfigurable extends ArrayRendererConfigurable implements Configurable { + private String myTitle; + + public NamedArrayConfigurable(String title, ArrayRenderer renderer) { + super(renderer); + myTitle = title; + } + + public String getDisplayName() { + return myTitle; + } + + public Icon getIcon() { + return null; + } + + public String getHelpTopic() { + return null; + } + } } \ No newline at end of file diff --git a/source/com/intellij/debugger/actions/CustomizeContextViewAction.java b/source/com/intellij/debugger/actions/CustomizeContextViewAction.java index f8f973445f7e..d9171de3c8d8 100644 --- a/source/com/intellij/debugger/actions/CustomizeContextViewAction.java +++ b/source/com/intellij/debugger/actions/CustomizeContextViewAction.java @@ -1,13 +1,13 @@ package com.intellij.debugger.actions; import com.intellij.debugger.settings.*; -import com.intellij.debugger.ui.PropertiesDialog; import com.intellij.debugger.ui.impl.FrameDebuggerTree; import com.intellij.debugger.ui.impl.watch.DebuggerTree; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataConstants; import com.intellij.openapi.project.Project; import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.options.ex.SingleConfigurableEditor; import javax.swing.*; import java.util.List; @@ -22,10 +22,10 @@ public class CustomizeContextViewAction extends DebuggerAction{ public void actionPerformed(AnActionEvent e) { final Project project = (Project)e.getDataContext().getData(DataConstants.PROJECT); - CompositeConfigurable configurable = new CompositeConfigurable() { + final CompositeConfigurable configurable = new CompositeConfigurable() { protected List createConfigurables() { ArrayList array = new ArrayList(); - array.add(new ViewsGeneralConfigurable()); + array.add(new BaseRenderersConfigurable(project)); array.add(new NodeRendererConfigurable(project)); return array; } @@ -43,8 +43,7 @@ public class CustomizeContextViewAction extends DebuggerAction{ } }; - PropertiesDialog dialog = new PropertiesDialog(configurable, project); - dialog.show(); + new SingleConfigurableEditor(project, configurable).show(); } public void update(AnActionEvent e) { diff --git a/source/com/intellij/debugger/actions/CustomizeThreadsViewAction.java b/source/com/intellij/debugger/actions/CustomizeThreadsViewAction.java index 57001fc19959..6e9f93909ec1 100644 --- a/source/com/intellij/debugger/actions/CustomizeThreadsViewAction.java +++ b/source/com/intellij/debugger/actions/CustomizeThreadsViewAction.java @@ -1,11 +1,11 @@ package com.intellij.debugger.actions; import com.intellij.debugger.settings.ThreadsViewSettings; -import com.intellij.debugger.ui.PropertiesDialog; import com.intellij.debugger.ui.impl.ThreadsDebuggerTree; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataConstants; import com.intellij.openapi.project.Project; +import com.intellij.openapi.options.ex.SingleConfigurableEditor; /** * User: lex @@ -15,8 +15,8 @@ import com.intellij.openapi.project.Project; public class CustomizeThreadsViewAction extends DebuggerAction { public void actionPerformed(AnActionEvent e) { Project project = (Project)e.getDataContext().getData(DataConstants.PROJECT); - PropertiesDialog dialog = new PropertiesDialog(ThreadsViewSettings.getInstance().getConfigurable(), project); - dialog.show(); + final SingleConfigurableEditor editor = new SingleConfigurableEditor(project, ThreadsViewSettings.getInstance().getConfigurable()); + editor.show(); } public void update(AnActionEvent e) { diff --git a/source/com/intellij/debugger/engine/DebugProcessImpl.java b/source/com/intellij/debugger/engine/DebugProcessImpl.java index 6847c01f95df..cbc3e170e939 100644 --- a/source/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/source/com/intellij/debugger/engine/DebugProcessImpl.java @@ -114,7 +114,7 @@ public abstract class DebugProcessImpl implements DebugProcess { private final DescriptorHistoryManager myDescriptorHistoryManager; - private final List myRenderers = new ArrayList(); + private final List myRenderers = new ArrayList(); private final Map myNodeRederersMap = new com.intellij.util.containers.HashMap(); private final NodeRendererSettingsListener mySettingsListener = new NodeRendererSettingsListener() { public void renderersChanged() { @@ -145,16 +145,12 @@ public abstract class DebugProcessImpl implements DebugProcess { private void loadRenderers() { getManagerThread().invoke(new DebuggerCommandImpl() { protected void action() throws Exception { - if(ViewsGeneralSettings.getInstance().USE_ALTERNATIVE_RENDERERS) { - final NodeRendererSettings settings = ((NodeRendererSettings) NodeRendererSettings.getInstance()); - settings.iterateRenderers(new InternalIterator() { - public boolean visit(AutoRendererNode rendererNode) { - if(rendererNode.getRenderer() instanceof ValueLabelRenderer) { - myRenderers.add(rendererNode); - } - return true; - } - }); + final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); + for (Iterator it = rendererSettings.getAllRenderers().iterator(); it.hasNext();) { + final NodeRenderer renderer = it.next(); + if(renderer.isEnabled() && renderer instanceof ValueLabelRenderer) { + myRenderers.add(renderer); + } } } }); @@ -167,10 +163,10 @@ public abstract class DebugProcessImpl implements DebugProcess { NodeRenderer renderer = myNodeRederersMap.get(type); if(renderer == null) { - for (Iterator iterator = myRenderers.iterator(); iterator.hasNext();) { - final AutoRendererNode nodeAutoRenderer = iterator.next(); - if(nodeAutoRenderer.isApplicable(type, false)) { - renderer = nodeAutoRenderer.getRenderer(); + for (Iterator iterator = myRenderers.iterator(); iterator.hasNext();) { + final NodeRenderer nodeRenderer = iterator.next(); + if(nodeRenderer.isApplicable(type)) { + renderer = nodeRenderer; break; } } @@ -186,17 +182,17 @@ public abstract class DebugProcessImpl implements DebugProcess { public NodeRenderer getDefaultRenderer(Type type) { final NodeRendererSettings settings = NodeRendererSettings.getInstance(); - final PrimitiveRenderer primitiveRenderer = (PrimitiveRenderer)settings.getPrimitiveRenderer(); + final PrimitiveRenderer primitiveRenderer = settings.getPrimitiveRenderer(); if(primitiveRenderer.isApplicable(type)) { return primitiveRenderer; } - final ArrayRenderer arrayRenderer = (ArrayRenderer)settings.getArrayRenderer(); + final ArrayRenderer arrayRenderer = settings.getArrayRenderer(); if(arrayRenderer.isApplicable(type)) { return arrayRenderer; } - final ClassRenderer classRenderer = (ClassRenderer)settings.getClassRenderer(); + final ClassRenderer classRenderer = settings.getClassRenderer(); LOG.assertTrue(classRenderer.isApplicable(type), type.name()); return classRenderer; } @@ -320,7 +316,7 @@ public abstract class DebugProcessImpl implements DebugProcess { String currentClassName = getCurrentClassName(stepThread); if (currentClassName == null || !settings.isNameFiltered(currentClassName)) { // add class filters - ClassFilter[] filters = settings.getFilters(); + ClassFilter[] filters = settings.getSteppingFilters(); for (int idx = 0; idx < filters.length; idx++) { if (filters[idx].isEnabled()) { stepRequest.addClassExclusionFilter(filters[idx].getPattern()); diff --git a/source/com/intellij/debugger/impl/DebuggerUtilsEx.java b/source/com/intellij/debugger/impl/DebuggerUtilsEx.java index 62aaf9e0739f..6d34707518f9 100644 --- a/source/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/source/com/intellij/debugger/impl/DebuggerUtilsEx.java @@ -185,14 +185,16 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { } public static ClassFilter[] readFilters(List children) throws InvalidDataException { - List classFiltersList = new LinkedList(); + if (children == null || children.size() == 0) { + return ClassFilter.EMPTY_ARRAY; + } + List classFiltersList = new ArrayList(children.size()); for (Iterator i = children.iterator(); i.hasNext();) { - Element filter = (Element)i.next(); - ClassFilter classFilter = new ClassFilter(); - classFilter.readExternal(filter); + final ClassFilter classFilter = new ClassFilter(); + classFilter.readExternal((Element)i.next()); classFiltersList.add(classFilter); } - return (ClassFilter[])classFiltersList.toArray(new ClassFilter[classFiltersList.size()]); + return classFiltersList.toArray(new ClassFilter[classFiltersList.size()]); } public static void writeFilters(Element parentNode, String tagName, ClassFilter[] filters) throws WriteExternalException { diff --git a/source/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java b/source/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java index f3b486f7101e..d51fb66a22ca 100644 --- a/source/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java +++ b/source/com/intellij/debugger/impl/GenericDebuggerParametersRunnerConfigurable.java @@ -1,14 +1,15 @@ package com.intellij.debugger.impl; -import com.intellij.debugger.settings.*; -import com.intellij.debugger.ui.PropertiesDialog; +import com.intellij.debugger.settings.DebuggerConfigurable; +import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.options.ex.SingleConfigurableEditor; import com.intellij.openapi.project.Project; import javax.swing.*; -import java.awt.event.ActionListener; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; /* * Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved. @@ -31,8 +32,8 @@ public class GenericDebuggerParametersRunnerConfigurable extends SettingsEditor< myDebuggerSettings.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DebuggerConfigurable debuggerConfigurable = new DebuggerConfigurable(); - PropertiesDialog dialog = new PropertiesDialog(debuggerConfigurable, project); - dialog.show(); + SingleConfigurableEditor editor = new SingleConfigurableEditor(project, debuggerConfigurable); + editor.show(); if("".equals(getPort())) { setPort(GenericDebuggerRunnerSettings.getDefaultPort(getTransport())); } diff --git a/source/com/intellij/debugger/settings/ArrayRendererConfigurable.java b/source/com/intellij/debugger/settings/ArrayRendererConfigurable.java index 2eca8d2e1c96..46523d6bee69 100644 --- a/source/com/intellij/debugger/settings/ArrayRendererConfigurable.java +++ b/source/com/intellij/debugger/settings/ArrayRendererConfigurable.java @@ -8,6 +8,7 @@ import com.intellij.openapi.ui.Messages; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import java.awt.*; /* * Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved. @@ -16,39 +17,18 @@ import javax.swing.event.DocumentListener; public class ArrayRendererConfigurable implements UnnamedConfigurable{ private JTextField myEntriesLimit; - private JTextField myFirstIndex; + private JTextField myStartIndex; private JTextField myEndIndex; private ArrayRenderer myRenderer; private JComponent myPanel; private JLabel myEntriesLimitLabel; - private JLabel myLastIndexLabel; - private JLabel myFirstIndexLabel; + private JLabel myEndIndexLabel; + private JLabel myStartIndexLabel; public ArrayRendererConfigurable(ArrayRenderer renderer) { myRenderer = renderer; - - myFirstIndexLabel.setLabelFor(myFirstIndex); - myLastIndexLabel.setLabelFor(myLastIndexLabel); - myEntriesLimitLabel.setLabelFor(myEntriesLimit); - - final DocumentListener listener = new DocumentListener() { - private void updateEntriesLimit() { - myEntriesLimit.setText(String.valueOf(getInt(myEndIndex) - getInt(myFirstIndex) + 1)); - } - public void changedUpdate(DocumentEvent e) { - updateEntriesLimit(); - } - public void insertUpdate (DocumentEvent e) { - updateEntriesLimit(); - } - public void removeUpdate (DocumentEvent e) { - updateEntriesLimit(); - } - }; - myFirstIndex.getDocument().addDocumentListener(listener); - myEndIndex.getDocument().addDocumentListener(listener); } public ArrayRenderer getRenderer() { @@ -56,7 +36,7 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{ } public void reset() { - myFirstIndex.setText(String.valueOf(myRenderer.START_INDEX)); + myStartIndex.setText(String.valueOf(myRenderer.START_INDEX)); myEndIndex.setText(String.valueOf(myRenderer.END_INDEX)); myEntriesLimit.setText(String.valueOf(myRenderer.ENTRIES_LIMIT)); } @@ -66,7 +46,7 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{ } private void applyTo(ArrayRenderer renderer) { - int newStartIndex = getInt(myFirstIndex); + int newStartIndex = getInt(myStartIndex); int newEndIndex = getInt(myEndIndex); int newLimit = getInt(myEntriesLimit); @@ -77,7 +57,9 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{ newEndIndex = newStartIndex + (currentEndIndex - currentStartIndex); } - if(newLimit <= 0) newLimit = 1; + if(newLimit <= 0) { + newLimit = 1; + } if(newEndIndex - newStartIndex > 10000) { if(Messages.showOkCancelDialog(myPanel.getRootPane(), "Range specified is too big. IDEA needs too much resources to perform requested operation. Are you shure you want to continue?", "Range is Too Big", Messages.getWarningIcon()) != DialogWrapper.OK_EXIT_CODE) return; @@ -90,6 +72,56 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{ } public JComponent createComponent() { + myPanel = new JPanel(new GridBagLayout()); + + myStartIndex = new JTextField(5); + myEndIndex = new JTextField(5); + myEntriesLimit = new JTextField(5); + + final FontMetrics fontMetrics = myStartIndex.getFontMetrics(myStartIndex.getFont()); + final Dimension minSize = new Dimension(myStartIndex.getPreferredSize()); + minSize.width = fontMetrics.stringWidth("AAAAA"); + myStartIndex.setMinimumSize(minSize); + myEndIndex.setMinimumSize(minSize); + myEntriesLimit.setMinimumSize(minSize); + + myStartIndexLabel = new JLabel("Array start index:"); + myStartIndexLabel.setLabelFor(myStartIndex); + myStartIndexLabel.setDisplayedMnemonic('r'); + + myEndIndexLabel = new JLabel("end index:"); + myEndIndexLabel.setLabelFor(myEndIndex); + myEndIndexLabel.setDisplayedMnemonic('d'); + + myEntriesLimitLabel = new JLabel("Show maximum"); + myEntriesLimitLabel.setLabelFor(myEntriesLimit); + myEntriesLimitLabel.setDisplayedMnemonic('m'); + + myPanel.add(myStartIndexLabel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 4), 0, 0)); + myPanel.add(myStartIndex, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 4), 0, 0)); + myPanel.add(myEndIndexLabel, new GridBagConstraints(2, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 4), 0, 0)); + myPanel.add(myEndIndex, new GridBagConstraints(3, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 4), 0, 0)); + + myPanel.add(myEntriesLimitLabel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 4), 0, 0)); + myPanel.add(myEntriesLimit, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 4), 0, 0)); + myPanel.add(new JLabel("array elements"), new GridBagConstraints(2, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 4), 0, 0)); + + final DocumentListener listener = new DocumentListener() { + private void updateEntriesLimit() { + myEntriesLimit.setText(String.valueOf(getInt(myEndIndex) - getInt(myStartIndex) + 1)); + } + public void changedUpdate(DocumentEvent e) { + updateEntriesLimit(); + } + public void insertUpdate (DocumentEvent e) { + updateEntriesLimit(); + } + public void removeUpdate (DocumentEvent e) { + updateEntriesLimit(); + } + }; + myStartIndex.getDocument().addDocumentListener(listener); + myEndIndex.getDocument().addDocumentListener(listener); return myPanel; } diff --git a/source/com/intellij/debugger/settings/BaseRenderersConfigurable.java b/source/com/intellij/debugger/settings/BaseRenderersConfigurable.java new file mode 100644 index 000000000000..b6deb15afe16 --- /dev/null +++ b/source/com/intellij/debugger/settings/BaseRenderersConfigurable.java @@ -0,0 +1,229 @@ +package com.intellij.debugger.settings; + +import com.intellij.debugger.impl.DebuggerUtilsEx; +import com.intellij.debugger.ui.ClassFilterEditor; +import com.intellij.debugger.ui.tree.render.ClassRenderer; +import com.intellij.debugger.ui.tree.render.ToStringRenderer; +import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.project.Project; +import com.intellij.ui.StateRestoringCheckBox; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +/** + * @author Eugene Belyaev + */ +public class BaseRenderersConfigurable implements Configurable { + private JCheckBox myCbAutoscroll; + private JCheckBox myCbShowSyntheticFields; + private JCheckBox myCbSort; + private JCheckBox myCbHideNullArrayElements; + private JCheckBox myCbShowStatic; + private StateRestoringCheckBox myCbShowStaticFinalFields; + private ArrayRendererConfigurable myArrayRendererConfigurable; + private JCheckBox myCbEnableAlternateViews; + + private JCheckBox myCbEnableToString; + private JRadioButton myRbAllThatOverride; + private JRadioButton myRbFromList; + private ClassFilterEditor myToStringFilterEditor; + private final Project myProject; + + public BaseRenderersConfigurable(Project project) { + myProject = project; + myArrayRendererConfigurable = new ArrayRendererConfigurable(NodeRendererSettings.getInstance().getArrayRenderer()); + } + + public void disposeUIResources() { + myArrayRendererConfigurable.disposeUIResources(); + } + + public String getDisplayName() { + return "Data views"; + } + + public JComponent createComponent() { + final JPanel panel = new JPanel(new GridBagLayout()); + + myCbAutoscroll = new JCheckBox("Autoscroll to new local variables"); + myCbAutoscroll.setMnemonic('l'); + myCbShowSyntheticFields = new JCheckBox("Show synthetic fields"); + myCbShowSyntheticFields.setMnemonic('y'); + myCbSort = new JCheckBox("Sort alphabetically"); + myCbSort.setMnemonic('l'); + myCbHideNullArrayElements = new JCheckBox("Hile null array elements"); + myCbHideNullArrayElements.setMnemonic('n'); + myCbShowStatic = new JCheckBox("Show static fields"); + myCbShowStatic.setMnemonic('s'); + myCbShowStaticFinalFields = new StateRestoringCheckBox("Show static final fields"); + myCbShowStaticFinalFields.setMnemonic('f'); + myCbEnableAlternateViews = new JCheckBox("Alternate view for Collections classes"); + myCbEnableAlternateViews.setMnemonic('C'); + myCbShowStatic.addChangeListener(new ChangeListener(){ + public void stateChanged(ChangeEvent e) { + if(myCbShowStatic.isSelected()) { + myCbShowStaticFinalFields.makeSelectable(); + } + else { + myCbShowStaticFinalFields.makeUnselectable(false); + } + } + }); + myCbEnableToString = new JCheckBox("Enable 'toString()' object view:"); + myCbEnableToString.setMnemonic('o'); + myRbAllThatOverride = new JRadioButton("For all classes that override 'toString()' method"); + myRbFromList = new JRadioButton("For classes from the list:"); + ButtonGroup group = new ButtonGroup(); + group.add(myRbAllThatOverride); + group.add(myRbFromList); + myToStringFilterEditor = new ClassFilterEditor(myProject); + myCbEnableToString.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + final boolean enabled = myCbEnableToString.isSelected(); + myRbAllThatOverride.setEnabled(enabled); + myRbFromList.setEnabled(enabled); + myToStringFilterEditor.setEnabled(enabled && myRbFromList.isSelected()); + } + }); + myRbFromList.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + myToStringFilterEditor.setEnabled(myCbEnableToString.isSelected() && myRbFromList.isSelected()); + } + }); + + panel.add(myCbSort, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 10), 0, 0)); + panel.add(myCbAutoscroll, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 4, 0, 10), 0, 0)); + panel.add(myCbEnableAlternateViews, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 2, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 6, 0, 10), 0, 0)); + + panel.add(myCbShowStatic, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 6, 0, 10), 0, 0)); + panel.add(myCbShowStaticFinalFields, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 12, 0, 10), 0, 0)); + panel.add(myCbShowSyntheticFields, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 2, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 6, 0, 10), 0, 0)); + + panel.add(myArrayRendererConfigurable.createComponent(), new GridBagConstraints(2, GridBagConstraints.RELATIVE, 1, 2, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(2, 8, 0, 0), 0, 0)); + panel.add(myCbHideNullArrayElements, new GridBagConstraints(2, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 6, 0, 0), 0, 0)); + + // starting 4-th row + panel.add(myCbEnableToString, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 4, 0, 0), 0, 0)); + panel.add(myRbAllThatOverride, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 8, 0, 0), 0, 0)); + panel.add(myRbFromList, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 8, 0, 0), 0, 0)); + panel.add(myToStringFilterEditor, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 16, 0, 0), 0, 0)); + + return panel; + } + + public Icon getIcon() { + return null; + } + + public void apply() { + final boolean renderersWereModified = areDefaultRenderersModified(); + + final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); + final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); + + generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myCbAutoscroll.isSelected(); + rendererSettings.setAlternateCollectionViewsEnabled(myCbEnableAlternateViews.isSelected()); + generalSettings.HIDE_NULL_ARRAY_ELEMENTS = myCbHideNullArrayElements.isSelected(); + + final ClassRenderer classRenderer = rendererSettings.getClassRenderer(); + classRenderer.SORT_ASCENDING = myCbSort.isSelected(); + classRenderer.SHOW_STATIC = myCbShowStatic.isSelected(); + classRenderer.SHOW_STATIC_FINAL = myCbShowStaticFinalFields.isSelectedWhenSelectable(); + classRenderer.SHOW_SYNTHETICS = myCbShowSyntheticFields.isSelected(); + + final ToStringRenderer toStringRenderer = rendererSettings.getToStringRenderer(); + toStringRenderer.setEnabled(myCbEnableToString.isSelected()); + toStringRenderer.setUseClassFilters(myRbFromList.isSelected()); + toStringRenderer.setClassFilters(myToStringFilterEditor.getFilters()); + + myArrayRendererConfigurable.apply(); + + if (renderersWereModified) { + rendererSettings.fireRenderersChanged(); + } + } + + public void reset() { + final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); + final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); + + myCbAutoscroll.setSelected(generalSettings.AUTOSCROLL_TO_NEW_LOCALS); + myCbHideNullArrayElements.setSelected(generalSettings.HIDE_NULL_ARRAY_ELEMENTS); + myCbEnableAlternateViews.setSelected(rendererSettings.areAlternateCollectionViewsEnabled()); + + ClassRenderer classRenderer = rendererSettings.getClassRenderer(); + + myCbShowSyntheticFields.setSelected(classRenderer.SHOW_SYNTHETICS); + myCbSort.setSelected(classRenderer.SORT_ASCENDING); + myCbShowStatic.setSelected(classRenderer.SHOW_STATIC); + myCbShowStaticFinalFields.setSelected(classRenderer.SHOW_STATIC_FINAL); + if(!classRenderer.SHOW_STATIC) { + myCbShowStaticFinalFields.makeUnselectable(false); + } + + final ToStringRenderer toStringRenderer = rendererSettings.getToStringRenderer(); + final boolean toStringEnabled = toStringRenderer.isEnabled(); + final boolean useClassFilters = toStringRenderer.isUseClassFilters(); + myCbEnableToString.setSelected(toStringEnabled); + myRbAllThatOverride.setSelected(!useClassFilters); + myRbFromList.setSelected(useClassFilters); + myToStringFilterEditor.setFilters(toStringRenderer.getClassFilters()); + myToStringFilterEditor.setEnabled(toStringEnabled && useClassFilters); + myRbFromList.setEnabled(toStringEnabled); + myRbAllThatOverride.setEnabled(toStringEnabled); + + myArrayRendererConfigurable.reset(); + } + + public boolean isModified() { + return areGeneralSettingsModified() || areDefaultRenderersModified(); + } + + private boolean areGeneralSettingsModified() { + ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); + return + (generalSettings.AUTOSCROLL_TO_NEW_LOCALS != myCbAutoscroll.isSelected()) || + (generalSettings.HIDE_NULL_ARRAY_ELEMENTS != myCbHideNullArrayElements.isSelected()); + } + + private boolean areDefaultRenderersModified() { + if (myArrayRendererConfigurable.isModified()) { + return true; + } + final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); + + final ClassRenderer classRenderer = rendererSettings.getClassRenderer(); + final boolean isClassRendererModified= + (classRenderer.SORT_ASCENDING != myCbSort.isSelected()) || + (classRenderer.SHOW_STATIC != myCbShowStatic.isSelected()) || + (classRenderer.SHOW_STATIC_FINAL != myCbShowStaticFinalFields.isSelectedWhenSelectable()) || + (classRenderer.SHOW_SYNTHETICS != myCbShowSyntheticFields.isSelected()); + if (isClassRendererModified) { + return true; + } + + final ToStringRenderer toStringRenderer = rendererSettings.getToStringRenderer(); + final boolean isToStringRendererModified = + (toStringRenderer.isEnabled() != myCbEnableToString.isSelected()) || + (toStringRenderer.isUseClassFilters() != myRbFromList.isSelected()) || + (DebuggerUtilsEx.filterEquals(toStringRenderer.getClassFilters(), myToStringFilterEditor.getFilters())); + if (isToStringRendererModified) { + return true; + } + + if (rendererSettings.areAlternateCollectionViewsEnabled() != myCbEnableAlternateViews.isSelected()) { + return true; + } + + return false; + } + + public String getHelpTopic() { + return null; + } +} \ No newline at end of file diff --git a/source/com/intellij/debugger/settings/CompositeConfigurable.java b/source/com/intellij/debugger/settings/CompositeConfigurable.java index 65d71073fd6f..8283e0b44890 100644 --- a/source/com/intellij/debugger/settings/CompositeConfigurable.java +++ b/source/com/intellij/debugger/settings/CompositeConfigurable.java @@ -1,9 +1,9 @@ package com.intellij.debugger.settings; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.BaseConfigurable; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; +import com.intellij.ui.TabbedPaneWrapper; import javax.swing.*; import java.util.Iterator; @@ -15,10 +15,8 @@ import java.util.List; */ public abstract class CompositeConfigurable extends BaseConfigurable { - private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.DebuggerConfigurable"); - - private JTabbedPane myTabbedPane; private List myConfigurables; + private TabbedPaneWrapper myTabbedPane; public void reset() { for (Iterator iterator = getConfigurables().iterator(); iterator.hasNext();) { @@ -37,23 +35,34 @@ public abstract class CompositeConfigurable extends BaseConfigurable { public boolean isModified() { for (Iterator iterator = getConfigurables().iterator(); iterator.hasNext();) { Configurable configurable = iterator.next(); - if(configurable.isModified()) return true; + if(configurable.isModified()) { + return true; + } } return false; } public JComponent createComponent() { - myTabbedPane = new JTabbedPane(); + myTabbedPane = new TabbedPaneWrapper(); for (Iterator iterator = getConfigurables().iterator(); iterator.hasNext();) { Configurable configurable = iterator.next(); - myTabbedPane.addTab(configurable.getDisplayName(), configurable.getIcon(), configurable.createComponent()); + myTabbedPane.addTab(configurable.getDisplayName(), configurable.getIcon(), configurable.createComponent(), null); } - return myTabbedPane; + myTabbedPane.installKeyboardNavigation(); + return myTabbedPane.getComponent(); } public void disposeUIResources() { - myTabbedPane = null; - myConfigurables = null; + if (myTabbedPane != null) { + myTabbedPane.uninstallKeyboardNavigation(); + myTabbedPane = null; + } + if (myConfigurables != null) { + for (Iterator it = myConfigurables.iterator(); it.hasNext();) { + it.next().disposeUIResources(); + } + myConfigurables = null; + } } protected abstract List createConfigurables(); diff --git a/source/com/intellij/debugger/settings/DebuggerConfigurable.java b/source/com/intellij/debugger/settings/DebuggerConfigurable.java index 53d02cce5480..94847c88d24d 100644 --- a/source/com/intellij/debugger/settings/DebuggerConfigurable.java +++ b/source/com/intellij/debugger/settings/DebuggerConfigurable.java @@ -51,7 +51,6 @@ public class DebuggerConfigurable extends CompositeConfigurable implements Appli project = ProjectManager.getInstance().getDefaultProject(); } configurables.add(new DebuggerGeneralConfigurable(project)); - configurables.add(new ViewsGeneralConfigurable()); configurables.add(new NodeRendererConfigurable(project)); return configurables; } diff --git a/source/com/intellij/debugger/settings/DebuggerGeneralConfigurable.java b/source/com/intellij/debugger/settings/DebuggerGeneralConfigurable.java index e086bfa0e17f..cef9bd658c6b 100644 --- a/source/com/intellij/debugger/settings/DebuggerGeneralConfigurable.java +++ b/source/com/intellij/debugger/settings/DebuggerGeneralConfigurable.java @@ -1,11 +1,10 @@ package com.intellij.debugger.settings; import com.intellij.debugger.ui.ClassFilterEditor; -import com.intellij.ide.DataManager; -import com.intellij.openapi.actionSystem.DataConstants; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; +import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.StateRestoringCheckBox; import javax.swing.*; @@ -13,128 +12,115 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -/** - * User: lex - * Date: Oct 6, 2003 - * Time: 7:37:05 PM - */ public class DebuggerGeneralConfigurable implements Configurable{ - private JPanel myPanel; - private JPanel myNodeRepresentationEditorPlace; - private JPanel mySteppingFiltersEditorPlace; - private JRadioButton mySocketTransportRadio; - private JRadioButton myShmemTransportRadio; - private JCheckBox myFiltersCheckBox; - private JCheckBox mySkipSyntheticMethodsCheckBox; - private JCheckBox mySkipConstructorsCheckBox; + private JRadioButton myRbSocket; + private JRadioButton myRbShmem; + private JCheckBox myCbStepInfoFiltersEnabled; + private JCheckBox myCbSkipSyntheticMethods; + private JCheckBox myCbSkipConstructors; private JCheckBox myHideDebuggerCheckBox; - private JRadioButton myRunHotswapAlways; - private JRadioButton myRunHotswapNever; - private JRadioButton myRunHotswapAsk; - private StateRestoringCheckBox myForceClassicCheckBox; - private ClassFilterEditor myFilterEditor; - private JTextField myValueLookupDelayField; - private JCheckBox mySkipGettersCheckBox; - private JCheckBox myCheckBox1; + private JRadioButton myRbAlways; + private JRadioButton myRbNever; + private JRadioButton myRbAsk; + private StateRestoringCheckBox myCbForceClassicVM; + private ClassFilterEditor mySteppingFilterEditor; + private JTextField myValueTooltipDelayField; + private JCheckBox myCbSkipSimpleGetters; + private final Project myProject; + private BaseRenderersConfigurable myBaseRenderersConfigurable; public DebuggerGeneralConfigurable(Project project) { - myFilterEditor = new ClassFilterEditor(project); - mySteppingFiltersEditorPlace.setLayout(new BorderLayout()); - mySteppingFiltersEditorPlace.add(myFilterEditor, BorderLayout.CENTER); - - ButtonGroup group = new ButtonGroup(); - group.add(mySocketTransportRadio); - group.add(myShmemTransportRadio); - - group = new ButtonGroup(); - group.add(myRunHotswapAlways); - group.add(myRunHotswapNever); - group.add(myRunHotswapAsk); - - myFiltersCheckBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - myFilterEditor.setEnabled(myFiltersCheckBox.isSelected()); - } - }); + myProject = project; + myBaseRenderersConfigurable = new BaseRenderersConfigurable(project); } public void reset() { + myBaseRenderersConfigurable.reset(); + final DebuggerSettings settings = DebuggerSettings.getInstance(); if (!SystemInfo.isWindows) { - mySocketTransportRadio.setSelected(true); - myShmemTransportRadio.setEnabled(false); + myRbSocket.setSelected(true); + myRbShmem.setEnabled(false); } else { - if (getSettings().DEBUGGER_TRANSPORT == DebuggerSettings.SHMEM_TRANSPORT) { - myShmemTransportRadio.setSelected(true); + if (settings.DEBUGGER_TRANSPORT == DebuggerSettings.SHMEM_TRANSPORT) { + myRbShmem.setSelected(true); } else { - mySocketTransportRadio.setSelected(true); + myRbSocket.setSelected(true); } - myShmemTransportRadio.setEnabled(true); + myRbShmem.setEnabled(true); } - mySkipGettersCheckBox.setSelected(getSettings().SKIP_GETTERS); - mySkipSyntheticMethodsCheckBox.setSelected(getSettings().SKIP_SYNTHETIC_METHODS); - mySkipConstructorsCheckBox.setSelected(getSettings().SKIP_CONSTRUCTORS); - myValueLookupDelayField.setText(Integer.toString(getSettings().VALUE_LOOKUP_DELAY)); - myHideDebuggerCheckBox.setSelected(getSettings().HIDE_DEBUGGER_ON_PROCESS_TERMINATION); - myForceClassicCheckBox.setSelected(getSettings().FORCE_CLASSIC_VM); + myCbSkipSimpleGetters.setSelected(settings.SKIP_GETTERS); + myCbSkipSyntheticMethods.setSelected(settings.SKIP_SYNTHETIC_METHODS); + myCbSkipConstructors.setSelected(settings.SKIP_CONSTRUCTORS); + myValueTooltipDelayField.setText(Integer.toString(settings.VALUE_LOOKUP_DELAY)); + myHideDebuggerCheckBox.setSelected(settings.HIDE_DEBUGGER_ON_PROCESS_TERMINATION); + myCbForceClassicVM.setSelected(settings.FORCE_CLASSIC_VM); - myFiltersCheckBox.setSelected(getSettings().TRACING_FILTERS_ENABLED); + myCbStepInfoFiltersEnabled.setSelected(settings.TRACING_FILTERS_ENABLED); - myFilterEditor.setFilters(getSettings().getFilters()); - myFilterEditor.setEnabled(getSettings().TRACING_FILTERS_ENABLED); + mySteppingFilterEditor.setFilters(settings.getSteppingFilters()); + mySteppingFilterEditor.setEnabled(settings.TRACING_FILTERS_ENABLED); - if(DebuggerSettings.RUN_HOTSWAP_ALWAYS.equals(getSettings().RUN_HOTSWAP_AFTER_COMPILE)) { - myRunHotswapAlways.setSelected(true); - } else if(DebuggerSettings.RUN_HOTSWAP_NEVER.equals(getSettings().RUN_HOTSWAP_AFTER_COMPILE)) { - myRunHotswapNever.setSelected(true); - } else { - myRunHotswapAsk.setSelected(true); + if(DebuggerSettings.RUN_HOTSWAP_ALWAYS.equals(settings.RUN_HOTSWAP_AFTER_COMPILE)) { + myRbAlways.setSelected(true); + } + else if(DebuggerSettings.RUN_HOTSWAP_NEVER.equals(settings.RUN_HOTSWAP_AFTER_COMPILE)) { + myRbNever.setSelected(true); + } + else { + myRbAsk.setSelected(true); } } public void apply() { - getSettingsTo(getSettings()); + getSettingsTo(DebuggerSettings.getInstance()); + myBaseRenderersConfigurable.apply(); } private void getSettingsTo(DebuggerSettings settings) { - if (myShmemTransportRadio.isSelected()) { + if (myRbShmem.isSelected()) { settings.DEBUGGER_TRANSPORT = DebuggerSettings.SHMEM_TRANSPORT; } - else if (mySocketTransportRadio.isSelected()) { + else if (myRbSocket.isSelected()) { settings.DEBUGGER_TRANSPORT = DebuggerSettings.SOCKET_TRANSPORT; } else { settings.DEBUGGER_TRANSPORT = DebuggerSettings.SOCKET_TRANSPORT; } - settings.SKIP_GETTERS = mySkipGettersCheckBox.isSelected(); - settings.SKIP_SYNTHETIC_METHODS = mySkipSyntheticMethodsCheckBox.isSelected(); - settings.SKIP_CONSTRUCTORS = mySkipConstructorsCheckBox.isSelected(); + settings.SKIP_GETTERS = myCbSkipSimpleGetters.isSelected(); + settings.SKIP_SYNTHETIC_METHODS = myCbSkipSyntheticMethods.isSelected(); + settings.SKIP_CONSTRUCTORS = myCbSkipConstructors.isSelected(); try { - settings.VALUE_LOOKUP_DELAY = Integer.parseInt(myValueLookupDelayField.getText().trim()); + settings.VALUE_LOOKUP_DELAY = Integer.parseInt(myValueTooltipDelayField.getText().trim()); } catch (NumberFormatException e) { } settings.HIDE_DEBUGGER_ON_PROCESS_TERMINATION = myHideDebuggerCheckBox.isSelected(); - settings.FORCE_CLASSIC_VM = myForceClassicCheckBox.isSelectedWhenSelectable(); - settings.TRACING_FILTERS_ENABLED = myFiltersCheckBox.isSelected(); + settings.FORCE_CLASSIC_VM = myCbForceClassicVM.isSelectedWhenSelectable(); + settings.TRACING_FILTERS_ENABLED = myCbStepInfoFiltersEnabled.isSelected(); - myFilterEditor.stopEditing(); - settings.setFilters(myFilterEditor.getFilters()); + mySteppingFilterEditor.stopEditing(); + settings.setSteppingFilters(mySteppingFilterEditor.getFilters()); - if(myRunHotswapAlways.isSelected()) + if (myRbAlways.isSelected()) { settings.RUN_HOTSWAP_AFTER_COMPILE = DebuggerSettings.RUN_HOTSWAP_ALWAYS; - else if(myRunHotswapNever.isSelected()) + } + else if (myRbNever.isSelected()) { settings.RUN_HOTSWAP_AFTER_COMPILE = DebuggerSettings.RUN_HOTSWAP_NEVER; - else + } + else { settings.RUN_HOTSWAP_AFTER_COMPILE = DebuggerSettings.RUN_HOTSWAP_ASK; + } } public boolean isModified() { - DebuggerSettings debuggerSettings = new DebuggerSettings(); - + if (myBaseRenderersConfigurable.isModified()) { + return true; + } + final DebuggerSettings debuggerSettings = new DebuggerSettings(); getSettingsTo(debuggerSettings); - return !debuggerSettings.equals(getSettings()); + return !debuggerSettings.equals(DebuggerSettings.getInstance()); } public String getDisplayName() { @@ -150,12 +136,115 @@ public class DebuggerGeneralConfigurable implements Configurable{ } public JComponent createComponent() { - return myPanel; + final JPanel panel = new JPanel(new GridBagLayout()); + + final JComponent generalGroup = createGeneralGroup(); + panel.add(generalGroup, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); + + final JComponent launchingGroup = createLaunchingGroup(); + panel.add(launchingGroup, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); + + final JComponent baseRenderersGroup = createBaseRenderersGroup(); + panel.add(baseRenderersGroup, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); + + final JComponent steppingGroup = createSteppingGroup(); + panel.add(steppingGroup, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); + + return panel; + } + + private JComponent createGeneralGroup() { + final JPanel panel = new JPanel(new GridBagLayout()); + panel.setBorder(IdeBorderFactory.createTitledBorder("General")); + + myHideDebuggerCheckBox = new JCheckBox("Hide debug window on process termination"); + myHideDebuggerCheckBox.setMnemonic('w'); + panel.add(myHideDebuggerCheckBox, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + + final JLabel tooltipLabel = new JLabel("Value tooltips delay (ms):"); + panel.add(tooltipLabel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + myValueTooltipDelayField = new JTextField(10); + panel.add(myValueTooltipDelayField, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + tooltipLabel.setLabelFor(myValueTooltipDelayField); + tooltipLabel.setDisplayedMnemonic('d'); + + panel.add(new JLabel("Reload classes after compilation:"), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + myRbAlways = new JRadioButton("Always"); + myRbAlways.setMnemonic('A'); + myRbNever = new JRadioButton("Never"); + myRbNever.setMnemonic('N'); + myRbAsk = new JRadioButton("Ask"); + myRbAsk.setMnemonic('k'); + final ButtonGroup group = new ButtonGroup(); + group.add(myRbAlways); + group.add(myRbNever); + group.add(myRbAsk); + final Box box = Box.createHorizontalBox(); + box.add(myRbAlways); + box.add(myRbNever); + box.add(myRbAsk); + panel.add(box, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + + return panel; + } + + private JComponent createLaunchingGroup() { + final JPanel panel = new JPanel(new GridBagLayout()); + panel.setBorder(IdeBorderFactory.createTitledBorder("Launching")); + + myCbForceClassicVM = new StateRestoringCheckBox("Force Classic VM for JDK 1.3.x and earlier"); + myCbForceClassicVM.setMnemonic('i'); + panel.add(myCbForceClassicVM, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + + panel.add(new JLabel("Debugger transport:"), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + myRbSocket = new JRadioButton("Socket"); + myRbSocket.setMnemonic('S'); + myRbShmem = new JRadioButton("Shared memory"); + myRbShmem.setMnemonic('m'); + final Box box = Box.createHorizontalBox(); + box.add(myRbSocket); + box.add(myRbShmem); + panel.add(box, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + + return panel; + } + + private JComponent createBaseRenderersGroup() { + final JComponent component = myBaseRenderersConfigurable.createComponent(); + component.setBorder(IdeBorderFactory.createTitledBorder("Views")); + return component; + } + + private JComponent createSteppingGroup() { + final JPanel panel = new JPanel(new GridBagLayout()); + panel.setBorder(IdeBorderFactory.createTitledBorder("Stepping")); + + myCbSkipSyntheticMethods = new JCheckBox("Skip synthetic methods"); + myCbSkipSyntheticMethods.setMnemonic('p'); + myCbSkipConstructors = new JCheckBox("Skip constructors"); + myCbSkipConstructors.setMnemonic('c'); + myCbSkipSimpleGetters = new JCheckBox("Skip simple getters"); + myCbSkipSimpleGetters.setMnemonic('g'); + myCbStepInfoFiltersEnabled = new JCheckBox("Do not step into the classes"); + myCbStepInfoFiltersEnabled.setMnemonic('i'); + panel.add(myCbSkipSyntheticMethods, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 4, 0, 0),0, 0)); + panel.add(myCbSkipConstructors, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 4, 0, 0),0, 0)); + panel.add(myCbSkipSimpleGetters, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 4, 0, 0),0, 0)); + panel.add(myCbStepInfoFiltersEnabled, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(8, 4, 0, 0),0, 0)); + + mySteppingFilterEditor = new ClassFilterEditor(myProject); + panel.add(mySteppingFilterEditor, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 12, 0, 0),0, 0)); + + myCbStepInfoFiltersEnabled.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + mySteppingFilterEditor.setEnabled(myCbStepInfoFiltersEnabled.isSelected()); + } + }); + return panel; } public void disposeUIResources() { + myBaseRenderersConfigurable.disposeUIResources(); } - private DebuggerSettings getSettings() { return DebuggerSettings.getInstance(); } - } diff --git a/source/com/intellij/debugger/settings/DebuggerSettings.java b/source/com/intellij/debugger/settings/DebuggerSettings.java index 5b4cf9fafb07..283562b9b5ed 100644 --- a/source/com/intellij/debugger/settings/DebuggerSettings.java +++ b/source/com/intellij/debugger/settings/DebuggerSettings.java @@ -1,16 +1,9 @@ package com.intellij.debugger.settings; -import com.intellij.debugger.ClassFilter; -import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.ClassFilter; import com.intellij.debugger.impl.DebuggerUtilsEx; -import com.intellij.debugger.ClassFilter; -import com.intellij.debugger.impl.DebuggerSession; -import com.intellij.debugger.ui.RunHotswapDialog; -import com.intellij.debugger.ClassFilter; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; -import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.JDOMExternalizable; @@ -49,7 +42,7 @@ public class DebuggerSettings implements JDOMExternalizable, ApplicationComponen public String STEP_THREAD_SUSPEND_POLICY; public String RUN_HOTSWAP_AFTER_COMPILE; - private ClassFilter[] myFilters = ClassFilter.EMPTY_ARRAY; + private ClassFilter[] mySteppingFilters = ClassFilter.EMPTY_ARRAY; public DebuggerSettings() { } @@ -59,8 +52,8 @@ public class DebuggerSettings implements JDOMExternalizable, ApplicationComponen public void initComponent() { } - public ClassFilter[] getFilters() { - return retrieveFilters(myFilters); + public ClassFilter[] getSteppingFilters() { + return retrieveFilters(mySteppingFilters); } private ClassFilter[] retrieveFilters(ClassFilter[] filters) { @@ -75,11 +68,11 @@ public class DebuggerSettings implements JDOMExternalizable, ApplicationComponen if (!TRACING_FILTERS_ENABLED) { return false; } - return DebuggerUtilsEx.isFiltered(qName, myFilters); + return DebuggerUtilsEx.isFiltered(qName, mySteppingFilters); } - void setFilters(ClassFilter[] filters) { - myFilters = (filters != null)? filters : ClassFilter.EMPTY_ARRAY; + void setSteppingFilters(ClassFilter[] steppingFilters) { + mySteppingFilters = (steppingFilters != null)? steppingFilters : ClassFilter.EMPTY_ARRAY; } public void readExternal(Element parentNode) throws InvalidDataException { @@ -90,7 +83,7 @@ public class DebuggerSettings implements JDOMExternalizable, ApplicationComponen Element filter = (Element)i.next(); filtersList.add(DebuggerUtilsEx.create(filter)); } - setFilters((ClassFilter[])filtersList.toArray(new ClassFilter[filtersList.size()])); + setSteppingFilters((ClassFilter[])filtersList.toArray(new ClassFilter[filtersList.size()])); filtersList.clear(); } @@ -98,10 +91,10 @@ public class DebuggerSettings implements JDOMExternalizable, ApplicationComponen public void writeExternal(Element parentNode) throws WriteExternalException { DefaultJDOMExternalizer.writeExternal(this, parentNode); Element element; - for (int idx = 0; idx < myFilters.length; idx++) { + for (int idx = 0; idx < mySteppingFilters.length; idx++) { element = new Element("filter"); parentNode.addContent(element); - myFilters[idx].writeExternal(element); + mySteppingFilters[idx].writeExternal(element); } } @@ -121,8 +114,9 @@ public class DebuggerSettings implements JDOMExternalizable, ApplicationComponen HIDE_DEBUGGER_ON_PROCESS_TERMINATION == secondSettings.HIDE_DEBUGGER_ON_PROCESS_TERMINATION && SKIP_SYNTHETIC_METHODS == secondSettings.SKIP_SYNTHETIC_METHODS && SKIP_CONSTRUCTORS == secondSettings.SKIP_CONSTRUCTORS && + SKIP_GETTERS == secondSettings.SKIP_GETTERS && (RUN_HOTSWAP_AFTER_COMPILE != null ? RUN_HOTSWAP_AFTER_COMPILE.equals(secondSettings.RUN_HOTSWAP_AFTER_COMPILE) : secondSettings.RUN_HOTSWAP_AFTER_COMPILE == null) && - DebuggerUtilsEx.filterEquals(myFilters, secondSettings.myFilters); + DebuggerUtilsEx.filterEquals(mySteppingFilters, secondSettings.mySteppingFilters); } public String getComponentName() { diff --git a/source/com/intellij/debugger/settings/NodeRendererSettings.java b/source/com/intellij/debugger/settings/NodeRendererSettings.java index 0924c8c681bf..de75f35bd1d7 100644 --- a/source/com/intellij/debugger/settings/NodeRendererSettings.java +++ b/source/com/intellij/debugger/settings/NodeRendererSettings.java @@ -1,19 +1,27 @@ package com.intellij.debugger.settings; +import com.intellij.debugger.engine.evaluation.EvaluateException; +import com.intellij.debugger.engine.evaluation.EvaluationContext; +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.tree.ValueDescriptor; import com.intellij.debugger.ui.tree.render.*; +import com.intellij.debugger.ui.tree.render.Renderer; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.NamedJDOMExternalizable; -import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.NamedJDOMExternalizable; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.WriteExternalException; import com.intellij.util.EventDispatcher; import com.intellij.util.containers.InternalIterator; import org.jdom.Element; -import java.util.List; +import javax.swing.*; import java.util.ArrayList; +import java.util.List; /** * User: lex @@ -29,17 +37,52 @@ public class NodeRendererSettings implements ApplicationComponent, NamedJDOMExte private final EventDispatcher myDispatcher = EventDispatcher.create(NodeRendererSettingsListener.class); private RendererConfiguration myRendererConfiguration = new RendererConfiguration(this); - // default singleton renderers + // base renderers private final PrimitiveRenderer myPrimitiveRenderer = new PrimitiveRenderer(); private final ArrayRenderer myArrayRenderer = new ArrayRenderer(); private final ClassRenderer myClassRenderer = new ClassRenderer(); private final HexRenderer myHexRenderer = new HexRenderer(); + private final ToStringRenderer myToStringRenderer = new ToStringRenderer(); + // alternate collections + private final NodeRenderer[] myAlternateCollectionRenderers = new NodeRenderer[]{ + createCompoundReferenceRenderer( + "Map", "java.util.Map", + createLabelRenderer("size = ", "size()", null), + createExpressionChildrenRenderer("entrySet().toArray()", "!isEmpty()") + ), + createCompoundReferenceRenderer( + "Map.Entry", "java.util.Map$Entry", + createLabelRenderer(null, "\" \" + getKey() + \" -> \" + getValue()", null), + createEnumerationChildrenRenderer(new String[][]{{"key", "getKey()"}, {"value", "getValue()"}}) + ), + createCompoundReferenceRenderer( + "Collection", "java.util.Collection", + createLabelRenderer("size = ", "size()", null), + createExpressionChildrenRenderer("toArray()", "!isEmpty()") + ) + }; + public NodeRendererSettings() { + // default configuration + myHexRenderer.setEnabled(false); + myToStringRenderer.setEnabled(true); + setAlternateCollectionViewsEnabled(true); + } public static NodeRendererSettings getInstance() { return ApplicationManager.getApplication().getComponent(NodeRendererSettings.class); } + public void setAlternateCollectionViewsEnabled(boolean enabled) { + for (int idx = 0; idx < myAlternateCollectionRenderers.length; idx++) { + myAlternateCollectionRenderers[idx].setEnabled(enabled); + } + } + + public boolean areAlternateCollectionViewsEnabled() { + return myAlternateCollectionRenderers[0].isEnabled(); + } + public String getComponentName() { return "NodeRendererSettings"; } @@ -89,7 +132,7 @@ public class NodeRendererSettings implements ApplicationComponent, NamedJDOMExte } } - public void iterateRenderers(InternalIterator iterator) { + public void iterateUserRenderers(InternalIterator iterator) { myRendererConfiguration.iterateRenderers(iterator); } @@ -109,26 +152,35 @@ public class NodeRendererSettings implements ApplicationComponent, NamedJDOMExte return myHexRenderer; } + public ToStringRenderer getToStringRenderer() { + return myToStringRenderer; + } + public void fireRenderersChanged() { myDispatcher.getMulticaster().renderersChanged(); } public List getAllRenderers() { + // the order is important as the renderers are applied according to it final List allRenderers = new ArrayList(); + allRenderers.add(myHexRenderer); + allRenderers.add(myPrimitiveRenderer); myRendererConfiguration.iterateRenderers(new InternalIterator() { public boolean visit(final AutoRendererNode element) { allRenderers.add(element.getRenderer()); return true; } }); + for (int idx = 0; idx < myAlternateCollectionRenderers.length; idx++) { + allRenderers.add(myAlternateCollectionRenderers[idx]); + } + allRenderers.add(myToStringRenderer); allRenderers.add(myArrayRenderer); allRenderers.add(myClassRenderer); - allRenderers.add(myPrimitiveRenderer); - allRenderers.add(myHexRenderer); return allRenderers; } - public boolean isDefault(final Renderer renderer) { + public boolean isBase(final Renderer renderer) { return renderer == myPrimitiveRenderer || renderer == myArrayRenderer || renderer == myClassRenderer; } @@ -188,11 +240,62 @@ public class NodeRendererSettings implements ApplicationComponent, NamedJDOMExte return new EnumerationChildrenRenderer(); } else if(rendererId.equals(ToStringRenderer.UNIQUE_ID)) { - return new ToStringRenderer(); + return myToStringRenderer; } else if(rendererId.equals(CompoundNodeRenderer.UNIQUE_ID) || rendererId.equals(REFERENCE_RENDERER)) { - return new CompoundReferenceRenderer(this, "unnamed", null, null); + return createCompoundReferenceRenderer("unnamed", "java.lang.Object", null, null); } return null; } + + private CompoundReferenceRenderer createCompoundReferenceRenderer( + final String rendererName, final String className, final LabelRenderer labelRenderer, final ChildrenRenderer childrenRenderer + ) { + CompoundReferenceRenderer renderer = new CompoundReferenceRenderer(this, rendererName, labelRenderer, childrenRenderer); + renderer.setClassName(className); + return renderer; + } + + private ExpressionChildrenRenderer createExpressionChildrenRenderer(String expressionText, String childrenExpandableText) { + final ExpressionChildrenRenderer childrenRenderer = new ExpressionChildrenRenderer(); + childrenRenderer.setChildrenExpression(new TextWithImportsImpl(TextWithImportsImpl.EXPRESSION_FACTORY, expressionText)); + if (childrenExpandableText != null) { + childrenRenderer.setChildrenExpandable(new TextWithImportsImpl(TextWithImportsImpl.EXPRESSION_FACTORY, childrenExpandableText)); + } + return childrenRenderer; + } + + private EnumerationChildrenRenderer createEnumerationChildrenRenderer(String[][] expressions) { + final EnumerationChildrenRenderer childrenRenderer = new EnumerationChildrenRenderer(); + if (expressions != null && expressions.length > 0) { + final ArrayList> childrenList = new ArrayList>(expressions.length); + for (int idx = 0; idx < expressions.length; idx++) { + final String[] expression = expressions[idx]; + childrenList.add(new Pair(expression[0], new TextWithImportsImpl(TextWithImportsImpl.EXPRESSION_FACTORY, expression[1]))); + } + childrenRenderer.setChildren(childrenList); + } + return childrenRenderer; + } + + private LabelRenderer createLabelRenderer(final String prefix, final String expressionText, final String postfix) { + final LabelRenderer labelRenderer = new LabelRenderer() { + public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener) throws EvaluateException { + final String evaluated = super.calcLabel(descriptor, evaluationContext, labelListener); + if (prefix == null && postfix == null) { + return evaluated; + } + if (prefix != null && postfix != null) { + return prefix + evaluated + postfix; + } + if (prefix != null) { + return prefix + evaluated; + } + return evaluated + postfix; + } + }; + labelRenderer.setLabelExpression(new TextWithImportsImpl(TextWithImportsImpl.EXPRESSION_FACTORY, expressionText)); + return labelRenderer; + } + } diff --git a/source/com/intellij/debugger/settings/RendererConfiguration.java b/source/com/intellij/debugger/settings/RendererConfiguration.java index d9b9649af6fc..31b9e28f17b0 100644 --- a/source/com/intellij/debugger/settings/RendererConfiguration.java +++ b/source/com/intellij/debugger/settings/RendererConfiguration.java @@ -100,17 +100,6 @@ public class RendererConfiguration implements Cloneable, JDOMExternalizable { myRepresentationNodes.remove(renderer); } - public List getRenderers() { - List result = new ArrayList(); - - for (Iterator iterator = myRepresentationNodes.iterator(); iterator.hasNext();) { - AutoRendererNode autoRendererNode = iterator.next(); - result.add(autoRendererNode.getRenderer()); - } - - return result; - } - public List getAutoNodes() { List result = new ArrayList(); diff --git a/source/com/intellij/debugger/settings/ViewsGeneralConfigurable.java b/source/com/intellij/debugger/settings/ViewsGeneralConfigurable.java deleted file mode 100644 index 1f20be79e683..000000000000 --- a/source/com/intellij/debugger/settings/ViewsGeneralConfigurable.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.intellij.debugger.settings; - -import com.intellij.debugger.ui.tree.render.ClassRenderer; -import com.intellij.openapi.options.Configurable; -import com.intellij.ui.StateRestoringCheckBox; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; - -/** - * @author Eugene Belyaev - */ -public class ViewsGeneralConfigurable implements Configurable { - private JPanel myPanel; - private JCheckBox myAutoscrollCheckBox; - private JCheckBox myShowSyntheticsCheckBox; - - private JCheckBox mySortCheckBox; - private JCheckBox myHideNullElementsCheckBox; - private JCheckBox myShowStaticCheckBox; - private StateRestoringCheckBox myShowStaticFinalCheckBox; - private JPanel myArrayConfigurablePlace; - private ArrayRendererConfigurable myArrayRendererConfigurable; - private JCheckBox myAlternativeViews; - - public ViewsGeneralConfigurable() { - myShowStaticCheckBox.addChangeListener(new ChangeListener(){ - public void stateChanged(ChangeEvent e) { - if(myShowStaticCheckBox.isSelected()) { - myShowStaticFinalCheckBox.makeSelectable(); - } else { - myShowStaticFinalCheckBox.makeUnselectable(false); - } - } - }); - - myArrayRendererConfigurable = new ArrayRendererConfigurable(NodeRendererSettings.getInstance().getArrayRenderer()); - myArrayConfigurablePlace.setLayout(new BorderLayout()); - myArrayConfigurablePlace.add(myArrayRendererConfigurable.createComponent()); - } - - public void disposeUIResources() { - myPanel = null; - } - - public String getDisplayName() { - return "Data views"; - } - - public JComponent createComponent() { - return myPanel; - } - - public Icon getIcon() { - return null; - } - - public void apply() { - if (myPanel != null) { - final boolean renderersWereModified = areDefaultRenderersModified(); - - final ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); - generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myAutoscrollCheckBox.isSelected(); - generalSettings.USE_ALTERNATIVE_RENDERERS = myAlternativeViews.isSelected(); - generalSettings.HIDE_NULL_ARRAY_ELEMENTS = myHideNullElementsCheckBox.isSelected(); - - final ClassRenderer classRenderer = NodeRendererSettings.getInstance().getClassRenderer(); - classRenderer.SORT_ASCENDING = mySortCheckBox.isSelected(); - classRenderer.SHOW_STATIC = myShowStaticCheckBox.isSelected(); - classRenderer.SHOW_STATIC_FINAL = myShowStaticFinalCheckBox.isSelectedWhenSelectable(); - classRenderer.SHOW_SYNTHETICS = myShowSyntheticsCheckBox.isSelected(); - - myArrayRendererConfigurable.apply(); - - if (renderersWereModified) { - NodeRendererSettings.getInstance().fireRenderersChanged(); - } - } - } - - public void reset() { - ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); - - myAutoscrollCheckBox.setSelected(generalSettings.AUTOSCROLL_TO_NEW_LOCALS); - myHideNullElementsCheckBox.setSelected(generalSettings.HIDE_NULL_ARRAY_ELEMENTS); - myAlternativeViews.setSelected(generalSettings.USE_ALTERNATIVE_RENDERERS); - - ClassRenderer classRenderer = NodeRendererSettings.getInstance().getClassRenderer(); - - myShowSyntheticsCheckBox.setSelected(classRenderer.SHOW_SYNTHETICS); - mySortCheckBox.setSelected(classRenderer.SORT_ASCENDING); - myShowStaticCheckBox.setSelected(classRenderer.SHOW_STATIC); - myShowStaticFinalCheckBox.setSelected(classRenderer.SHOW_STATIC_FINAL); - if(!classRenderer.SHOW_STATIC) { - myShowStaticFinalCheckBox.makeUnselectable(false); - } - - myArrayRendererConfigurable.reset(); - } - - public boolean isModified() { - return areGeneralSettingsModified() || areDefaultRenderersModified(); - } - - private boolean areGeneralSettingsModified() { - ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance(); - return - (generalSettings.AUTOSCROLL_TO_NEW_LOCALS != myAutoscrollCheckBox.isSelected()) || - (generalSettings.USE_ALTERNATIVE_RENDERERS != myAlternativeViews.isSelected()) || - (generalSettings.HIDE_NULL_ARRAY_ELEMENTS != myHideNullElementsCheckBox.isSelected()); - } - - private boolean areDefaultRenderersModified() { - if (myArrayRendererConfigurable.isModified()) { - return true; - } - final ClassRenderer classRenderer = NodeRendererSettings.getInstance().getClassRenderer(); - return - (classRenderer.SORT_ASCENDING != mySortCheckBox.isSelected()) || - (classRenderer.SHOW_STATIC != myShowStaticCheckBox.isSelected()) || - (classRenderer.SHOW_STATIC_FINAL != myShowStaticFinalCheckBox.isSelectedWhenSelectable()) || - (classRenderer.SHOW_SYNTHETICS != myShowSyntheticsCheckBox.isSelected()); - } - - public String getHelpTopic() { - return null; - } -} \ No newline at end of file diff --git a/source/com/intellij/debugger/settings/ViewsGeneralSettings.java b/source/com/intellij/debugger/settings/ViewsGeneralSettings.java index eb67adf6f42b..c32dffd95fb2 100644 --- a/source/com/intellij/debugger/settings/ViewsGeneralSettings.java +++ b/source/com/intellij/debugger/settings/ViewsGeneralSettings.java @@ -14,7 +14,6 @@ public class ViewsGeneralSettings implements NamedJDOMExternalizable, Applicatio public boolean SHOW_OBJECTID = true; public boolean HIDE_NULL_ARRAY_ELEMENTS = true; public boolean AUTOSCROLL_TO_NEW_LOCALS = true; - public boolean USE_ALTERNATIVE_RENDERERS = true; private NodeRendererSettings myNodeRendererSettings; public ViewsGeneralSettings(NodeRendererSettings instance) { diff --git a/source/com/intellij/debugger/ui/ClassFilterEditor.java b/source/com/intellij/debugger/ui/ClassFilterEditor.java index eed418ed95b6..e42b373101d4 100644 --- a/source/com/intellij/debugger/ui/ClassFilterEditor.java +++ b/source/com/intellij/debugger/ui/ClassFilterEditor.java @@ -5,14 +5,13 @@ package com.intellij.debugger.ui; import com.intellij.debugger.ClassFilter; -import com.intellij.ide.util.TreeClassChooserDialog; import com.intellij.ide.util.TreeClassChooser; import com.intellij.ide.util.TreeClassChooserFactory; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.util.ui.Table; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.util.ui.Table; import javax.swing.*; import javax.swing.event.ListSelectionEvent; @@ -34,21 +33,23 @@ public class ClassFilterEditor extends JPanel { private JButton myRemoveButton; protected Project myProject; private TreeClassChooser.ClassFilter myChooserFilter; - private JPanel myPanel; - private JScrollPane myScrollPane; - private JPanel myScrollPanePlace; public ClassFilterEditor(Project project) { this (project, null); } public ClassFilterEditor(Project project, TreeClassChooser.ClassFilter classFilter) { - super(new BorderLayout()); - add(myPanel); + super(new GridBagLayout()); + myAddClassButton = new JButton("Add Class..."); + myAddPatternButton = new JButton("Add Pattern..."); + myRemoveButton = new JButton("Remove"); myTable = new Table(); - myScrollPane = ScrollPaneFactory.createScrollPane(myTable); - myScrollPanePlace.setLayout(new BorderLayout()); - myScrollPanePlace.add(myScrollPane); + JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTable); + + add(scrollPane, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 3, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(4, 4, 4, 6), 0, 0)); + add(myAddClassButton, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(4, 0, 0, 4), 0, 0)); + add(myAddPatternButton, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(4, 0, 0, 4), 0, 0)); + add(myRemoveButton, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(4, 0, 0, 4), 0, 0)); myChooserFilter = classFilter; myProject = project; diff --git a/source/com/intellij/debugger/ui/tree/render/CompoundNodeRenderer.java b/source/com/intellij/debugger/ui/tree/render/CompoundNodeRenderer.java index 183591b4d10a..417839bb6879 100644 --- a/source/com/intellij/debugger/ui/tree/render/CompoundNodeRenderer.java +++ b/source/com/intellij/debugger/ui/tree/render/CompoundNodeRenderer.java @@ -26,7 +26,7 @@ public class CompoundNodeRenderer extends NodeRendererImpl{ protected ValueLabelRenderer myLabelRenderer; protected ChildrenRenderer myChildrenRenderer; - private final NodeRendererSettings myRendererSettings; + protected final NodeRendererSettings myRendererSettings; public CompoundNodeRenderer(NodeRendererSettings rendererSettings, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) { myRendererSettings = rendererSettings; diff --git a/source/com/intellij/debugger/ui/tree/render/CompoundReferenceRenderer.java b/source/com/intellij/debugger/ui/tree/render/CompoundReferenceRenderer.java index 82aa75c56f41..d1cfdae6d8dd 100644 --- a/source/com/intellij/debugger/ui/tree/render/CompoundReferenceRenderer.java +++ b/source/com/intellij/debugger/ui/tree/render/CompoundReferenceRenderer.java @@ -19,11 +19,11 @@ public class CompoundReferenceRenderer extends CompoundNodeRenderer{ } public void setLabelRenderer(ValueLabelRenderer labelRenderer) { - super.setLabelRenderer(NodeRendererSettings.getInstance().isDefault(labelRenderer) ? null : labelRenderer); + super.setLabelRenderer(myRendererSettings.isBase(labelRenderer) ? null : labelRenderer); } public void setChildrenRenderer(ChildrenRenderer childrenRenderer) { - super.setChildrenRenderer(NodeRendererSettings.getInstance().isDefault(childrenRenderer) ? null : childrenRenderer); + super.setChildrenRenderer(myRendererSettings.isBase(childrenRenderer) ? null : childrenRenderer); } public ChildrenRenderer getChildrenRenderer() { @@ -31,8 +31,7 @@ public class CompoundReferenceRenderer extends CompoundNodeRenderer{ } private NodeRenderer getDefaultRenderer() { - final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); - return getClassName().endsWith("]") ? (NodeRenderer)rendererSettings.getArrayRenderer() : (NodeRenderer)rendererSettings.getClassRenderer(); + return getClassName().endsWith("]") ? (NodeRenderer)myRendererSettings.getArrayRenderer() : (NodeRenderer)myRendererSettings.getClassRenderer(); } public ValueLabelRenderer getLabelRenderer() { diff --git a/source/com/intellij/debugger/ui/tree/render/ToStringRenderer.java b/source/com/intellij/debugger/ui/tree/render/ToStringRenderer.java index 8a5274d6a044..cb0e6a21aa7a 100644 --- a/source/com/intellij/debugger/ui/tree/render/ToStringRenderer.java +++ b/source/com/intellij/debugger/ui/tree/render/ToStringRenderer.java @@ -1,17 +1,21 @@ package com.intellij.debugger.ui.tree.render; +import com.intellij.debugger.ClassFilter; import com.intellij.debugger.DebuggerContext; -import com.intellij.debugger.engine.StackFrameContext; import com.intellij.debugger.engine.DebugProcessImpl; +import com.intellij.debugger.engine.StackFrameContext; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContext; +import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.ui.tree.DebuggerTreeNode; import com.intellij.debugger.ui.tree.NodeDescriptor; import com.intellij.debugger.ui.tree.ValueDescriptor; -import com.intellij.debugger.ui.tree.render.*; -import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.JDOMExternalizerUtil; +import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.PsiExpression; import com.sun.jdi.*; +import org.jdom.Element; import java.util.Iterator; @@ -22,7 +26,9 @@ import java.util.Iterator; public class ToStringRenderer extends NodeRendererImpl { public static final String UNIQUE_ID = "ToStringRenderer"; - private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ToStringRenderer"); + + private boolean USE_CLASS_FILTERS = false; + private ClassFilter[] myClassFilters = ClassFilter.EMPTY_ARRAY; public ToStringRenderer() { setEnabled(true); @@ -41,7 +47,13 @@ public class ToStringRenderer extends NodeRendererImpl { } public ToStringRenderer clone() { - return (ToStringRenderer)super.clone(); + final ToStringRenderer cloned = (ToStringRenderer)super.clone(); + final ClassFilter[] classFilters = (myClassFilters.length > 0)? new ClassFilter[myClassFilters.length] : ClassFilter.EMPTY_ARRAY; + for (int idx = 0; idx < classFilters.length; idx++) { + classFilters[idx] = myClassFilters[idx].clone(); + } + cloned.myClassFilters = classFilters; + return cloned; } public String calcLabel(final ValueDescriptor valueDescriptor, EvaluationContext evaluationContext, final DescriptorLabelListener labelListener) @@ -61,27 +73,46 @@ public class ToStringRenderer extends NodeRendererImpl { return NodeDescriptor.EVALUATING_MESSAGE; } + public boolean isUseClassFilters() { + return USE_CLASS_FILTERS; + } + + public void setUseClassFilters(boolean value) { + USE_CLASS_FILTERS = value; + } + public boolean isApplicable(Type type) { if(!(type instanceof ReferenceType)) { return false; } + if(type.name().equals("java.lang.String")) { - return false; + return false; // do not render 'String' objects for performance reasons } + if(!overridesToString(type)) { return false; } + + if (USE_CLASS_FILTERS) { + if (!isFiltered(type)) { + return false; + } + } + return true; } - boolean overridesToString(Type type) { + private static boolean overridesToString(Type type) { if(type instanceof ClassType) { - ClassType classType = (ClassType)type; - java.util.List list = classType.methodsByName("toString", "()Ljava/lang/String;"); - for (Iterator iterator = list.iterator(); iterator.hasNext();) { - Method method = (Method)iterator.next(); - if(!(method.declaringType().name()).equals("java.lang.Object")){ - return true; + final ClassType classType = (ClassType)type; + final java.util.List methods = classType.methodsByName("toString", "()Ljava/lang/String;"); + if (methods.size() > 0) { + for (Iterator iterator = methods.iterator(); iterator.hasNext();) { + final Method method = (Method)iterator.next(); + if(!(method.declaringType().name()).equals("java.lang.Object")){ + return true; + } } } } @@ -105,4 +136,36 @@ public class ToStringRenderer extends NodeRendererImpl { return getDefaultRenderer(value, evaluationContext).isExpandable(value, evaluationContext, parentDescriptor); } + public void readExternal(Element element) throws InvalidDataException { + super.readExternal(element); + final String value = JDOMExternalizerUtil.readField(element, "USE_CLASS_FILTERS"); + USE_CLASS_FILTERS = "true".equalsIgnoreCase(value); + myClassFilters = DebuggerUtilsEx.readFilters(element.getChildren("filter")); + } + + public void writeExternal(Element element) throws WriteExternalException { + super.writeExternal(element); + JDOMExternalizerUtil.writeField(element, "USE_CLASS_FILTERS", USE_CLASS_FILTERS? "true" : "false"); + DebuggerUtilsEx.writeFilters(element, "filter", myClassFilters); + } + + public ClassFilter[] getClassFilters() { + return myClassFilters; + } + + public void setClassFilters(ClassFilter[] classFilters) { + myClassFilters = classFilters != null? classFilters : ClassFilter.EMPTY_ARRAY; + } + + private boolean isFiltered(Type t) { + if (t instanceof ReferenceType) { + for (int i = 0; i < myClassFilters.length; i++) { + ClassFilter classFilter = myClassFilters[i]; + if(classFilter.isEnabled() && DebuggerUtilsEx.getSuperType(t, classFilter.getPattern()) != null) { + return true; + } + } + } + return DebuggerUtilsEx.isFiltered(t.name(), myClassFilters); + } } diff --git a/util/src/com/intellij/openapi/util/JDOMExternalizerUtil.java b/util/src/com/intellij/openapi/util/JDOMExternalizerUtil.java index ebca49a5681e..d76edd2c51b7 100644 --- a/util/src/com/intellij/openapi/util/JDOMExternalizerUtil.java +++ b/util/src/com/intellij/openapi/util/JDOMExternalizerUtil.java @@ -6,13 +6,6 @@ import org.jdom.Element; import java.util.List; -/** - * Created by IntelliJ IDEA. - * User: lex - * Date: Apr 13, 2004 - * Time: 2:58:50 PM - * To change this template use File | Settings | File Templates. - */ public class JDOMExternalizerUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.util.JDOMExternalizerUtil");