Merge remote-tracking branch 'origin/master'
[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.util.ui.JBUI;
24 import com.intellij.xdebugger.frame.XValueModifier;
25 import com.intellij.xdebugger.frame.presentation.XValuePresentation;
26 import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
27 import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
28 import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
29 import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
30 import com.intellij.xdebugger.impl.ui.tree.nodes.XValuePresentationUtil;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33
34 import javax.swing.*;
35 import java.awt.*;
36
37 /**
38  * @author nik
39  */
40 public class SetValueInplaceEditor extends XDebuggerTreeInplaceEditor {
41   private final JPanel myEditorPanel;
42   private final XValueModifier myModifier;
43   private final XValueNodeImpl myValueNode;
44   private final int myNameOffset;
45
46   private SetValueInplaceEditor(final XValueNodeImpl node, @NotNull final String nodeName) {
47     super(node, "setValue");
48     myValueNode = node;
49     myModifier = myValueNode.getValueContainer().getModifier();
50
51     SimpleColoredComponent nameLabel = new SimpleColoredComponent();
52     nameLabel.getIpad().right = 0;
53     nameLabel.getIpad().left = 0;
54     nameLabel.setIcon(myNode.getIcon());
55     nameLabel.append(nodeName, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES);
56     XValuePresentation presentation = node.getValuePresentation();
57     if (presentation != null) {
58       XValuePresentationUtil.appendSeparator(nameLabel, presentation.getSeparator());
59     }
60     myNameOffset = nameLabel.getPreferredSize().width;
61     myEditorPanel = JBUI.Panels.simplePanel(myExpressionEditor.getComponent());
62   }
63
64   @Nullable
65   @Override
66   protected Rectangle getEditorBounds() {
67     Rectangle bounds = super.getEditorBounds();
68     if (bounds == null) {
69       return null;
70     }
71     bounds.x += myNameOffset;
72     bounds.width -= myNameOffset;
73     return bounds;
74   }
75
76   public static void show(final XValueNodeImpl node, @NotNull final String nodeName) {
77     final SetValueInplaceEditor editor = new SetValueInplaceEditor(node, nodeName);
78
79     if (editor.myModifier != null) {
80       editor.myModifier.calculateInitialValueEditorText(initialValue -> AppUIUtil.invokeOnEdt(() -> {
81         if (editor.getTree().isShowing()) {
82           editor.show(initialValue);
83         }
84       }));
85     }
86     else {
87       editor.show(null);
88     }
89   }
90
91   private void show(String initialValue) {
92     myExpressionEditor.setExpression(XExpressionImpl.fromText(initialValue));
93     myExpressionEditor.selectAll();
94
95     show();
96   }
97
98   @Override
99   protected JComponent createInplaceEditorComponent() {
100     return myEditorPanel;
101   }
102
103   @Override
104   public void doOKAction() {
105     if (myModifier == null) return;
106
107     DebuggerUIUtil.setTreeNodeValue(myValueNode, getExpression().getExpression(), errorMessage -> {
108       Editor editor = getEditor();
109       if (editor != null) {
110         HintManager.getInstance().showErrorHint(editor, errorMessage);
111       }
112       else {
113         Messages.showErrorDialog(myTree, errorMessage);
114       }
115     });
116
117     super.doOKAction();
118   }
119 }