private void computeAttatchCommand(XamlAttribute parent, FormAttachment attachment) {
    XamlElement attachmentChild = parent.getChild("FormAttachment", IConstants.XWT_NAMESPACE);
    if (attachmentChild == null) {
      attachmentChild =
          XamlFactory.eINSTANCE.createElement("FormAttachment", IConstants.XWT_NAMESPACE);
    }
    Control control = attachment.control;
    if (control != null) {
      String controlName = getName(control);
      if (controlName == null) {
        controlName = NamedCommand.generateName(control);
        addCommand(new NamedCommand(control, controlName));
      }
      XamlAttribute controlAttr = attachmentChild.getAttribute("control", IConstants.XWT_NAMESPACE);
      if (controlAttr == null) {
        controlAttr = XamlFactory.eINSTANCE.createAttribute("control", IConstants.XWT_NAMESPACE);
      }
      XamlElement bindChild = controlAttr.getChild("Binding", IConstants.XWT_NAMESPACE);
      if (bindChild == null) {
        bindChild = XamlFactory.eINSTANCE.createElement("Binding", IConstants.XWT_NAMESPACE);
      }
      ApplyAttributeSettingCommand command =
          new ApplyAttributeSettingCommand(
              bindChild, "ElementName", IConstants.XWT_NAMESPACE, controlName);
      addCommand(command);

      addNewChild(controlAttr, bindChild);
      addNewChild(attachmentChild, controlAttr);

      /* if (attachment.alignment != SWT.DEFAULT) */ {
        String alignment = "SWT.DEFAULT";
        switch (attachment.alignment) {
          case SWT.TOP:
            alignment = "SWT.TOP";
            break;
          case SWT.BOTTOM:
            alignment = "SWT.BOTTOM";
            break;
          case SWT.RIGHT:
            alignment = "SWT.RIGHT";
            break;
          case SWT.CENTER:
            alignment = "SWT.CENTER";
            break;
          case SWT.LEFT:
            alignment = "SWT.LEFT";
            break;
        }
        command =
            new ApplyAttributeSettingCommand(
                attachmentChild, "alignment", IConstants.XWT_NAMESPACE, alignment);
        addCommand(command);
      }
    } else {
      addCommand(new DeleteCommand(attachmentChild.getAttribute("control")));
    }
    /* if (attachment.denominator != 100) */ {
      ApplyAttributeSettingCommand command =
          new ApplyAttributeSettingCommand(
              attachmentChild,
              "denominator",
              IConstants.XWT_NAMESPACE,
              Integer.toString(attachment.denominator));
      addCommand(command);
    }
    /* if (attachment.numerator != 0) */ {
      ApplyAttributeSettingCommand command =
          new ApplyAttributeSettingCommand(
              attachmentChild,
              "numerator",
              IConstants.XWT_NAMESPACE,
              Integer.toString(attachment.numerator));
      addCommand(command);
    }
    /* if (attachment.offset != 0) */ {
      ApplyAttributeSettingCommand command =
          new ApplyAttributeSettingCommand(
              attachmentChild,
              "offset",
              IConstants.XWT_NAMESPACE,
              Integer.toString(attachment.offset));
      addCommand(command);
    }
    addNewChild(parent, attachmentChild);
  }
  private static BindingInfo createBindingInfo(
      Object targetSource, String propertyName, XamlElement bindingNode) {
    BindingInfo bindingInfo = bindingCache.get(bindingNode);
    if (bindingInfo != null) {
      // TODO: To check if binding changed.
      return bindingInfo;
    }

    Observable target = ObservableUtil.getObservable(targetSource);
    Property targetProperty = target.getProperty(propertyName);

    String elementName = null;
    String modelPropertyName = null;
    String bindingMode = null;
    String updateTtrigger = null;
    String converter = null;
    XamlAttribute attribute = bindingNode.getAttribute(ELEMENT_NAME);
    if (attribute != null) {
      elementName = attribute.getValue();
    }
    attribute = bindingNode.getAttribute(PATH);
    if (attribute != null) {
      modelPropertyName = attribute.getValue();
    }
    attribute = bindingNode.getAttribute(MODE);
    if (attribute != null) {
      bindingMode = attribute.getValue();
    }
    attribute = bindingNode.getAttribute(CONVERTER);
    if (attribute != null) {
      converter = attribute.getValue();
    }
    attribute = bindingNode.getAttribute(UPDATE_SOURCE_TRIGGER);
    if (attribute != null) {
      updateTtrigger = attribute.getValue();
    }
    Object modelSource;
    if (elementName != null) {
      modelSource = XWT.findElementByName(targetSource, elementName);
    } else {
      modelSource = getDataContext(targetSource);
    }
    IObservable model = ObservableUtil.getObservable(modelSource);
    if (model == null) {
      return null;
    }
    Property modelProperty = model.getProperty(modelPropertyName);

    bindingInfo = new BindingInfo(new BindingContext(target, targetProperty, model, modelProperty));
    bindingInfo.setElementName(elementName);
    if (bindingMode != null) {
      bindingInfo.setBindingMode(BindingMode.valueOf(bindingMode));
    }
    if (updateTtrigger != null) {
      bindingInfo.setTriggerMode(UpdateSourceTrigger.valueOf(updateTtrigger));
    }
    bindingInfo.setConverter(converter);
    bindingInfo.setBindingNode(bindingNode);
    bindingCache.put(bindingNode, bindingInfo);
    return bindingInfo;
  }