diff options
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame')
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); } } |