(no message)

This commit is contained in:
Eugene Zhuravlev
2005-02-18 19:59:59 +03:00
parent 5cfdd0ac87
commit 41d73b1d07
22 changed files with 792 additions and 375 deletions
@@ -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");