a93bf8101a310d9a8c00ffc24cce18aa2565b638
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / actions / AddToWatchActionHandler.java
1 /*
2  * Copyright 2000-2009 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
17 /*
18  * Class AddToWatchActionHandler
19  * @author Jeka
20  */
21 package com.intellij.debugger.actions;
22
23 import com.intellij.debugger.DebuggerInvocationUtil;
24 import com.intellij.debugger.engine.evaluation.EvaluateException;
25 import com.intellij.debugger.engine.evaluation.TextWithImports;
26 import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
27 import com.intellij.debugger.impl.DebuggerContextImpl;
28 import com.intellij.debugger.impl.DebuggerSession;
29 import com.intellij.debugger.impl.DebuggerUtilsEx;
30 import com.intellij.debugger.ui.DebuggerPanelsManager;
31 import com.intellij.debugger.ui.impl.*;
32 import com.intellij.debugger.ui.impl.watch.*;
33 import com.intellij.idea.ActionsBundle;
34 import com.intellij.openapi.actionSystem.AnActionEvent;
35 import com.intellij.openapi.actionSystem.CommonDataKeys;
36 import com.intellij.openapi.actionSystem.DataContext;
37 import com.intellij.openapi.editor.Editor;
38 import com.intellij.openapi.project.Project;
39 import com.intellij.openapi.ui.Messages;
40 import com.intellij.xdebugger.impl.actions.DebuggerActionHandler;
41 import com.intellij.xdebugger.impl.actions.XDebuggerActions;
42 import org.jetbrains.annotations.NotNull;
43
44 public class AddToWatchActionHandler extends DebuggerActionHandler {
45   @Override
46   public boolean isEnabled(@NotNull Project project, AnActionEvent event) {
47     DataContext context = event.getDataContext();
48     DebuggerTreeNodeImpl[] selectedNodes = DebuggerAction.getSelectedNodes(context);
49     boolean enabled = false;
50     if (selectedNodes != null && selectedNodes.length > 0) {
51       DebuggerTreePanel panel = DebuggerAction.getPanel(context);
52       if (panel instanceof VariablesPanel || panel instanceof WatchPanel
53           || (panel == null && DebuggerAction.getTree(context) instanceof InspectDebuggerTree)) {
54         enabled = true;
55         for (DebuggerTreeNodeImpl node : selectedNodes) {
56           NodeDescriptorImpl descriptor = node.getDescriptor();
57           if (!(descriptor instanceof ValueDescriptorImpl)) {
58             enabled = false;
59             break;
60           }
61         }
62       }
63     }
64     else {
65       final Editor editor = event.getData(CommonDataKeys.EDITOR);
66       enabled = DebuggerUtilsEx.getEditorText(editor) != null;
67     }
68     return enabled;
69   }
70
71   @Override
72   public void perform(@NotNull Project project, AnActionEvent event) {
73     final DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(event.getDataContext());
74
75     if(debuggerContext == null) return;
76
77     final DebuggerSession session = debuggerContext.getDebuggerSession();
78     if(session == null) {
79       return;
80     }
81     final MainWatchPanel watchPanel = DebuggerPanelsManager.getInstance(debuggerContext.getProject()).getWatchPanel();
82
83     if(watchPanel == null) {
84       return;
85     }
86
87     final DebuggerTreeNodeImpl[] selectedNodes = DebuggerAction.getSelectedNodes(event.getDataContext());
88
89     if(selectedNodes != null && selectedNodes.length > 0) {
90       addFromNodes(debuggerContext, watchPanel, selectedNodes);
91     }
92     else {
93       final Editor editor = event.getData(CommonDataKeys.EDITOR);
94       if (editor != null) {
95         final TextWithImports editorText = DebuggerUtilsEx.getEditorText(editor);
96         if (editorText != null) {
97           doAddWatch(watchPanel, editorText, null);
98         }
99       }
100     }
101   }
102
103   public static void addFromNodes(final DebuggerContextImpl debuggerContext, final MainWatchPanel watchPanel, final DebuggerTreeNodeImpl[] selectedNodes) {
104     debuggerContext.getDebugProcess().getManagerThread().schedule(new AddToWatchesCommand(debuggerContext, selectedNodes, watchPanel));
105   }
106
107   public static void doAddWatch(final MainWatchPanel watchPanel, final TextWithImports expression, final NodeDescriptorImpl descriptor) {
108     final WatchDebuggerTree watchTree = watchPanel.getWatchTree();
109     final DebuggerTreeNodeImpl node = watchTree.addWatch(expression, null);
110     if (descriptor != null) {
111       node.getDescriptor().displayAs(descriptor);
112     }
113     node.calcValue();
114   }
115
116   private static class AddToWatchesCommand extends DebuggerContextCommandImpl {
117
118     private final DebuggerContextImpl myDebuggerContext;
119     private final DebuggerTreeNodeImpl[] mySelectedNodes;
120     private final MainWatchPanel myWatchPanel;
121
122     public AddToWatchesCommand(DebuggerContextImpl debuggerContext, DebuggerTreeNodeImpl[] selectedNodes, MainWatchPanel watchPanel) {
123       super(debuggerContext);
124       myDebuggerContext = debuggerContext;
125       mySelectedNodes = selectedNodes;
126       myWatchPanel = watchPanel;
127     }
128
129     @Override
130     public void threadAction() {
131       final DebuggerSession session = myDebuggerContext.getDebuggerSession();
132       if (session == null) {
133         return;
134       }
135       final Project project = session.getProject();
136       for (final DebuggerTreeNodeImpl node : mySelectedNodes) {
137         final NodeDescriptorImpl descriptor = node.getDescriptor();
138         try {
139           final TextWithImports expression = DebuggerTreeNodeExpression.createEvaluationText(node, myDebuggerContext);
140           if (expression != null) {
141             DebuggerInvocationUtil.swingInvokeLater(project, new Runnable() {
142               @Override
143               public void run() {
144                 doAddWatch(myWatchPanel, expression, descriptor);
145               }
146             });
147           }
148         }
149         catch (final EvaluateException e) {
150           DebuggerInvocationUtil.swingInvokeLater(project, new Runnable() {
151             @Override
152             public void run() {
153               Messages.showErrorDialog(project, e.getMessage(), ActionsBundle.actionText(XDebuggerActions.ADD_TO_WATCH));
154             }
155           });
156         }
157       }
158     }
159
160     @Override
161     protected void commandCancelled() {
162       DebuggerInvocationUtil.swingInvokeLater(myDebuggerContext.getProject(), new Runnable() {
163         @Override
164         public void run() {
165           for (DebuggerTreeNodeImpl node : mySelectedNodes) {
166             final NodeDescriptorImpl descriptor = node.getDescriptor();
167             if (descriptor instanceof WatchItemDescriptor) {
168               final TextWithImports expression = ((WatchItemDescriptor)descriptor).getEvaluationText();
169               if (expression != null) {
170                 doAddWatch(myWatchPanel, expression, descriptor);
171               }
172             }
173           }
174         }
175       });
176     }
177
178   }
179 }