summaryrefslogtreecommitdiff
path: root/platform/xdebugger-impl
diff options
context:
space:
mode:
Diffstat (limited to 'platform/xdebugger-impl')
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java32
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java2
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java50
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java4
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java32
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java2
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java45
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java6
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java4
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java18
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/WatchInplaceEditor.java6
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugView.java14
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugViewSessionListener.java7
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java19
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java45
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java119
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesViewImpl.java18
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java3
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java34
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java57
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java62
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java6
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java4
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java4
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java4
-rw-r--r--platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerTestUtil.java100
-rw-r--r--platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestContainer.java2
-rw-r--r--platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestEvaluationCallback.java7
-rw-r--r--platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestValueNode.java2
29 files changed, 421 insertions, 287 deletions
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java
index b09c7388748f..d76d60410648 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/DebuggerSupport.java
@@ -16,6 +16,7 @@
package com.intellij.xdebugger.impl;
import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
@@ -25,11 +26,15 @@ import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler;
import com.intellij.xdebugger.impl.actions.EditBreakpointActionHandler;
import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler;
import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider;
+import com.intellij.xdebugger.impl.evaluate.quick.common.AbstractValueHint;
import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler;
+import com.intellij.xdebugger.impl.evaluate.quick.common.ValueHintType;
import com.intellij.xdebugger.impl.settings.DebuggerSettingsPanelProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.awt.*;
+
/**
* @author nik
*/
@@ -118,7 +123,32 @@ public abstract class DebuggerSupport {
public abstract DebuggerActionHandler getEvaluateHandler();
@NotNull
- public abstract QuickEvaluateHandler getQuickEvaluateHandler();
+ public QuickEvaluateHandler getQuickEvaluateHandler() {
+ return DISABLED_QUICK_EVALUATE;
+ }
+
+ private static final QuickEvaluateHandler DISABLED_QUICK_EVALUATE = new QuickEvaluateHandler() {
+ @Override
+ public boolean isEnabled(@NotNull Project project) {
+ return false;
+ }
+
+ @Nullable
+ @Override
+ public AbstractValueHint createValueHint(@NotNull Project project, @NotNull Editor editor, @NotNull Point point, ValueHintType type) {
+ return null;
+ }
+
+ @Override
+ public boolean canShowHint(@NotNull Project project) {
+ return false;
+ }
+
+ @Override
+ public int getValueLookupDelay(Project project) {
+ return 0;
+ }
+ };
@NotNull
public abstract DebuggerActionHandler getAddToWatchesActionHandler();
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java
index 1b0f0ca69a59..ddc28745934a 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java
@@ -98,7 +98,7 @@ public class XDebugSessionImpl implements XDebugSession {
private XExecutionStack myCurrentExecutionStack;
private XStackFrame myCurrentStackFrame;
private boolean myIsTopFrame;
- private XSourcePosition myTopFramePosition;
+ private volatile XSourcePosition myTopFramePosition;
private final AtomicBoolean myPaused = new AtomicBoolean();
private MyDependentBreakpointListener myDependentBreakpointListener;
private XValueMarkers<?, ?> myValueMarkers;
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java
index 2e6f91d43924..6ef4ca6a1252 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerManagerImpl.java
@@ -24,7 +24,11 @@ import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.runners.RunContentBuilder;
-import com.intellij.execution.ui.*;
+import com.intellij.execution.ui.ExecutionConsole;
+import com.intellij.execution.ui.RunContentDescriptor;
+import com.intellij.execution.ui.RunContentManager;
+import com.intellij.execution.ui.RunContentWithExecutorListener;
+import com.intellij.ide.DataManager;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.*;
@@ -49,7 +53,6 @@ import com.intellij.xdebugger.impl.settings.XDebuggerSettingsManager;
import com.intellij.xdebugger.impl.ui.ExecutionPointHighlighter;
import com.intellij.xdebugger.impl.ui.XDebugSessionData;
import com.intellij.xdebugger.impl.ui.XDebugSessionTab;
-import gnu.trove.THashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -70,8 +73,6 @@ public class XDebuggerManagerImpl extends XDebuggerManager
private final Project myProject;
private final XBreakpointManagerImpl myBreakpointManager;
private final XDebuggerWatchesManager myWatchesManager;
- private final Map<RunContentDescriptor, XDebugSessionData> mySessionData;
- private final Map<RunContentDescriptor, XDebugSessionTab> mySessionTabs;
private final Map<ProcessHandler, XDebugSessionImpl> mySessions;
private final ExecutionPointHighlighter myExecutionPointHighlighter;
private XDebugSessionImpl myActiveSession;
@@ -80,8 +81,6 @@ public class XDebuggerManagerImpl extends XDebuggerManager
myProject = project;
myBreakpointManager = new XBreakpointManagerImpl(project, this, startupManager);
myWatchesManager = new XDebuggerWatchesManager();
- mySessionData = new THashMap<RunContentDescriptor, XDebugSessionData>();
- mySessionTabs = new THashMap<RunContentDescriptor, XDebugSessionTab>();
mySessions = new LinkedHashMap<ProcessHandler, XDebugSessionImpl>();
myExecutionPointHighlighter = new ExecutionPointHighlighter(project);
@@ -135,11 +134,6 @@ public class XDebuggerManagerImpl extends XDebuggerManager
public void contentRemoved(@Nullable RunContentDescriptor descriptor, @NotNull Executor executor) {
if (descriptor != null && executor.equals(DefaultDebugExecutor.getDebugExecutorInstance())) {
mySessions.remove(descriptor.getProcessHandler());
- mySessionData.remove(descriptor);
- XDebugSessionTab tab = mySessionTabs.remove(descriptor);
- if (tab != null) {
- Disposer.dispose(tab);
- }
}
}
});
@@ -218,7 +212,13 @@ public class XDebuggerManagerImpl extends XDebuggerManager
XDebugProcess process = processStarter.start(session);
myProject.getMessageBus().syncPublisher(TOPIC).processStarted(process);
- XDebugSessionData oldSessionData = contentToReuse != null ? mySessionData.get(contentToReuse) : null;
+ XDebugSessionData oldSessionData = null;
+ if (contentToReuse != null) {
+ JComponent component = contentToReuse.getComponent();
+ if (component != null) {
+ oldSessionData = XDebugSessionData.DATA_KEY.getData(DataManager.getInstance().getDataContext(component));
+ }
+ }
if (oldSessionData == null) {
oldSessionData = new XDebugSessionData(session.getWatchExpressions());
}
@@ -240,21 +240,17 @@ public class XDebuggerManagerImpl extends XDebuggerManager
XDebugSessionTab sessionTab = session.getSessionTab();
mySessions.remove(session.getDebugProcess().getProcessHandler());
if (sessionTab != null) {
- final RunContentDescriptor descriptor = sessionTab.getRunContentDescriptor();
- mySessionData.put(descriptor, session.getSessionData());
- mySessionTabs.put(descriptor, sessionTab);
-
- // in test-mode RunContentWithExecutorListener.contentRemoved events are not sent (see RunContentManagerImpl.showRunContent)
- // so we make sure the mySessions and mySessionData are cleared correctly when session is disposed
-
- Disposer.register(sessionTab, new Disposable() {
- @Override
- public void dispose() {
- mySessionData.remove(descriptor);
- mySessionTabs.remove(descriptor);
- mySessions.remove(session.getDebugProcess().getProcessHandler());
- }
- });
+ RunContentDescriptor descriptor = sessionTab.getRunContentDescriptor();
+ if (descriptor != null) {
+ // in test-mode RunContentWithExecutorListener.contentRemoved events are not sent (see RunContentManagerImpl.showRunContent)
+ // so we make sure the mySessions and mySessionData are cleared correctly when session is disposed
+ Disposer.register(descriptor, new Disposable() {
+ @Override
+ public void dispose() {
+ mySessions.remove(session.getDebugProcess().getProcessHandler());
+ }
+ });
+ }
if (!myProject.isDisposed() && !ApplicationManager.getApplication().isUnitTestMode() && XDebuggerSettingsManager.getInstanceImpl().getGeneralSettings().isHideDebuggerOnProcessTermination()) {
ExecutionManager.getInstance(myProject).getContentManager().hideRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), descriptor);
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java
index c3a9b9842661..c83b07fa09ff 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XMarkObjectActionHandler.java
@@ -30,6 +30,8 @@ import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import static com.intellij.openapi.actionSystem.PlatformDataKeys.CONTEXT_COMPONENT;
+
/**
* @author nik
*/
@@ -49,7 +51,7 @@ public class XMarkObjectActionHandler extends MarkObjectActionHandler {
markers.unmarkValue(value);
}
else {
- ValueMarkerPresentationDialog dialog = new ValueMarkerPresentationDialog(node.getName());
+ ValueMarkerPresentationDialog dialog = new ValueMarkerPresentationDialog(event.getData(CONTEXT_COMPONENT), node.getName());
dialog.show();
ValueMarkup markup = dialog.getConfiguredMarkup();
if (dialog.isOK() && markup != null) {
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java
index e73564095b21..b9a58844585a 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java
@@ -18,6 +18,7 @@ package com.intellij.xdebugger.impl.evaluate;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.EditorLinePainter;
import com.intellij.openapi.editor.LineExtensionInfo;
+import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
@@ -25,10 +26,8 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.ui.Gray;
-import com.intellij.ui.JBColor;
-import com.intellij.ui.SimpleColoredText;
-import com.intellij.ui.SimpleTextAttributes;
+import com.intellij.ui.*;
+import com.intellij.util.NotNullProducer;
import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XSourcePosition;
import com.intellij.xdebugger.frame.presentation.XValuePresentation;
@@ -142,12 +141,33 @@ public class XDebuggerEditorLinePainter extends EditorLinePainter {
return -1;
}
+ private static boolean isDarkEditor() {
+ Color bg = EditorColorsManager.getInstance().getGlobalScheme().getDefaultBackground();
+ return ColorUtil.isDark(bg);
+ }
+
public static JBColor getForeground() {
- return new JBColor(new Color(61, 128, 101), new Color(61, 128, 101));
+ return new JBColor(new NotNullProducer<Color>() {
+ @SuppressWarnings("UseJBColor")
+ @NotNull
+ @Override
+ public Color produce() {
+ return isDarkEditor() ? Registry.getColor("ide.debugger.inline.dark.fg.color", new Color(0x3d8065))
+ : Registry.getColor("ide.debugger.inline.fg.color", new Color(0x3d8065));
+ }
+ });
}
public static JBColor getChangedForeground() {
- return new JBColor(new Color(202, 128, 33), new Color(161, 131, 10));
+ return new JBColor(new NotNullProducer<Color>() {
+ @SuppressWarnings("UseJBColor")
+ @NotNull
+ @Override
+ public Color produce() {
+ return isDarkEditor() ? Registry.getColor("ide.debugger.inline.dark.fg.modified.color", new Color(0xa1830a))
+ : Registry.getColor("ide.debugger.inline.fg.modified.color", new Color(0xca8021));
+ }
+ });
}
static class Variable {
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java
index 74b3b5202dbd..5a6d19de3234 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEvaluationDialog.java
@@ -295,7 +295,7 @@ public class XDebuggerEvaluationDialog extends DialogWrapper {
evaluationCallback.errorOccurred(XDebuggerBundle.message("xdebugger.evaluate.stack.frame.has.not.evaluator"));
}
else {
- evaluator.evaluate(expression, evaluationCallback, null, inputEditor.getMode());
+ evaluator.evaluate(expression, evaluationCallback, null);
}
}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java
index ca78932701d2..37b641e1042e 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,15 +20,23 @@ import com.intellij.execution.console.LanguageConsoleImpl;
import com.intellij.execution.console.LanguageConsoleView;
import com.intellij.execution.impl.ConsoleViewImpl;
import com.intellij.execution.ui.ConsoleView;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.actionSystem.ActionManager;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.ShortcutSet;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.keymap.KeymapUtil;
+import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vcs.changes.issueLinks.LinkMouseListenerBase;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleColoredText;
+import com.intellij.ui.SimpleTextAttributes;
import com.intellij.util.Consumer;
import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XDebuggerUtil;
@@ -68,6 +76,8 @@ public class XValueHint extends AbstractValueHint {
private final String myExpression;
private final String myValueName;
private final @Nullable XSourcePosition myExpressionPosition;
+ private final ExpressionInfo myExpressionInfo;
+ private Disposable myDisposable;
public XValueHint(@NotNull Project project, @NotNull Editor editor, @NotNull Point point, @NotNull ValueHintType type,
@NotNull ExpressionInfo expressionInfo, @NotNull XDebuggerEvaluator evaluator,
@@ -78,6 +88,7 @@ public class XValueHint extends AbstractValueHint {
myDebugSession = session;
myExpression = XDebuggerEvaluateActionHandler.getExpressionText(expressionInfo, editor.getDocument());
myValueName = XDebuggerEvaluateActionHandler.getDisplayText(expressionInfo, editor.getDocument());
+ myExpressionInfo = expressionInfo;
VirtualFile file;
ConsoleView consoleView = ConsoleViewImpl.CONSOLE_VIEW_IN_EDITOR_VIEW.get(editor);
@@ -98,6 +109,33 @@ public class XValueHint extends AbstractValueHint {
}
@Override
+ protected boolean showHint(final JComponent component) {
+ boolean result = super.showHint(component);
+ if (result && getType() == ValueHintType.MOUSE_OVER_HINT) {
+ myDisposable = Disposer.newDisposable();
+ ShortcutSet shortcut = ActionManager.getInstance().getAction("ShowErrorDescription").getShortcutSet();
+ new DumbAwareAction() {
+ @Override
+ public void actionPerformed(@NotNull AnActionEvent e) {
+ hideHint();
+ final Point point = new Point(myPoint.x, myPoint.y + getEditor().getLineHeight());
+ new XValueHint(getProject(), getEditor(), point, ValueHintType.MOUSE_CLICK_HINT, myExpressionInfo, myEvaluator, myDebugSession).invokeHint();
+ }
+ }.registerCustomShortcutSet(shortcut, getEditor().getContentComponent(), myDisposable);
+ }
+ return result;
+ }
+
+ @Override
+ public void hideHint() {
+ super.hideHint();
+ if (myDisposable != null) {
+ Disposer.dispose(myDisposable);
+
+ }
+ }
+
+ @Override
protected void evaluateAndShowHint() {
myEvaluator.evaluate(myExpression, new XEvaluationCallbackBase() {
@Override
@@ -136,6 +174,11 @@ public class XValueHint extends AbstractValueHint {
showTree(result);
}
else {
+ if (getType() == ValueHintType.MOUSE_OVER_HINT) {
+ text.insert(0, "(" + KeymapUtil.getFirstKeyboardShortcutText("ShowErrorDescription") + ") ",
+ SimpleTextAttributes.GRAYED_ATTRIBUTES);
+ }
+
JComponent component = createExpandableHintComponent(text, new Runnable() {
@Override
public void run() {
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java
index 7b860b49d255..c24ce74df1c6 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/AbstractValueHint.java
@@ -65,7 +65,7 @@ public abstract class AbstractValueHint {
private final Project myProject;
private final Editor myEditor;
private final ValueHintType myType;
- private final Point myPoint;
+ protected final Point myPoint;
private LightweightHint myCurrentHint;
private boolean myHintHidden;
private TextRange myCurrentRange;
@@ -132,6 +132,10 @@ public abstract class AbstractValueHint {
}
}
+ public void invokeHint() {
+ invokeHint(null);
+ }
+
public void invokeHint(Runnable hideRunnable) {
myHideRunnable = hideRunnable;
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java
index c7c5af9f6fb4..2851c701ef70 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -170,7 +170,7 @@ abstract class DebuggerTreeWithHistoryContainer<D> {
}
@Override
- public void onFailure(Throwable t) {
+ public void onFailure(@NotNull Throwable t) {
LOG.debug(t);
}
});
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java
index e4ea46b69ea9..97edec9133ba 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java
@@ -20,6 +20,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
+import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Disposer;
import com.intellij.ui.ScreenUtil;
import com.intellij.ui.awt.RelativePoint;
@@ -64,7 +65,7 @@ class DebuggerTreeWithHistoryPopup<D> extends DebuggerTreeWithHistoryContainer<D
}
@Override
- protected void updateContainer(Tree tree, String title) {
+ protected void updateContainer(final Tree tree, String title) {
if (myPopup != null) {
myPopup.cancel();
}
@@ -75,6 +76,21 @@ class DebuggerTreeWithHistoryPopup<D> extends DebuggerTreeWithHistoryContainer<D
.setResizable(true)
.setMovable(true)
.setDimensionServiceKey(myProject, DIMENSION_SERVICE_KEY, false)
+ .setMayBeParent(true)
+ .setCancelCallback(new Computable<Boolean>() {
+ @Override
+ public Boolean compute() {
+ Window parent = SwingUtilities.getWindowAncestor(tree);
+ if (parent != null) {
+ for (Window child : parent.getOwnedWindows()) {
+ if (child.isShowing()) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ })
.createPopup();
if (tree instanceof Disposable) {
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/WatchInplaceEditor.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/WatchInplaceEditor.java
index 683c27e30e18..00ceef568c21 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/WatchInplaceEditor.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/WatchInplaceEditor.java
@@ -39,7 +39,7 @@ public class WatchInplaceEditor extends XDebuggerTreeInplaceEditor {
@Nullable private final WatchNode myOldNode;
public WatchInplaceEditor(@NotNull WatchesRootNode rootNode,
- @NotNull XDebugSession session, XWatchesView watchesView, final WatchNode node,
+ @Nullable XDebugSession session, XWatchesView watchesView, final WatchNode node,
@NonNls final String historyId,
final @Nullable WatchNode oldNode) {
super((XDebuggerTreeNode)node, historyId);
@@ -47,7 +47,9 @@ public class WatchInplaceEditor extends XDebuggerTreeInplaceEditor {
myWatchesView = watchesView;
myOldNode = oldNode;
myExpressionEditor.setExpression(oldNode != null ? oldNode.getExpression() : null);
- new WatchEditorSessionListener(session).install();
+ if (session != null) {
+ new WatchEditorSessionListener(session).install();
+ }
}
@Override
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugView.java
index 0007ec2f9997..847dd9004a49 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugView.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugView.java
@@ -19,6 +19,7 @@ import com.intellij.execution.ui.layout.ViewContext;
import com.intellij.ide.DataManager;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.actionSystem.DataKey;
import com.intellij.ui.content.ContentManager;
import com.intellij.util.SingleAlarm;
import com.intellij.xdebugger.XDebugSession;
@@ -66,15 +67,20 @@ public abstract class XDebugView implements Disposable {
@Nullable
public static XDebugSession getSession(@NotNull Component component) {
+ return getData(XDebugSession.DATA_KEY, component);
+ }
+
+ @Nullable
+ public static <T> T getData(DataKey<T> key, @NotNull Component component) {
DataContext dataContext = DataManager.getInstance().getDataContext(component);
ViewContext viewContext = ViewContext.CONTEXT_KEY.getData(dataContext);
ContentManager contentManager = viewContext == null ? null : viewContext.getContentManager();
if (contentManager != null) {
- XDebugSession session = XDebugSession.DATA_KEY.getData(DataManager.getInstance().getDataContext(contentManager.getComponent()));
- if (session != null) {
- return session;
+ T data = key.getData(DataManager.getInstance().getDataContext(contentManager.getComponent()));
+ if (data != null) {
+ return data;
}
}
- return XDebugSession.DATA_KEY.getData(dataContext);
+ return key.getData(dataContext);
}
}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugViewSessionListener.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugViewSessionListener.java
index d790113b1816..f124078f5a57 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugViewSessionListener.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugViewSessionListener.java
@@ -16,7 +16,6 @@
package com.intellij.xdebugger.impl.frame;
import com.intellij.ui.AppUIUtil;
-import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XDebugSessionAdapter;
import org.jetbrains.annotations.NotNull;
@@ -25,15 +24,13 @@ import org.jetbrains.annotations.NotNull;
*/
public class XDebugViewSessionListener extends XDebugSessionAdapter {
private final XDebugView myDebugView;
- private final XDebugSession session;
- public XDebugViewSessionListener(@NotNull XDebugView debugView, @NotNull XDebugSession session) {
+ public XDebugViewSessionListener(@NotNull XDebugView debugView) {
myDebugView = debugView;
- this.session = session;
}
private void onSessionEvent(final @NotNull XDebugView.SessionEvent event) {
- AppUIUtil.invokeLaterIfProjectAlive(session.getProject(), new Runnable() {
+ AppUIUtil.invokeOnEdt(new Runnable() {
@Override
public void run() {
myDebugView.processSessionEvent(event);
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java
index 9b39ad63deb8..63a1cfeea6af 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,6 +15,8 @@
*/
package com.intellij.xdebugger.impl.frame;
+import com.intellij.openapi.actionSystem.CommonDataKeys;
+import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
@@ -27,7 +29,9 @@ import com.intellij.util.ui.UIUtil;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.XSourcePosition;
import com.intellij.xdebugger.frame.XStackFrame;
+import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
@@ -78,7 +82,7 @@ public class XDebuggerFramesList extends DebuggerFramesList {
}
@Override
- public int getSourceActions(JComponent c) {
+ public int getSourceActions(@NotNull JComponent c) {
return COPY;
}
};
@@ -90,6 +94,17 @@ public class XDebuggerFramesList extends DebuggerFramesList {
doInit();
setTransferHandler(DEFAULT_TRANSFER_HANDLER);
+ setDataProvider(new DataProvider() {
+ @Nullable
+ @Override
+ public Object getData(@NonNls String dataId) {
+ if (CommonDataKeys.VIRTUAL_FILE.is(dataId) && mySelectedFrame != null) {
+ XSourcePosition position = mySelectedFrame.getSourcePosition();
+ return position != null ? position.getFile() : null;
+ }
+ return null;
+ }
+ });
}
@Override
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java
index 9999ac015b77..cd1fee38b074 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java
@@ -61,6 +61,7 @@ public class XFramesView extends XDebugView {
private final ComboBox myThreadComboBox;
private final Set<XExecutionStack> myExecutionStacks = ContainerUtil.newHashSet();
private XExecutionStack mySelectedStack;
+ private int mySelectedFrameIndex;
private boolean myListenersEnabled;
private final Map<XExecutionStack, StackFramesListBuilder> myBuilders = new HashMap<XExecutionStack, StackFramesListBuilder>();
private final ActionToolbarImpl myToolbar;
@@ -76,7 +77,7 @@ public class XFramesView extends XDebugView {
@Override
public void valueChanged(ListSelectionEvent e) {
if (myListenersEnabled && !e.getValueIsAdjusting()) {
- processFrameSelection(e);
+ processFrameSelection(getSession(e));
}
}
});
@@ -86,7 +87,7 @@ public class XFramesView extends XDebugView {
if (myListenersEnabled) {
int i = myFramesList.locationToIndex(e.getPoint());
if (i != -1 && myFramesList.isSelectedIndex(i)) {
- processFrameSelection(e);
+ processFrameSelection(getSession(e));
}
}
}
@@ -115,9 +116,10 @@ public class XFramesView extends XDebugView {
if (e.getStateChange() == ItemEvent.SELECTED) {
Object item = e.getItem();
- if (item instanceof XExecutionStack) {
+ if (item != mySelectedStack && item instanceof XExecutionStack) {
XDebugSession session = getSession(e);
if (session != null) {
+ mySelectedFrameIndex = 0;
updateFrames((XExecutionStack)item, session);
}
}
@@ -209,16 +211,21 @@ public class XFramesView extends XDebugView {
XStackFrame currentStackFrame = session == null ? null : session.getCurrentStackFrame();
if (currentStackFrame != null) {
myFramesList.setSelectedValue(currentStackFrame, true);
+ mySelectedFrameIndex = myFramesList.getSelectedIndex();
}
return;
}
+ if (event != SessionEvent.SETTINGS_CHANGED) {
+ mySelectedFrameIndex = 0;
+ mySelectedStack = null;
+ }
+
myListenersEnabled = false;
for (StackFramesListBuilder builder : myBuilders.values()) {
builder.dispose();
}
myBuilders.clear();
- mySelectedStack = null;
XSuspendContext suspendContext = session == null ? null : session.getSuspendContext();
if (suspendContext == null) {
requestClear();
@@ -234,7 +241,7 @@ public class XFramesView extends XDebugView {
XExecutionStack[] executionStacks = suspendContext.getExecutionStacks();
addExecutionStacks(Arrays.asList(executionStacks));
- XExecutionStack activeExecutionStack = suspendContext.getActiveExecutionStack();
+ XExecutionStack activeExecutionStack = mySelectedStack != null ? mySelectedStack : suspendContext.getActiveExecutionStack();
myThreadComboBox.setSelectedItem(activeExecutionStack);
myThreadsPanel.removeAll();
myThreadsPanel.add(myToolbar.getComponent(), BorderLayout.EAST);
@@ -265,9 +272,6 @@ public class XFramesView extends XDebugView {
}
private void updateFrames(final XExecutionStack executionStack, @NotNull XDebugSession session) {
- if (mySelectedStack == executionStack) {
- return;
- }
if (mySelectedStack != null) {
getOrCreateBuilder(mySelectedStack, session).stop();
}
@@ -275,6 +279,7 @@ public class XFramesView extends XDebugView {
mySelectedStack = executionStack;
if (executionStack != null) {
StackFramesListBuilder builder = getOrCreateBuilder(executionStack, session);
+ myListenersEnabled = false;
builder.initModel(myFramesList.getModel());
builder.start();
}
@@ -292,12 +297,12 @@ public class XFramesView extends XDebugView {
return myMainPanel;
}
- private void processFrameSelection(@NotNull EventObject e) {
+ private void processFrameSelection(XDebugSession session) {
+ mySelectedFrameIndex = myFramesList.getSelectedIndex();
Object selected = myFramesList.getSelectedValue();
if (selected instanceof XStackFrame) {
- XDebugSession session = getSession(e);
if (session != null) {
- session.setCurrentStackFrame(mySelectedStack, (XStackFrame)selected, myFramesList.getSelectedIndex() == 0);
+ session.setCurrentStackFrame(mySelectedStack, (XStackFrame)selected, mySelectedFrameIndex == 0);
}
}
}
@@ -324,9 +329,7 @@ public class XFramesView extends XDebugView {
public void run() {
myStackFrames.addAll(stackFrames);
addFrameListElements(stackFrames, last);
- if (myNextFrameIndex == 0) {
- selectTopFrame();
- }
+ selectCurrentFrame();
myNextFrameIndex += stackFrames.size();
myAllFramesLoaded = last;
if (last) {
@@ -390,11 +393,13 @@ public class XFramesView extends XDebugView {
myRunning = false;
}
- private void selectTopFrame() {
- if (!myStackFrames.isEmpty() && mySelectedStack != null) {
- XStackFrame topFrame = myStackFrames.get(0);
- myFramesList.setSelectedValue(topFrame, true);
- mySession.setCurrentStackFrame(mySelectedStack, topFrame, true);
+ private void selectCurrentFrame() {
+ if (mySelectedStack != null &&
+ myFramesList.getSelectedIndex() != mySelectedFrameIndex &&
+ myFramesList.getElementCount() > mySelectedFrameIndex &&
+ myFramesList.getModel().get(mySelectedFrameIndex) != null) {
+ myFramesList.setSelectedIndex(mySelectedFrameIndex);
+ processFrameSelection(mySession);
myListenersEnabled = true;
}
}
@@ -411,7 +416,7 @@ public class XFramesView extends XDebugView {
else if (!myAllFramesLoaded) {
model.addElement(null);
}
- selectTopFrame();
+ selectCurrentFrame();
}
}
}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java
index d4bd27c30d9b..4bfcfa58855f 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java
@@ -15,34 +15,34 @@
*/
package com.intellij.xdebugger.impl.frame;
-import com.intellij.codeInsight.hint.HintManager;
-import com.intellij.codeInsight.hint.HintUtil;
import com.intellij.ide.dnd.DnDManager;
-import com.intellij.openapi.Disposable;
+import com.intellij.openapi.application.AccessToken;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.LogicalPosition;
import com.intellij.openapi.editor.event.SelectionEvent;
import com.intellij.openapi.editor.event.SelectionListener;
+import com.intellij.openapi.editor.impl.SelectionModelImpl;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.ui.SimpleColoredComponent;
-import com.intellij.ui.SimpleColoredText;
+import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.XSourcePosition;
+import com.intellij.xdebugger.evaluation.ExpressionInfo;
import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider;
import com.intellij.xdebugger.evaluation.XDebuggerEvaluator;
-import com.intellij.xdebugger.frame.XFullValueEvaluator;
import com.intellij.xdebugger.frame.XStackFrame;
import com.intellij.xdebugger.frame.XValue;
-import com.intellij.xdebugger.frame.XValuePlace;
-import com.intellij.xdebugger.frame.presentation.XValuePresentation;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
+import com.intellij.xdebugger.impl.evaluate.quick.XValueHint;
+import com.intellij.xdebugger.impl.evaluate.quick.common.ValueHintType;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreePanel;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreeRestorer;
@@ -50,11 +50,11 @@ import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreeState;
import com.intellij.xdebugger.impl.ui.tree.nodes.XEvaluationCallbackBase;
import com.intellij.xdebugger.impl.ui.tree.nodes.XStackFrameNode;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
-import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodePresentationConfigurator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.awt.*;
import java.util.HashMap;
import java.util.Set;
@@ -88,68 +88,53 @@ public abstract class XVariablesViewBase extends XDebugView {
myTreeRestorer = myTreeState.restoreState(tree);
}
if (position != null && Registry.is("ide.debugger.inline")) {
- final VirtualFile file = position.getFile();
- final FileEditor fileEditor = FileEditorManagerEx.getInstanceEx(project).getSelectedEditor(file);
- if (fileEditor instanceof PsiAwareTextEditorImpl) {
- final Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor();
- final SelectionListener listener = new SelectionListener() {
- @Override
- public void selectionChanged(SelectionEvent e) {
- final String text = editor.getDocument().getText(e.getNewRange());
- final XDebuggerEvaluator evaluator = stackFrame.getEvaluator();
- if (evaluator != null && !StringUtil.isEmpty(text)
- && !(text.contains("exec(") || text.contains("++") || text.contains("--") || text.contains("="))) {
- evaluator.evaluate(text, new XEvaluationCallbackBase() {
- @Override
- public void evaluated(@NotNull XValue result) {
- result.computePresentation(new XValueNodePresentationConfigurator.ConfigurableXValueNodeImpl() {
- @Override
- public void applyPresentation(@Nullable Icon icon,
- @NotNull XValuePresentation valuePresenter,
- boolean hasChildren) {
- SimpleColoredText text = new SimpleColoredText();
- XValueNodeImpl.buildText(valuePresenter, text, false);
- SimpleColoredComponent component = HintUtil.createInformationComponent();
- text.appendToComponent(component);
- String str = text.toString();
- if ("undefined".equals(str) || str.startsWith("Cannot find local variable")
- || str.startsWith("Invalid expression")) {
- return; //todo[kb] this is temporary solution
- }
- HintManager.getInstance().hideAllHints();
- HintManager.getInstance().showInformationHint(editor, component);
- }
+ registerInlineEvaluator(stackFrame, tree, position, project);
+ }
+ }
- @Override
- public void setFullValueEvaluator(@NotNull XFullValueEvaluator fullValueEvaluator) {
- }
+ private void registerInlineEvaluator(final XStackFrame stackFrame,
+ XDebuggerTree tree,
+ final XSourcePosition position,
+ final Project project) {
+ final VirtualFile file = position.getFile();
+ final FileEditor fileEditor = FileEditorManagerEx.getInstanceEx(project).getSelectedEditor(file);
+ if (fileEditor instanceof PsiAwareTextEditorImpl) {
+ final Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor();
+ final SelectionListener listener = new SelectionListener() {
+ @Override
+ public void selectionChanged(final SelectionEvent e) {
+ final String text = editor.getDocument().getText(e.getNewRange());
+ final XDebuggerEvaluator evaluator = stackFrame.getEvaluator();
+ if (evaluator != null && !StringUtil.isEmpty(text)
+ && !(text.contains("exec(") || text.contains("++") || text.contains("--") || text.contains("="))) {
+ evaluator.evaluate(text, new XEvaluationCallbackBase() {
+ @Override
+ public void evaluated(@NotNull XValue result) {
+ final AccessToken token = ApplicationManager.getApplication().acquireReadActionLock();
+ try {
+ final XDebugSession session = getSession(getTree());
+ if (session == null) return;
+ final TextRange range = e.getNewRange();
+ final ExpressionInfo info = new ExpressionInfo(range);
+ final int offset = range.getStartOffset();
+ final LogicalPosition pos = editor.offsetToLogicalPosition(offset);
+ final Point point = editor.logicalPositionToXY(pos);
- @Override
- public boolean isObsolete() {
- return true;
- }
- }, XValuePlace.TOOLTIP);
+ new XValueHint(project, editor, point, ValueHintType.MOUSE_OVER_HINT, info, evaluator, session).invokeHint();
}
-
- @Override
- public void errorOccurred(@NotNull String errorMessage) {
- System.out.println(errorMessage);
+ finally {
+ token.finish();
}
- }, position);
- }
- }
- };
- editor.getSelectionModel().addSelectionListener(listener);
- Disposer.register(tree, new Disposable() {
- @Override
- public void dispose() {
- final FileEditor fileEditor = FileEditorManagerEx.getInstanceEx(project).getSelectedEditor(file);
- if (fileEditor instanceof PsiAwareTextEditorImpl) {
- ((PsiAwareTextEditorImpl)fileEditor).getEditor().getSelectionModel().removeSelectionListener(listener);
- }
+ }
+
+ @Override
+ public void errorOccurred(@NotNull String errorMessage) {
+ }
+ }, position);
}
- });
- }
+ }
+ };
+ ((SelectionModelImpl)editor.getSelectionModel()).addSelectionListener(listener, tree);
}
}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesViewImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesViewImpl.java
index c510cd17c90a..8b94e2c4858a 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesViewImpl.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesViewImpl.java
@@ -40,6 +40,7 @@ import com.intellij.xdebugger.frame.XStackFrame;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
+import com.intellij.xdebugger.impl.ui.XDebugSessionData;
import com.intellij.xdebugger.impl.ui.XDebugSessionTab;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreePanel;
@@ -220,13 +221,9 @@ public class XWatchesViewImpl extends XDebugView implements DnDNativeTarget, XWa
@Override
public void addWatchExpression(@NotNull XExpression expression, int index, final boolean navigateToWatchNode) {
XDebugSession session = getSession(getTree());
- if (session == null) {
- return;
- }
-
- myRootNode.addWatchExpression(session.getDebugProcess().getEvaluator(), expression, index, navigateToWatchNode);
+ myRootNode.addWatchExpression(session != null ? session.getDebugProcess().getEvaluator() : null, expression, index, navigateToWatchNode);
updateSessionData();
- if (navigateToWatchNode) {
+ if (navigateToWatchNode && session != null) {
showWatchesTab((XDebugSessionImpl)session);
}
}
@@ -342,8 +339,15 @@ public class XWatchesViewImpl extends XDebugView implements DnDNativeTarget, XWa
}
XDebugSession session = getSession(getTree());
+ XExpression[] expressions = watchExpressions.toArray(new XExpression[watchExpressions.size()]);
if (session != null) {
- ((XDebugSessionImpl)session).setWatchExpressions(watchExpressions.toArray(new XExpression[watchExpressions.size()]));
+ ((XDebugSessionImpl)session).setWatchExpressions(expressions);
+ }
+ else {
+ XDebugSessionData data = getData(XDebugSessionData.DATA_KEY, getTree());
+ if (data != null) {
+ data.setWatchExpressions(expressions);
+ }
}
}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java
index 58896a87f596..3d0db0abc7fb 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.xdebugger.XDebuggerBundle;
+import com.intellij.xdebugger.breakpoints.XBreakpointType;
import com.intellij.xdebugger.impl.DebuggerSupport;
import com.intellij.xdebugger.settings.DebuggerConfigurableProvider;
import com.intellij.xdebugger.settings.DebuggerSettingsCategory;
@@ -159,7 +160,7 @@ public class DebuggerConfigurable implements SearchableConfigurable.Parent {
@Override
public boolean isVisible() {
- return true;
+ return XBreakpointType.EXTENSION_POINT_NAME.getExtensions().length != 0;
}
@Override
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java
new file mode 100644
index 000000000000..bb747f92eab7
--- /dev/null
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurableProvider.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.xdebugger.impl.settings;
+
+import com.intellij.openapi.options.Configurable;
+import com.intellij.openapi.options.ConfigurableProvider;
+import com.intellij.xdebugger.breakpoints.XBreakpointType;
+import org.jetbrains.annotations.NotNull;
+
+public final class DebuggerConfigurableProvider extends ConfigurableProvider {
+ @NotNull
+ @Override
+ public Configurable createConfigurable() {
+ return new DebuggerConfigurable();
+ }
+
+ @Override
+ public boolean canCreateConfigurable() {
+ return XBreakpointType.EXTENSION_POINT_NAME.getExtensions().length != 0;
+ }
+}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java
index 053f18dd14bf..2bdbb7faa80d 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java
@@ -16,26 +16,22 @@
package com.intellij.xdebugger.impl.ui;
import com.intellij.debugger.ui.DebuggerContentInfo;
-import com.intellij.diagnostic.logging.AdditionalTabComponent;
-import com.intellij.diagnostic.logging.DebuggerLogConsoleManager;
import com.intellij.execution.ExecutionManager;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.executors.DefaultDebugExecutor;
-import com.intellij.execution.process.ProcessHandler;
-import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.RunContentBuilder;
import com.intellij.execution.runners.RunTab;
-import com.intellij.execution.ui.*;
+import com.intellij.execution.ui.ConsoleViewContentType;
+import com.intellij.execution.ui.ExecutionConsole;
+import com.intellij.execution.ui.ObservableConsoleView;
import com.intellij.execution.ui.layout.LayoutAttractionPolicy;
import com.intellij.execution.ui.layout.LayoutViewOptions;
-import com.intellij.icons.AllIcons;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.ide.ui.customization.CustomActionsSchema;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.AppIcon;
@@ -44,20 +40,17 @@ import com.intellij.xdebugger.XDebuggerBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import javax.swing.*;
import java.util.Collection;
/**
* @author nik
*/
-public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerLogConsoleManager {
+public abstract class DebuggerSessionTabBase extends RunTab {
protected ExecutionConsole myConsole;
public DebuggerSessionTabBase(@NotNull Project project, @NotNull String runnerId, @NotNull String sessionName, @NotNull GlobalSearchScope searchScope) {
super(project, searchScope, runnerId, XDebuggerBundle.message("xdebugger.default.content.title"), sessionName);
- Disposer.register(project, this);
-
myUi.getDefaults()
.initTabDefaults(0, XDebuggerBundle.message("xdebugger.debugger.tab.title"), null)
.initFocusContent(DebuggerContentInfo.FRAME_CONTENT, XDebuggerUIConstants.LAYOUT_VIEW_BREAKPOINT_CONDITION)
@@ -68,32 +61,6 @@ public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerL
return (ActionGroup)CustomActionsSchema.getInstance().getCorrectedAction(id);
}
- public abstract RunContentDescriptor getRunContentDescriptor();
-
- @Override
- public ProcessHandler getProcessHandler() {
- return getRunContentDescriptor().getProcessHandler();
- }
-
- @Override
- protected Content createLogContent(AdditionalTabComponent tabComponent, String id, Icon icon) {
- Content result = super.createLogContent(tabComponent, id, icon);
- result.setCloseable(false);
- result.setDescription(tabComponent.getTooltip());
- return result;
- }
-
- @Override
- protected Icon getDefaultIcon() {
- return AllIcons.FileTypes.Text;
- }
-
- @Override
- @NotNull
- public RunnerLayoutUi getUi() {
- return myUi;
- }
-
protected void attachNotificationTo(final Content content) {
if (myConsole instanceof ObservableConsoleView) {
ObservableConsoleView observable = (ObservableConsoleView)myConsole;
@@ -107,12 +74,11 @@ public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerL
}, content);
RunProfile profile = getRunProfile();
if (profile instanceof RunConfigurationBase && !ApplicationManager.getApplication().isUnitTestMode()) {
- final RunConfigurationBase runConfigurationBase = (RunConfigurationBase)profile;
- observable.addChangeListener(new RunContentBuilder.ConsoleToFrontListener(runConfigurationBase,
- getProject(),
+ observable.addChangeListener(new RunContentBuilder.ConsoleToFrontListener((RunConfigurationBase)profile,
+ myProject,
DefaultDebugExecutor.getDebugExecutorInstance(),
myRunContentDescriptor,
- getUi()),
+ myUi),
content);
}
}
@@ -120,21 +86,20 @@ public abstract class DebuggerSessionTabBase extends RunTab implements DebuggerL
@Nullable
protected RunProfile getRunProfile() {
- ExecutionEnvironment environment = getEnvironment();
- return environment != null ? environment.getRunProfile() : null;
+ return myEnvironment != null ? myEnvironment.getRunProfile() : null;
}
public void toFront(boolean focus) {
if (!ApplicationManager.getApplication().isUnitTestMode()) {
- ExecutionManager.getInstance(getProject()).getContentManager().toFrontRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor);
+ ExecutionManager.getInstance(myProject).getContentManager().toFrontRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor);
if (focus) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
boolean focusWnd = Registry.is("debugger.mayBringFrameToFrontOnBreakpoint");
- ProjectUtil.focusProjectWindow(getProject(), focusWnd);
+ ProjectUtil.focusProjectWindow(myProject, focusWnd);
if (!focusWnd) {
- AppIcon.getInstance().requestAttention(getProject(), true);
+ AppIcon.getInstance().requestAttention(myProject, true);
}
}
});
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java
index 1a4505f6d85b..881ed56bad3d 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebugSessionTab.java
@@ -20,8 +20,8 @@ import com.intellij.execution.Executor;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.RunContentBuilder;
-import com.intellij.execution.ui.ExecutionConsole;
import com.intellij.execution.ui.RunContentDescriptor;
+import com.intellij.execution.ui.RunnerLayoutUi;
import com.intellij.execution.ui.actions.CloseAction;
import com.intellij.execution.ui.layout.PlaceInGrid;
import com.intellij.execution.ui.layout.impl.ViewImpl;
@@ -83,6 +83,11 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
return new XDebugSessionTab(session, icon, environment);
}
+ @NotNull
+ public RunnerLayoutUi getUi() {
+ return myUi;
+ }
+
private XDebugSessionTab(@NotNull XDebugSessionImpl session,
@Nullable Icon icon,
@Nullable ExecutionEnvironment environment) {
@@ -95,7 +100,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
myUi.addContent(createWatchesContent(session), 0, PlaceInGrid.right, false);
for (XDebugView view : myViews) {
- Disposer.register(this, view);
+ Disposer.register(myRunContentDescriptor, view);
}
attachToSession(session);
@@ -115,20 +120,19 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
}
}
}
- }, this);
+ }, myRunContentDescriptor);
rebuildViews();
}
private void setSession(@NotNull XDebugSessionImpl session, @Nullable ExecutionEnvironment environment, @Nullable Icon icon) {
- if (environment != null) {
- setEnvironment(environment);
- }
-
+ myEnvironment = environment;
mySession = session;
mySessionData = session.getSessionData();
myConsole = session.getConsoleView();
myRunContentDescriptor = new RunContentDescriptor(myConsole, session.getDebugProcess().getProcessHandler(), myUi.getComponent(), session.getSessionName(), icon);
+ Disposer.register(myRunContentDescriptor, this);
+ Disposer.register(myProject, myRunContentDescriptor);
}
@Nullable
@@ -180,7 +184,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
@NotNull
private Content createFramesContent() {
- XFramesView framesView = new XFramesView(getProject());
+ XFramesView framesView = new XFramesView(myProject);
myViews.add(framesView);
Content framesContent = myUi.createContent(DebuggerContentInfo.FRAME_CONTENT, framesView.getMainPanel(),
XDebuggerBundle.message("debugger.session.tab.frames.title"), AllIcons.Debugger.Frame, null);
@@ -188,12 +192,8 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
return framesContent;
}
- public ExecutionConsole getConsole() {
- return myConsole;
- }
-
public void rebuildViews() {
- AppUIUtil.invokeLaterIfProjectAlive(getProject(), new Runnable() {
+ AppUIUtil.invokeLaterIfProjectAlive(myProject, new Runnable() {
@Override
public void run() {
for (XDebugView view : myViews) {
@@ -209,7 +209,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
private void attachToSession(@NotNull XDebugSessionImpl session) {
for (XDebugView view : myViews) {
- session.addSessionListener(new XDebugViewSessionListener(view, session), this);
+ session.addSessionListener(new XDebugViewSessionListener(view), myRunContentDescriptor);
}
XDebugTabLayouter layouter = session.getDebugProcess().createTabLayouter();
@@ -225,8 +225,7 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
DefaultActionGroup leftToolbar = new DefaultActionGroup();
final Executor debugExecutor = DefaultDebugExecutor.getDebugExecutorInstance();
- ExecutionEnvironment environment = getEnvironment();
- if (environment != null) {
+ if (myEnvironment != null) {
leftToolbar.add(ActionManager.getInstance().getAction(IdeActions.ACTION_RERUN));
List<AnAction> additionalRestartActions = session.getRestartActions();
if (!additionalRestartActions.isEmpty()) {
@@ -247,24 +246,12 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
leftToolbar.add(myUi.getOptions().getLayoutActions());
final AnAction[] commonSettings = myUi.getOptions().getSettingsActionsList();
- final AnAction commonSettingsList = myUi.getOptions().getSettingsActions();
-
- final DefaultActionGroup settings = new DefaultActionGroup("DebuggerSettings", commonSettings.length > 0) {
- @Override
- public void update(AnActionEvent e) {
- e.getPresentation().setText(ActionsBundle.message("group.XDebugger.settings.text"));
- e.getPresentation().setIcon(commonSettingsList.getTemplatePresentation().getIcon());
- }
-
- @Override
- public boolean isDumbAware() {
- return true;
- }
- };
- for (AnAction each : commonSettings) {
- settings.add(each);
- }
+ DefaultActionGroup settings = new DefaultActionGroup(ActionsBundle.message("group.XDebugger.settings.text"), true);
+ settings.getTemplatePresentation().setIcon(myUi.getOptions().getSettingsActions().getTemplatePresentation().getIcon());
if (commonSettings.length > 0) {
+ for (AnAction each : commonSettings) {
+ settings.add(each);
+ }
settings.addSeparator();
}
if (!session.getDebugProcess().isValuesCustomSorted()) {
@@ -276,18 +263,18 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
leftToolbar.addSeparator();
leftToolbar.add(PinToolwindowTabAction.getPinAction());
- leftToolbar.add(new CloseAction(environment != null ? environment.getExecutor() : debugExecutor, myRunContentDescriptor, getProject()));
+ leftToolbar.add(new CloseAction(myEnvironment != null ? myEnvironment.getExecutor() : debugExecutor, myRunContentDescriptor, myProject));
leftToolbar.add(new ContextHelpAction(debugExecutor.getHelpId()));
DefaultActionGroup topToolbar = new DefaultActionGroup();
topToolbar.addAll(getCustomizedActionGroup(XDebuggerActions.TOOL_WINDOW_TOP_TOOLBAR_GROUP));
- session.getDebugProcess().registerAdditionalActions(leftToolbar, topToolbar);
+ session.getDebugProcess().registerAdditionalActions(leftToolbar, topToolbar, settings);
myUi.getOptions().setLeftToolbar(leftToolbar, ActionPlaces.DEBUGGER_TOOLBAR);
myUi.getOptions().setTopToolbar(topToolbar, ActionPlaces.DEBUGGER_TOOLBAR);
- if (environment != null) {
- initLogConsoles(environment.getRunProfile(), myRunContentDescriptor.getProcessHandler(), myConsole);
+ if (myEnvironment != null) {
+ initLogConsoles(myEnvironment.getRunProfile(), myRunContentDescriptor, myConsole);
}
}
@@ -296,7 +283,6 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
mySession = null;
}
- @Override
@Nullable
public RunContentDescriptor getRunContentDescriptor() {
return myRunContentDescriptor;
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java
index 4e164cc7fd15..e135bb1f4629 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialog.java
@@ -17,12 +17,14 @@ package com.intellij.xdebugger.impl.ui.tree;
import org.jetbrains.annotations.Nullable;
+import java.awt.Component;
+
/**
* @author nik
*/
public class ValueMarkerPresentationDialog extends ValueMarkerPresentationDialogBase {
- public ValueMarkerPresentationDialog(@Nullable String defaultText) {
- super(defaultText);
+ public ValueMarkerPresentationDialog(@Nullable Component parent, @Nullable String defaultText) {
+ super(parent, defaultText);
init();
}
}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java
index 8bb4327e36ff..fc7303460cbf 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/ValueMarkerPresentationDialogBase.java
@@ -38,8 +38,8 @@ public abstract class ValueMarkerPresentationDialogBase extends DialogWrapper {
private FixedSizeButton myChooseColorButton;
private JPanel mySamplePanel;
- public ValueMarkerPresentationDialogBase(final @Nullable String defaultText) {
- super(true);
+ public ValueMarkerPresentationDialogBase(@Nullable Component parent, final @Nullable String defaultText) {
+ super(parent, true);
setTitle("Select Object Label");
setModal(true);
myLabelField.getDocument().addDocumentListener(new DocumentAdapter() {
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java
index cf67f7d5fdb5..2e4e168b8d84 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java
@@ -188,9 +188,7 @@ public class WatchesRootNode extends XDebuggerTreeNode {
fireNodeStructureChanged(messageNode);
}
XDebugSession session = XDebugView.getSession(myTree);
- if (session != null) {
- new WatchInplaceEditor(this, session, myWatchesView, messageNode, "watch", node).show();
- }
+ new WatchInplaceEditor(this, session, myWatchesView, messageNode, "watch", node).show();
}
private class MyEvaluationCallback extends XEvaluationCallbackBase {
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java
index a2fb3d51d253..5a7c4bb6d0d8 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueContainerNode.java
@@ -187,14 +187,14 @@ public abstract class XValueContainerNode<ValueContainer extends XValueContainer
myTemporaryMessageChildren != null ? myTemporaryMessageChildren : Collections.<MessageTreeNode>emptyList());
final int[] indices = getNodesIndices(allMessageChildren);
final TreeNode[] nodes = getChildNodes(indices);
- myMessageChildren = null;
- myTemporaryMessageChildren = null;
fireNodesRemoved(indices, nodes);
if (!temporary) {
myMessageChildren = messages;
+ myTemporaryMessageChildren = null;
}
else {
myTemporaryMessageChildren = messages;
+ myMessageChildren = null;
}
myCachedAllChildren = null;
fireNodesInserted(messages);
diff --git a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerTestUtil.java b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerTestUtil.java
index e47002649d5a..e11ac871e3b4 100644
--- a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerTestUtil.java
+++ b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XDebuggerTestUtil.java
@@ -35,8 +35,8 @@ import com.intellij.xdebugger.frame.*;
import com.intellij.xdebugger.frame.XNamedValue;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
import com.intellij.xdebugger.impl.breakpoints.XBreakpointUtil;
+import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointImpl;
-import junit.framework.Assert;
import org.intellij.lang.annotations.Language;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -50,6 +50,8 @@ import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
+import static org.junit.Assert.*;
+
public class XDebuggerTestUtil {
private static final int TIMEOUT = 25000;
@@ -65,10 +67,9 @@ public class XDebuggerTestUtil {
XLineBreakpointType type = (XLineBreakpointType)XDebuggerUtil.getInstance().findBreakpointType(breakpointType);
XBreakpointManager manager = XDebuggerManager.getInstance(project).getBreakpointManager();
XLineBreakpointImpl breakpoint = (XLineBreakpointImpl)manager.findBreakpointAtLine(type, file, line);
- Assert.assertNotNull(breakpoint);
- Assert
- .assertEquals(validity ? AllIcons.Debugger.Db_verified_breakpoint : AllIcons.Debugger.Db_invalid_breakpoint, breakpoint.getIcon());
- Assert.assertEquals(errorMessage, breakpoint.getErrorMessage());
+ assertNotNull(breakpoint);
+ assertEquals(validity ? AllIcons.Debugger.Db_verified_breakpoint : AllIcons.Debugger.Db_invalid_breakpoint, breakpoint.getIcon());
+ assertEquals(errorMessage, breakpoint.getErrorMessage());
}
public static void toggleBreakpoint(Project project, VirtualFile file, int line) {
@@ -79,7 +80,7 @@ public class XDebuggerTestUtil {
final P properties,
final Class<? extends XBreakpointType<XBreakpoint<P>, P>> typeClass) {
return new WriteAction<XBreakpoint<P>>() {
- protected void run(final Result<XBreakpoint<P>> result) {
+ protected void run(@NotNull final Result<XBreakpoint<P>> result) {
result.setResult(XDebuggerManager.getInstance(project).getBreakpointManager().addBreakpoint(
XBreakpointType.EXTENSION_POINT_NAME.findExtension(typeClass), properties));
}
@@ -88,16 +89,16 @@ public class XDebuggerTestUtil {
public static void removeBreakpoint(final Project project, final XBreakpoint<?> breakpoint) {
new WriteAction() {
- protected void run(final Result result) {
+ protected void run(@NotNull final Result result) {
XDebuggerManager.getInstance(project).getBreakpointManager().removeBreakpoint(breakpoint);
}
}.execute();
}
public static void assertPosition(XSourcePosition pos, VirtualFile file, int line) throws IOException {
- Assert.assertNotNull("No current position", pos);
- Assert.assertEquals(new File(file.getPath()).getCanonicalPath(), new File(pos.getFile().getPath()).getCanonicalPath());
- if (line != -1) Assert.assertEquals(line, pos.getLine());
+ assertNotNull("No current position", pos);
+ assertEquals(new File(file.getPath()).getCanonicalPath(), new File(pos.getFile().getPath()).getCanonicalPath());
+ if (line != -1) assertEquals(line, pos.getLine());
}
public static void assertCurrentPosition(XDebugSession session, VirtualFile file, int line) throws IOException {
@@ -127,12 +128,23 @@ public class XDebuggerTestUtil {
return container.waitFor(timeout).first;
}
- public static Pair<XValue, String> evaluate(XDebugSession session, String expression) throws InterruptedException {
+ public static Pair<XValue, String> evaluate(XDebugSession session, XExpression expression) {
return evaluate(session, expression, TIMEOUT);
}
- public static Pair<XValue, String> evaluate(XDebugSession session, String expression, long timeout) throws InterruptedException {
- XDebuggerEvaluator evaluator = session.getCurrentStackFrame().getEvaluator();
+ public static Pair<XValue, String> evaluate(XDebugSession session, String expression) {
+ return evaluate(session, XExpressionImpl.fromText(expression), TIMEOUT);
+ }
+
+ public static Pair<XValue, String> evaluate(XDebugSession session, String expression, long timeout) {
+ return evaluate(session, XExpressionImpl.fromText(expression), timeout);
+ }
+
+ private static Pair<XValue, String> evaluate(XDebugSession session, XExpression expression, long timeout) {
+ XStackFrame frame = session.getCurrentStackFrame();
+ assertNotNull(frame);
+ XDebuggerEvaluator evaluator = frame.getEvaluator();
+ assertNotNull(evaluator);
XTestEvaluationCallback callback = new XTestEvaluationCallback();
evaluator.evaluate(expression, callback, session.getCurrentPosition());
return callback.waitFor(timeout);
@@ -189,10 +201,10 @@ public class XDebuggerTestUtil {
@Nullable Boolean hasChildren) throws InterruptedException {
XTestValueNode node = computePresentation(var);
- if (name != null) Assert.assertEquals(name, node.myName);
- if (type != null) Assert.assertEquals(type, node.myType);
- if (value != null) Assert.assertEquals(value, node.myValue);
- if (hasChildren != null) Assert.assertEquals((boolean)hasChildren, node.myHasChildren);
+ if (name != null) assertEquals(name, node.myName);
+ if (type != null) assertEquals(type, node.myType);
+ if (value != null) assertEquals(value, node.myValue);
+ if (hasChildren != null) assertEquals(hasChildren, node.myHasChildren);
}
public static void assertVariableValue(XValue var, @Nullable String name, @Nullable String value) throws InterruptedException {
@@ -221,10 +233,10 @@ public class XDebuggerTestUtil {
@Nullable String type,
@Nullable @Language("RegExp") String valuePattern) throws InterruptedException {
XTestValueNode node = computePresentation(var);
- if (name != null) Assert.assertEquals(name, node.myName);
- if (type != null) Assert.assertEquals(type, node.myType);
+ if (name != null) assertEquals(name, node.myName);
+ if (type != null) assertEquals(type, node.myType);
if (valuePattern != null) {
- Assert.assertTrue("Expected value" + valuePattern + " Actual value: " + node.myValue, node.myValue.matches(valuePattern));
+ assertTrue("Expected value" + valuePattern + " Actual value: " + node.myValue, node.myValue.matches(valuePattern));
}
}
@@ -239,10 +251,10 @@ public class XDebuggerTestUtil {
@Nullable @Language("RegExp") String typePattern) throws InterruptedException {
XTestValueNode node = computePresentation(var);
if (name != null) {
- Assert.assertEquals(name, node.myName);
+ assertEquals(name, node.myName);
}
if (typePattern != null) {
- Assert.assertTrue("Expected type: " + typePattern + " Actual type: " + node.myType, node.myType.matches(typePattern));
+ assertTrue("Expected type: " + typePattern + " Actual type: " + node.myType, node.myType.matches(typePattern));
}
}
@@ -273,7 +285,7 @@ public class XDebuggerTestUtil {
}
});
- Assert.assertEquals(value, result[0]);
+ assertEquals(value, result[0]);
}
public static void assertVariableFullValue(Collection<XValue> vars, @Nullable String name, @Nullable String value)
@@ -303,9 +315,9 @@ public class XDebuggerTestUtil {
}
expectedNames.removeAll(actualNames);
- UsefulTestCase.assertTrue("Missing variables:" + StringUtil.join(expectedNames, ", ")
- + "\nAll Variables: " + StringUtil.join(actualNames, ", "),
- expectedNames.isEmpty()
+ assertTrue("Missing variables:" + StringUtil.join(expectedNames, ", ")
+ + "\nAll Variables: " + StringUtil.join(actualNames, ", "),
+ expectedNames.isEmpty()
);
}
@@ -317,13 +329,23 @@ public class XDebuggerTestUtil {
value.computeSourcePosition(n);
}
});
- Assert.assertNotNull(n.myPosition);
- Assert.assertEquals(file, n.myPosition.getFile());
- Assert.assertEquals(offset, n.myPosition.getOffset());
+ assertNotNull(n.myPosition);
+ assertEquals(file, n.myPosition.getFile());
+ assertEquals(offset, n.myPosition.getOffset());
}
- public static boolean waitFor(Semaphore semaphore, long timeoutInMillis) throws InterruptedException {
- return semaphore.tryAcquire(timeoutInMillis, TimeUnit.MILLISECONDS);
+ public static boolean waitFor(Semaphore semaphore, long timeoutInMillis) {
+ long end = System.currentTimeMillis() + timeoutInMillis;
+ long remaining = timeoutInMillis;
+ do {
+ try {
+ return semaphore.tryAcquire(remaining, TimeUnit.MILLISECONDS);
+ }
+ catch (InterruptedException ignored) {
+ remaining = end - System.currentTimeMillis();
+ }
+ } while (remaining > 0);
+ return false;
}
public static void assertVariable(Collection<XValue> vars,
@@ -337,7 +359,7 @@ public class XDebuggerTestUtil {
@NotNull
public static String getConsoleText(final @NotNull ConsoleViewImpl consoleView) {
new WriteAction() {
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
consoleView.flushDeferredText();
}
}.execute();
@@ -356,7 +378,7 @@ public class XDebuggerTestUtil {
final T breakpointType = exceptionType.cast(type);
new WriteAction() {
@Override
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
breakpoint.set(breakpointManager.addBreakpoint(breakpointType, properties));
}
}.execute();
@@ -372,7 +394,7 @@ public class XDebuggerTestUtil {
for (final XBreakpoint b : breakpoints) {
new WriteAction() {
@Override
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
breakpointManager.removeBreakpoint(b);
}
}.execute();
@@ -406,7 +428,7 @@ public class XDebuggerTestUtil {
if (lineBreakpoint.getLine() == line) {
new WriteAction() {
@Override
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
lineBreakpoint.setCondition(condition);
}
}.execute();
@@ -424,7 +446,7 @@ public class XDebuggerTestUtil {
if (lineBreakpoint.getLine() == line) {
new WriteAction() {
@Override
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
lineBreakpoint.setLogExpression(logExpression);
lineBreakpoint.setLogMessage(true);
}
@@ -436,7 +458,7 @@ public class XDebuggerTestUtil {
public static void disposeDebugSession(final XDebugSession debugSession) {
new WriteAction() {
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
XDebugSessionImpl session = (XDebugSessionImpl)debugSession;
Disposer.dispose(session.getSessionTab());
Disposer.dispose(session.getConsoleView());
@@ -449,13 +471,13 @@ public class XDebuggerTestUtil {
@Nullable String type,
@Nullable String value,
@Nullable Boolean hasChildren) throws InterruptedException {
- Assert.assertNull(varAndErrorMessage.second);
+ assertNull(varAndErrorMessage.second);
assertVariable(varAndErrorMessage.first, name, type, value, hasChildren);
}
public static String assertVariableExpression(XValue desc, String expectedExpression) {
String expression = desc.getEvaluationExpression();
- Assert.assertEquals(expectedExpression, expression);
+ assertEquals(expectedExpression, expression);
return expression;
}
diff --git a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestContainer.java b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestContainer.java
index 32c65d8eb6fc..84c1fe8693e8 100644
--- a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestContainer.java
+++ b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestContainer.java
@@ -56,7 +56,7 @@ public class XTestContainer<T> {
return false;
}
- public Pair<List<T>, String> waitFor(long timeout) throws InterruptedException {
+ public Pair<List<T>, String> waitFor(long timeout) {
if (!XDebuggerTestUtil.waitFor(myFinished, timeout)) {
throw new AssertionError("Waiting timed out");
}
diff --git a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestEvaluationCallback.java b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestEvaluationCallback.java
index cb1b18e3795a..918648840790 100644
--- a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestEvaluationCallback.java
+++ b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestEvaluationCallback.java
@@ -2,11 +2,12 @@ package com.intellij.xdebugger;
import com.intellij.openapi.util.Pair;
import com.intellij.xdebugger.frame.XValue;
-import junit.framework.Assert;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.Semaphore;
+import static org.junit.Assert.*;
+
public class XTestEvaluationCallback extends com.intellij.xdebugger.impl.ui.tree.nodes.XEvaluationCallbackBase {
private XValue myResult;
private String myErrorMessage;
@@ -24,8 +25,8 @@ public class XTestEvaluationCallback extends com.intellij.xdebugger.impl.ui.tree
myFinished.release();
}
- public Pair<XValue, String> waitFor(long timeoutInMilliseconds) throws InterruptedException {
- Assert.assertTrue("timed out", XDebuggerTestUtil.waitFor(myFinished, timeoutInMilliseconds));
+ public Pair<XValue, String> waitFor(long timeoutInMilliseconds) {
+ assertTrue("timed out", XDebuggerTestUtil.waitFor(myFinished, timeoutInMilliseconds));
return Pair.create(myResult, myErrorMessage);
}
}
diff --git a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestValueNode.java b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestValueNode.java
index e1dbca415903..45ad3306831a 100644
--- a/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestValueNode.java
+++ b/platform/xdebugger-impl/testSrc/com/intellij/xdebugger/XTestValueNode.java
@@ -41,7 +41,7 @@ public class XTestValueNode extends XValueNodePresentationConfigurator.Configura
return false;
}
- public void waitFor(long timeoutInMillis) throws InterruptedException {
+ public void waitFor(long timeoutInMillis) {
if (!XDebuggerTestUtil.waitFor(myFinished, timeoutInMillis)) {
throw new AssertionError("Waiting timed out");
}