From 430618622f07839db4998e14c10c19cc14385015 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 25 Jul 2016 19:23:32 +0300 Subject: [PATCH] IDEA-159007 Allow to keep class fields in enumeration children renderers --- .../CompoundRendererConfigurable.java | 27 +++++++++++++------ .../render/EnumerationChildrenRenderer.java | 26 +++++++++++++++++- .../src/messages/DebuggerBundle.properties | 1 + 3 files changed, 45 insertions(+), 9 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 6e6e3f4b4df5..ee1c4c715621 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java @@ -68,6 +68,7 @@ class CompoundRendererConfigurable extends JPanel { private XDebuggerExpressionEditor myListChildrenEditor; private final JLabel myExpandedLabel; private JBTable myTable; + private final JBCheckBox myAppendDefaultChildren; @NonNls private static final String EMPTY_PANEL_ID = "EMPTY"; @NonNls private static final String DATA_PANEL_ID = "DATA"; private static final int NAME_TABLE_COLUMN = 0; @@ -132,6 +133,8 @@ class CompoundRendererConfigurable extends JPanel { } }); + myAppendDefaultChildren = new JBCheckBox(DebuggerBundle.message("label.compound.renderer.configurable.append.default.children")); + JPanel panel = new JPanel(new GridBagLayout()); panel.add(new JLabel(DebuggerBundle.message("label.compound.renderer.configurable.apply.to")), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, @@ -176,6 +179,9 @@ class CompoundRendererConfigurable extends JPanel { panel.add(myChildrenListEditor, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, JBUI.insets(4, 30, 0, 0), 0, 0)); + panel.add(myAppendDefaultChildren, + new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, + JBUI.insetsLeft(25), 0, 0)); add(new JPanel(), EMPTY_PANEL_ID); add(panel, DATA_PANEL_ID); } @@ -214,7 +220,10 @@ class CompoundRendererConfigurable extends JPanel { myChildrenExpandedEditor.setEnabled(isChildrenExpression); myExpandedLabel.setEnabled(isChildrenExpression); myChildrenEditor.setEnabled(isChildrenExpression); - myTable.setEnabled(myRbListChildrenRenderer.isSelected()); + + boolean isListChildren = myRbListChildrenRenderer.isSelected(); + myTable.setEnabled(isListChildren); + myAppendDefaultChildren.setEnabled(isListChildren); } private JComponent createChildrenListEditor(JavaDebuggerEditorsProvider editorsProvider) { @@ -318,7 +327,9 @@ class CompoundRendererConfigurable extends JPanel { ((ExpressionChildrenRenderer)childrenRenderer).setChildrenExpandable(TextWithImportsImpl.fromXExpression(myChildrenExpandedEditor.getExpression())); } else if (myRbListChildrenRenderer.isSelected()) { - childrenRenderer = new EnumerationChildrenRenderer(getTableModel().getExpressions()); + EnumerationChildrenRenderer enumerationChildrenRenderer = new EnumerationChildrenRenderer(getTableModel().getExpressions()); + enumerationChildrenRenderer.setAppendDefaultChildren(myAppendDefaultChildren.isSelected()); + childrenRenderer = enumerationChildrenRenderer; } renderer.setChildrenRenderer(childrenRenderer); // classname @@ -351,28 +362,28 @@ class CompoundRendererConfigurable extends JPanel { myLabelEditor.setExpression(TextWithImportsImpl.toXExpression(((LabelRenderer)labelRenderer).getLabelExpression())); } + getTableModel().clear(); + myAppendDefaultChildren.setSelected(false); + if (rendererSettings.isBase(childrenRenderer)) { myRbDefaultChildrenRenderer.setSelected(true); myChildrenEditor.setExpression(TextWithImportsImpl.toXExpression(emptyExpressionFragment)); myChildrenExpandedEditor.setExpression(TextWithImportsImpl.toXExpression(emptyExpressionFragment)); - getTableModel().clear(); } else if (childrenRenderer instanceof ExpressionChildrenRenderer) { myRbExpressionChildrenRenderer.setSelected(true); final ExpressionChildrenRenderer exprRenderer = (ExpressionChildrenRenderer)childrenRenderer; myChildrenEditor.setExpression(TextWithImportsImpl.toXExpression(exprRenderer.getChildrenExpression())); myChildrenExpandedEditor.setExpression(TextWithImportsImpl.toXExpression(exprRenderer.getChildrenExpandable())); - getTableModel().clear(); } else { myRbListChildrenRenderer.setSelected(true); myChildrenEditor.setExpression(TextWithImportsImpl.toXExpression(emptyExpressionFragment)); myChildrenExpandedEditor.setExpression(TextWithImportsImpl.toXExpression(emptyExpressionFragment)); if (childrenRenderer instanceof EnumerationChildrenRenderer) { - getTableModel().init(((EnumerationChildrenRenderer)childrenRenderer).getChildren()); - } - else { - getTableModel().clear(); + EnumerationChildrenRenderer enumerationRenderer = (EnumerationChildrenRenderer)childrenRenderer; + getTableModel().init(enumerationRenderer.getChildren()); + myAppendDefaultChildren.setSelected(enumerationRenderer.isAppendDefaultChildren()); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/EnumerationChildrenRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/EnumerationChildrenRenderer.java index a3a286645a34..2067fbeb70e7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/EnumerationChildrenRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/EnumerationChildrenRenderer.java @@ -16,6 +16,7 @@ package com.intellij.debugger.ui.tree.render; import com.intellij.debugger.DebuggerContext; +import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContext; @@ -24,6 +25,7 @@ import com.intellij.debugger.impl.descriptors.data.UserExpressionData; import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl; import com.intellij.debugger.ui.tree.*; import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.JDOMExternalizerUtil; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.PsiElement; @@ -42,7 +44,10 @@ import java.util.List; public final class EnumerationChildrenRenderer extends ReferenceRenderer implements ChildrenRenderer{ public static final @NonNls String UNIQUE_ID = "EnumerationChildrenRenderer"; + private boolean myAppendDefaultChildren; private List> myChildren; + + public static final @NonNls String APPEND_DEFAULT_NAME = "AppendDefault"; public static final @NonNls String CHILDREN_EXPRESSION = "ChildrenExpression"; public static final @NonNls String CHILD_NAME = "Name"; @@ -55,6 +60,14 @@ public final class EnumerationChildrenRenderer extends ReferenceRenderer impleme myChildren = children; } + public void setAppendDefaultChildren(boolean appendDefaultChildren) { + myAppendDefaultChildren = appendDefaultChildren; + } + + public boolean isAppendDefaultChildren() { + return myAppendDefaultChildren; + } + public String getUniqueId() { return UNIQUE_ID; } @@ -68,6 +81,8 @@ public final class EnumerationChildrenRenderer extends ReferenceRenderer impleme myChildren.clear(); + myAppendDefaultChildren = "true".equals(JDOMExternalizerUtil.readField(element, APPEND_DEFAULT_NAME)); + List children = element.getChildren(CHILDREN_EXPRESSION); for (Element item : children) { String name = item.getAttributeValue(CHILD_NAME); @@ -80,6 +95,10 @@ public final class EnumerationChildrenRenderer extends ReferenceRenderer impleme public void writeExternal(Element element) throws WriteExternalException { super.writeExternal(element); + if (myAppendDefaultChildren) { + JDOMExternalizerUtil.writeField(element, APPEND_DEFAULT_NAME, "true"); + } + for (Pair pair : myChildren) { Element child = new Element(CHILDREN_EXPRESSION); child.setAttribute(CHILD_NAME, pair.getFirst()); @@ -101,6 +120,10 @@ public final class EnumerationChildrenRenderer extends ReferenceRenderer impleme ); } builder.setChildren(children); + + if (myAppendDefaultChildren) { + DebugProcessImpl.getDefaultRenderer(value).buildChildren(value, builder, evaluationContext); + } } public PsiElement getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException { @@ -108,7 +131,8 @@ public final class EnumerationChildrenRenderer extends ReferenceRenderer impleme } public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) { - return myChildren.size() > 0; + return myChildren.size() > 0 || + (myAppendDefaultChildren && DebugProcessImpl.getDefaultRenderer(value).isExpandable(value, evaluationContext, parentDescriptor)); } public List> getChildren() { diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index 5fdf025ffbbf..7c5d9b17c743 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -215,6 +215,7 @@ label.compound.renderer.configurable.when.expanding=When expanding a node label.compound.renderer.configurable.test.can.expand=Test if a node can be expanded (optional): title.compound.renderer.configurable.choose.renderer.reference.type=Renderer Reference Type text.base.renderer.configurable.no.class.patterns=No class patterns configured +label.compound.renderer.configurable.append.default.children=Append default children button.add=Add button.remove=&Remove button.move.up=Move &Up