diff options
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl')
25 files changed, 354 insertions, 243 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); |