mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
(no message)
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Configurable> createConfigurables() {
|
||||
ArrayList<Configurable> array = new ArrayList<Configurable>();
|
||||
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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -114,7 +114,7 @@ public abstract class DebugProcessImpl implements DebugProcess {
|
||||
|
||||
private final DescriptorHistoryManager myDescriptorHistoryManager;
|
||||
|
||||
private final List<AutoRendererNode> myRenderers = new ArrayList<AutoRendererNode>();
|
||||
private final List<NodeRenderer> myRenderers = new ArrayList<NodeRenderer>();
|
||||
private final Map<Type, NodeRenderer> myNodeRederersMap = new com.intellij.util.containers.HashMap<Type, NodeRenderer>();
|
||||
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<AutoRendererNode>() {
|
||||
public boolean visit(AutoRendererNode rendererNode) {
|
||||
if(rendererNode.getRenderer() instanceof ValueLabelRenderer) {
|
||||
myRenderers.add(rendererNode);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance();
|
||||
for (Iterator<NodeRenderer> 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<AutoRendererNode> iterator = myRenderers.iterator(); iterator.hasNext();) {
|
||||
final AutoRendererNode nodeAutoRenderer = iterator.next();
|
||||
if(nodeAutoRenderer.isApplicable(type, false)) {
|
||||
renderer = nodeAutoRenderer.getRenderer();
|
||||
for (Iterator<NodeRenderer> 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());
|
||||
|
||||
@@ -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<ClassFilter> classFiltersList = new ArrayList<ClassFilter>(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 {
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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<Configurable> myConfigurables;
|
||||
private TabbedPaneWrapper myTabbedPane;
|
||||
|
||||
public void reset() {
|
||||
for (Iterator<Configurable> iterator = getConfigurables().iterator(); iterator.hasNext();) {
|
||||
@@ -37,23 +35,34 @@ public abstract class CompositeConfigurable extends BaseConfigurable {
|
||||
public boolean isModified() {
|
||||
for (Iterator<Configurable> 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<Configurable> 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<Configurable> it = myConfigurables.iterator(); it.hasNext();) {
|
||||
it.next().disposeUIResources();
|
||||
}
|
||||
myConfigurables = null;
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract List<Configurable> createConfigurables();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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<NodeRendererSettingsListener> 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<AutoRendererNode> iterator) {
|
||||
public void iterateUserRenderers(InternalIterator<AutoRendererNode> 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<NodeRenderer> getAllRenderers() {
|
||||
// the order is important as the renderers are applied according to it
|
||||
final List<NodeRenderer> allRenderers = new ArrayList<NodeRenderer>();
|
||||
allRenderers.add(myHexRenderer);
|
||||
allRenderers.add(myPrimitiveRenderer);
|
||||
myRendererConfiguration.iterateRenderers(new InternalIterator<AutoRendererNode>() {
|
||||
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<Pair<String, TextWithImports>> childrenList = new ArrayList<Pair<String, TextWithImports>>(expressions.length);
|
||||
for (int idx = 0; idx < expressions.length; idx++) {
|
||||
final String[] expression = expressions[idx];
|
||||
childrenList.add(new Pair<String, TextWithImports>(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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -100,17 +100,6 @@ public class RendererConfiguration implements Cloneable, JDOMExternalizable {
|
||||
myRepresentationNodes.remove(renderer);
|
||||
}
|
||||
|
||||
public List<NodeRenderer> getRenderers() {
|
||||
List<NodeRenderer> result = new ArrayList<NodeRenderer>();
|
||||
|
||||
for (Iterator<AutoRendererNode> iterator = myRepresentationNodes.iterator(); iterator.hasNext();) {
|
||||
AutoRendererNode autoRendererNode = iterator.next();
|
||||
result.add(autoRendererNode.getRenderer());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<AutoRendererNode> getAutoNodes() {
|
||||
List<AutoRendererNode> result = new ArrayList<AutoRendererNode>();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user