Package com.google.gdt.eclipse.designer.gxt.databinding.model.bindings

Source Code of com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.FieldBindingInfo

/*******************************************************************************
* Copyright 2011 Google Inc. All Rights Reserved.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* 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.google.gdt.eclipse.designer.gxt.databinding.model.bindings;

import com.google.gdt.eclipse.designer.gxt.databinding.DatabindingsProvider;
import com.google.gdt.eclipse.designer.gxt.databinding.model.ObserveInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.beans.BeanObserveInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.beans.BeanPropertyObserveInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.beans.BeansObserveTypeContainer;
import com.google.gdt.eclipse.designer.gxt.databinding.model.widgets.WidgetObserveInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.ui.contentproviders.ChooseClassAndPropertiesUiContentProvider;
import com.google.gdt.eclipse.designer.gxt.databinding.ui.contentproviders.ConverterUiContentProvider;

import org.eclipse.wb.core.model.JavaInfo;
import org.eclipse.wb.internal.core.databinding.model.AstObjectInfo;
import org.eclipse.wb.internal.core.databinding.model.CodeGenerationSupport;
import org.eclipse.wb.internal.core.databinding.model.IDatabindingsProvider;
import org.eclipse.wb.internal.core.databinding.parser.AbstractParser;
import org.eclipse.wb.internal.core.databinding.parser.IModelResolver;
import org.eclipse.wb.internal.core.databinding.ui.editor.EmptyPageListener;
import org.eclipse.wb.internal.core.databinding.ui.editor.IPageListener;
import org.eclipse.wb.internal.core.databinding.ui.editor.IUiContentProvider;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.ChooseClassAndPropertiesConfiguration;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.ChooseClassAndPropertiesConfiguration.LoadedPropertiesCheckedStrategy;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.ChooseClassConfiguration;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.PropertyAdapter;
import org.eclipse.wb.internal.core.databinding.utils.CoreUtils;
import org.eclipse.wb.internal.core.model.property.Property;
import org.eclipse.wb.internal.core.utils.ast.AstEditor;

import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.MethodInvocation;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.ClassUtils;

import java.util.List;

/**
*
* @author lobas_av
*
*/
public class FieldBindingInfo extends BindingInfo {
  private static final String BIND =
      "com.extjs.gxt.ui.client.binding.FieldBinding.bind(com.extjs.gxt.ui.client.data.ModelData)";
  private static final String SET_STORE_START =
      "com.extjs.gxt.ui.client.binding.FieldBinding.setStore(com.extjs.gxt.ui.client.store.Store";
  private static final String SET_CONVERTER =
      "com.extjs.gxt.ui.client.binding.FieldBinding.setConverter(com.extjs.gxt.ui.client.binding.Converter)";
  //
  private static ChooseClassConfiguration m_configuration;
  //
  private final String m_parsedProperty;
  private ConverterInfo m_converter;
  private String m_storeReference;
  private BindingsInfo m_parentBinding;
  private boolean m_autobind;
  protected String m_baseClassName = "com.extjs.gxt.ui.client.binding.FieldBinding";
  private BeanObserveInfo m_gridSelectionModel;

