public CustomFieldInplaceEditor(
      @NotNull XDebuggerTreeNode node,
      @Nullable UserExpressionDescriptorImpl descriptor,
      @Nullable EnumerationChildrenRenderer renderer) {
    super(node, "customField");
    myDescriptor = descriptor;
    myRenderer = renderer;
    myExpressionEditor.setExpression(
        descriptor != null
            ? TextWithImportsImpl.toXExpression(descriptor.getEvaluationText())
            : null);

    ValueDescriptorImpl parentDescriptor =
        ((JavaValue) ((XValueContainerNode) node.getParent()).getValueContainer()).getDescriptor();
    Pair<PsiClass, PsiType> pair =
        DebuggerUtilsImpl.getPsiClassAndType(getTypeName(parentDescriptor), getProject());
    if (pair.first != null) {
      myExpressionEditor.setContext(pair.first);
    }
  }
  @Override
  public void doOKAction() {
    List<Pair<String, TextWithImports>> children = getRendererChildren();
    TextWithImports newText =
        TextWithImportsImpl.fromXExpression(myExpressionEditor.getExpression());
    if (myDescriptor == null) {
      children.add(0, Pair.create("", newText));
    } else {
      int index = myDescriptor.getEnumerationIndex();
      children.set(index, Pair.create(children.get(index).first, newText));
    }

    myTree.putClientProperty(
        XDebuggerTreeRestorer.SELECTION_PATH_PROPERTY,
        createDummySelectionTreePath(newText.getText(), (XDebuggerTreeNode) myNode.getParent()));

    XDebuggerUtilImpl.rebuildTreeAndViews(myTree);

    super.doOKAction();
  }