/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.xdebugger.impl.ui.tree;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.ui.Messages;
import com.intellij.ui.AppUIUtil;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.util.ui.JBUI;
import com.intellij.xdebugger.frame.XValueModifier;
import com.intellij.xdebugger.frame.presentation.XValuePresentation;
import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValuePresentationUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
/**
* @author nik
*/
public class SetValueInplaceEditor extends XDebuggerTreeInplaceEditor {
private final JPanel myEditorPanel;
private final XValueModifier myModifier;
private final XValueNodeImpl myValueNode;
private final int myNameOffset;
private SetValueInplaceEditor(final XValueNodeImpl node, @NotNull final String nodeName) {
super(node, "setValue");
myValueNode = node;
myModifier = myValueNode.getValueContainer().getModifier();
SimpleColoredComponent nameLabel = new SimpleColoredComponent();
nameLabel.getIpad().right = 0;
nameLabel.getIpad().left = 0;
nameLabel.setIcon(myNode.getIcon());
nameLabel.append(nodeName, XDebuggerUIConstants.VALUE_NAME_ATTRIBUTES);
XValuePresentation presentation = node.getValuePresentation();
if (presentation != null) {
XValuePresentationUtil.appendSeparator(nameLabel, presentation.getSeparator());
}
myNameOffset = nameLabel.getPreferredSize().width;
myEditorPanel = JBUI.Panels.simplePanel(myExpressionEditor.getComponent());
}
@Nullable
@Override
protected Rectangle getEditorBounds() {
Rectangle bounds = super.getEditorBounds();
if (bounds == null) {
return null;
}
bounds.x += myNameOffset;
bounds.width -= myNameOffset;
return bounds;
}
public static void show(final XValueNodeImpl node, @NotNull final String nodeName) {
final SetValueInplaceEditor editor = new SetValueInplaceEditor(node, nodeName);
if (editor.myModifier != null) {
editor.myModifier.calculateInitialValueEditorText(initialValue -> AppUIUtil.invokeOnEdt(() -> {
if (editor.getTree().isShowing()) {
editor.show(initialValue);
}
}));
}
else {
editor.show(null);
}
}
private void show(String initialValue) {
myExpressionEditor.setExpression(XExpressionImpl.fromText(initialValue));
myExpressionEditor.selectAll();
show();
}
@Override
protected JComponent createInplaceEditorComponent() {
return myEditorPanel;
}
@Override
public void doOKAction() {
if (myModifier == null) return;
DebuggerUIUtil.setTreeNodeValue(myValueNode, getExpression().getExpression(), errorMessage -> {
Editor editor = getEditor();
if (editor != null) {
HintManager.getInstance().showErrorHint(editor, errorMessage);
}
else {
Messages.showErrorDialog(myTree, errorMessage);
}
});
super.doOKAction();
}
}