mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
removed DebuggerCommonViews plugin and moved its functionality to IDEA
This commit is contained in:
@@ -4,15 +4,12 @@
|
||||
*/
|
||||
package com.intellij.debugger.engine;
|
||||
|
||||
import com.intellij.debugger.engine.DebugProcessListener;
|
||||
import com.intellij.debugger.engine.SuspendContext;
|
||||
import com.intellij.debugger.PositionManager;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
import com.intellij.debugger.engine.managerThread.DebuggerManagerThread;
|
||||
import com.intellij.debugger.engine.jdi.VirtualMachineProxy;
|
||||
import com.intellij.debugger.engine.managerThread.DebuggerManagerThread;
|
||||
import com.intellij.debugger.requests.RequestManager;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererManager;
|
||||
import com.intellij.debugger.PositionManager;
|
||||
import com.intellij.execution.ExecutionResult;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
@@ -33,8 +30,6 @@ public interface DebugProcess {
|
||||
|
||||
Project getProject();
|
||||
|
||||
NodeRendererManager getNodeRendererManager();
|
||||
|
||||
RequestManager getRequestsManager();
|
||||
|
||||
PositionManager getPositionManager();
|
||||
@@ -78,4 +73,5 @@ public interface DebugProcess {
|
||||
List paramList) throws EvaluateException;
|
||||
|
||||
boolean isAttached();
|
||||
|
||||
}
|
||||
|
||||
@@ -200,7 +200,9 @@ public abstract class DebuggerUtils implements ApplicationComponent {
|
||||
public static Type getSuperType(Type subType, String superType) {
|
||||
if("java.lang.Object".equals(superType)) {
|
||||
List list = subType.virtualMachine().classesByName("java.lang.Object");
|
||||
if(list.size() > 0) return (ReferenceType)list.get(0);
|
||||
if(list.size() > 0) {
|
||||
return (ReferenceType)list.get(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -253,7 +255,9 @@ public abstract class DebuggerUtils implements ApplicationComponent {
|
||||
//only for interfaces and arrays
|
||||
if("java.lang.Object".equals(superType)) {
|
||||
List list = subType.virtualMachine().classesByName("java.lang.Object");
|
||||
if(list.size() > 0) return (ReferenceType)list.get(0);
|
||||
if(list.size() > 0) {
|
||||
return (ReferenceType)list.get(0);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.JDOMExternalizerUtil;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import org.jdom.Element;
|
||||
|
||||
/**
|
||||
* @author Eugene Zhuravlev
|
||||
* Date: Feb 9, 2005
|
||||
*/
|
||||
public abstract class NodeRendererImpl extends RendererImpl implements NodeRenderer{
|
||||
private String myName;
|
||||
|
||||
protected NodeRendererImpl(RendererProvider rendererProvider, String uniqueId) {
|
||||
super(rendererProvider, uniqueId);
|
||||
}
|
||||
|
||||
public final String getName() {
|
||||
return myName;
|
||||
}
|
||||
|
||||
public final void setName(String text) {
|
||||
myName = text;
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
super.readExternal(element);
|
||||
myName = JDOMExternalizerUtil.readField(element, "NAME");
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
super.writeExternal(element);
|
||||
JDOMExternalizerUtil.writeField(element, "NAME", myName);
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
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.sun.jdi.ReferenceType;
|
||||
import com.sun.jdi.Type;
|
||||
import org.jdom.Element;
|
||||
|
||||
public abstract class ReferenceRenderer extends RendererImpl {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ReferenceRenderer");
|
||||
private String myClassName; // todo: remove from here, use support from RendererImpl
|
||||
|
||||
protected ReferenceRenderer(final RendererProvider rendererProvider, final String uniqueId) {
|
||||
this("java.lang.Object", rendererProvider, uniqueId);
|
||||
}
|
||||
|
||||
protected ReferenceRenderer(String className, final RendererProvider rendererProvider, final String uniqueId) {
|
||||
super(rendererProvider, uniqueId);
|
||||
LOG.assertTrue(className != null);
|
||||
myClassName = className;
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return myClassName;
|
||||
}
|
||||
|
||||
public void setClassName(String className) {
|
||||
myClassName = className;
|
||||
}
|
||||
|
||||
public boolean isApplicable(Type type) {
|
||||
if(type == null || !(type instanceof ReferenceType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return DebuggerUtils.instanceOf(type, myClassName);
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
super.writeExternal(element);
|
||||
JDOMExternalizerUtil.writeField(element, "QUALIFIED_NAME", getClassName());
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
super.readExternal(element);
|
||||
final String className = JDOMExternalizerUtil.readField(element, "QUALIFIED_NAME");
|
||||
if(className != null) {
|
||||
setClassName(className);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.intellij.debugger.tree.actions;
|
||||
|
||||
import com.intellij.debugger.tree.CommonRenderers;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
public class ShowAllAsHex extends ShowAllAs {
|
||||
|
||||
public ShowAllAsHex() {
|
||||
super(CommonRenderers.getInstance().getHexRenderer());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,19 +1,11 @@
|
||||
<components>
|
||||
<application-components>
|
||||
<component>
|
||||
<implementation-class>com.intellij.debugger.ui.impl.watch.render.DefaultRendererProvider</implementation-class>
|
||||
</component>
|
||||
<component>
|
||||
<interface-class>com.intellij.debugger.engine.DebuggerUtils</interface-class>
|
||||
<implementation-class>com.intellij.debugger.impl.DebuggerUtilsImpl</implementation-class>
|
||||
</component>
|
||||
<component>
|
||||
<interface-class>com.intellij.debugger.ui.tree.render.NodeRendererSettings</interface-class>
|
||||
<implementation-class>com.intellij.debugger.settings.NodeRendererSettingsImpl</implementation-class>
|
||||
</component>
|
||||
<component>
|
||||
<interface-class>com.intellij.debugger.ui.tree.render.NodeProviderManager</interface-class>
|
||||
<implementation-class>com.intellij.debugger.settings.NodeProviderManagerImpl</implementation-class>
|
||||
<implementation-class>com.intellij.debugger.settings.NodeRendererSettings</implementation-class>
|
||||
</component>
|
||||
<component>
|
||||
<implementation-class>com.intellij.debugger.settings.ThreadsViewSettings</implementation-class>
|
||||
@@ -58,4 +50,12 @@
|
||||
<implementation-class>com.intellij.debugger.ui.ValueLookupManager</implementation-class>
|
||||
</component>
|
||||
</project-components>
|
||||
|
||||
<actions>
|
||||
<group id="CommonViews">
|
||||
<add-to-group group-id="Debugger.Representation" anchor="after" relative-to-action="Debugger.AutoRenderer"/>
|
||||
<action id="Debugger.ShowAllAsHex" class="com.intellij.debugger.ui.tree.actions.ShowAllAsHex" text="Hex Array"/>
|
||||
<action id="Debugger.ShowAllAsDecimal" class="com.intellij.debugger.ui.tree.actions.ShowAllAsDecimal" text="Decimal Array"/>
|
||||
</group>
|
||||
</actions>
|
||||
</components>
|
||||
@@ -3,7 +3,8 @@ package com.intellij.debugger.actions;
|
||||
import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl;
|
||||
import com.intellij.debugger.ui.impl.watch.NodeDescriptorImpl;
|
||||
import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl;
|
||||
import com.intellij.debugger.ui.impl.watch.render.ArrayRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.ArrayRenderer;
|
||||
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;
|
||||
|
||||
@@ -6,7 +6,7 @@ import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl;
|
||||
import com.intellij.debugger.ui.impl.watch.NodeDescriptorImpl;
|
||||
import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererSettings;
|
||||
import com.intellij.debugger.settings.NodeRendererSettings;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
|
||||
|
||||
@@ -16,12 +16,19 @@ import com.intellij.debugger.impl.DebuggerUtilsEx;
|
||||
import com.intellij.debugger.jdi.StackFrameProxyImpl;
|
||||
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
|
||||
import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
|
||||
import com.intellij.debugger.settings.AutoRendererNode;
|
||||
import com.intellij.debugger.settings.DebuggerSettings;
|
||||
import com.intellij.debugger.settings.NodeRendererSettings;
|
||||
import com.intellij.debugger.settings.ViewsGeneralSettings;
|
||||
import com.intellij.debugger.ui.DebuggerSmoothManager;
|
||||
import com.intellij.debugger.ui.DescriptorHistoryManagerImpl;
|
||||
import com.intellij.debugger.ui.breakpoints.LineBreakpoint;
|
||||
import com.intellij.debugger.ui.impl.watch.DescriptorHistoryManager;
|
||||
import com.intellij.debugger.ui.impl.watch.render.NodeRendererManagerImpl;
|
||||
import com.intellij.debugger.ui.tree.render.ArrayRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.ClassRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.PrimitiveRenderer;
|
||||
import com.intellij.debugger.ui.tree.ValueDescriptor;
|
||||
import com.intellij.debugger.ui.tree.render.*;
|
||||
import com.intellij.execution.CantRunException;
|
||||
import com.intellij.execution.ExecutionException;
|
||||
import com.intellij.execution.ExecutionResult;
|
||||
@@ -46,6 +53,7 @@ import com.intellij.psi.PsiFile;
|
||||
import com.intellij.util.Alarm;
|
||||
import com.intellij.util.EventDispatcher;
|
||||
import com.intellij.util.concurrency.Semaphore;
|
||||
import com.intellij.util.containers.InternalIterator;
|
||||
import com.sun.jdi.*;
|
||||
import com.sun.jdi.connect.*;
|
||||
import com.sun.jdi.request.EventRequest;
|
||||
@@ -105,7 +113,17 @@ public abstract class DebugProcessImpl implements DebugProcess {
|
||||
: EventRequest.SUSPEND_EVENT_THREAD;
|
||||
|
||||
private final DescriptorHistoryManager myDescriptorHistoryManager;
|
||||
private final NodeRendererManagerImpl myNodeRendererManager = new NodeRendererManagerImpl(this);
|
||||
|
||||
private final List<AutoRendererNode> myRenderers = new ArrayList<AutoRendererNode>();
|
||||
private final Map<Type, NodeRenderer> myNodeRederersMap = new com.intellij.util.containers.HashMap<Type, NodeRenderer>();
|
||||
private final NodeRendererSettingsListener mySettingsListener = new NodeRendererSettingsListener() {
|
||||
public void renderersChanged() {
|
||||
myNodeRederersMap.clear();
|
||||
myRenderers.clear();
|
||||
loadRenderers();
|
||||
}
|
||||
};
|
||||
|
||||
private final SuspendManagerImpl mySuspendManager = new SuspendManagerImpl(this);
|
||||
protected CompoundPositionManager myPositionManager = null;
|
||||
DebuggerManagerThreadImpl myDebuggerManagerThread;
|
||||
@@ -120,8 +138,70 @@ public abstract class DebugProcessImpl implements DebugProcess {
|
||||
myRequestManager = new RequestManagerImpl(this);
|
||||
myDescriptorHistoryManager = new DescriptorHistoryManagerImpl(project);
|
||||
setSuspendPolicy(DebuggerSettings.getInstance().isSuspendAllThreads());
|
||||
NodeRendererSettings.getInstance().addListener(mySettingsListener);
|
||||
loadRenderers();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public NodeRenderer getAutoRenderer(ValueDescriptor descriptor) {
|
||||
DebuggerManagerThreadImpl.assertIsManagerThread();
|
||||
final Value value = descriptor.getValue();
|
||||
Type type = value != null ? value.type() : null;
|
||||
|
||||
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();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (renderer == null) {
|
||||
renderer = getDefaultRenderer(type);
|
||||
}
|
||||
myNodeRederersMap.put(type, renderer);
|
||||
}
|
||||
|
||||
return renderer;
|
||||
}
|
||||
|
||||
public NodeRenderer getDefaultRenderer(Type type) {
|
||||
final NodeRendererSettings settings = NodeRendererSettings.getInstance();
|
||||
|
||||
final PrimitiveRenderer primitiveRenderer = (PrimitiveRenderer)settings.getPrimitiveRenderer();
|
||||
if(primitiveRenderer.isApplicable(type)) {
|
||||
return primitiveRenderer;
|
||||
}
|
||||
|
||||
final ArrayRenderer arrayRenderer = (ArrayRenderer)settings.getArrayRenderer();
|
||||
if(arrayRenderer.isApplicable(type)) {
|
||||
return arrayRenderer;
|
||||
}
|
||||
|
||||
final ClassRenderer classRenderer = (ClassRenderer)settings.getClassRenderer();
|
||||
LOG.assertTrue(classRenderer.isApplicable(type), type.name());
|
||||
return classRenderer;
|
||||
}
|
||||
|
||||
|
||||
protected void commitVM(VirtualMachine vm) {
|
||||
LOG.assertTrue(myState == STATE_INITIAL, "State is invalid " + myState);
|
||||
DebuggerManagerThreadImpl.assertIsManagerThread();
|
||||
@@ -647,14 +727,14 @@ public abstract class DebugProcessImpl implements DebugProcess {
|
||||
}
|
||||
}
|
||||
else if (e instanceof CantRunException) {
|
||||
message = "Error Launching Debuggee.\n" + ((CantRunException)e).getMessage();
|
||||
message = "Error Launching Debuggee.\n" + e.getMessage();
|
||||
}
|
||||
else if (e instanceof VMDisconnectedException) {
|
||||
message = "VM Disconnected.\n" + "Target virtual machine closed connection.";
|
||||
}
|
||||
else if (e instanceof UnknownHostException) {
|
||||
message = "Cannot Connect to Remote Process.\n" +
|
||||
"Host unknown: " + ((UnknownHostException)e).getMessage();
|
||||
"Host unknown: " + e.getMessage();
|
||||
}
|
||||
else if (e instanceof IOException) {
|
||||
IOException e1 = (IOException)e;
|
||||
@@ -671,24 +751,19 @@ public abstract class DebugProcessImpl implements DebugProcess {
|
||||
message = buf.toString();
|
||||
}
|
||||
else if (e instanceof ExecutionException) {
|
||||
message = ((ExecutionException)e).getMessage();
|
||||
message = e.getMessage();
|
||||
}
|
||||
else {
|
||||
Exception e1 = (Exception)e;
|
||||
message = "Error Connecting to Remote Process.\n" +
|
||||
"Exception occured: " + e1.getClass().getName() + "\n" +
|
||||
"Exception message: " + e1.getMessage();
|
||||
"Exception occured: " + e.getClass().getName() + "\n" +
|
||||
"Exception message: " + e.getMessage();
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug(e1);
|
||||
LOG.debug(e);
|
||||
}
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
public NodeRendererManagerImpl getNodeRendererManager() {
|
||||
return myNodeRendererManager;
|
||||
}
|
||||
|
||||
public DescriptorHistoryManager getDescriptorHistoryManager() {
|
||||
return myDescriptorHistoryManager;
|
||||
}
|
||||
@@ -715,7 +790,7 @@ public abstract class DebugProcessImpl implements DebugProcess {
|
||||
|
||||
public void dispose() {
|
||||
LOG.assertTrue(!isAttached());
|
||||
myNodeRendererManager.dispose();
|
||||
NodeRendererSettings.getInstance().addListener(mySettingsListener);
|
||||
myDescriptorHistoryManager.dispose();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package com.intellij.debugger.settings;
|
||||
|
||||
import com.intellij.debugger.impl.DebuggerUtilsEx;
|
||||
import com.intellij.debugger.ui.impl.watch.render.ArrayRenderer;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.debugger.ui.tree.render.ArrayRenderer;
|
||||
import com.intellij.openapi.options.UnnamedConfigurable;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
@@ -31,19 +29,24 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{
|
||||
public ArrayRendererConfigurable(ArrayRenderer renderer) {
|
||||
myRenderer = renderer;
|
||||
|
||||
myFirstIndexLabel .setLabelFor(myFirstIndex);
|
||||
myLastIndexLabel .setLabelFor(myLastIndexLabel);
|
||||
myFirstIndexLabel.setLabelFor(myFirstIndex);
|
||||
myLastIndexLabel.setLabelFor(myLastIndexLabel);
|
||||
myEntriesLimitLabel.setLabelFor(myEntriesLimit);
|
||||
|
||||
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(); }
|
||||
};
|
||||
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);
|
||||
}
|
||||
@@ -53,8 +56,8 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
myFirstIndex .setText(String.valueOf(myRenderer.START_INDEX));
|
||||
myEndIndex .setText(String.valueOf(myRenderer.END_INDEX));
|
||||
myFirstIndex.setText(String.valueOf(myRenderer.START_INDEX));
|
||||
myEndIndex.setText(String.valueOf(myRenderer.END_INDEX));
|
||||
myEntriesLimit.setText(String.valueOf(myRenderer.ENTRIES_LIMIT));
|
||||
}
|
||||
|
||||
@@ -64,8 +67,8 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{
|
||||
|
||||
private void applyTo(ArrayRenderer renderer) {
|
||||
int newStartIndex = getInt(myFirstIndex);
|
||||
int newEndIndex = getInt(myEndIndex);
|
||||
int newLimit = getInt(myEntriesLimit);
|
||||
int newEndIndex = getInt(myEndIndex);
|
||||
int newLimit = getInt(myEntriesLimit);
|
||||
|
||||
if (newStartIndex >= 0 && newEndIndex >= 0) {
|
||||
if (newStartIndex >= newEndIndex) {
|
||||
@@ -103,7 +106,11 @@ public class ArrayRendererConfigurable implements UnnamedConfigurable{
|
||||
public boolean isModified() {
|
||||
ArrayRenderer cloneRenderer = myRenderer.clone();
|
||||
applyTo(cloneRenderer);
|
||||
return !DebuggerUtilsEx.externalizableEqual(myRenderer, cloneRenderer);
|
||||
final boolean valuesEqual =
|
||||
(myRenderer.END_INDEX == cloneRenderer.END_INDEX) &&
|
||||
(myRenderer.START_INDEX == cloneRenderer.START_INDEX) &&
|
||||
(myRenderer.ENTRIES_LIMIT == cloneRenderer.ENTRIES_LIMIT);
|
||||
return !valuesEqual;
|
||||
}
|
||||
|
||||
public void disposeUIResources() {
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
package com.intellij.debugger.settings;
|
||||
|
||||
import com.intellij.debugger.impl.DebuggerUtilsEx;
|
||||
import com.intellij.debugger.ui.tree.render.*;
|
||||
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.util.EventDispatcher;
|
||||
import com.intellij.util.containers.InternalIterator;
|
||||
import org.jdom.Element;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Sep 18, 2003
|
||||
* Time: 8:00:25 PM
|
||||
*/
|
||||
public class NodeRendererSettings implements ApplicationComponent, NamedJDOMExternalizable {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.NodeRendererSettings");
|
||||
private static final String REFERENCE_RENDERER = "Reference renderer";
|
||||
public static final String RENDERER_TAG = "Renderer";
|
||||
private static final String RENDERER_ID = "ID";
|
||||
|
||||
private final EventDispatcher<NodeRendererSettingsListener> myDispatcher = EventDispatcher.create(NodeRendererSettingsListener.class);
|
||||
private RendererConfiguration myRendererConfiguration = new RendererConfiguration(this);
|
||||
|
||||
// default singleton 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();
|
||||
|
||||
|
||||
public static NodeRendererSettings getInstance() {
|
||||
return ApplicationManager.getApplication().getComponent(NodeRendererSettings.class);
|
||||
}
|
||||
|
||||
public String getComponentName() {
|
||||
return "NodeRendererSettings";
|
||||
}
|
||||
|
||||
public void initComponent() { }
|
||||
|
||||
public void disposeComponent() {
|
||||
}
|
||||
|
||||
public String getExternalFileName() {
|
||||
return "debugger.renderers";
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
if(!(o instanceof NodeRendererSettings)) return false;
|
||||
|
||||
return DebuggerUtilsEx.externalizableEqual(this, (NodeRendererSettings)o);
|
||||
}
|
||||
|
||||
public void addListener(NodeRendererSettingsListener listener) {
|
||||
myDispatcher.addListener(listener);
|
||||
}
|
||||
|
||||
public void removeListener(NodeRendererSettingsListener listener) {
|
||||
myDispatcher.removeListener(listener);
|
||||
}
|
||||
|
||||
public void writeExternal(final Element element) throws WriteExternalException {
|
||||
myRendererConfiguration.writeExternal(element);
|
||||
}
|
||||
|
||||
public void readExternal(final Element root) {
|
||||
myRendererConfiguration.readExternal(root);
|
||||
myDispatcher.getMulticaster().renderersChanged();
|
||||
}
|
||||
|
||||
public RendererConfiguration getRendererConfiguration() {
|
||||
return myRendererConfiguration;
|
||||
}
|
||||
|
||||
public void setRendererConfiguration(final RendererConfiguration rendererConfiguration) {
|
||||
LOG.assertTrue(rendererConfiguration != null);
|
||||
RendererConfiguration oldConfig = myRendererConfiguration;
|
||||
myRendererConfiguration = rendererConfiguration;
|
||||
if (oldConfig == null || !oldConfig.equals(rendererConfiguration)) {
|
||||
fireRenderersChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public void iterateRenderers(InternalIterator<AutoRendererNode> iterator) {
|
||||
myRendererConfiguration.iterateRenderers(iterator);
|
||||
}
|
||||
|
||||
public PrimitiveRenderer getPrimitiveRenderer() {
|
||||
return myPrimitiveRenderer;
|
||||
}
|
||||
|
||||
public ArrayRenderer getArrayRenderer() {
|
||||
return myArrayRenderer;
|
||||
}
|
||||
|
||||
public ClassRenderer getClassRenderer() {
|
||||
return myClassRenderer;
|
||||
}
|
||||
|
||||
public HexRenderer getHexRenderer() {
|
||||
return myHexRenderer;
|
||||
}
|
||||
|
||||
public void fireRenderersChanged() {
|
||||
myDispatcher.getMulticaster().renderersChanged();
|
||||
}
|
||||
|
||||
public List<NodeRenderer> getAllRenderers() {
|
||||
final List<NodeRenderer> allRenderers = new ArrayList<NodeRenderer>();
|
||||
myRendererConfiguration.iterateRenderers(new InternalIterator<AutoRendererNode>() {
|
||||
public boolean visit(final AutoRendererNode element) {
|
||||
allRenderers.add(element.getRenderer());
|
||||
return true;
|
||||
}
|
||||
});
|
||||
allRenderers.add(myArrayRenderer);
|
||||
allRenderers.add(myClassRenderer);
|
||||
allRenderers.add(myPrimitiveRenderer);
|
||||
allRenderers.add(myHexRenderer);
|
||||
return allRenderers;
|
||||
}
|
||||
|
||||
public boolean isDefault(final Renderer renderer) {
|
||||
return renderer == myPrimitiveRenderer || renderer == myArrayRenderer || renderer == myClassRenderer;
|
||||
}
|
||||
|
||||
public Renderer readRenderer(Element root) throws InvalidDataException {
|
||||
if (root == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!RENDERER_TAG.equals(root.getName())) {
|
||||
throw new InvalidDataException("Cannot read renderer - tag name is not '" + RENDERER_TAG + "'");
|
||||
}
|
||||
|
||||
final String rendererId = root.getAttributeValue(RENDERER_ID);
|
||||
if(rendererId == null) {
|
||||
throw new InvalidDataException("unknown renderer ID: " + rendererId);
|
||||
}
|
||||
|
||||
final Renderer renderer = createRenderer(rendererId);
|
||||
if(renderer == null) {
|
||||
throw new InvalidDataException("unknown renderer ID: " + rendererId);
|
||||
}
|
||||
|
||||
renderer.readExternal(root);
|
||||
|
||||
return renderer;
|
||||
}
|
||||
|
||||
public Element writeRenderer(Renderer renderer) throws WriteExternalException {
|
||||
Element root = new Element(RENDERER_TAG);
|
||||
if(renderer != null) {
|
||||
root.setAttribute(RENDERER_ID , renderer.getUniqueId());
|
||||
renderer.writeExternal(root);
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
public Renderer createRenderer(final String rendererId) {
|
||||
if (ClassRenderer.UNIQUE_ID.equals(rendererId)) {
|
||||
return myClassRenderer;
|
||||
}
|
||||
else if (ArrayRenderer.UNIQUE_ID.equals(rendererId)) {
|
||||
return myArrayRenderer;
|
||||
}
|
||||
else if (PrimitiveRenderer.UNIQUE_ID.equals(rendererId)) {
|
||||
return myPrimitiveRenderer;
|
||||
}
|
||||
else if(HexRenderer.UNIQUE_ID.equals(rendererId)) {
|
||||
return myHexRenderer;
|
||||
}
|
||||
else if(rendererId.equals(ExpressionChildrenRenderer.UNIQUE_ID)) {
|
||||
return new ExpressionChildrenRenderer();
|
||||
}
|
||||
else if(rendererId.equals(LabelRenderer.UNIQUE_ID)) {
|
||||
return new LabelRenderer();
|
||||
}
|
||||
else if(rendererId.equals(EnumerationChildrenRenderer.UNIQUE_ID)) {
|
||||
return new EnumerationChildrenRenderer();
|
||||
}
|
||||
else if(rendererId.equals(ToStringRenderer.UNIQUE_ID)) {
|
||||
return new ToStringRenderer();
|
||||
}
|
||||
else if(rendererId.equals(CompoundNodeRenderer.UNIQUE_ID) || rendererId.equals(REFERENCE_RENDERER)) {
|
||||
return new CompoundReferenceRenderer(this, "unnamed", null, null);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+15
-86
@@ -1,15 +1,11 @@
|
||||
package com.intellij.debugger.settings;
|
||||
|
||||
import com.intellij.debugger.impl.DebuggerUtilsEx;
|
||||
import com.intellij.debugger.ui.impl.watch.render.ArrayRenderer;
|
||||
import com.intellij.debugger.ui.impl.watch.render.ClassRenderer;
|
||||
import com.intellij.debugger.ui.impl.watch.render.DefaultRendererProvider;
|
||||
import com.intellij.debugger.ui.impl.watch.render.PrimitiveRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.*;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.NamedJDOMExternalizable;
|
||||
import com.intellij.openapi.util.JDOMExternalizable;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.intellij.util.EventDispatcher;
|
||||
import com.intellij.util.containers.InternalIterator;
|
||||
import org.jdom.Element;
|
||||
|
||||
@@ -17,42 +13,27 @@ import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Sep 18, 2003
|
||||
* Time: 8:00:25 PM
|
||||
*/
|
||||
public class NodeRendererSettingsImpl extends NodeRendererSettings implements Cloneable, NamedJDOMExternalizable {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.NodeRendererSettingsImpl");
|
||||
public class RendererConfiguration implements Cloneable, JDOMExternalizable {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.NodeRendererSettings");
|
||||
private static final String AUTO_NODE = "node";
|
||||
|
||||
private static final int VERSION = 3;
|
||||
private static final int VERSION = 5;
|
||||
|
||||
private EventDispatcher<NodeRendererSettingsListener> myDispatcher = EventDispatcher.create(NodeRendererSettingsListener.class);
|
||||
private List<AutoRendererNode> myRepresentationNodes = new ArrayList<AutoRendererNode>();
|
||||
private final NodeRendererSettings myRendererSettings;
|
||||
|
||||
public String getComponentName() {
|
||||
return "NodeRendererSettings";
|
||||
protected RendererConfiguration(NodeRendererSettings rendererSettings) {
|
||||
myRendererSettings = rendererSettings;
|
||||
}
|
||||
|
||||
public void initComponent() { }
|
||||
|
||||
public void disposeComponent() {
|
||||
}
|
||||
|
||||
public String getExternalFileName() {
|
||||
return "debugger.renderers";
|
||||
}
|
||||
|
||||
public NodeRendererSettingsImpl clone() {
|
||||
NodeRendererSettingsImpl result = null;
|
||||
public RendererConfiguration clone() {
|
||||
RendererConfiguration result = null;
|
||||
try {
|
||||
result = (NodeRendererSettingsImpl)super.clone();
|
||||
result = (RendererConfiguration)super.clone();
|
||||
}
|
||||
catch (CloneNotSupportedException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
result.myDispatcher = EventDispatcher.create(NodeRendererSettingsListener.class);
|
||||
result.myRepresentationNodes = new ArrayList<AutoRendererNode>();
|
||||
for (Iterator<AutoRendererNode> iterator = myRepresentationNodes.iterator(); iterator.hasNext();) {
|
||||
AutoRendererNode autoRendererNode = iterator.next();
|
||||
@@ -63,17 +44,9 @@ public class NodeRendererSettingsImpl extends NodeRendererSettings implements Cl
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
if(!(o instanceof NodeRendererSettingsImpl)) return false;
|
||||
if(!(o instanceof RendererConfiguration)) return false;
|
||||
|
||||
return DebuggerUtilsEx.externalizableEqual(this, (NodeRendererSettingsImpl)o);
|
||||
}
|
||||
|
||||
public void addListener(NodeRendererSettingsListener listener) {
|
||||
myDispatcher.addListener(listener);
|
||||
}
|
||||
|
||||
public void removeListener(NodeRendererSettingsListener listener) {
|
||||
myDispatcher.removeListener(listener);
|
||||
return DebuggerUtilsEx.externalizableEqual(this, (RendererConfiguration)o);
|
||||
}
|
||||
|
||||
public void writeExternal(final Element element) throws WriteExternalException {
|
||||
@@ -107,13 +80,11 @@ public class NodeRendererSettingsImpl extends NodeRendererSettings implements Cl
|
||||
for (Iterator<Element> iterator = children.iterator(); iterator.hasNext();) {
|
||||
Element nodeRepresentation = iterator.next();
|
||||
try {
|
||||
addNode(AutoRendererNode.read(nodeRepresentation));
|
||||
addNode(AutoRendererNode.read(nodeRepresentation, myRendererSettings));
|
||||
} catch (Exception e) {
|
||||
LOG.debug(e);
|
||||
}
|
||||
}
|
||||
|
||||
myDispatcher.getMulticaster().renderersChanged();
|
||||
}
|
||||
|
||||
private void addNode(AutoRendererNode nodeRepresentation) {
|
||||
@@ -129,28 +100,17 @@ public class NodeRendererSettingsImpl extends NodeRendererSettings implements Cl
|
||||
myRepresentationNodes.remove(renderer);
|
||||
}
|
||||
|
||||
public List<NodeRenderer> getAllRenderers() {
|
||||
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());
|
||||
}
|
||||
final DefaultRendererProvider defaultRendererProvider = DefaultRendererProvider.getInstance();
|
||||
result.add(defaultRendererProvider.getArrayRenderer());
|
||||
result.add(defaultRendererProvider.getClassRenderer());
|
||||
result.add(defaultRendererProvider.getPrimitiveRenderer());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean isDefault(Renderer renderer) {
|
||||
final DefaultRendererProvider defaultRendererProvider = DefaultRendererProvider.getInstance();
|
||||
return renderer == defaultRendererProvider.getArrayRenderer() ||
|
||||
renderer == defaultRendererProvider.getClassRenderer() ||
|
||||
renderer == defaultRendererProvider.getPrimitiveRenderer();
|
||||
}
|
||||
|
||||
public List<AutoRendererNode> getAutoNodes() {
|
||||
List<AutoRendererNode> result = new ArrayList<AutoRendererNode>();
|
||||
|
||||
@@ -164,17 +124,6 @@ public class NodeRendererSettingsImpl extends NodeRendererSettings implements Cl
|
||||
|
||||
public void setAutoNodes(List<AutoRendererNode> nodes) {
|
||||
myRepresentationNodes = nodes;
|
||||
fireRenderersChanged();
|
||||
}
|
||||
|
||||
public List<NodeRenderer> getRenderersByProvider(RendererProvider rendererProvider) {
|
||||
List<NodeRenderer> result = new ArrayList<NodeRenderer>();
|
||||
|
||||
for (Iterator<AutoRendererNode> iterator = myRepresentationNodes.iterator(); iterator.hasNext();) {
|
||||
AutoRendererNode autoRendererNode = iterator.next();
|
||||
if(autoRendererNode.getRenderer().getRendererProvider() == rendererProvider) result.add(autoRendererNode.getRenderer());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void iterateRenderers(InternalIterator<AutoRendererNode> iterator) {
|
||||
@@ -183,24 +132,4 @@ public class NodeRendererSettingsImpl extends NodeRendererSettings implements Cl
|
||||
iterator.visit(autoRendererNode);
|
||||
}
|
||||
}
|
||||
|
||||
public PrimitiveRenderer getPrimitiveRenderer() {
|
||||
return DefaultRendererProvider.getInstance().getPrimitiveRenderer();
|
||||
}
|
||||
|
||||
public ArrayRenderer getArrayRenderer() {
|
||||
return DefaultRendererProvider.getInstance().getArrayRenderer();
|
||||
}
|
||||
|
||||
public ClassRenderer getClassRenderer() {
|
||||
return DefaultRendererProvider.getInstance().getClassRenderer();
|
||||
}
|
||||
|
||||
public void fireRenderersChanged() {
|
||||
myDispatcher.getMulticaster().renderersChanged();
|
||||
}
|
||||
|
||||
public static NodeRendererSettingsImpl getInstanceEx() {
|
||||
return (NodeRendererSettingsImpl)getInstance();
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,7 @@
|
||||
package com.intellij.debugger.settings;
|
||||
|
||||
import com.intellij.debugger.ui.impl.watch.render.ClassRenderer;
|
||||
import com.intellij.debugger.impl.DebuggerUtilsEx;
|
||||
import com.intellij.debugger.ui.tree.render.ClassRenderer;
|
||||
import com.intellij.openapi.options.Configurable;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.ui.StateRestoringCheckBox;
|
||||
|
||||
import javax.swing.*;
|
||||
@@ -15,7 +13,6 @@ import java.awt.*;
|
||||
* @author Eugene Belyaev
|
||||
*/
|
||||
public class ViewsGeneralConfigurable implements Configurable {
|
||||
private ViewsGeneralSettings myGeneralSettings;
|
||||
private JPanel myPanel;
|
||||
private JCheckBox myAutoscrollCheckBox;
|
||||
private JCheckBox myShowSyntheticsCheckBox;
|
||||
@@ -29,7 +26,6 @@ public class ViewsGeneralConfigurable implements Configurable {
|
||||
private JCheckBox myAlternativeViews;
|
||||
|
||||
public ViewsGeneralConfigurable() {
|
||||
myGeneralSettings = ViewsGeneralSettings.getInstance();
|
||||
myShowStaticCheckBox.addChangeListener(new ChangeListener(){
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
if(myShowStaticCheckBox.isSelected()) {
|
||||
@@ -40,7 +36,7 @@ public class ViewsGeneralConfigurable implements Configurable {
|
||||
}
|
||||
});
|
||||
|
||||
myArrayRendererConfigurable = new ArrayRendererConfigurable(NodeRendererSettingsImpl.getInstanceEx().getArrayRenderer());
|
||||
myArrayRendererConfigurable = new ArrayRendererConfigurable(NodeRendererSettings.getInstance().getArrayRenderer());
|
||||
myArrayConfigurablePlace.setLayout(new BorderLayout());
|
||||
myArrayConfigurablePlace.add(myArrayRendererConfigurable.createComponent());
|
||||
}
|
||||
@@ -63,27 +59,25 @@ public class ViewsGeneralConfigurable implements Configurable {
|
||||
|
||||
public void apply() {
|
||||
if (myPanel != null) {
|
||||
ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance();
|
||||
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();
|
||||
|
||||
applyTo(generalSettings);
|
||||
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();
|
||||
|
||||
generalSettings.fireRendererSettingsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void applyTo(ViewsGeneralSettings generalSettings) {
|
||||
generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myAutoscrollCheckBox.isSelected();
|
||||
generalSettings.USE_ALTERNATIVE_RENDERERS = myAlternativeViews.isSelected();
|
||||
generalSettings.HIDE_NULL_ARRAY_ELEMENTS = myHideNullElementsCheckBox.isSelected();
|
||||
|
||||
ClassRenderer classRenderer = (ClassRenderer)NodeRendererSettingsImpl.getInstance().getClassRenderer();
|
||||
|
||||
classRenderer.SORT_ASCENDING = mySortCheckBox.isSelected();
|
||||
classRenderer.SHOW_STATIC = myShowStaticCheckBox.isSelected();
|
||||
classRenderer.SHOW_STATIC_FINAL = myShowStaticFinalCheckBox.isSelectedWhenSelectable();
|
||||
classRenderer.SHOW_SYNTHETICS = myShowSyntheticsCheckBox.isSelected();
|
||||
if (renderersWereModified) {
|
||||
NodeRendererSettings.getInstance().fireRenderersChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
@@ -93,7 +87,7 @@ public class ViewsGeneralConfigurable implements Configurable {
|
||||
myHideNullElementsCheckBox.setSelected(generalSettings.HIDE_NULL_ARRAY_ELEMENTS);
|
||||
myAlternativeViews.setSelected(generalSettings.USE_ALTERNATIVE_RENDERERS);
|
||||
|
||||
ClassRenderer classRenderer = (ClassRenderer)NodeRendererSettingsImpl.getInstance().getClassRenderer();
|
||||
ClassRenderer classRenderer = NodeRendererSettings.getInstance().getClassRenderer();
|
||||
|
||||
myShowSyntheticsCheckBox.setSelected(classRenderer.SHOW_SYNTHETICS);
|
||||
mySortCheckBox.setSelected(classRenderer.SORT_ASCENDING);
|
||||
@@ -107,10 +101,27 @@ public class ViewsGeneralConfigurable implements Configurable {
|
||||
}
|
||||
|
||||
public boolean isModified() {
|
||||
ViewsGeneralSettings settings = ((ViewsGeneralSettings)ViewsGeneralSettings.getInstance()).clone();
|
||||
applyTo(settings);
|
||||
return areGeneralSettingsModified() || areDefaultRenderersModified();
|
||||
}
|
||||
|
||||
return !DebuggerUtilsEx.externalizableEqual(settings, ViewsGeneralSettings.getInstance()) || myArrayRendererConfigurable.isModified();
|
||||
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() {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.intellij.debugger.settings;
|
||||
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererSettings;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.components.ApplicationComponent;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
@@ -10,7 +9,7 @@ import com.intellij.openapi.util.NamedJDOMExternalizable;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import org.jdom.Element;
|
||||
|
||||
public class ViewsGeneralSettings implements NamedJDOMExternalizable, ApplicationComponent, Cloneable {
|
||||
public class ViewsGeneralSettings implements NamedJDOMExternalizable, ApplicationComponent{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.ViewsSettings");
|
||||
public boolean SHOW_OBJECTID = true;
|
||||
public boolean HIDE_NULL_ARRAY_ELEMENTS = true;
|
||||
@@ -37,7 +36,6 @@ public class ViewsGeneralSettings implements NamedJDOMExternalizable, Applicatio
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
DefaultJDOMExternalizer.readExternal(this, element);
|
||||
fireRendererSettingsChanged();
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
@@ -49,7 +47,7 @@ public class ViewsGeneralSettings implements NamedJDOMExternalizable, Applicatio
|
||||
}
|
||||
|
||||
void fireRendererSettingsChanged() {
|
||||
((NodeRendererSettingsImpl) myNodeRendererSettings).fireRenderersChanged();
|
||||
myNodeRendererSettings.fireRenderersChanged();
|
||||
}
|
||||
|
||||
public boolean equals(Object object) {
|
||||
@@ -60,21 +58,4 @@ public class ViewsGeneralSettings implements NamedJDOMExternalizable, Applicatio
|
||||
AUTOSCROLL_TO_NEW_LOCALS == generalSettings.AUTOSCROLL_TO_NEW_LOCALS;
|
||||
}
|
||||
|
||||
protected ViewsGeneralSettings clone() {
|
||||
try {
|
||||
Element root = new Element("root");
|
||||
writeExternal(root);
|
||||
ViewsGeneralSettings settings = new ViewsGeneralSettings(((NodeRendererSettingsImpl)myNodeRendererSettings).clone());
|
||||
settings.readExternal(root);
|
||||
return settings;
|
||||
}
|
||||
catch (WriteExternalException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
catch (InvalidDataException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,7 +4,8 @@
|
||||
*/
|
||||
package com.intellij.debugger.ui.impl.nodes;
|
||||
|
||||
import com.intellij.debugger.ui.impl.watch.render.ArrayRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.ArrayRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.ArrayRenderer;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.sun.jdi.ArrayReference;
|
||||
|
||||
|
||||
@@ -17,13 +17,13 @@ import com.intellij.debugger.jdi.StackFrameProxyImpl;
|
||||
import com.intellij.debugger.jdi.ThreadGroupReferenceProxyImpl;
|
||||
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
|
||||
import com.intellij.debugger.settings.ThreadsViewSettings;
|
||||
import com.intellij.debugger.settings.NodeRendererSettings;
|
||||
import com.intellij.debugger.ui.impl.DebuggerTreeBase;
|
||||
import com.intellij.debugger.ui.impl.tree.TreeBuilder;
|
||||
import com.intellij.debugger.ui.impl.tree.TreeBuilderNode;
|
||||
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
|
||||
import com.intellij.debugger.ui.tree.NodeDescriptor;
|
||||
import com.intellij.debugger.ui.tree.render.ChildrenBuilder;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererSettings;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererSettingsListener;
|
||||
import com.intellij.execution.ExecutionManager;
|
||||
import com.intellij.execution.ui.RunContentDescriptor;
|
||||
|
||||
@@ -192,7 +192,7 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements
|
||||
return myRenderer;
|
||||
}
|
||||
|
||||
myAutoRenderer = debugProcess.getNodeRendererManager().getAutoRenderer(this);
|
||||
myAutoRenderer = debugProcess.getAutoRenderer(this);
|
||||
return myAutoRenderer;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.intellij.debugger.tree.actions;
|
||||
package com.intellij.debugger.ui.tree.actions;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.intellij.debugger.tree.actions;
|
||||
package com.intellij.debugger.ui.tree.actions;
|
||||
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererSettings;
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.intellij.debugger.ui.tree.actions;
|
||||
|
||||
import com.intellij.debugger.ui.tree.render.HexRenderer;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRenderer;
|
||||
import com.intellij.debugger.settings.NodeRendererSettings;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
public class ShowAllAsHex extends ShowAllAs {
|
||||
|
||||
public ShowAllAsHex() {
|
||||
super(NodeRendererSettings.getInstance().getHexRenderer());
|
||||
}
|
||||
}
|
||||
+19
-16
@@ -1,4 +1,4 @@
|
||||
package com.intellij.debugger.ui.impl.watch.render;
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
|
||||
@@ -13,7 +13,6 @@ import com.intellij.debugger.ui.tree.DebuggerTreeNode;
|
||||
import com.intellij.debugger.ui.tree.NodeDescriptor;
|
||||
import com.intellij.debugger.ui.tree.NodeDescriptorFactory;
|
||||
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.DefaultJDOMExternalizer;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
@@ -37,8 +36,8 @@ import java.util.ListIterator;
|
||||
* Date: Sep 18, 2003
|
||||
* Time: 3:07:19 PM
|
||||
*/
|
||||
public class ArrayRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.impl.watch.render.ArrayRenderer");
|
||||
public class ArrayRenderer extends NodeRendererImpl{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ArrayRenderer");
|
||||
|
||||
public static final String UNIQUE_ID = "ArrayRenderer";
|
||||
|
||||
@@ -47,12 +46,24 @@ public class ArrayRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
public int ENTRIES_LIMIT = 100;
|
||||
private final static String MORE_ELEMENTS = "...";
|
||||
|
||||
public ArrayRenderer(RendererProvider provider) {
|
||||
super(provider, UNIQUE_ID);
|
||||
public ArrayRenderer() {
|
||||
myProperties.setEnabled(true);
|
||||
}
|
||||
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return myProperties.isEnabled();
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
myProperties.setEnabled(enabled);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Default";
|
||||
return "Array";
|
||||
}
|
||||
|
||||
public void setName(String text) {
|
||||
@@ -181,14 +192,6 @@ public class ArrayRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
}
|
||||
|
||||
public boolean isApplicable(Type type) {
|
||||
if(type == null || !(type instanceof ArrayType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if("[]".equals(getClassName())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.isApplicable(type);
|
||||
return (type instanceof ArrayType);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.JDOMExternalizable;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import org.jdom.Element;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Eugene Zhuravlev
|
||||
* Date: Feb 12, 2005
|
||||
*/
|
||||
public final class BasicRendererProperties implements Cloneable, JDOMExternalizable{
|
||||
// todo: add class filters here
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.BasicRendererProperties");
|
||||
|
||||
private static final String NAME_OPTION = "NAME";
|
||||
private String myName;
|
||||
|
||||
private static final String ENABLED_OPTION = "ENABLED";
|
||||
private Boolean myEnabled;
|
||||
|
||||
private static final String CLASSNAME_OPTION = "QUALIFIED_NAME";
|
||||
private String myClassName;
|
||||
|
||||
public String getName() {
|
||||
return myName;
|
||||
}
|
||||
|
||||
public void setName(final String name) {
|
||||
myName = name;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return myEnabled != null? myEnabled.booleanValue() : false;
|
||||
}
|
||||
|
||||
public void setEnabled(final boolean enabled) {
|
||||
myEnabled = enabled? Boolean.TRUE : Boolean.FALSE;
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return myClassName;
|
||||
}
|
||||
|
||||
public void setClassName(final String className) {
|
||||
myClassName = className;
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
final List options = element.getChildren("option");
|
||||
myName = null;
|
||||
myEnabled = null;
|
||||
myClassName = null;
|
||||
for (Iterator it = options.iterator(); it.hasNext();) {
|
||||
final Element option = (Element)it.next();
|
||||
final String optionName = option.getAttributeValue("name");
|
||||
if (NAME_OPTION.equals(optionName)) {
|
||||
myName = option.getAttributeValue("value");
|
||||
}
|
||||
else if (ENABLED_OPTION.equals(optionName)) {
|
||||
final String val = option.getAttributeValue("value");
|
||||
myEnabled = "true".equalsIgnoreCase(val)? Boolean.TRUE : Boolean.FALSE;
|
||||
}
|
||||
else if (CLASSNAME_OPTION.equals(optionName)) {
|
||||
myClassName = option.getAttributeValue("value");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
if (myName != null) {
|
||||
addOption(element, NAME_OPTION, myName);
|
||||
}
|
||||
if (myEnabled != null) {
|
||||
addOption(element, ENABLED_OPTION, myEnabled.booleanValue()? "true" : "false");
|
||||
}
|
||||
if (myClassName != null) {
|
||||
addOption(element, CLASSNAME_OPTION, myClassName);
|
||||
}
|
||||
}
|
||||
|
||||
private void addOption(final Element element, final String optionName, final String optionValue) {
|
||||
final Element option = new Element("option");
|
||||
element.addContent(option);
|
||||
option.setAttribute("name", optionName);
|
||||
option.setAttribute("value", optionValue);
|
||||
}
|
||||
|
||||
public BasicRendererProperties clone() {
|
||||
try {
|
||||
return (BasicRendererProperties)super.clone();
|
||||
}
|
||||
catch (CloneNotSupportedException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerManager;
|
||||
import com.intellij.debugger.engine.DebugProcess;
|
||||
import com.intellij.debugger.engine.DebugProcessAdapter;
|
||||
import com.intellij.debugger.engine.SuspendContext;
|
||||
import com.intellij.debugger.engine.managerThread.SuspendContextCommand;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
import com.intellij.debugger.engine.jdi.ThreadReferenceProxy;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.rt.debugger.BatchEvaluatorServer;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Jul 7, 2003
|
||||
* Time: 11:13:52 PM
|
||||
*/
|
||||
|
||||
public class BatchEvaluator {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.BatchEvaluator");
|
||||
|
||||
private final DebugProcess myDebugProcess;
|
||||
private boolean myBatchEvaluatorChecked;
|
||||
private ObjectReference myBatchEvaluatorObject;
|
||||
private Method myBatchEvaluatorMethod;
|
||||
|
||||
private static final Key<BatchEvaluator> BATCH_EVALUATOR_KEY = new Key<BatchEvaluator>("BatchEvaluator");
|
||||
private final HashMap<SuspendContext, List<ToStringCommand>> myBuffer = new HashMap<SuspendContext, List<ToStringCommand>>();
|
||||
|
||||
private BatchEvaluator(DebugProcess process) {
|
||||
myDebugProcess = process;
|
||||
myDebugProcess.addDebugProcessListener(new DebugProcessAdapter() {
|
||||
public void processDetached(DebugProcess process) {
|
||||
myBatchEvaluatorChecked = false;
|
||||
myBatchEvaluatorObject= null;
|
||||
myBatchEvaluatorMethod = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public boolean hasBatchEvaluator(EvaluationContext evaluationContext) {
|
||||
if (!myBatchEvaluatorChecked) {
|
||||
myBatchEvaluatorChecked = true;
|
||||
|
||||
ThreadReferenceProxy thread = evaluationContext.getSuspendContext().getThread();
|
||||
|
||||
if (thread == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ThreadReference threadReference = thread.getThreadReference();
|
||||
if(threadReference == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ClassType batchEvaluatorClass = null;
|
||||
try {
|
||||
batchEvaluatorClass = (ClassType)myDebugProcess.findClass(evaluationContext, BatchEvaluatorServer.class.getName(),
|
||||
evaluationContext.getClassLoader());
|
||||
}
|
||||
catch (EvaluateException e) {
|
||||
}
|
||||
|
||||
if (batchEvaluatorClass != null) {
|
||||
Method constructor = batchEvaluatorClass.concreteMethodByName("<init>", "()V");
|
||||
if(constructor != null){
|
||||
ObjectReference evaluator = null;
|
||||
try {
|
||||
evaluator = myDebugProcess.newInstance(evaluationContext, batchEvaluatorClass, constructor, new ArrayList());
|
||||
}
|
||||
catch (Exception e) {
|
||||
LOG.debug(e);
|
||||
}
|
||||
myBatchEvaluatorObject = evaluator;
|
||||
|
||||
if(myBatchEvaluatorObject != null) {
|
||||
myBatchEvaluatorMethod = batchEvaluatorClass.concreteMethodByName("evaluate", "([Ljava/lang/Object;)[Ljava/lang/Object;");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return myBatchEvaluatorMethod != null;
|
||||
}
|
||||
|
||||
public void invoke(ToStringCommand command) {
|
||||
LOG.assertTrue(DebuggerManager.getInstance(myDebugProcess.getProject()).isDebuggerManagerThread());
|
||||
|
||||
final EvaluationContext evaluationContext = command.getEvaluationContext();
|
||||
final SuspendContext suspendContext = evaluationContext.getSuspendContext();
|
||||
|
||||
if(!hasBatchEvaluator(evaluationContext)) {
|
||||
myDebugProcess.getManagerThread().invokeCommand(command);
|
||||
}
|
||||
else {
|
||||
List<ToStringCommand> toStringCommands = myBuffer.get(suspendContext);
|
||||
if(toStringCommands == null) {
|
||||
final List<ToStringCommand> commands = new ArrayList<ToStringCommand>();
|
||||
toStringCommands = commands;
|
||||
myBuffer.put(suspendContext, commands);
|
||||
|
||||
myDebugProcess.getManagerThread().invokeCommand(new SuspendContextCommand() {
|
||||
public SuspendContext getSuspendContext() {
|
||||
return suspendContext;
|
||||
}
|
||||
|
||||
public void action() {
|
||||
myBuffer.remove(suspendContext);
|
||||
|
||||
if(!doEvaluateBatch(commands, evaluationContext)) {
|
||||
for (Iterator<ToStringCommand> iterator = commands.iterator(); iterator.hasNext();) {
|
||||
ToStringCommand toStringCommand = iterator.next();
|
||||
toStringCommand.action();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void commandCancelled() {
|
||||
myBuffer.remove(suspendContext);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
toStringCommands.add(command);
|
||||
}
|
||||
}
|
||||
|
||||
public static BatchEvaluator getBatchEvaluator(DebugProcess debugProcess) {
|
||||
BatchEvaluator batchEvaluator = debugProcess.getUserData(BATCH_EVALUATOR_KEY);
|
||||
|
||||
if(batchEvaluator == null) {
|
||||
batchEvaluator = new BatchEvaluator(debugProcess);
|
||||
debugProcess.putUserData(BATCH_EVALUATOR_KEY, batchEvaluator);
|
||||
}
|
||||
return batchEvaluator;
|
||||
}
|
||||
|
||||
private boolean doEvaluateBatch(List<ToStringCommand> requests, EvaluationContext evaluationContext) {
|
||||
try {
|
||||
DebugProcess debugProcess = evaluationContext.getDebugProcess();
|
||||
List<Value> values = new ArrayList<Value>();
|
||||
for (Iterator<ToStringCommand> iterator = requests.iterator(); iterator.hasNext();) {
|
||||
ToStringCommand toStringCommand = iterator.next();
|
||||
values.add(toStringCommand.getValue());
|
||||
}
|
||||
|
||||
ArrayType objectArrayClass = (ArrayType)debugProcess.findClass(
|
||||
evaluationContext,
|
||||
"java.lang.Object[]",
|
||||
evaluationContext.getClassLoader());
|
||||
if (objectArrayClass == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ArrayReference argArray = debugProcess.newInstance(objectArrayClass, values.size());
|
||||
argArray.setValues(values);
|
||||
List argList = new ArrayList(1);
|
||||
argList.add(argArray);
|
||||
Value value = debugProcess.invokeMethod(evaluationContext, myBatchEvaluatorObject,
|
||||
myBatchEvaluatorMethod, argList);
|
||||
if (value instanceof ArrayReference) {
|
||||
ArrayReference strings = (ArrayReference)value;
|
||||
int idx = 0;
|
||||
for (Iterator<ToStringCommand> iterator = requests.iterator(); iterator.hasNext(); idx++) {
|
||||
ToStringCommand request = iterator.next();
|
||||
final Value strValue = strings.getValue(idx);
|
||||
if(strValue == null || strValue instanceof StringReference){
|
||||
String str = (strValue == null)? null : ((StringReference)strValue).value();
|
||||
request.evaluationResult(str);
|
||||
} else if(strValue instanceof ObjectReference){
|
||||
request.evaluationError(EvaluateExceptionUtil.createEvaluateException(new InvocationException((ObjectReference)strValue)).getMessage());
|
||||
} else {
|
||||
LOG.assertTrue(false);
|
||||
}
|
||||
request.setEvaluated();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (ClassNotLoadedException e) {
|
||||
}
|
||||
catch (InvalidTypeException e) {
|
||||
}
|
||||
catch (EvaluateException e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
|
||||
import com.intellij.debugger.engine.evaluation.TextWithImports;
|
||||
import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Computable;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
|
||||
import java.lang.ref.SoftReference;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: lex
|
||||
* Date: Dec 27, 2003
|
||||
* Time: 7:56:13 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public abstract class CachedEvaluator {
|
||||
private static class Cache {
|
||||
protected ExpressionEvaluator myEvaluator;
|
||||
protected EvaluateException myException;
|
||||
protected PsiExpression myPsiChildrenExpression;
|
||||
};
|
||||
SoftReference<Cache> myCache = new SoftReference<Cache>(null);
|
||||
private TextWithImports myReferenceExpression = DebuggerUtils.getInstance().createExpressionWithImports("");
|
||||
|
||||
protected abstract String getClassName();
|
||||
|
||||
public TextWithImports getReferenceExpression() {
|
||||
return myReferenceExpression != null ? myReferenceExpression : DebuggerUtils.getInstance().createExpressionWithImports("");
|
||||
}
|
||||
|
||||
public void setReferenceExpression(TextWithImports referenceExpression) {
|
||||
myReferenceExpression = referenceExpression;
|
||||
clear();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
myCache.clear();
|
||||
}
|
||||
|
||||
protected Cache initEvaluatorAndChildrenExpression(final Project project) {
|
||||
final Cache cache = new Cache();
|
||||
try {
|
||||
final PsiClass contextClass = DebuggerUtils.findClass(getClassName(), project);
|
||||
if(contextClass == null) throw EvaluateExceptionUtil.CANNOT_FIND_SOURCE_CLASS;
|
||||
cache.myPsiChildrenExpression = null;
|
||||
PsiCodeFragment codeFragment = myReferenceExpression.createCodeFragment(contextClass, project);
|
||||
DebuggerUtils.checkSyntax(codeFragment);
|
||||
cache.myPsiChildrenExpression = ((PsiExpressionCodeFragment)codeFragment).getExpression();
|
||||
cache.myEvaluator = DebuggerUtils.getInstance().getEvaluatorBuilder().build(cache.myPsiChildrenExpression);
|
||||
} catch (EvaluateException e) {
|
||||
cache.myException = e;
|
||||
}
|
||||
|
||||
myCache = new SoftReference<Cache>(cache);
|
||||
return cache;
|
||||
}
|
||||
|
||||
protected ExpressionEvaluator getEvaluator(final Project project) throws EvaluateException {
|
||||
Cache cache = myCache.get();
|
||||
if(cache == null) {
|
||||
cache = PsiDocumentManager.getInstance(project).commitAndRunReadAction(new Computable<Cache>() {
|
||||
public Cache compute() {
|
||||
return initEvaluatorAndChildrenExpression(project);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(cache.myException != null) {
|
||||
throw cache.myException;
|
||||
}
|
||||
|
||||
return cache.myEvaluator;
|
||||
}
|
||||
|
||||
protected PsiExpression getPsiExpression(final Project project) {
|
||||
Cache cache = myCache.get();
|
||||
if(cache == null) {
|
||||
cache = initEvaluatorAndChildrenExpression(project);
|
||||
}
|
||||
|
||||
return cache.myPsiChildrenExpression;
|
||||
}
|
||||
}
|
||||
+20
-13
@@ -1,4 +1,4 @@
|
||||
package com.intellij.debugger.ui.impl.watch.render;
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
|
||||
@@ -9,7 +9,6 @@ import com.intellij.debugger.ui.impl.watch.MessageDescriptor;
|
||||
import com.intellij.debugger.ui.impl.watch.NodeManagerImpl;
|
||||
import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl;
|
||||
import com.intellij.debugger.ui.tree.*;
|
||||
import com.intellij.debugger.ui.tree.render.*;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.DefaultJDOMExternalizer;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
@@ -31,8 +30,8 @@ import java.util.List;
|
||||
* Date: Sep 17, 2003
|
||||
* Time: 2:04:00 PM
|
||||
*/
|
||||
public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.impl.watch.render.ClassRenderer");
|
||||
public class ClassRenderer extends NodeRendererImpl{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ClassRenderer");
|
||||
|
||||
public static final String UNIQUE_ID = "ClassRenderer";
|
||||
|
||||
@@ -42,16 +41,27 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
public boolean SHOW_STATIC_FINAL = false;
|
||||
public boolean CHILDREN_PHYSICAL = true;
|
||||
|
||||
public ClassRenderer(RendererProvider provider) {
|
||||
super(provider, UNIQUE_ID);
|
||||
public ClassRenderer() {
|
||||
myProperties.setEnabled(true);
|
||||
}
|
||||
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return myProperties.isEnabled();
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
myProperties.setEnabled(enabled);
|
||||
}
|
||||
|
||||
public ClassRenderer clone() {
|
||||
return (ClassRenderer) super.clone();
|
||||
}
|
||||
|
||||
public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener)
|
||||
throws EvaluateException {
|
||||
public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener) throws EvaluateException {
|
||||
return calcLabel(descriptor);
|
||||
}
|
||||
|
||||
@@ -181,14 +191,11 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
|
||||
}
|
||||
|
||||
public boolean isApplicable(Type type) {
|
||||
if(!(type instanceof ReferenceType) || type instanceof ArrayType) {
|
||||
return false;
|
||||
}
|
||||
return super.isApplicable(type);
|
||||
return type instanceof ReferenceType && !(type instanceof ArrayType);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Default";
|
||||
return "Object";
|
||||
}
|
||||
|
||||
public void setName(String text) {
|
||||
+16
-13
@@ -3,6 +3,7 @@ package com.intellij.debugger.ui.tree.render;
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
import com.intellij.debugger.settings.NodeRendererSettings;
|
||||
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
|
||||
import com.intellij.debugger.ui.tree.NodeDescriptor;
|
||||
import com.intellij.debugger.ui.tree.ValueDescriptor;
|
||||
@@ -25,18 +26,23 @@ public class CompoundNodeRenderer extends NodeRendererImpl{
|
||||
|
||||
protected ValueLabelRenderer myLabelRenderer;
|
||||
protected ChildrenRenderer myChildrenRenderer;
|
||||
private final NodeRendererSettings myRendererSettings;
|
||||
|
||||
public CompoundNodeRenderer(RendererProvider provider, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) {
|
||||
super(provider, UNIQUE_ID);
|
||||
public CompoundNodeRenderer(NodeRendererSettings rendererSettings, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) {
|
||||
myRendererSettings = rendererSettings;
|
||||
setName(name);
|
||||
myLabelRenderer = labelRenderer;
|
||||
myChildrenRenderer = childrenRenderer;
|
||||
}
|
||||
|
||||
public Renderer clone() {
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public CompoundNodeRenderer clone() {
|
||||
CompoundNodeRenderer renderer = (CompoundNodeRenderer)super.clone();
|
||||
renderer.myLabelRenderer = myLabelRenderer != null ? (ValueLabelRenderer)myLabelRenderer.clone() : null;
|
||||
renderer.myChildrenRenderer = myChildrenRenderer != null ? (ChildrenRenderer)myChildrenRenderer.clone() : null;
|
||||
renderer.myLabelRenderer = (myLabelRenderer != null) ? (ValueLabelRenderer)myLabelRenderer.clone() : null;
|
||||
renderer.myChildrenRenderer = (myChildrenRenderer != null) ? (ChildrenRenderer)myChildrenRenderer.clone() : null;
|
||||
return renderer;
|
||||
}
|
||||
|
||||
@@ -78,19 +84,16 @@ public class CompoundNodeRenderer extends NodeRendererImpl{
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
super.readExternal(element);
|
||||
if(getName() == null) {
|
||||
setName("<unknown>");
|
||||
}
|
||||
List<Element> children = element.getChildren(NodeRendererExternalizer.RENDERER_TAG);
|
||||
myLabelRenderer = (ValueLabelRenderer) NodeRendererExternalizer.readRenderer(children.get(0));
|
||||
myChildrenRenderer = (ChildrenRenderer) NodeRendererExternalizer.readRenderer(children.get(1));
|
||||
final List<Element> children = element.getChildren(NodeRendererSettings.RENDERER_TAG);
|
||||
myLabelRenderer = (ValueLabelRenderer) myRendererSettings.readRenderer(children.get(0));
|
||||
myChildrenRenderer = (ChildrenRenderer) myRendererSettings.readRenderer(children.get(1));
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
super.writeExternal(element);
|
||||
final Element labelRendererElement = NodeRendererExternalizer.writeRenderer(myLabelRenderer);
|
||||
final Element labelRendererElement = myRendererSettings.writeRenderer(myLabelRenderer);
|
||||
element.addContent(labelRendererElement);
|
||||
final Element childrenRendererElement = NodeRendererExternalizer.writeRenderer(myChildrenRenderer);
|
||||
final Element childrenRendererElement = myRendererSettings.writeRenderer(myChildrenRenderer);
|
||||
element.addContent(childrenRendererElement);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.settings.NodeRendererSettings;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
public class CompoundReferenceRenderer extends CompoundNodeRenderer{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer");
|
||||
|
||||
public CompoundReferenceRenderer(final NodeRendererSettings rendererSettings, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) {
|
||||
super(rendererSettings, name, labelRenderer, childrenRenderer);
|
||||
myProperties.setClassName("java.lang.Object");
|
||||
LOG.assertTrue(labelRenderer == null || labelRenderer instanceof ReferenceRenderer);
|
||||
LOG.assertTrue(childrenRenderer == null || childrenRenderer instanceof ReferenceRenderer);
|
||||
}
|
||||
|
||||
public void setLabelRenderer(ValueLabelRenderer labelRenderer) {
|
||||
super.setLabelRenderer(NodeRendererSettings.getInstance().isDefault(labelRenderer) ? null : labelRenderer);
|
||||
}
|
||||
|
||||
public void setChildrenRenderer(ChildrenRenderer childrenRenderer) {
|
||||
super.setChildrenRenderer(NodeRendererSettings.getInstance().isDefault(childrenRenderer) ? null : childrenRenderer);
|
||||
}
|
||||
|
||||
public ChildrenRenderer getChildrenRenderer() {
|
||||
return super.getChildrenRenderer() != null ? super.getChildrenRenderer() : getDefaultRenderer();
|
||||
}
|
||||
|
||||
private NodeRenderer getDefaultRenderer() {
|
||||
final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance();
|
||||
return getClassName().endsWith("]") ? (NodeRenderer)rendererSettings.getArrayRenderer() : (NodeRenderer)rendererSettings.getClassRenderer();
|
||||
}
|
||||
|
||||
public ValueLabelRenderer getLabelRenderer() {
|
||||
return super.getLabelRenderer() != null ? super.getLabelRenderer() : getDefaultRenderer();
|
||||
}
|
||||
|
||||
private ChildrenRenderer getRawChildrenRenderer() {
|
||||
NodeRenderer classRenderer = getDefaultRenderer();
|
||||
return myChildrenRenderer == classRenderer ? null : myChildrenRenderer;
|
||||
}
|
||||
|
||||
private ValueLabelRenderer getRawLabelRenderer() {
|
||||
NodeRenderer classRenderer = getDefaultRenderer();
|
||||
return myLabelRenderer == classRenderer ? null : myLabelRenderer;
|
||||
}
|
||||
|
||||
public void setClassName(String name) {
|
||||
LOG.assertTrue(name != null);
|
||||
myProperties.setClassName(name);
|
||||
if(getRawLabelRenderer() != null) {
|
||||
((ReferenceRenderer)myLabelRenderer).setClassName(name);
|
||||
}
|
||||
|
||||
if(getRawChildrenRenderer() != null) {
|
||||
((ReferenceRenderer)myChildrenRenderer).setClassName(name);
|
||||
}
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return myProperties.getClassName();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
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.ui.tree.*;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.intellij.psi.PsiExpression;
|
||||
import com.sun.jdi.Value;
|
||||
import org.jdom.Element;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Dec 19, 2003
|
||||
* Time: 1:25:15 PM
|
||||
*/
|
||||
public final class EnumerationChildrenRenderer extends com.intellij.debugger.ui.tree.render.ReferenceRenderer implements ChildrenRenderer{
|
||||
public static final String UNIQUE_ID = "EnumerationChildrenRenderer";
|
||||
|
||||
private List<Pair<String, TextWithImports>> myChildren;
|
||||
public static final String CHILDREN_EXPRESSION = "ChildrenExpression";
|
||||
public static final String CHILD_NAME = "Name";
|
||||
|
||||
public EnumerationChildrenRenderer() {
|
||||
this(new ArrayList<Pair<String, TextWithImports>>());
|
||||
}
|
||||
|
||||
public EnumerationChildrenRenderer(List<Pair<String, TextWithImports>> children) {
|
||||
super();
|
||||
myChildren = children;
|
||||
}
|
||||
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public EnumerationChildrenRenderer clone() {
|
||||
return (EnumerationChildrenRenderer)super.clone();
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
super.readExternal(element);
|
||||
|
||||
myChildren.clear();
|
||||
|
||||
List<Element> children = element.getChildren(CHILDREN_EXPRESSION);
|
||||
for (Iterator<Element> iterator = children.iterator(); iterator.hasNext();) {
|
||||
Element item = iterator.next();
|
||||
|
||||
String name = item.getAttributeValue(CHILD_NAME);
|
||||
TextWithImports text = DebuggerUtils.getInstance().readTextWithImports((Element) item.getChildren().get(0));
|
||||
|
||||
myChildren.add(new Pair<String, TextWithImports>(name, text));
|
||||
}
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
super.writeExternal(element);
|
||||
|
||||
for (Iterator<Pair<String, TextWithImports>> iterator = myChildren.iterator(); iterator.hasNext();) {
|
||||
Pair<String, TextWithImports> pair = iterator.next();
|
||||
Element child = new Element(CHILDREN_EXPRESSION);
|
||||
child.setAttribute(CHILD_NAME, pair.getFirst());
|
||||
child.addContent(DebuggerUtils.getInstance().writeTextWithImports(pair.getSecond()));
|
||||
|
||||
element.addContent(child);
|
||||
}
|
||||
}
|
||||
|
||||
public void buildChildren(Value value, ChildrenBuilder builder, EvaluationContext evaluationContext) {
|
||||
NodeManager nodeManager = builder.getNodeManager();
|
||||
NodeDescriptorFactory descriptorFactory = builder.getDescriptorManager();
|
||||
|
||||
List<DebuggerTreeNode> children = new ArrayList<DebuggerTreeNode>();
|
||||
for (Iterator<Pair<String, TextWithImports>> iterator = myChildren.iterator(); iterator.hasNext();) {
|
||||
Pair<String, TextWithImports> pair = iterator.next();
|
||||
children.add(nodeManager.createNode(descriptorFactory.getUserExpressionDescriptor(builder.getParentDescriptor(), getClassName(), pair.getFirst(), pair.getSecond()), evaluationContext));
|
||||
}
|
||||
builder.setChildren(children);
|
||||
}
|
||||
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
|
||||
return ((ValueDescriptor) node.getDescriptor()).getDescriptorEvaluation(context);
|
||||
}
|
||||
|
||||
public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) {
|
||||
return myChildren.size() > 0;
|
||||
}
|
||||
|
||||
public List<Pair<String, TextWithImports>> getChildren() {
|
||||
return myChildren;
|
||||
}
|
||||
|
||||
public void setChildren(List<Pair<String, TextWithImports>> children) {
|
||||
myChildren = children;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.DebugProcessImpl;
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
import com.intellij.debugger.engine.evaluation.TextWithImports;
|
||||
import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator;
|
||||
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
|
||||
import com.intellij.debugger.ui.tree.NodeDescriptor;
|
||||
import com.intellij.debugger.ui.tree.NodeManager;
|
||||
import com.intellij.debugger.ui.tree.ValueDescriptor;
|
||||
import com.intellij.openapi.util.DefaultJDOMExternalizer;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.intellij.psi.PsiExpression;
|
||||
import com.sun.jdi.BooleanValue;
|
||||
import com.sun.jdi.Value;
|
||||
import org.jdom.Element;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Sep 17, 2003
|
||||
* Time: 2:04:00 PM
|
||||
*/
|
||||
public class ExpressionChildrenRenderer extends ReferenceRenderer implements ChildrenRenderer {
|
||||
public static final String UNIQUE_ID = "ExpressionChildrenRenderer";
|
||||
private static final Key<Value> EXPRESSION_VALUE = new Key<Value>("EXPRESSION_VALUE");
|
||||
|
||||
private final CachedEvaluator myChildrenExpandable = new CachedEvaluator() {
|
||||
protected String getClassName() {
|
||||
return ExpressionChildrenRenderer.this.getClassName();
|
||||
}
|
||||
};
|
||||
|
||||
private final CachedEvaluator myChildrenExpression = new CachedEvaluator() {
|
||||
protected String getClassName() {
|
||||
return ExpressionChildrenRenderer.this.getClassName();
|
||||
}
|
||||
};
|
||||
|
||||
public ExpressionChildrenRenderer() {
|
||||
super();
|
||||
}
|
||||
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public ExpressionChildrenRenderer clone() {
|
||||
return (ExpressionChildrenRenderer)super.clone();
|
||||
}
|
||||
|
||||
public void buildChildren(final Value value, final ChildrenBuilder builder, final EvaluationContext evaluationContext) {
|
||||
final NodeManager nodeManager = builder.getNodeManager();
|
||||
|
||||
try {
|
||||
final Value childrenValue = evaluateChildren(
|
||||
evaluationContext.createEvaluationContext(value), builder.getParentDescriptor()
|
||||
);
|
||||
|
||||
ChildrenRenderer defaultRenderer = ((DebugProcessImpl)evaluationContext.getDebugProcess()).getDefaultRenderer(childrenValue.type());
|
||||
defaultRenderer.buildChildren(childrenValue, builder, evaluationContext);
|
||||
}
|
||||
catch (final EvaluateException e) {
|
||||
List<DebuggerTreeNode> errorChildren = new ArrayList<DebuggerTreeNode>();
|
||||
errorChildren.add(nodeManager.createMessageNode(e.getMessage() + " Failed to evaluate expression for this object alternative view."));
|
||||
builder.setChildren(errorChildren);
|
||||
}
|
||||
}
|
||||
|
||||
private Value evaluateChildren(EvaluationContext context, NodeDescriptor descriptor) throws EvaluateException {
|
||||
final ExpressionEvaluator evaluator = myChildrenExpression.getEvaluator(context.getDebugProcess().getProject());
|
||||
|
||||
Value value = evaluator.evaluate(context);
|
||||
descriptor.putUserData(EXPRESSION_VALUE, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
super.readExternal(element);
|
||||
DefaultJDOMExternalizer.readExternal(this, element);
|
||||
|
||||
TextWithImports childrenExpression = DebuggerUtils.getInstance().readTextWithImports(element, "CHILDREN_EXPRESSION");
|
||||
if(childrenExpression != null) {
|
||||
setChildrenExpression(childrenExpression);
|
||||
}
|
||||
|
||||
TextWithImports childrenExpandable = DebuggerUtils.getInstance().readTextWithImports(element, "CHILDREN_EXPANDABLE");
|
||||
if(childrenExpandable != null) {
|
||||
myChildrenExpandable.setReferenceExpression(childrenExpandable);
|
||||
}
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
super.writeExternal(element);
|
||||
DefaultJDOMExternalizer.writeExternal(this, element);
|
||||
DebuggerUtils.getInstance().writeTextWithImports(element, "CHILDREN_EXPANDABLE", getChildrenExpandable());
|
||||
DebuggerUtils.getInstance().writeTextWithImports(element, "CHILDREN_EXPRESSION", getChildrenExpression());
|
||||
}
|
||||
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
|
||||
ValueDescriptor descriptor = (ValueDescriptor) node.getParent().getDescriptor();
|
||||
Value expressionValue = descriptor.getUserData(EXPRESSION_VALUE);
|
||||
if(expressionValue == null) {
|
||||
throw EvaluateExceptionUtil.createEvaluateException("Node is not evaluated - internal error");
|
||||
}
|
||||
|
||||
ChildrenRenderer defaultChildrenRenderer = ((DebugProcessImpl)context.getDebugProcess()).getDefaultRenderer(expressionValue.type());
|
||||
|
||||
return DebuggerUtils.getInstance().substituteThis(
|
||||
defaultChildrenRenderer.getChildValueExpression(node, context),
|
||||
(PsiExpression)myChildrenExpression.getPsiExpression(node.getProject()).copy(),
|
||||
expressionValue, context);
|
||||
}
|
||||
|
||||
public boolean isExpandable(Value value, final EvaluationContext context, NodeDescriptor parentDescriptor) {
|
||||
final EvaluationContext evaluationContext = context.createEvaluationContext(value);
|
||||
|
||||
if(!"".equals(myChildrenExpandable.getReferenceExpression())) {
|
||||
try {
|
||||
Value expanded = myChildrenExpandable.getEvaluator(evaluationContext.getProject()).evaluate(evaluationContext);
|
||||
if(expanded instanceof BooleanValue) {
|
||||
return ((BooleanValue)expanded).booleanValue();
|
||||
}
|
||||
}
|
||||
catch (EvaluateException e) {
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Value children = evaluateChildren(evaluationContext, parentDescriptor);
|
||||
|
||||
ChildrenRenderer defaultChildrenRenderer = ((DebugProcessImpl)evaluationContext.getDebugProcess()).getDefaultRenderer(value.type());
|
||||
|
||||
return defaultChildrenRenderer.isExpandable(children, evaluationContext, parentDescriptor);
|
||||
}
|
||||
catch (EvaluateException e) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public TextWithImports getChildrenExpression() {
|
||||
return myChildrenExpression.getReferenceExpression();
|
||||
}
|
||||
|
||||
public void setChildrenExpression(TextWithImports expression) {
|
||||
myChildrenExpression.setReferenceExpression(expression);
|
||||
}
|
||||
|
||||
public TextWithImports getChildrenExpandable() {
|
||||
return myChildrenExpandable.getReferenceExpression();
|
||||
}
|
||||
|
||||
public void setChildrenExpandable(TextWithImports childrenExpandable) {
|
||||
myChildrenExpandable.setReferenceExpression(childrenExpandable);
|
||||
}
|
||||
|
||||
public void setClassName(String name) {
|
||||
super.setClassName(name);
|
||||
myChildrenExpression.clear();
|
||||
myChildrenExpandable.clear();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
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.ChildrenBuilder;
|
||||
import com.intellij.debugger.ui.tree.render.DescriptorLabelListener;
|
||||
import com.intellij.debugger.ui.tree.render.NodeRendererImpl;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.psi.PsiExpression;
|
||||
import com.sun.jdi.*;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Nov 19, 2003
|
||||
* Time: 3:13:11 PM
|
||||
*/
|
||||
public class HexRenderer extends NodeRendererImpl{
|
||||
public static final String UNIQUE_ID = "HexRenderer";
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.HexRenderer");
|
||||
|
||||
public HexRenderer() {
|
||||
setEnabled(false);
|
||||
}
|
||||
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Hex";
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
// prohibit change
|
||||
}
|
||||
|
||||
public HexRenderer clone() {
|
||||
return (HexRenderer) super.clone();
|
||||
}
|
||||
|
||||
public String calcLabel(ValueDescriptor valueDescriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener) {
|
||||
Value value = valueDescriptor.getValue();
|
||||
StringBuffer buf = new StringBuffer(16);
|
||||
|
||||
if(value == null) {
|
||||
buf.append("null");
|
||||
}
|
||||
else if (value instanceof CharValue) {
|
||||
buf.append("'");
|
||||
buf.append(DebuggerUtils.translateStringValue(value.toString()));
|
||||
buf.append("' ");
|
||||
long longValue = ((PrimitiveValue)value).longValue();
|
||||
buf.append("0x" + Long.toHexString(longValue).toUpperCase());
|
||||
}
|
||||
else if (value instanceof ByteValue) {
|
||||
byte val = ((PrimitiveValue)value).byteValue();
|
||||
String strValue = Integer.toHexString(val).toUpperCase();
|
||||
if (strValue.length() > 2) {
|
||||
strValue = strValue.substring(strValue.length() - 2);
|
||||
}
|
||||
buf.append("0x" + strValue);
|
||||
}
|
||||
else if (value instanceof ShortValue) {
|
||||
short val = ((PrimitiveValue)value).shortValue();
|
||||
String strValue = Integer.toHexString(val).toUpperCase();
|
||||
if (strValue.length() > 4) {
|
||||
strValue = strValue.substring(strValue.length() - 4);
|
||||
}
|
||||
buf.append("0x" + strValue);
|
||||
}
|
||||
else if (value instanceof IntegerValue) {
|
||||
int val = ((PrimitiveValue)value).intValue();
|
||||
buf.append("0x" + Integer.toHexString(val).toUpperCase());
|
||||
}
|
||||
else if (value instanceof LongValue) {
|
||||
long val = ((PrimitiveValue)value).longValue();
|
||||
buf.append("0x" + Long.toHexString(val).toUpperCase());
|
||||
}
|
||||
else {
|
||||
LOG.assertTrue(false);
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public void buildChildren(Value value, ChildrenBuilder builder, EvaluationContext evaluationContext) {
|
||||
}
|
||||
|
||||
//returns whether this renderer is apllicable to this type or it's supertypes
|
||||
public boolean isApplicable(Type t) {
|
||||
if(t == null) {
|
||||
return false;
|
||||
}
|
||||
return t instanceof CharType ||
|
||||
t instanceof ByteType ||
|
||||
t instanceof ShortType ||
|
||||
t instanceof IntegerType ||
|
||||
t instanceof LongType;
|
||||
}
|
||||
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) {
|
||||
LOG.assertTrue(false);
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.engine.DebugProcess;
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
import com.intellij.debugger.engine.evaluation.TextWithImports;
|
||||
import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator;
|
||||
import com.intellij.debugger.ui.tree.ValueDescriptor;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.DefaultJDOMExternalizer;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.sun.jdi.PrimitiveValue;
|
||||
import com.sun.jdi.Value;
|
||||
import org.jdom.Element;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Sep 20, 2003
|
||||
* Time: 10:27:12 PM
|
||||
*/
|
||||
public class LabelRenderer extends com.intellij.debugger.ui.tree.render.ReferenceRenderer implements ValueLabelRenderer{
|
||||
public static final String UNIQUE_ID = "LabelRenderer";
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.impl.watch.render.ClassLabelRenderer");
|
||||
|
||||
private final CachedEvaluator myLabelExpression = new CachedEvaluator() {
|
||||
protected String getClassName() {
|
||||
return LabelRenderer.this.getClassName();
|
||||
}
|
||||
};
|
||||
|
||||
public LabelRenderer() {
|
||||
super();
|
||||
}
|
||||
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public LabelRenderer clone() {
|
||||
return (LabelRenderer)super.clone();
|
||||
}
|
||||
|
||||
public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener)
|
||||
throws EvaluateException {
|
||||
String result;
|
||||
LOG.assertTrue(!(descriptor instanceof PrimitiveValue));
|
||||
|
||||
final DebugProcess debugProcess = evaluationContext.getDebugProcess();
|
||||
final Value value = descriptor.getValue();
|
||||
if (value != null) {
|
||||
try {
|
||||
final ExpressionEvaluator evaluator = myLabelExpression.getEvaluator(debugProcess.getProject());
|
||||
|
||||
if(!debugProcess.isAttached()) {
|
||||
throw EvaluateExceptionUtil.PROCESS_EXITED;
|
||||
}
|
||||
EvaluationContext thisEvaluationContext = evaluationContext.createEvaluationContext(value);
|
||||
Value labelValue = evaluator.evaluate(thisEvaluationContext);
|
||||
result = DebuggerUtils.getValueAsString(thisEvaluationContext, labelValue);
|
||||
}
|
||||
catch (final EvaluateException ex) {
|
||||
throw new EvaluateException(ex.getMessage() + " Failed to evaluate expression for this object alternative view", ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
result = "null";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
super.readExternal(element);
|
||||
DefaultJDOMExternalizer.readExternal(this, element);
|
||||
TextWithImports labelExpression = DebuggerUtils.getInstance().readTextWithImports(element, "LABEL_EXPRESSION");
|
||||
if (labelExpression != null) {
|
||||
setLabelExpression(labelExpression);
|
||||
}
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
super.writeExternal(element);
|
||||
DefaultJDOMExternalizer.writeExternal(this, element);
|
||||
DebuggerUtils.getInstance().writeTextWithImports(element, "LABEL_EXPRESSION", getLabelExpression());
|
||||
}
|
||||
|
||||
public TextWithImports getLabelExpression() {
|
||||
return myLabelExpression.getReferenceExpression();
|
||||
}
|
||||
|
||||
public void setLabelExpression(TextWithImports expression) {
|
||||
myLabelExpression.setReferenceExpression(expression);
|
||||
}
|
||||
|
||||
}
|
||||
+4
@@ -9,4 +9,8 @@ public interface NodeRenderer extends ChildrenRenderer, ValueLabelRenderer {
|
||||
String getName();
|
||||
|
||||
void setName(String text);
|
||||
|
||||
boolean isEnabled();
|
||||
|
||||
void setEnabled(boolean enabled);
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import org.jdom.Element;
|
||||
|
||||
/**
|
||||
* @author Eugene Zhuravlev
|
||||
* Date: Feb 9, 2005
|
||||
*/
|
||||
public abstract class NodeRendererImpl implements NodeRenderer{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.NodeRendererImpl");
|
||||
protected BasicRendererProperties myProperties = new BasicRendererProperties();
|
||||
|
||||
protected NodeRendererImpl() {
|
||||
myProperties.setName("unnamed");
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return myProperties.getName();
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
myProperties.setName(name);
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return myProperties.isEnabled();
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
myProperties.setEnabled(enabled);
|
||||
}
|
||||
|
||||
public NodeRendererImpl clone() {
|
||||
try {
|
||||
final NodeRendererImpl cloned = (NodeRendererImpl)super.clone();
|
||||
cloned.myProperties = myProperties.clone();
|
||||
return cloned;
|
||||
}
|
||||
catch (CloneNotSupportedException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
myProperties.readExternal(element);
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
myProperties.writeExternal(element);
|
||||
}
|
||||
}
|
||||
+20
-22
@@ -1,22 +1,15 @@
|
||||
package com.intellij.debugger.ui.impl.watch.render;
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
|
||||
import com.intellij.debugger.engine.StackFrameContext;
|
||||
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.debugger.DebuggerContext;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.DefaultJDOMExternalizer;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.intellij.psi.PsiExpression;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.sun.jdi.*;
|
||||
import org.jdom.Element;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
@@ -25,29 +18,34 @@ import org.jdom.Element;
|
||||
*/
|
||||
public class PrimitiveRenderer extends NodeRendererImpl {
|
||||
public static final String UNIQUE_ID = "PrimitiveRenderer";
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.PrimitiveRenderer");
|
||||
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.impl.watch.render.PrimitiveRenderer");
|
||||
public PrimitiveRenderer() {
|
||||
myProperties.setName("Primitive");
|
||||
}
|
||||
|
||||
public PrimitiveRenderer(final RendererProvider provider) {
|
||||
super(provider, UNIQUE_ID);
|
||||
setName("Default");
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "Primitive";
|
||||
}
|
||||
|
||||
/*
|
||||
public void setName(String text) {
|
||||
LOG.assertTrue(false, "Cannot set name for primitive renderer");
|
||||
// prohibit name change
|
||||
}
|
||||
*/
|
||||
|
||||
public PrimitiveRenderer clone(){
|
||||
return (PrimitiveRenderer)super.clone();
|
||||
public final boolean isEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
// prohibit change
|
||||
}
|
||||
|
||||
public boolean isApplicable(Type type) {
|
||||
if(type == null) {
|
||||
return true;
|
||||
}
|
||||
return type instanceof PrimitiveType || type instanceof VoidType;
|
||||
return (type == null) || (type instanceof PrimitiveType) || (type instanceof VoidType);
|
||||
}
|
||||
|
||||
public String calcLabel(ValueDescriptor valueDescriptor, EvaluationContext evaluationContext, DescriptorLabelListener labelListener) {
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.sun.jdi.ReferenceType;
|
||||
import com.sun.jdi.Type;
|
||||
import org.jdom.Element;
|
||||
|
||||
public abstract class ReferenceRenderer implements Renderer {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ReferenceRenderer");
|
||||
protected BasicRendererProperties myProperties = new BasicRendererProperties();
|
||||
|
||||
protected ReferenceRenderer() {
|
||||
this("java.lang.Object");
|
||||
}
|
||||
|
||||
protected ReferenceRenderer(String className) {
|
||||
LOG.assertTrue(className != null);
|
||||
myProperties.setClassName(className);
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return myProperties.getClassName();
|
||||
}
|
||||
|
||||
public void setClassName(String className) {
|
||||
myProperties.setClassName(className);
|
||||
}
|
||||
|
||||
public Renderer clone() {
|
||||
final ReferenceRenderer cloned;
|
||||
try {
|
||||
cloned = (ReferenceRenderer)super.clone();
|
||||
cloned.myProperties = myProperties.clone();
|
||||
return cloned;
|
||||
}
|
||||
catch (CloneNotSupportedException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean isApplicable(Type type) {
|
||||
if(type == null || !(type instanceof ReferenceType)) {
|
||||
return false;
|
||||
}
|
||||
return DebuggerUtils.instanceOf(type, getClassName());
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
myProperties.writeExternal(element);
|
||||
}
|
||||
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
myProperties.readExternal(element);
|
||||
}
|
||||
}
|
||||
-5
@@ -5,11 +5,6 @@ import com.intellij.openapi.util.JDOMExternalizable;
|
||||
import com.sun.jdi.Type;
|
||||
|
||||
public interface Renderer extends Cloneable, JDOMExternalizable {
|
||||
boolean isEnabled();
|
||||
|
||||
void setEnabled(boolean enabled);
|
||||
|
||||
RendererProvider getRendererProvider();
|
||||
|
||||
String getUniqueId();
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.engine.SuspendContext;
|
||||
import com.intellij.debugger.engine.managerThread.SuspendContextCommand;
|
||||
import com.sun.jdi.Value;
|
||||
|
||||
/**
|
||||
* User: lex
|
||||
* Date: Sep 16, 2003
|
||||
* Time: 10:58:26 AM
|
||||
*/
|
||||
public abstract class ToStringCommand implements SuspendContextCommand {
|
||||
private final EvaluationContext myEvaluationContext;
|
||||
private final Value myValue;
|
||||
|
||||
private boolean myIsEvaluated = false;
|
||||
|
||||
protected ToStringCommand(EvaluationContext evaluationContext, Value value) {
|
||||
myEvaluationContext = evaluationContext;
|
||||
myValue = value;
|
||||
}
|
||||
|
||||
public void action() {
|
||||
if(myIsEvaluated) return;
|
||||
try {
|
||||
final String valueAsString = DebuggerUtils.getValueAsString(myEvaluationContext, myValue);
|
||||
evaluationResult(valueAsString);
|
||||
} catch(final EvaluateException ex) {
|
||||
evaluationError(ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void commandCancelled() {
|
||||
}
|
||||
|
||||
public void setEvaluated() {
|
||||
myIsEvaluated = true;
|
||||
}
|
||||
|
||||
public SuspendContext getSuspendContext() {
|
||||
return myEvaluationContext.getSuspendContext();
|
||||
}
|
||||
|
||||
public abstract void evaluationResult(String message);
|
||||
public abstract void evaluationError (String message);
|
||||
|
||||
public Value getValue() {
|
||||
return myValue;
|
||||
}
|
||||
|
||||
public EvaluationContext getEvaluationContext() {
|
||||
return myEvaluationContext;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
package com.intellij.debugger.ui.tree.render;
|
||||
|
||||
import com.intellij.debugger.DebuggerContext;
|
||||
import com.intellij.debugger.engine.StackFrameContext;
|
||||
import com.intellij.debugger.engine.DebugProcessImpl;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluateException;
|
||||
import com.intellij.debugger.engine.evaluation.EvaluationContext;
|
||||
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.psi.PsiExpression;
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
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");
|
||||
|
||||
public ToStringRenderer() {
|
||||
setEnabled(true);
|
||||
}
|
||||
|
||||
public String getUniqueId() {
|
||||
return UNIQUE_ID;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "toString";
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
// prohibit change
|
||||
}
|
||||
|
||||
public ToStringRenderer clone() {
|
||||
return (ToStringRenderer)super.clone();
|
||||
}
|
||||
|
||||
public String calcLabel(final ValueDescriptor valueDescriptor, EvaluationContext evaluationContext, final DescriptorLabelListener labelListener)
|
||||
throws EvaluateException {
|
||||
Value value = valueDescriptor.getValue();
|
||||
BatchEvaluator.getBatchEvaluator(evaluationContext.getDebugProcess()).invoke(new ToStringCommand(evaluationContext, value) {
|
||||
public void evaluationResult(String message) {
|
||||
valueDescriptor.setValueLabel(message != null ? "\"" + message + "\"" : "");
|
||||
labelListener.labelChanged();
|
||||
}
|
||||
|
||||
public void evaluationError(String message) {
|
||||
valueDescriptor.setValueLabelFailed(new EvaluateException(message + " Failed to evaluate toString() for this object", null));
|
||||
labelListener.labelChanged();
|
||||
}
|
||||
});
|
||||
return NodeDescriptor.EVALUATING_MESSAGE;
|
||||
}
|
||||
|
||||
public boolean isApplicable(Type type) {
|
||||
if(!(type instanceof ReferenceType)) {
|
||||
return false;
|
||||
}
|
||||
if(type.name().equals("java.lang.String")) {
|
||||
return false;
|
||||
}
|
||||
if(!overridesToString(type)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void buildChildren(Value value, ChildrenBuilder builder, EvaluationContext evaluationContext) {
|
||||
getDefaultRenderer(value, evaluationContext).buildChildren(value, builder, evaluationContext);
|
||||
}
|
||||
|
||||
private static NodeRenderer getDefaultRenderer(Value value, StackFrameContext context) {
|
||||
Type type = value != null ? value.type() : null;
|
||||
return ((DebugProcessImpl)context.getDebugProcess()).getDefaultRenderer(type);
|
||||
}
|
||||
|
||||
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
|
||||
return getDefaultRenderer(((ValueDescriptor) node.getDescriptor()).getValue(), context).getChildValueExpression(node, context);
|
||||
}
|
||||
|
||||
public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) {
|
||||
return getDefaultRenderer(value, evaluationContext).isExpandable(value, evaluationContext, parentDescriptor);
|
||||
}
|
||||
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.debugger.ui.tree.render.configurables.ClassChildrenExpressionConfigurable">
|
||||
<grid id="1ddd" binding="myPanel" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="38" y="77" width="450" height="138"/>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="cb46f" class="com.intellij.openapi.ui.LabeledComponent" binding="myChildrenPanel">
|
||||
<constraints>
|
||||
<xy x="0" y="0" width="450" height="29"/>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="1" fill="1"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<componentClass value="javax.swing.JPanel"/>
|
||||
<labelInsets top="0" left="0" bottom="5" right="0"/>
|
||||
<text value="Node &descendands expression:"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="5dbf7" class="com.intellij.openapi.ui.LabeledComponent" binding="myExpandablePanel">
|
||||
<constraints>
|
||||
<xy x="0" y="54" width="450" height="29"/>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="1" fill="1"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<componentClass value="javax.swing.JPanel"/>
|
||||
<labelInsets top="0" left="0" bottom="5" right="0"/>
|
||||
<text value="Node &has descendands expression (optional):"/>
|
||||
</properties>
|
||||
</component>
|
||||
<vspacer id="2950c">
|
||||
<constraints>
|
||||
<xy x="219" y="83" width="11" height="55"/>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2"/>
|
||||
</constraints>
|
||||
</vspacer>
|
||||
</children>
|
||||
</grid>
|
||||
</form>
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
package com.intellij.debugger.ui.tree.render.configurables;
|
||||
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.ui.CompletitionEditor;
|
||||
import com.intellij.debugger.ui.tree.render.ExpressionChildrenRenderer;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.openapi.options.UnnamedConfigurable;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.LabeledComponent;
|
||||
import com.intellij.psi.PsiClass;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
public class ClassChildrenExpressionConfigurable implements UnnamedConfigurable{
|
||||
private final Project myProject;
|
||||
private final ExpressionChildrenRenderer myRenderer;
|
||||
|
||||
private JPanel myPanel;
|
||||
private LabeledComponent<JPanel> myChildrenPanel;
|
||||
private LabeledComponent<JPanel> myExpandablePanel;
|
||||
|
||||
private final CompletitionEditor myChildrenEditor;
|
||||
private final CompletitionEditor myExpandableEditor;
|
||||
|
||||
public ClassChildrenExpressionConfigurable(Project project, ExpressionChildrenRenderer renderer) {
|
||||
myProject = project;
|
||||
myRenderer = renderer;
|
||||
|
||||
PsiClass psiClass = DebuggerUtils.findClass(myRenderer.getClassName(), myProject);
|
||||
myChildrenEditor = DebuggerUtils.getInstance().createEditor(project, psiClass, "ClassChildrenExpression");
|
||||
myExpandableEditor = DebuggerUtils.getInstance().createEditor(project, psiClass, "ClassChildrenExpression");
|
||||
|
||||
myChildrenPanel.getComponent().setLayout(new BorderLayout());
|
||||
myChildrenPanel.getComponent().add(myChildrenEditor);
|
||||
|
||||
myExpandablePanel.getComponent().setLayout(new BorderLayout());
|
||||
myExpandablePanel.getComponent().add(myExpandableEditor);
|
||||
}
|
||||
|
||||
public JComponent createComponent() {
|
||||
return myPanel;
|
||||
}
|
||||
|
||||
public boolean isModified() {
|
||||
return !myRenderer.getChildrenExpression().equals(myChildrenEditor.getText()) ||
|
||||
!myRenderer.getChildrenExpandable().equals(myExpandableEditor.getText());
|
||||
}
|
||||
|
||||
public void apply() throws ConfigurationException {
|
||||
myRenderer.setChildrenExpression(myChildrenEditor.getText());
|
||||
myRenderer.setChildrenExpandable(myExpandableEditor.getText());
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
myChildrenEditor.setText(myRenderer.getChildrenExpression());
|
||||
myExpandableEditor.setText(myRenderer.getChildrenExpandable());
|
||||
}
|
||||
|
||||
public void disposeUIResources() {
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
package com.intellij.debugger.ui.tree.render.configurables;
|
||||
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.ui.CompletitionEditor;
|
||||
import com.intellij.debugger.ui.tree.render.LabelRenderer;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.openapi.options.UnnamedConfigurable;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.LabeledComponent;
|
||||
import com.intellij.psi.PsiClass;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
public class ClassLabelExpressionConfigurable implements UnnamedConfigurable{
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.configurables.ClassLabelExpressionConfigurable");
|
||||
|
||||
private final Project myProject;
|
||||
private final LabelRenderer myRenderer;
|
||||
private LabeledComponent<CompletitionEditor> myCompletitionEditor;
|
||||
private final JPanel myPanel;
|
||||
|
||||
public ClassLabelExpressionConfigurable(Project project, LabelRenderer renderer) {
|
||||
LOG.assertTrue(project != null);
|
||||
myProject = project;
|
||||
myRenderer = renderer;
|
||||
|
||||
myCompletitionEditor = new LabeledComponent<CompletitionEditor>();
|
||||
PsiClass psiClass = DebuggerUtils.findClass(myRenderer.getClassName(), myProject);
|
||||
myCompletitionEditor.setComponent(DebuggerUtils.getInstance().createEditor(myProject, psiClass, "ClassLabelExpression"));
|
||||
myCompletitionEditor.setText("Node label expression");
|
||||
|
||||
myPanel = new JPanel(new BorderLayout());
|
||||
myPanel.add(myCompletitionEditor, BorderLayout.NORTH);
|
||||
}
|
||||
|
||||
public JComponent createComponent() {
|
||||
return myPanel;
|
||||
}
|
||||
|
||||
public boolean isModified() {
|
||||
return !myRenderer.getLabelExpression().equals(myCompletitionEditor.getComponent().getText());
|
||||
}
|
||||
|
||||
public void apply() throws ConfigurationException {
|
||||
myRenderer.setLabelExpression(myCompletitionEditor.getComponent().getText());
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
myCompletitionEditor.getComponent().setText(myRenderer.getLabelExpression());
|
||||
}
|
||||
|
||||
public void disposeUIResources() {
|
||||
myCompletitionEditor = null;
|
||||
}
|
||||
}
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.debugger.ui.tree.render.configurables.NamedChildrenConfigurable">
|
||||
<grid id="47245" binding="myPanel" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="57" y="23" width="298" height="252"/>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="a2d2a" class="javax.swing.JLabel" binding="myTableLabel">
|
||||
<constraints>
|
||||
<xy x="0" y="3" width="93" height="14"/>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Node de&scendants:"/>
|
||||
</properties>
|
||||
</component>
|
||||
<grid id="c8237" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="0" y="25" width="298" height="227"/>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<scrollpane id="68272">
|
||||
<constraints>
|
||||
<xy x="0" y="0" width="198" height="227"/>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="7" anchor="0" fill="3"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="8776c" class="com.intellij.util.ui.Table" binding="myTable">
|
||||
<constraints/>
|
||||
<properties>
|
||||
<preferredScrollableViewportSize width="-1" height="-1"/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</scrollpane>
|
||||
<grid id="c7716" row-count="5" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="208" y="0" width="90" height="227"/>
|
||||
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="c1f20" class="javax.swing.JButton" binding="myButtonRemove">
|
||||
<constraints>
|
||||
<xy x="0" y="29" width="90" height="24"/>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="&Remove"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="f0acb" class="javax.swing.JButton" binding="myButtonUp">
|
||||
<constraints>
|
||||
<xy x="0" y="58" width="90" height="24"/>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Move &Up"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="66bbb" class="javax.swing.JButton" binding="myButtonDown">
|
||||
<constraints>
|
||||
<xy x="0" y="87" width="90" height="24"/>
|
||||
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Move &Down"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="5579c" class="javax.swing.JButton" binding="myButtonAdd">
|
||||
<constraints>
|
||||
<xy x="0" y="0" width="90" height="24"/>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="&Add"/>
|
||||
</properties>
|
||||
</component>
|
||||
<vspacer id="d11e5">
|
||||
<constraints>
|
||||
<xy x="39" y="111" width="11" height="116"/>
|
||||
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2"/>
|
||||
</constraints>
|
||||
</vspacer>
|
||||
</children>
|
||||
</grid>
|
||||
</children>
|
||||
</grid>
|
||||
</children>
|
||||
</grid>
|
||||
</form>
|
||||
+172
@@ -0,0 +1,172 @@
|
||||
package com.intellij.debugger.ui.tree.render.configurables;
|
||||
|
||||
import com.intellij.debugger.engine.DebuggerUtils;
|
||||
import com.intellij.debugger.engine.evaluation.TextWithImports;
|
||||
import com.intellij.debugger.ui.CompletitionEditor;
|
||||
import com.intellij.debugger.ui.tree.render.EnumerationChildrenRenderer;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.openapi.options.UnnamedConfigurable;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.ui.TableUtil;
|
||||
import com.intellij.util.ui.AbstractTableCellEditor;
|
||||
import com.intellij.util.ui.Table;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.table.DefaultTableModel;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
public class NamedChildrenConfigurable implements UnnamedConfigurable{
|
||||
private Table myTable;
|
||||
private final Project myProject;
|
||||
private final EnumerationChildrenRenderer myRenderer;
|
||||
private JPanel myPanel;
|
||||
private JLabel myTableLabel;
|
||||
private JButton myButtonAdd;
|
||||
private JButton myButtonRemove;
|
||||
private JButton myButtonUp;
|
||||
private JButton myButtonDown;
|
||||
|
||||
public NamedChildrenConfigurable(Project project, EnumerationChildrenRenderer renderer) {
|
||||
myProject = project;
|
||||
myRenderer = renderer;
|
||||
|
||||
myTableLabel.setLabelFor(myTable);
|
||||
|
||||
getModel().addColumn("Name", (Object[])null);
|
||||
getModel().addColumn("Expression", (Object[])null);
|
||||
|
||||
PsiClass psiClass = DebuggerUtils.findClass(myRenderer.getClassName(), myProject);
|
||||
final CompletitionEditor editor = DebuggerUtils.getInstance().createEditor(myProject, psiClass, "NamedChildrenConfigurable");
|
||||
|
||||
myTable.setDragEnabled(false);
|
||||
myTable.setIntercellSpacing(new Dimension(0, 0));
|
||||
|
||||
myTable.getColumn("Expression").setCellEditor(new AbstractTableCellEditor() {
|
||||
public Object getCellEditorValue() {
|
||||
return editor.getText();
|
||||
}
|
||||
|
||||
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
|
||||
editor.setText((TextWithImports)value);
|
||||
return editor;
|
||||
}
|
||||
});
|
||||
|
||||
myButtonAdd.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
getModel().addRow(new Object[] {"", DebuggerUtils.getInstance().createExpressionWithImports("") });
|
||||
}
|
||||
});
|
||||
|
||||
myButtonRemove.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
int selectedRow = myTable.getSelectedRow();
|
||||
if(selectedRow >= 0 && selectedRow < myTable.getRowCount()) {
|
||||
getModel().removeRow(selectedRow);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
myButtonDown.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
TableUtil.moveSelectedItemsDown(myTable);
|
||||
}
|
||||
});
|
||||
|
||||
myButtonUp.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
TableUtil.moveSelectedItemsUp(myTable);
|
||||
}
|
||||
});
|
||||
|
||||
myTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
updateButtons();
|
||||
}
|
||||
});
|
||||
updateButtons();
|
||||
}
|
||||
|
||||
private void updateButtons() {
|
||||
int selectedRow = myTable.getSelectedRow();
|
||||
myButtonRemove.setEnabled(selectedRow != -1);
|
||||
myButtonUp.setEnabled(selectedRow > 0);
|
||||
myButtonDown.setEnabled(selectedRow < myTable.getRowCount() - 1);
|
||||
}
|
||||
|
||||
private DefaultTableModel getModel() {
|
||||
return ((DefaultTableModel)myTable.getModel());
|
||||
}
|
||||
|
||||
public JComponent createComponent() {
|
||||
return myPanel;
|
||||
}
|
||||
|
||||
public boolean isModified() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void apply() throws ConfigurationException {
|
||||
DefaultTableModel model = getModel();
|
||||
|
||||
final int size = model.getRowCount();
|
||||
java.util.List<Pair<String, TextWithImports>> result = new ArrayList<Pair<String, TextWithImports>>();
|
||||
|
||||
for (int idx = 0; idx < size; idx++) {
|
||||
result.add(new Pair<String, TextWithImports>((String)model.getValueAt(idx, 0), (TextWithImports)model.getValueAt(idx, 1)));
|
||||
}
|
||||
myRenderer.setChildren(result);
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
while(myTable.getModel().getRowCount() > 0) {
|
||||
getModel().removeRow(0);
|
||||
}
|
||||
|
||||
for (Iterator<Pair<String, TextWithImports>> iterator = myRenderer.getChildren().iterator(); iterator.hasNext();) {
|
||||
Pair<String, TextWithImports> pair = iterator.next();
|
||||
getModel().addRow(new Object[] { pair.getFirst(), pair.getSecond()});
|
||||
}
|
||||
}
|
||||
|
||||
public void disposeUIResources() {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
private class TextWithImportsTableRenderer implements TableCellRenderer{
|
||||
private final CompletitionEditor myEditor;
|
||||
|
||||
private TextWithImportsTableRenderer () {
|
||||
PsiClass psiClass = DebuggerUtils.findClass(myRenderer.getClassName(), myProject);
|
||||
myEditor = DebuggerUtils.getInstance().createEditor(myProject, psiClass, "NamedChildrenConfigurable");
|
||||
}
|
||||
|
||||
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
if(hasFocus) {
|
||||
myEditor.setText((TextWithImports)value);
|
||||
return myEditor;
|
||||
}
|
||||
else {
|
||||
TableCellRenderer defaultRenderer = myTable.getDefaultRenderer(String.class);
|
||||
return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user