示例#1
0
  public Command bindWithCommand() {
    if (!canBinding()) {
      return null;
    }
    CompoundCommand commandList = new CompoundCommand();

    Property targetProperty = context.getTargetProperty();
    Property modelProperty = context.getModelProperty();
    IObservable target = context.getTarget();
    IObservable model = context.getModel();
    Object targetSource = target.getSource();

    Object modelSource = model.getSource();

    XamlNode node = null;
    if (targetSource instanceof Widget) {
      node = XWTProxy.getModel((Widget) targetSource);
    } else if (targetSource instanceof XamlElement) {
      node = (XamlElement) targetSource;
    }

    if (node == null) {
      return UnexecutableCommand.INSTANCE;
    }

    // 1. Get attr of targetProperty, such as < text="{}"/>
    XamlAttribute attribute = node.getAttribute(targetProperty.getName(), IConstants.XWT_NAMESPACE);
    if (attribute != null) {
      commandList.add(new DeleteCommand(attribute));
      attribute = null;
    }
    if (attribute == null) {
      attribute =
          XamlFactory.eINSTANCE.createAttribute(targetProperty.getName(), IConstants.XWT_NAMESPACE);
    }
    // 2. Binding Node.
    if (bindingNode == null) {
      bindingNode = attribute.getChild(BINDING, IConstants.XWT_NAMESPACE);
    }
    if (bindingNode == null) {
      bindingNode = XamlFactory.eINSTANCE.createElement(BINDING, IConstants.XWT_NAMESPACE);
    }
    // 3. ElementName
    int type = model.getType();
    if (type == IObservable.OBSERVE_SWT_JFACE) {
      addAttr(
          bindingNode,
          ELEMENT_NAME,
          IConstants.XWT_NAMESPACE,
          getCreateName(modelSource, commandList));
    }
    // 4. DataContext
    else if (IObservable.OBSERVE_JAVA_BAEN == type) {
      XamlDocument ownerDocument = node.getOwnerDocument();
      XamlElement rootElement = ownerDocument.getRootElement();
      DataContext dataContext = (DataContext) modelSource;
      String key = dataContext.getKey();
      if (key != null) {
        boolean canUseDC = getCodeStyles().useDataContext;
        if (canUseDC) {
          XamlAttribute contextNode =
              getAttribute(rootElement, DATA_CONTEXT, IConstants.XWT_NAMESPACE);
          contextNode.setUseFlatValue(true);

          XamlElement resourceNode =
              getElement(contextNode, STATIC_RESOURCE, IConstants.XWT_NAMESPACE);
          if (!key.equals(resourceNode.getValue())) {
            if (resourceNode.getValue() != null) {
              canUseDC = false;
            } else {
              resourceNode.setValue(key);
              commandList.add(new AddNewChildCommand(contextNode, resourceNode));
              commandList.add(new AddNewChildCommand(rootElement, contextNode));
            }
          }
        }
        if (!canUseDC || !getCodeStyles().useDataContext) {
          XamlAttribute sourceAttr = getAttribute(bindingNode, SOURCE, IConstants.XWT_NAMESPACE);
          sourceAttr.setUseFlatValue(true);
          XamlElement resourceNode =
              getElement(sourceAttr, STATIC_RESOURCE, IConstants.XWT_NAMESPACE);

          resourceNode.setValue(key);
          commandList.add(new AddNewChildCommand(sourceAttr, resourceNode));
          commandList.add(new AddNewChildCommand(bindingNode, sourceAttr));
        }
      }
    }

    // 5. Path
    addAttr(bindingNode, PATH, IConstants.XWT_NAMESPACE, modelProperty.toString());

    // 6. BindingMode
    if (bindingMode != null && BindingMode.TwoWay.equals(bindingMode)) {
      addAttr(bindingNode, MODE, IConstants.XWT_NAMESPACE, bindingMode.name());
    }

    // 7. Converter.
    if (converter != null) {
      addAttr(bindingNode, CONVERTER, IConstants.XWT_NAMESPACE, converter);
    }

    // 8. UpdateSourceTrigger
    if (triggerMode != null) {
      addAttr(bindingNode, UPDATE_SOURCE_TRIGGER, IConstants.XWT_NAMESPACE, triggerMode.name());
    }

    // 9. Code Style.
    attribute.setUseFlatValue(getCodeStyles().useFlatVlaue);

    if (!attribute.getChildNodes().contains(bindingNode)) {
      attribute.getChildNodes().add(bindingNode);
    }
    if (!node.getAttributes().contains(attribute)) {
      commandList.add(new AddNewChildCommand(node, attribute));
    }
    return commandList.unwrap();
  }
示例#2
0
  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;
  }