  ////////////////////////////////////////////////////////////////////////////
  //
  // Constructor
  //
  ////////////////////////////////////////////////////////////////////////////
  public FieldBindingInfo(ObserveInfo target, ObserveInfo targetProperty, String parsedProperty) {
    m_target = target;
    m_targetProperty = targetProperty;
    m_parsedProperty = parsedProperty;
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Access
  //
  ////////////////////////////////////////////////////////////////////////////
  public BindingsInfo getParentBinding() {
    return m_parentBinding;
  }

  public void setParentBinding(BindingsInfo parentBinding) {
    m_parentBinding = parentBinding;
  }

  public boolean isAutobind() {
    return m_autobind;
  }

  public void setAutobind(boolean autobind) {
    m_autobind = autobind;
  }

  public String getParsedProperty() {
    return m_parsedProperty;
  }

  public ConverterInfo getConverter() {
    return m_converter;
  }

  public void setConverter(ConverterInfo converter) {
    m_converter = converter;
  }

  public void setGridSelectionModel(BeanObserveInfo model) {
    m_gridSelectionModel = model;
  }

  public void updateGridSelectionModel() throws Exception {
    if (m_autobind && m_gridSelectionModel != null) {
      boolean create = m_modelProperty == null;
      m_modelProperty = m_gridSelectionModel.resolvePropertyReference(m_parsedProperty, null);
      if (!create) {
        m_modelProperty.createBinding(FieldBindingInfo.this);
      }
    }
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Operation
  //
  ////////////////////////////////////////////////////////////////////////////
  @Override
  public void move(List<BindingInfo> bindings) {
    if (m_parentBinding != null) {
      m_parentBinding.getFieldBindings().remove(this);
      int index = bindings.indexOf(this) - bindings.indexOf(m_parentBinding) - 1;
      m_parentBinding.getFieldBindings().add(index, this);
    }
  }

  @Override
  public void delete(List<BindingInfo> bindings, boolean deleteAll) throws Exception {
    super.delete(bindings, deleteAll);
    //
    if (m_parentBinding != null) {
      m_parentBinding.getFieldBindings().remove(this);
      //
      if (m_autobind && m_parentBinding instanceof FormBindingInfo) {
        FormBindingInfo parentBinding = (FormBindingInfo) m_parentBinding;
        if (parentBinding.isAutobind() && !deleteAll) {
          WidgetObserveInfo field = (WidgetObserveInfo) m_target;
          Property property = field.getJavaInfo().getPropertyByTitle("name");
          if (property != null) {
            property.setValue(Property.UNKNOWN_VALUE);
          }
        }
      }
    }
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Parser
  //
  ////////////////////////////////////////////////////////////////////////////
  @Override
  public AstObjectInfo parseExpression(AstEditor editor,
      String signature,
      MethodInvocation invocation,
      Expression[] arguments,
      IModelResolver resolver,
      IDatabindingsProvider provider) throws Exception {
    if (BIND.equals(signature)) {
      BeansObserveTypeContainer container = DatabindingsProvider.cast(provider).getBeansContainer();
      BeanObserveInfo beanObserveObject = container.getBeanObserveObject(arguments[0]);
      setModel(
          beanObserveObject,
          beanObserveObject.resolvePropertyReference(m_parsedProperty, null));
      //
      provider.getBindings().add(this);
    } else if (signature.startsWith(SET_STORE_START)) {
      m_storeReference = CoreUtils.getNodeReference(arguments[0]);
    } else if (SET_CONVERTER.equals(signature)) {
      m_converter = (ConverterInfo) resolver.getModel(arguments[0]);
      if (m_converter == null) {
        AbstractParser.addError(
            editor,
            "FieldBinding converter '" + arguments[0] + "' not found",
            new Throwable());
      }
    }
    return null;
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  //
  //
  ////////////////////////////////////////////////////////////////////////////
  @Override
  public void createContentProviders(List<IUiContentProvider> providers,
      IPageListener listener,
      DatabindingsProvider provider) throws Exception {
    super.createContentProviders(providers, listener, provider);
    if (!m_autobind) {
      if (m_configuration == null) {
        m_configuration = new ChooseClassConfiguration();
        m_configuration.setDialogFieldLabel("Converter:");
        m_configuration.setValueScope("com.extjs.gxt.ui.client.binding.Converter");
        m_configuration.setClearValue("N/S");
        m_configuration.setBaseClassName("com.extjs.gxt.ui.client.binding.Converter");
        m_configuration.setConstructorParameters(ArrayUtils.EMPTY_CLASS_ARRAY);
        m_configuration.setEmptyClassErrorMessage("Converter class is empty.");
        m_configuration.setErrorMessagePrefix("Converter");
      }
      //
      m_configuration.clearDefaultStrings();
      if (m_converter != null && m_converter.getClassName().indexOf('(') != -1) {
        m_configuration.addDefaultStart(m_converter.getClassName());
      }
      //
      providers.add(new ConverterUiContentProvider(m_configuration, this));
      //
      if (m_parentBinding != null && listener == EmptyPageListener.INSTANCE) {
        ChooseClassAndPropertiesConfiguration configuration =
            new ChooseClassAndPropertiesConfiguration();
        configuration.setBaseClassName("com.extjs.gxt.ui.client.data.ModelData");
        configuration.setValueScope("beans");
        configuration.setDialogFieldLabel("Model:");
        configuration.setDialogFieldEnabled(false);
        configuration.setPropertiesLabel("Model property:");
        configuration.setLoadedPropertiesCheckedStrategy(LoadedPropertiesCheckedStrategy.None);
        configuration.setPropertiesErrorMessage("Choose model property.");
        //
        providers.add(new ChooseClassAndPropertiesUiContentProvider(configuration,
            provider.getBeansContainer().getBeanSupport()) {
          public void updateFromObject() throws Exception {
            if (m_modelProperty == null) {
              BeanObserveInfo model = getLocalModel();
              if (model == null) {
                calculateFinish();
              } else {
                setClassName(model.getObjectType().getName());
              }
            } else {
              BeanPropertyObserveInfo modelProperty = (BeanPropertyObserveInfo) m_modelProperty;
              setClassNameAndProperty(
                  getLocalModel().getObjectType().getName(),
                  new PropertyAdapter(modelProperty.getPresentation().getText(),
                      modelProperty.getObjectType()),
                  true);
            }
          }

          @Override
          protected void saveToObject(Class<?> choosenClass, List<PropertyAdapter> choosenProperties)
              throws Exception {
            boolean create = m_modelProperty == null;
            m_modelProperty =
                getLocalModel().resolvePropertyReference(
                    "\"" + choosenProperties.get(0).getName() + "\"",
                    null);
            if (!create) {
              m_modelProperty.createBinding(FieldBindingInfo.this);
            }
          }
        });
      }
    }
  }

  private BeanObserveInfo getLocalModel() {
    if (m_gridSelectionModel == null) {
      if (m_model instanceof BeanObserveInfo) {
        return (BeanObserveInfo) m_model;
      }
    }
    return m_gridSelectionModel;
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Code generation
  //
  ////////////////////////////////////////////////////////////////////////////
  @Override
  public boolean addSourceCodeSeparator() {
    return m_parentBinding == null;
  }

  @Override
  public void addSourceCode(List<String> lines, CodeGenerationSupport generationSupport)
      throws Exception {
    if (m_parentBinding == null) {
      addSourceCode0(lines, generationSupport);
    }
  }

  public void addSourceCode0(List<String> lines, CodeGenerationSupport generationSupport)
      throws Exception {
    if (m_autobind) {
      return;
    }
    //
    String sourceCode =
        "new "
            + m_baseClassName
            + "("
            + m_target.getReference()
            + ", "
            + m_modelProperty.getReference()
            + ")";
    String variable = getVariableIdentifier();
    if (variable == null && (m_parentBinding == null || m_converter != null)) {
      variable = generationSupport.generateLocalName("fieldBinding");
      setVariableIdentifier(variable);
    }
    if (variable != null) {
      String startCode = isField() ? "" : m_baseClassName + " ";
      sourceCode = startCode + variable + " = " + sourceCode;
    }
    //
    if (m_parentBinding == null || variable != null) {
      lines.add(sourceCode + ";");
      sourceCode = variable;
    }
    //
    if (m_converter != null) {
      lines.add(variable
          + ".setConverter("
          + m_converter.getSourceCode(lines, generationSupport)
          + ");");
    }
    //
    if (m_parentBinding == null) {
      if (m_storeReference != null) {
        lines.add(variable + ".setStore(" + m_storeReference + ");");
      }
      lines.add(variable + ".bind(" + m_model.getReference() + ");");
    } else {
      lines.add(m_parentBinding.getVariableIdentifier() + ".addFieldBinding(" + sourceCode + ");");
    }
  }

  @Override
  public String getDefinitionSource() throws Exception {
    if (!m_autobind) {
      String sourceCode =
          "new "
              + ClassUtils.getShortClassName(m_baseClassName)
              + "("
              + m_target.getReference()
              + ", "
              + m_modelProperty.getReference()
              + ")";
      String variable = getVariableIdentifier();
      if (m_parentBinding != null && variable == null) {
        return m_parentBinding.getVariableIdentifier() + ".addFieldBinding(" + sourceCode + ")";
      }
      if (variable == null) {
        return sourceCode;
      }
      return ClassUtils.getShortClassName(m_baseClassName) + " " + variable + " = " + sourceCode;
    }
    return null;
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // IASTObjectInfo2
  //
  ////////////////////////////////////////////////////////////////////////////
  public void setVariableIdentifier(JavaInfo javaInfoRoot, String variable, boolean field) {
    setVariableIdentifier(javaInfoRoot, m_baseClassName, variable, field);
  }
}
TOP

Related Classes of com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.FieldBindingInfo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.