com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.FieldBindingInfo.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.FieldBindingInfo.java

Source

/*******************************************************************************
 * 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);
    }
}