17b354c99e67ed3409ce4c3e2b69d2a47c31c54d
[idea/community.git] / python / src / com / jetbrains / python / debugger / containerview / PyViewNumericContainerAction.java
1 /*
2  * Copyright 2000-2016 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.jetbrains.python.debugger.containerview;
17
18 import com.intellij.openapi.actionSystem.AnActionEvent;
19 import com.intellij.openapi.actionSystem.DataContext;
20 import com.intellij.openapi.project.Project;
21 import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree;
22 import com.intellij.xdebugger.impl.ui.tree.actions.XDebuggerTreeActionBase;
23 import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
24 import com.jetbrains.python.debugger.PyDebugValue;
25 import com.jetbrains.python.debugger.array.NumpyArrayTable;
26 import com.jetbrains.python.debugger.dataframe.DataFrameTable;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29
30 import javax.swing.tree.TreePath;
31
32 /**
33  * @author amarch
34  */
35
36 public class PyViewNumericContainerAction extends XDebuggerTreeActionBase {
37
38   @Override
39   protected void perform(XValueNodeImpl node, @NotNull String nodeName, AnActionEvent e) {
40     Project p = e.getProject();
41     if (p != null && node != null && node.getValueContainer() instanceof PyDebugValue && node.isComputed()) {
42       PyDebugValue debugValue = (PyDebugValue)node.getValueContainer();
43       String nodeType = debugValue.getType();
44       final ViewNumericContainerDialog dialog;
45       if ("ndarray".equals(nodeType)) {
46         dialog = new ViewNumericContainerDialog(p, (dialogWrapper) -> {
47           NumpyArrayTable arrayTable = new NumpyArrayTable(p, dialogWrapper, debugValue);
48           arrayTable.init();
49           return arrayTable.getComponent().getMainPanel();
50         });
51       }
52       else if (("DataFrame".equals(nodeType))) {
53         dialog = new ViewNumericContainerDialog(p, (dialogWrapper) -> {
54           DataFrameTable dataFrameTable = new DataFrameTable(p, dialogWrapper, debugValue);
55           dataFrameTable.init();
56           return dataFrameTable.getComponent().getMainPanel();
57         });
58       }
59       else {
60         throw new IllegalStateException("Cannot render node type: " + nodeType);
61       }
62
63       dialog.show();
64     }
65   }
66
67   @Nullable
68   private static TreePath[] getSelectedPaths(DataContext dataContext) {
69     XDebuggerTree tree = XDebuggerTree.getTree(dataContext);
70     return tree == null ? null : tree.getSelectionPaths();
71   }
72
73   @Override
74   public void update(AnActionEvent e) {
75     e.getPresentation().setVisible(false);
76     TreePath[] paths = getSelectedPaths(e.getDataContext());
77     if (paths != null) {
78       if (paths.length > 1) {
79         e.getPresentation().setVisible(false);
80         return;
81       }
82
83       XValueNodeImpl node = getSelectedNode(e.getDataContext());
84       if (node != null && node.getValueContainer() instanceof PyDebugValue && node.isComputed()) {
85         PyDebugValue debugValue = (PyDebugValue)node.getValueContainer();
86
87         String nodeType = debugValue.getType();
88         if ("ndarray".equals(nodeType)) {
89           e.getPresentation().setText("View as Array");
90           e.getPresentation().setVisible(true);
91         }
92         else if (("DataFrame".equals(nodeType))) {
93           e.getPresentation().setText("View as DataFrame");
94           e.getPresentation().setVisible(true);
95         }
96         else {
97           e.getPresentation().setVisible(false);
98         }
99       }
100       else
101       {
102         e.getPresentation().setVisible(false);
103       }
104     }
105   }
106 }