[platform] mock update server
[idea/community.git] / platform / xdebugger-impl / src / com / intellij / xdebugger / impl / ui / tree / SetValueInplaceEditor.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.intellij.xdebugger.impl.ui.tree;
17
18 import com.intellij.codeInsight.hint.HintManager;
19 import com.intellij.openapi.editor.Editor;
20 import com.intellij.openapi.ui.Messages;
21 import com.intellij.ui.AppUIUtil;
22 import com.intellij.ui.SimpleColoredComponent;
23 import com.intellij.xdebugger.frame.XValueModifier;
24 import com.intellij.xdebugger.frame.presentation.XValuePresentation;
25 import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
26 import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
27 import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
28 import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
29 import com.intellij.xdebugger.impl.ui.tree.nodes.XValuePresentationUtil;
30 import org.jetbrains.annotations.NotNull;
31
32 import javax.swing.*;
33 import java.awt.*;
34
35 /**
36  * @author nik
37  */
38 public class SetValueInplaceEditor extends XDebuggerTreeInplaceEditor {
39   private final JPanel myEditorPanel;
40   private final XValueModifier myModifier;
41   private final XValueNodeImpl myValueNode;
42
43   private SetValueInplaceEditor(final XValueNodeImpl node, @NotNull final String nodeName) {
44     super(node, "setValue");
45     myValueNode = node;
46     myModifier = myValueNode.getValueContainer().getModifier();
47
48     myEditorPanel = new JPanel();
49     myEditorPanel.setLayout(new BorderLayout(0, 0));
50     SimpleColoredComponent nameLabel = new SimpleColoredComponent();
51     nameLabel.setIcon(myNode.getIcon());
52     nameLabel.append(nodeName, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES);
53     XValuePresentation presentation = node.getValuePresentation();
54     if (presentation != null) {
55       XValuePresentationUtil.appendSeparator(nameLabel, presentation.getSeparator());
56     }
57     myEditorPanel.add(nameLabel, BorderLayout.WEST);
58
59     myEditorPanel.add(myExpressionEditor.getComponent(), BorderLayout.CENTER);
60   }
61
62   public static void show(final XValueNodeImpl node, @NotNull final String nodeName) {
63     final SetValueInplaceEditor editor = new SetValueInplaceEditor(node, nodeName);
64
65     if (editor.myModifier != null) {
66       editor.myModifier.calculateInitialValueEditorText(initialValue -> AppUIUtil.invokeOnEdt(() -> {
67         if (editor.getTree().isShowing()) {
68           editor.show(initialValue);
69         }
70       }));
71     }
72     else {
73       editor.show(null);
74     }
75   }
76
77   private void show(String initialValue) {
78     myExpressionEditor.setExpression(XExpressionImpl.fromText(initialValue));
79     myExpressionEditor.selectAll();
80
81     show();
82   }
83
84   @Override
85   protected JComponent createInplaceEditorComponent() {
86     return myEditorPanel;
87   }
88
89   @Override
90   public void doOKAction() {
91     if (myModifier == null) return;
92
93     DebuggerUIUtil.setTreeNodeValue(myValueNode, getExpression().getExpression(), errorMessage -> {
94       Editor editor = getEditor();
95       if (editor != null) {
96         HintManager.getInstance().showErrorHint(editor, errorMessage);
97       }
98       else {
99         Messages.showErrorDialog(myTree, errorMessage);
100       }
101     });
102
103     super.doOKAction();
104   }
105 }