diff --git a/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugSession.java b/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugSession.java index 33fa877064db..fc1c1a327c7a 100644 --- a/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugSession.java +++ b/platform/xdebugger-api/src/com/intellij/xdebugger/XDebugSession.java @@ -80,13 +80,12 @@ public interface XDebugSession extends AbstractDebuggerSession { void showExecutionPoint(); - void setCurrentStackFrame(@NotNull XExecutionStack executionStack, @NotNull XStackFrame frame); + void setCurrentStackFrame(@NotNull XExecutionStack executionStack, @NotNull XStackFrame frame, boolean isTopFrame); /** - * @deprecated use {@link #setCurrentStackFrame(com.intellij.xdebugger.frame.XExecutionStack, com.intellij.xdebugger.frame.XStackFrame)} instead + * @deprecated use {@link #setCurrentStackFrame(com.intellij.xdebugger.frame.XExecutionStack, com.intellij.xdebugger.frame.XStackFrame, boolean)} instead */ - @SuppressWarnings("UnusedDeclaration") - void setCurrentStackFrame(@NotNull XStackFrame frame); + void setCurrentStackFrame(@NotNull XExecutionStack executionStack, @NotNull XStackFrame frame); /** * Call this method to setup custom icon and/or error message (it will be shown in tooltip) for breakpoint 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 08538a2de6e7..72ea1698e671 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java @@ -97,6 +97,7 @@ public class XDebugSessionImpl implements XDebugSession { private XSuspendContext mySuspendContext; private XExecutionStack myCurrentExecutionStack; private XStackFrame myCurrentStackFrame; + private boolean myIsTopFrame; private XSourcePosition myCurrentPosition; private final AtomicBoolean myPaused = new AtomicBoolean(); private MyDependentBreakpointListener myDependentBreakpointListener; @@ -560,7 +561,7 @@ public class XDebugSessionImpl implements XDebugSession { } private boolean isTopFrameSelected() { - return myCurrentExecutionStack != null && myCurrentExecutionStack.getTopFrame() == myCurrentStackFrame; + return myCurrentExecutionStack != null && myIsTopFrame; } @@ -571,7 +572,7 @@ public class XDebugSessionImpl implements XDebugSession { if (executionStack != null) { XStackFrame topFrame = executionStack.getTopFrame(); if (topFrame != null) { - setCurrentStackFrame(executionStack, topFrame); + setCurrentStackFrame(executionStack, topFrame, true); myDebuggerManager.showExecutionPosition(); } } @@ -579,17 +580,18 @@ public class XDebugSessionImpl implements XDebugSession { } @Override - public void setCurrentStackFrame(@NotNull final XStackFrame frame) { - setCurrentStackFrame(myCurrentExecutionStack, frame); + public void setCurrentStackFrame(@NotNull XExecutionStack executionStack, @NotNull XStackFrame frame) { + setCurrentStackFrame(myCurrentExecutionStack, frame, frame == executionStack.getTopFrame()); } @Override - public void setCurrentStackFrame(@NotNull XExecutionStack executionStack, @NotNull XStackFrame frame) { + public void setCurrentStackFrame(@NotNull XExecutionStack executionStack, @NotNull XStackFrame frame, boolean isTopFrame) { if (mySuspendContext == null) return; boolean frameChanged = myCurrentStackFrame != frame; myCurrentExecutionStack = executionStack; myCurrentStackFrame = frame; + myIsTopFrame = isTopFrame; activateSession(); if (frameChanged) { 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 b98440b5d69f..7ee10401c9a7 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 @@ -188,10 +188,10 @@ public class XFramesView extends XDebugView { return toolbar; } - private StackFramesListBuilder getOrCreateBuilder(XExecutionStack executionStack) { + private StackFramesListBuilder getOrCreateBuilder(XExecutionStack executionStack, XDebugSession session) { StackFramesListBuilder builder = myBuilders.get(executionStack); if (builder == null) { - builder = new StackFramesListBuilder(executionStack); + builder = new StackFramesListBuilder(executionStack, session); myBuilders.put(executionStack, builder); } return builder; @@ -244,7 +244,6 @@ public class XFramesView extends XDebugView { } myToolbar.setAddSeparatorFirst(!invisible); updateFrames(activeExecutionStack, session); - myListenersEnabled = true; } @Override @@ -270,19 +269,14 @@ public class XFramesView extends XDebugView { return; } if (mySelectedStack != null) { - getOrCreateBuilder(mySelectedStack).stop(); + getOrCreateBuilder(mySelectedStack, session).stop(); } mySelectedStack = executionStack; if (executionStack != null) { - StackFramesListBuilder builder = getOrCreateBuilder(executionStack); + StackFramesListBuilder builder = getOrCreateBuilder(executionStack, session); builder.initModel(myFramesList.getModel()); builder.start(); - XStackFrame topFrame = executionStack.getTopFrame(); - if (topFrame != null) { - myFramesList.setSelectedValue(topFrame, true); - session.setCurrentStackFrame(executionStack, topFrame); - } } } @@ -303,7 +297,7 @@ public class XFramesView extends XDebugView { if (selected instanceof XStackFrame) { XDebugSession session = getSession(e); if (session != null) { - session.setCurrentStackFrame(mySelectedStack, (XStackFrame)selected); + session.setCurrentStackFrame(mySelectedStack, (XStackFrame)selected, myFramesList.getSelectedIndex() == 0); } } } @@ -312,21 +306,15 @@ public class XFramesView extends XDebugView { private XExecutionStack myExecutionStack; private final List myStackFrames; private String myErrorMessage; - private int myNextFrameIndex; + private int myNextFrameIndex = 0; private boolean myRunning; private boolean myAllFramesLoaded; + private final XDebugSession mySession; - private StackFramesListBuilder(final XExecutionStack executionStack) { + private StackFramesListBuilder(final XExecutionStack executionStack, XDebugSession session) { myExecutionStack = executionStack; + mySession = session; myStackFrames = new ArrayList(); - XStackFrame topFrame = executionStack.getTopFrame(); - if (topFrame != null) { - myStackFrames.add(topFrame); - myNextFrameIndex = 1; - } - else { - myNextFrameIndex = 0; - } } @Override @@ -336,6 +324,9 @@ public class XFramesView extends XDebugView { public void run() { myStackFrames.addAll(stackFrames); addFrameListElements(stackFrames, last); + if (myNextFrameIndex == 0) { + selectTopFrame(); + } myNextFrameIndex += stackFrames.size(); myAllFramesLoaded = last; if (last) { @@ -399,6 +390,15 @@ public class XFramesView extends XDebugView { myRunning = false; } + private void selectTopFrame() { + if (!myStackFrames.isEmpty()) { + XStackFrame topFrame = myStackFrames.get(0); + myFramesList.setSelectedValue(topFrame, true); + mySession.setCurrentStackFrame(mySelectedStack, topFrame, true); + myListenersEnabled = true; + } + } + @SuppressWarnings("unchecked") public void initModel(final DefaultListModel model) { model.removeAllElements(); @@ -411,6 +411,7 @@ public class XFramesView extends XDebugView { else if (!myAllFramesLoaded) { model.addElement(null); } + selectTopFrame(); } } }