diff options
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.java | 128 |
1 files changed, 72 insertions, 56 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 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) { |