IDEA-79921 Suspend one thread while debugging
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / actions / FreezeThreadAction.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.debugger.actions;
17
18 import com.intellij.debugger.engine.DebugProcessImpl;
19 import com.intellij.debugger.engine.events.DebuggerCommandImpl;
20 import com.intellij.debugger.impl.DebuggerContextImpl;
21 import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
22 import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl;
23 import com.intellij.debugger.ui.impl.watch.NodeDescriptorImpl;
24 import com.intellij.debugger.ui.impl.watch.ThreadDescriptorImpl;
25 import com.intellij.openapi.actionSystem.AnActionEvent;
26
27 /**
28  * @author lex
29  */
30 public class FreezeThreadAction extends DebuggerAction {
31   public void actionPerformed(final AnActionEvent e) {
32     DebuggerTreeNodeImpl[] selectedNode = getSelectedNodes(e.getDataContext());
33     if (selectedNode == null) {
34       return;
35     }
36     final DebuggerContextImpl debuggerContext = getDebuggerContext(e.getDataContext());
37     final DebugProcessImpl debugProcess = debuggerContext.getDebugProcess();
38
39     for (final DebuggerTreeNodeImpl debuggerTreeNode : selectedNode) {
40       ThreadDescriptorImpl threadDescriptor = ((ThreadDescriptorImpl)debuggerTreeNode.getDescriptor());
41       final ThreadReferenceProxyImpl thread = threadDescriptor.getThreadReference();
42
43       if (!threadDescriptor.isFrozen()) {
44         debugProcess.getManagerThread().schedule(new DebuggerCommandImpl(){
45           @Override
46           protected void action() throws Exception {
47             debugProcess.createFreezeThreadCommand(thread).run();
48             debuggerTreeNode.calcValue();
49           }
50         });
51       }
52     }
53   }
54
55   public void update(AnActionEvent e) {
56     DebuggerTreeNodeImpl[] selectedNode = getSelectedNodes(e.getDataContext());
57     if (selectedNode == null) {
58       return;
59     }
60     DebugProcessImpl debugProcess = getDebuggerContext(e.getDataContext()).getDebugProcess();
61
62     boolean visible = false;
63     if (debugProcess != null) {
64       visible = true;
65       for (DebuggerTreeNodeImpl aSelectedNode : selectedNode) {
66         NodeDescriptorImpl threadDescriptor = aSelectedNode.getDescriptor();
67         if (!(threadDescriptor instanceof ThreadDescriptorImpl) || ((ThreadDescriptorImpl)threadDescriptor).isFrozen()) {
68           visible = false;
69           break;
70         }
71       }
72
73     }
74
75     e.getPresentation().setVisible(visible);
76   }
77 }