summaryrefslogtreecommitdiff
path: root/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame
diff options
context:
space:
mode:
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame')
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java8
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugView.java58
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebugViewSessionListener.java10
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XDebuggerFramesList.java3
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XFramesView.java128
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XStandaloneVariablesView.java8
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java50
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesViewBase.java11
-rw-r--r--platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XWatchesViewImpl.java58
9 files changed, 229 insertions, 105 deletions
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java
index 41dd52bcc3b9..18ef7cecd450 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/DebuggerFramesList.java
@@ -39,6 +39,7 @@ public abstract class DebuggerFramesList extends JBList implements OccurenceNavi
getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setCellRenderer(createListRenderer());
getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+ @Override
public void valueChanged(final ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
onFrameChanged(getSelectedValue());
@@ -49,6 +50,7 @@ public abstract class DebuggerFramesList extends JBList implements OccurenceNavi
getEmptyText().setText(XDebuggerBundle.message("debugger.frames.not.available"));
}
+ @Override
public DefaultListModel getModel() {
return (DefaultListModel)super.getModel();
}
@@ -61,19 +63,23 @@ public abstract class DebuggerFramesList extends JBList implements OccurenceNavi
return getModel().getSize();
}
+ @Override
public String getNextOccurenceActionName() {
return XDebuggerBundle.message("action.next.frame.text");
}
+ @Override
public String getPreviousOccurenceActionName() {
return XDebuggerBundle.message("action.previous.frame.text");
}
+ @Override
public OccurenceInfo goNextOccurence() {
setSelectedIndex(getSelectedIndex() + 1);
return createInfo();
}
+ @Override
public OccurenceInfo goPreviousOccurence() {
setSelectedIndex(getSelectedIndex() - 1);
return createInfo();
@@ -83,10 +89,12 @@ public abstract class DebuggerFramesList extends JBList implements OccurenceNavi
return OccurenceInfo.position(getSelectedIndex(), getElementCount());
}
+ @Override
public boolean hasNextOccurence() {
return getSelectedIndex() < getElementCount() - 1;
}
+ @Override
public boolean hasPreviousOccurence() {
return getSelectedIndex() > 0;
}
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 85ff7b2c2357..0007ec2f9997 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
@@ -15,14 +15,66 @@
*/
package com.intellij.xdebugger.impl.frame;
+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.ui.content.ContentManager;
+import com.intellij.util.SingleAlarm;
+import com.intellij.xdebugger.XDebugSession;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.*;
+import java.util.EventObject;
/**
* @author nik
*/
-public interface XDebugView extends Disposable {
- enum SessionEvent {PAUSED, BEFORE_RESUME, RESUMED, STOPPED, FRAME_CHANGED, SETTINGS_CHANGED}
+public abstract class XDebugView implements Disposable {
+ public enum SessionEvent {PAUSED, BEFORE_RESUME, RESUMED, STOPPED, FRAME_CHANGED, SETTINGS_CHANGED}
+
+ private final SingleAlarm myClearAlarm;
+ private static final int VIEW_CLEAR_DELAY = 100; //ms
+
+ public XDebugView() {
+ myClearAlarm = new SingleAlarm(new Runnable() {
+ @Override
+ public void run() {
+ clear();
+ }
+ }, VIEW_CLEAR_DELAY, this);
+ }
+
+ protected final void requestClear() {
+ myClearAlarm.cancelAndRequest();
+ }
+
+ protected final void cancelClear() {
+ myClearAlarm.cancel();
+ }
+
+ protected abstract void clear();
+
+ public abstract void processSessionEvent(@NotNull SessionEvent event);
+
+ @Nullable
+ protected static XDebugSession getSession(@NotNull EventObject e) {
+ Component component = e.getSource() instanceof Component ? (Component)e.getSource() : null;
+ return component == null ? null : getSession(component);
+ }
- void processSessionEvent(@NotNull SessionEvent event);
+ @Nullable
+ public static XDebugSession getSession(@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;
+ }
+ }
+ return XDebugSession.DATA_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 d265005d3a34..d790113b1816 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
@@ -15,8 +15,8 @@
*/
package com.intellij.xdebugger.impl.frame;
-import com.intellij.openapi.project.Project;
import com.intellij.ui.AppUIUtil;
+import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XDebugSessionAdapter;
import org.jetbrains.annotations.NotNull;
@@ -25,15 +25,15 @@ import org.jetbrains.annotations.NotNull;
*/
public class XDebugViewSessionListener extends XDebugSessionAdapter {
private final XDebugView myDebugView;
- private final Project myProject;
+ private final XDebugSession session;
- public XDebugViewSessionListener(@NotNull XDebugView debugView, @NotNull Project project) {
+ public XDebugViewSessionListener(@NotNull XDebugView debugView, @NotNull XDebugSession session) {
myDebugView = debugView;
- myProject = project;
+ this.session = session;
}
private void onSessionEvent(final @NotNull XDebugView.SessionEvent event) {
- AppUIUtil.invokeLaterIfProjectAlive(myProject, new Runnable() {
+ AppUIUtil.invokeLaterIfProjectAlive(session.getProject(), 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 f4b6c2caee8e..9b39ad63deb8 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
@@ -27,6 +27,7 @@ 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.NotNull;
import javax.swing.*;
import java.awt.*;
@@ -84,7 +85,7 @@ public class XDebuggerFramesList extends DebuggerFramesList {
private XStackFrame mySelectedFrame;
- public XDebuggerFramesList(Project project) {
+ public XDebuggerFramesList(@NotNull Project project) {
super(project);
doInit();
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 b7c5f4bf9746..b98440b5d69f 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
@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.ActionPlaces;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl;
import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
@@ -29,6 +30,7 @@ import com.intellij.ui.border.CustomLineBorder;
import com.intellij.ui.components.panels.Wrapper;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
+import com.intellij.util.containers.TransferToEDTQueue;
import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.frame.XExecutionStack;
import com.intellij.xdebugger.frame.XStackFrame;
@@ -53,46 +55,47 @@ import java.util.List;
/**
* @author nik
*/
-public class XFramesView implements XDebugView {
+public class XFramesView extends XDebugView {
private final JPanel myMainPanel;
private final XDebuggerFramesList myFramesList;
private final ComboBox myThreadComboBox;
private final Set<XExecutionStack> myExecutionStacks = ContainerUtil.newHashSet();
- @NotNull private final XDebugSession mySession;
private XExecutionStack mySelectedStack;
private boolean myListenersEnabled;
private final Map<XExecutionStack, StackFramesListBuilder> myBuilders = new HashMap<XExecutionStack, StackFramesListBuilder>();
private final ActionToolbarImpl myToolbar;
private final Wrapper myThreadsPanel;
private boolean myThreadsCalculated = false;
+ private final TransferToEDTQueue<Runnable> myLaterInvocator = TransferToEDTQueue.createRunnableMerger("XFramesView later invocator", 50);
- public XFramesView(@NotNull final XDebugSession session) {
- mySession = session;
-
+ public XFramesView(@NotNull Project project) {
myMainPanel = new JPanel(new BorderLayout());
- myFramesList = new XDebuggerFramesList(session.getProject());
+ myFramesList = new XDebuggerFramesList(project);
myFramesList.addListSelectionListener(new ListSelectionListener() {
@Override
- public void valueChanged(final ListSelectionEvent e) {
- if (e.getValueIsAdjusting()) return;
- processFrameSelection();
+ public void valueChanged(ListSelectionEvent e) {
+ if (myListenersEnabled && !e.getValueIsAdjusting()) {
+ processFrameSelection(e);
+ }
}
});
myFramesList.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent e) {
- int i = myFramesList.locationToIndex(e.getPoint());
- if (i != -1 && myFramesList.isSelectedIndex(i)) {
- processFrameSelection();
+ if (myListenersEnabled) {
+ int i = myFramesList.locationToIndex(e.getPoint());
+ if (i != -1 && myFramesList.isSelectedIndex(i)) {
+ processFrameSelection(e);
+ }
}
}
});
- final ActionManager actionManager = ActionManager.getInstance();
myFramesList.addMouseListener(new PopupHandler() {
@Override
public void invokePopup(final Component comp, final int x, final int y) {
+ ActionManager actionManager = ActionManager.getInstance();
ActionGroup group = (ActionGroup)actionManager.getAction(XDebuggerActions.FRAMES_TREE_POPUP_GROUP);
actionManager.createActionPopupMenu(ActionPlaces.UNKNOWN, group).getComponent().show(comp, x, y);
}
@@ -103,13 +106,32 @@ public class XFramesView implements XDebugView {
myThreadComboBox = new ComboBox();
//noinspection unchecked
myThreadComboBox.setRenderer(new ThreadComboBoxRenderer(myThreadComboBox));
- myThreadComboBox.addItemListener(new MyItemListener());
+ myThreadComboBox.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(final ItemEvent e) {
+ if (!myListenersEnabled) {
+ return;
+ }
+
+ if (e.getStateChange() == ItemEvent.SELECTED) {
+ Object item = e.getItem();
+ if (item instanceof XExecutionStack) {
+ XDebugSession session = getSession(e);
+ if (session != null) {
+ updateFrames((XExecutionStack)item, session);
+ }
+ }
+ }
+ }
+ });
myThreadComboBox.addPopupMenuListener(new PopupMenuListenerAdapter() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
- XSuspendContext context = mySession.getSuspendContext();
+ XDebugSession session = getSession(e);
+ XSuspendContext context = session == null ? null : session.getSuspendContext();
if (context != null && !myThreadsCalculated) {
myThreadsCalculated = true;
+ //noinspection unchecked
myThreadComboBox.addItem(null); // rendered as "Loading..."
context.computeExecutionStacks(new XSuspendContext.XExecutionStackContainer() {
@Override
@@ -130,7 +152,6 @@ public class XFramesView implements XDebugView {
@Override
public void errorOccurred(@NotNull String errorMessage) {
-
}
});
}
@@ -145,12 +166,9 @@ public class XFramesView implements XDebugView {
myToolbar = createToolbar();
myThreadsPanel = new Wrapper();
- CustomLineBorder border = new CustomLineBorder(CaptionPanel.CNT_ACTIVE_BORDER_COLOR, 0, 0, 1, 0);
- myThreadsPanel.setBorder(border);
+ myThreadsPanel.setBorder(new CustomLineBorder(CaptionPanel.CNT_ACTIVE_BORDER_COLOR, 0, 0, 1, 0));
myThreadsPanel.add(myToolbar.getComponent(), BorderLayout.EAST);
myMainPanel.add(myThreadsPanel, BorderLayout.NORTH);
-
- processSessionEvent(SessionEvent.RESUMED);
}
private ActionToolbarImpl createToolbar() {
@@ -181,9 +199,14 @@ public class XFramesView implements XDebugView {
@Override
public void processSessionEvent(@NotNull final SessionEvent event) {
- if (event == SessionEvent.BEFORE_RESUME) return;
+ if (event == SessionEvent.BEFORE_RESUME) {
+ return;
+ }
+
+ XDebugSession session = getSession(getMainPanel());
+
if (event == SessionEvent.FRAME_CHANGED) {
- XStackFrame currentStackFrame = mySession.getCurrentStackFrame();
+ XStackFrame currentStackFrame = session == null ? null : session.getCurrentStackFrame();
if (currentStackFrame != null) {
myFramesList.setSelectedValue(currentStackFrame, true);
}
@@ -196,15 +219,16 @@ public class XFramesView implements XDebugView {
}
myBuilders.clear();
mySelectedStack = null;
- XSuspendContext suspendContext = mySession.getSuspendContext();
- if (suspendContext == null || event == SessionEvent.PAUSED) {
- myThreadComboBox.removeAllItems();
- myFramesList.clear();
- myThreadsCalculated = false;
- myExecutionStacks.clear();
- if (suspendContext == null) {
- return;
- }
+ XSuspendContext suspendContext = session == null ? null : session.getSuspendContext();
+ if (suspendContext == null) {
+ requestClear();
+ return;
+ }
+
+ if (event == SessionEvent.PAUSED) {
+ // clear immediately
+ cancelClear();
+ clear();
}
XExecutionStack[] executionStacks = suspendContext.getExecutionStacks();
@@ -219,10 +243,18 @@ public class XFramesView implements XDebugView {
myThreadsPanel.add(myThreadComboBox, BorderLayout.CENTER);
}
myToolbar.setAddSeparatorFirst(!invisible);
- updateFrames(activeExecutionStack);
+ updateFrames(activeExecutionStack, session);
myListenersEnabled = true;
}
+ @Override
+ protected void clear() {
+ myThreadComboBox.removeAllItems();
+ myFramesList.clear();
+ myThreadsCalculated = false;
+ myExecutionStacks.clear();
+ }
+
private void addExecutionStacks(List<? extends XExecutionStack> executionStacks) {
for (XExecutionStack executionStack : executionStacks) {
if (!myExecutionStacks.contains(executionStack)) {
@@ -233,7 +265,7 @@ public class XFramesView implements XDebugView {
}
}
- private void updateFrames(final XExecutionStack executionStack) {
+ private void updateFrames(final XExecutionStack executionStack, @NotNull XDebugSession session) {
if (mySelectedStack == executionStack) {
return;
}
@@ -249,7 +281,7 @@ public class XFramesView implements XDebugView {
XStackFrame topFrame = executionStack.getTopFrame();
if (topFrame != null) {
myFramesList.setSelectedValue(topFrame, true);
- onFrameSelected(executionStack, topFrame);
+ session.setCurrentStackFrame(executionStack, topFrame);
}
}
}
@@ -262,32 +294,16 @@ public class XFramesView implements XDebugView {
return myFramesList;
}
- private void onFrameSelected(XExecutionStack executionStack, final @NotNull XStackFrame stackFrame) {
- mySession.setCurrentStackFrame(executionStack, stackFrame);
- }
-
public JPanel getMainPanel() {
return myMainPanel;
}
- private void processFrameSelection() {
- if (!myListenersEnabled) return;
+ private void processFrameSelection(@NotNull EventObject e) {
Object selected = myFramesList.getSelectedValue();
if (selected instanceof XStackFrame) {
- onFrameSelected(mySelectedStack, (XStackFrame)selected);
- }
- }
-
- private class MyItemListener implements ItemListener {
- @Override
- public void itemStateChanged(final ItemEvent e) {
- if (!myListenersEnabled) return;
-
- if (e.getStateChange() == ItemEvent.SELECTED) {
- Object item = e.getItem();
- if (item instanceof XExecutionStack) {
- updateFrames((XExecutionStack)item);
- }
+ XDebugSession session = getSession(e);
+ if (session != null) {
+ session.setCurrentStackFrame(mySelectedStack, (XStackFrame)selected);
}
}
}
@@ -315,7 +331,7 @@ public class XFramesView implements XDebugView {
@Override
public void addStackFrames(@NotNull final List<? extends XStackFrame> stackFrames, final boolean last) {
- ApplicationManager.getApplication().invokeLater(new Runnable() {
+ myLaterInvocator.offer(new Runnable() {
@Override
public void run() {
myStackFrames.addAll(stackFrames);
@@ -331,7 +347,7 @@ public class XFramesView implements XDebugView {
@Override
public void errorOccurred(@NotNull final String errorMessage) {
- ApplicationManager.getApplication().invokeLater(new Runnable() {
+ myLaterInvocator.offer(new Runnable() {
@Override
public void run() {
if (myErrorMessage == null) {
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XStandaloneVariablesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XStandaloneVariablesView.java
index f7f32ba86b9c..f91146426878 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XStandaloneVariablesView.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XStandaloneVariablesView.java
@@ -42,4 +42,12 @@ public class XStandaloneVariablesView extends XVariablesViewBase {
}
});
}
+
+ @Override
+ public void processSessionEvent(@NotNull SessionEvent event) {
+ }
+
+ @Override
+ protected void clear() {
+ }
}
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java
index 31b30a8362e3..df43b1147419 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.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,30 +15,37 @@
*/
package com.intellij.xdebugger.impl.frame;
+import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.xdebugger.XDebugProcess;
import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.frame.XStackFrame;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree;
import com.intellij.xdebugger.impl.ui.tree.nodes.XDebuggerTreeNode;
+import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import org.jetbrains.annotations.NotNull;
+import java.util.Map;
+import java.util.Set;
+
import static com.intellij.xdebugger.impl.ui.tree.nodes.MessageTreeNode.createInfoMessage;
/**
* @author nik
*/
-public class XVariablesView extends XVariablesViewBase implements XDebugView {
- @NotNull private final XDebugSession mySession;
+public class XVariablesView extends XVariablesViewBase {
+ public static final Key<Map<Pair<VirtualFile, Integer>, Set<XValueNodeImpl>>> DEBUG_VARIABLES = Key.create("debug.frame");
- public XVariablesView(@NotNull XDebugSession session) {
- super(session.getProject(), session.getDebugProcess().getEditorsProvider(), ((XDebugSessionImpl)session).getValueMarkers());
- mySession = session;
+ public XVariablesView(@NotNull XDebugSessionImpl session) {
+ super(session.getProject(), session.getDebugProcess().getEditorsProvider(), session.getValueMarkers());
}
@Override
public void processSessionEvent(@NotNull final SessionEvent event) {
- XStackFrame stackFrame = mySession.getCurrentStackFrame();
+ XDebugSession session = getSession(getPanel());
+ XStackFrame stackFrame = session == null ? null : session.getCurrentStackFrame();
XDebuggerTree tree = getTree();
if (event == SessionEvent.BEFORE_RESUME || event == SessionEvent.SETTINGS_CHANGED) {
@@ -50,20 +57,29 @@ public class XVariablesView extends XVariablesViewBase implements XDebugView {
tree.markNodesObsolete();
if (stackFrame != null) {
+ cancelClear();
buildTreeAndRestoreState(stackFrame);
}
else {
- tree.setSourcePosition(null);
+ requestClear();
+ }
+ }
- XDebuggerTreeNode node;
- if (!mySession.isStopped() && mySession.isPaused()) {
- node = createInfoMessage(tree, "Frame is not available");
- }
- else {
- XDebugProcess debugProcess = mySession.getDebugProcess();
- node = createInfoMessage(tree, debugProcess.getCurrentStateMessage(), debugProcess.getCurrentStateHyperlinkListener());
- }
- tree.setRoot(node, true);
+ @Override
+ protected void clear() {
+ XDebuggerTree tree = getTree();
+ tree.getProject().putUserData(DEBUG_VARIABLES, null);
+ tree.setSourcePosition(null);
+
+ XDebuggerTreeNode node;
+ XDebugSession session = getSession(getPanel());
+ if (session == null || (!session.isStopped() && session.isPaused())) {
+ node = createInfoMessage(tree, "Frame is not available");
+ }
+ else {
+ XDebugProcess debugProcess = session.getDebugProcess();
+ node = createInfoMessage(tree, debugProcess.getCurrentStateMessage(), debugProcess.getCurrentStateHyperlinkListener());
}
+ tree.setRoot(node, true);
}
}
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 33a1639ba5d7..ace9938318df 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
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 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.
@@ -16,8 +16,9 @@
package com.intellij.xdebugger.impl.frame;
import com.intellij.ide.dnd.DnDManager;
-import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider;
import com.intellij.xdebugger.frame.XStackFrame;
@@ -27,15 +28,18 @@ import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreePanel;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreeRestorer;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTreeState;
import com.intellij.xdebugger.impl.ui.tree.nodes.XStackFrameNode;
+import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.util.HashMap;
+import java.util.Set;
/**
* @author nik
*/
-public abstract class XVariablesViewBase implements Disposable {
+public abstract class XVariablesViewBase extends XDebugView {
protected final XDebuggerTreePanel myDebuggerTreePanel;
private XDebuggerTreeState myTreeState;
private Object myFrameEqualityObject;
@@ -51,6 +55,7 @@ public abstract class XVariablesViewBase implements Disposable {
XDebuggerTree tree = myDebuggerTreePanel.getTree();
tree.setSourcePosition(stackFrame.getSourcePosition());
tree.setRoot(new XStackFrameNode(tree, stackFrame), false);
+ tree.getProject().putUserData(XVariablesView.DEBUG_VARIABLES, new HashMap<Pair<VirtualFile, Integer>, Set<XValueNodeImpl>>());
Object newEqualityObject = stackFrame.getEqualityObject();
if (myFrameEqualityObject != null && newEqualityObject != null && myFrameEqualityObject.equals(newEqualityObject)
&& myTreeState != null) {
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 6216c1312349..c510cd17c90a 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
@@ -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.
@@ -33,6 +33,7 @@ import com.intellij.ui.border.CustomLineBorder;
import com.intellij.util.Alarm;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.tree.TreeUtil;
+import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.XExpression;
import com.intellij.xdebugger.frame.XStackFrame;
@@ -64,20 +65,18 @@ import java.util.List;
/**
* @author nik
*/
-public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugView {
+public class XWatchesViewImpl extends XDebugView implements DnDNativeTarget, XWatchesView {
private final XDebuggerTreePanel myTreePanel;
private XDebuggerTreeState myTreeState;
private XDebuggerTreeRestorer myTreeRestorer;
private final WatchesRootNode myRootNode;
- @NotNull private final XDebugSessionImpl mySession;
private final JPanel myDecoratedPanel;
private final CompositeDisposable myDisposables = new CompositeDisposable();
private boolean myRebuildNeeded;
- public XWatchesViewImpl(@NotNull final XDebugSessionImpl session) {
- mySession = session;
+ public XWatchesViewImpl(@NotNull XDebugSessionImpl session) {
myTreePanel = new XDebuggerTreePanel(session.getProject(), session.getDebugProcess().getEditorsProvider(), this, null,
- XDebuggerActions.WATCHES_TREE_POPUP_GROUP, ((XDebugSessionImpl)session).getValueMarkers());
+ XDebuggerActions.WATCHES_TREE_POPUP_GROUP, session.getValueMarkers());
ActionManager actionManager = ActionManager.getInstance();
@@ -89,7 +88,7 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
actionManager.getAction(XDebuggerActions.XEDIT_WATCH).registerCustomShortcutSet(f2Shortcut, tree);
DnDManager.getInstance().registerTarget(this, tree);
- myRootNode = new WatchesRootNode(tree, session, this, session.getSessionData().getWatchExpressions());
+ myRootNode = new WatchesRootNode(tree, this, session.getSessionData().getWatchExpressions());
tree.setRoot(myRootNode, false);
final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myTreePanel.getTree()).disableUpDownActions();
@@ -134,6 +133,7 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
DataContext context = DataManager.getInstance().getDataContext(watchTree);
final AnActionEvent actionEvent = new AnActionEvent(null, context, "WATCH_TREE", presentation, ActionManager.getInstance(), 0);
Runnable runnable = new Runnable() {
+ @Override
public void run() {
editWatchAction.actionPerformed(actionEvent);
}
@@ -161,12 +161,12 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
final FocusListener focusListener = new FocusListener() {
@Override
- public void focusGained(FocusEvent e) {
+ public void focusGained(@NotNull FocusEvent e) {
quitePeriod.addRequest(EmptyRunnable.getInstance(), UIUtil.getMultiClickInterval());
}
@Override
- public void focusLost(FocusEvent e) {
+ public void focusLost(@NotNull FocusEvent e) {
editAlarm.cancelAllRequests();
}
};
@@ -174,7 +174,7 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
final TreeSelectionListener selectionListener = new TreeSelectionListener() {
@Override
- public void valueChanged(TreeSelectionEvent e) {
+ public void valueChanged(@NotNull TreeSelectionEvent e) {
quitePeriod.addRequest(EmptyRunnable.getInstance(), UIUtil.getMultiClickInterval());
}
};
@@ -219,15 +219,20 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
@Override
public void addWatchExpression(@NotNull XExpression expression, int index, final boolean navigateToWatchNode) {
- myRootNode.addWatchExpression(mySession.getDebugProcess().getEvaluator(), expression, index, navigateToWatchNode);
+ XDebugSession session = getSession(getTree());
+ if (session == null) {
+ return;
+ }
+
+ myRootNode.addWatchExpression(session.getDebugProcess().getEvaluator(), expression, index, navigateToWatchNode);
updateSessionData();
if (navigateToWatchNode) {
- showWatchesTab();
+ showWatchesTab((XDebugSessionImpl)session);
}
}
- private void showWatchesTab() {
- XDebugSessionTab tab = mySession.getSessionTab();
+ private static void showWatchesTab(@NotNull XDebugSessionImpl session) {
+ XDebugSessionTab tab = session.getSessionTab();
if (tab != null) {
tab.toFront(false);
// restore watches tab if minimized
@@ -255,7 +260,6 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
return;
}
- XStackFrame stackFrame = mySession.getCurrentStackFrame();
XDebuggerTree tree = myTreePanel.getTree();
if (event == SessionEvent.BEFORE_RESUME || event == SessionEvent.SETTINGS_CHANGED) {
@@ -268,7 +272,10 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
}
}
+ XDebugSession session = getSession(getMainPanel());
+ XStackFrame stackFrame = session == null ? null : session.getCurrentStackFrame();
if (stackFrame != null) {
+ cancelClear();
tree.setSourcePosition(stackFrame.getSourcePosition());
myRootNode.updateWatches(stackFrame.getEvaluator());
if (myTreeState != null) {
@@ -276,11 +283,16 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
}
}
else {
- tree.setSourcePosition(null);
- myRootNode.updateWatches(null);
+ requestClear();
}
}
+ @Override
+ protected void clear() {
+ getTree().setSourcePosition(null);
+ myRootNode.updateWatches(null);
+ }
+
public XDebuggerTree getTree() {
return myTreePanel.getTree();
}
@@ -290,7 +302,7 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
}
@Override
- public void removeWatches(final List<? extends XDebuggerTreeNode> nodes) {
+ public void removeWatches(List<? extends XDebuggerTreeNode> nodes) {
List<? extends WatchNode> children = myRootNode.getAllChildren();
int minIndex = Integer.MAX_VALUE;
List<XDebuggerTreeNode> toRemove = new ArrayList<XDebuggerTreeNode>();
@@ -328,7 +340,11 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
watchExpressions.add(child.getExpression());
}
}
- mySession.setWatchExpressions(watchExpressions.toArray(new XExpression[watchExpressions.size()]));
+
+ XDebugSession session = getSession(getTree());
+ if (session != null) {
+ ((XDebugSessionImpl)session).setWatchExpressions(watchExpressions.toArray(new XExpression[watchExpressions.size()]));
+ }
}
@Override
@@ -348,13 +364,14 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
}
@Override
- public void drop(final DnDEvent aEvent) {
+ public void drop(DnDEvent aEvent) {
Object object = aEvent.getAttachedObject();
if (object instanceof XValueNodeImpl[]) {
final XValueNodeImpl[] nodes = (XValueNodeImpl[])object;
for (XValueNodeImpl node : nodes) {
String expression = node.getValueContainer().getEvaluationExpression();
if (expression != null) {
+ //noinspection ConstantConditions
addWatchExpression(XExpressionImpl.fromText(expression), -1, false);
}
}
@@ -362,6 +379,7 @@ public class XWatchesViewImpl implements DnDNativeTarget, XWatchesView, XDebugVi
else if (object instanceof EventInfo) {
String text = ((EventInfo)object).getTextForFlavor(DataFlavor.stringFlavor);
if (text != null) {
+ //noinspection ConstantConditions
addWatchExpression(XExpressionImpl.fromText(text), -1, false);
}
}