summaryrefslogtreecommitdiff
path: root/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java')
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java45
1 files changed, 25 insertions, 20 deletions
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();
}
}
}