com.google.gdt.eclipse.designer.gxt.databinding.DatabindingsProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gdt.eclipse.designer.gxt.databinding.DatabindingsProvider.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;

import com.google.common.collect.Lists;
import com.google.gdt.eclipse.designer.gxt.databinding.model.DataBindingsRootInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.JavaInfoDecorator;
import com.google.gdt.eclipse.designer.gxt.databinding.model.JavaInfoDeleteManager;
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.BeansObserveTypeContainer;
import com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.BindingInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.BindingsInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.FieldBindingInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.bindings.FormBindingInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.widgets.BindingsWidgetObserveInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.widgets.WidgetObserveInfo;
import com.google.gdt.eclipse.designer.gxt.databinding.model.widgets.WidgetsObserveTypeContainer;
import com.google.gdt.eclipse.designer.gxt.databinding.ui.property.JavaInfoPropertiesManager;
import com.google.gdt.eclipse.designer.gxt.databinding.ui.providers.BindingLabelProvider;

import org.eclipse.wb.core.editor.IDesignPageSite;
import org.eclipse.wb.core.model.JavaInfo;
import org.eclipse.wb.internal.core.databinding.model.IBindingInfo;
import org.eclipse.wb.internal.core.databinding.model.IDatabindingsProvider;
import org.eclipse.wb.internal.core.databinding.model.IObserveInfo;
import org.eclipse.wb.internal.core.databinding.model.ObserveTypeContainer;
import org.eclipse.wb.internal.core.databinding.model.SynchronizeManager;
import org.eclipse.wb.internal.core.databinding.ui.ObserveType;
import org.eclipse.wb.internal.core.databinding.ui.UiUtils;
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.filter.PropertyFilter;
import org.eclipse.wb.internal.core.databinding.ui.providers.ObserveDecoratingLabelProvider;
import org.eclipse.wb.internal.core.databinding.utils.CoreUtils;
import org.eclipse.wb.internal.core.model.JavaInfoUtils;
import org.eclipse.wb.internal.core.utils.ast.AstEditor;
import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils;
import org.eclipse.wb.internal.core.utils.execution.RunnableEx;

import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.ToolBar;

import java.util.Collections;
import java.util.List;

/**
 * 
 * @author lobas_av
 * 
 */
public class DatabindingsProvider implements IDatabindingsProvider {
    private final JavaInfo m_javaInfoRoot;
    private final List<ObserveTypeContainer> m_containers = Lists.newArrayList();
    private final DataBindingsRootInfo m_rootInfo = new DataBindingsRootInfo();
    private final List<BindingInfo> m_bindings = Lists.newArrayList();
    private JavaInfoDeleteManager m_javaInfoDeleteManager;

    ////////////////////////////////////////////////////////////////////////////
    //
    // Constructor
    //
    ////////////////////////////////////////////////////////////////////////////
    public DatabindingsProvider(JavaInfo javaInfoRoot) throws Exception {
        m_javaInfoRoot = javaInfoRoot;
        m_containers.add(new BeansObserveTypeContainer());
        m_containers.add(new WidgetsObserveTypeContainer());
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Internal
    //
    ////////////////////////////////////////////////////////////////////////////
    public static DatabindingsProvider cast(IDatabindingsProvider provider) {
        return (DatabindingsProvider) provider;
    }

    public BeansObserveTypeContainer getBeansContainer() {
        return (BeansObserveTypeContainer) m_containers.get(0);
    }

    public WidgetsObserveTypeContainer getWidgetsContainer() {
        return (WidgetsObserveTypeContainer) m_containers.get(1);
    }

    public JavaInfo getJavaInfoRoot() {
        return m_javaInfoRoot;
    }

    public List<ObserveTypeContainer> getContainers() {
        return m_containers;
    }

    public DataBindingsRootInfo getRootInfo() {
        return m_rootInfo;
    }

    public void hookJavaInfoEvents() throws Exception {
        // update observes
        new SynchronizeManager(this, m_javaInfoRoot);
        // handle delete info's
        m_javaInfoDeleteManager = new JavaInfoDeleteManager(this);
        // decorate info's
        new JavaInfoDecorator(this);
        // properties
        new JavaInfoPropertiesManager(this, m_javaInfoRoot);
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Bindings
    //
    ////////////////////////////////////////////////////////////////////////////
    public void configureBindingViewer(IDialogSettings settings, TableViewer viewer) {
        // prepare table
        Table table = viewer.getTable();
        // binding type image column
        TableColumn bindingColumn = new TableColumn(table, SWT.NONE);
        bindingColumn.setWidth(23);
        bindingColumn.setResizable(false);
        // target column
        TableColumn targetColumn = UiUtils.createSmartColumn(table, settings, "TargetColumn", 300);
        targetColumn.setText("Target");
        // model column
        TableColumn modelColumn = UiUtils.createSmartColumn(table, settings, "ModelColumn", 300);
        modelColumn.setText("Model");
        // binding variable column
        TableColumn variableBindingColumn = UiUtils.createSmartColumn(table, settings, "VariableBindingColumn",
                250);
        variableBindingColumn.setText("Binding");
        // label provider
        viewer.setLabelProvider(new BindingLabelProvider());
    }

    public List<IBindingInfo> getBindings() {
        return CoreUtils.cast(m_bindings);
    }

    public List<BindingInfo> getBindings0() {
        return m_bindings;
    }

    public String getBindingPresentationText(IBindingInfo binding) throws Exception {
        return null;
    }

    public void gotoDefinition(IBindingInfo ibinding) {
        try {
            BindingInfo binding = (BindingInfo) ibinding;
            String source = binding.getDefinitionSource();
            //
            if (source != null) {
                int position = m_javaInfoRoot.getEditor().getEnclosingNode(source).getStartPosition();
                IDesignPageSite site = IDesignPageSite.Helper.getSite(m_javaInfoRoot);
                site.openSourcePosition(position);
            }
        } catch (Throwable e) {
        }
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Types
    //
    ////////////////////////////////////////////////////////////////////////////
    public List<ObserveType> getTypes() {
        return ObserveType.TYPES;
    }

    public ObserveType getTargetStartType() {
        return ObserveType.WIDGETS;
    }

    public ObserveType getModelStartType() {
        return ObserveType.BEANS;
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Observes
    //
    ////////////////////////////////////////////////////////////////////////////
    public IBaseLabelProvider createPropertiesViewerLabelProvider(TreeViewer viewer) {
        return new ObserveDecoratingLabelProvider(viewer);
    }

    public List<PropertyFilter> getObservePropertyFilters() {
        return Collections.emptyList();
    }

    public List<IObserveInfo> getObserves(ObserveType type) {
        for (ObserveTypeContainer container : m_containers) {
            if (container.getObserveType() == type) {
                return container.getObservables();
            }
        }
        //
        return Collections.emptyList();
    }

    public void synchronizeObserves() throws Exception {
        // prepare editor
        AstEditor editor = m_javaInfoRoot.getEditor();
        // prepare node
        TypeDeclaration rootNode = JavaInfoUtils.getTypeDeclaration(m_javaInfoRoot);
        if (rootNode == null) {
            // use first type declaration from compilation unit 
            CompilationUnit astUnit = editor.getAstUnit();
            rootNode = (TypeDeclaration) astUnit.types().get(0);
        }
        // synchronize
        for (ObserveTypeContainer container : m_containers) {
            container.synchronizeObserves(m_javaInfoRoot, editor, rootNode);
        }
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Editing
    //
    ////////////////////////////////////////////////////////////////////////////
    public List<IUiContentProvider> getContentProviders(IBindingInfo ibinding, IPageListener listener)
            throws Exception {
        List<IUiContentProvider> providers = Lists.newArrayList();
        BindingInfo binding = (BindingInfo) ibinding;
        binding.createContentProviders(providers, listener, this);
        return providers;
    }

    public boolean validate(IObserveInfo target, IObserveInfo targetProperty, IObserveInfo model,
            IObserveInfo modelProperty) throws Exception {
        // ignore itself
        if (target == model && targetProperty == modelProperty) {
            return false;
        }
        // prepare ObserveInfo's
        ObserveInfo targetObserve = (ObserveInfo) target;
        ObserveInfo targetPropertyObserve = (ObserveInfo) targetProperty;
        ObserveInfo modelObserve = (ObserveInfo) model;
        ObserveInfo modelPropertyObserve = (ObserveInfo) modelProperty;
        // check over reference's
        if (targetObserve.getReference().equals(modelObserve.getReference())
                && targetPropertyObserve.getReference().equals(modelPropertyObserve.getReference())) {
            return false;
        }
        //
        if (model instanceof BeanObserveInfo && target instanceof BeanObserveInfo) {
            return false;
        }
        if (model instanceof WidgetObserveInfo && target instanceof WidgetObserveInfo) {
            WidgetObserveInfo widgetModel = (WidgetObserveInfo) model;
            WidgetObserveInfo widgetTarget = (WidgetObserveInfo) target;
            //
            if (widgetModel.isGrid() && widgetModel.getSelfProperty() == modelProperty) {
                return widgetTarget.isFormPanel() && widgetTarget.getSelfProperty() == targetProperty;
            }
            if (widgetTarget.isGrid() && widgetTarget.getSelfProperty() == targetProperty) {
                return widgetModel.isFormPanel() && widgetModel.getSelfProperty() == modelProperty;
            }
            //
            return false;
        }
        if (model instanceof BeanObserveInfo) {
            BeanObserveInfo beanObserve = (BeanObserveInfo) model;
            if (modelProperty == beanObserve.getSelfProperty()) {
                WidgetObserveInfo widgetObserve = (WidgetObserveInfo) target;
                if ((!widgetObserve.isFormPanel() || !(widgetObserve instanceof BindingsWidgetObserveInfo))
                        && targetProperty != widgetObserve.getSelfProperty()) {
                    return false;
                }
            }
        }
        if (target instanceof BeanObserveInfo) {
            BeanObserveInfo beanObserve = (BeanObserveInfo) target;
            if (targetProperty == beanObserve.getSelfProperty()) {
                WidgetObserveInfo widgetObserve = (WidgetObserveInfo) model;
                if ((!widgetObserve.isFormPanel() || !(widgetObserve instanceof BindingsWidgetObserveInfo))
                        && modelProperty != widgetObserve.getSelfProperty()) {
                    return false;
                }
            }
        }
        if (model instanceof WidgetObserveInfo) {
            WidgetObserveInfo widgetObserve = (WidgetObserveInfo) model;
            if (widgetObserve.isGrid()) {
                return false;
            }
            if ((widgetObserve.isFormPanel() || widgetObserve instanceof BindingsWidgetObserveInfo)
                    && modelProperty == widgetObserve.getSelfProperty()) {
                BeanObserveInfo beanObserve = (BeanObserveInfo) target;
                if (targetProperty != beanObserve.getSelfProperty()) {
                    return false;
                }
            }
        }
        if (target instanceof WidgetObserveInfo) {
            WidgetObserveInfo widgetObserve = (WidgetObserveInfo) target;
            if (widgetObserve.isGrid()) {
                return false;
            }
            if ((widgetObserve.isFormPanel() || widgetObserve instanceof BindingsWidgetObserveInfo)
                    && targetProperty == widgetObserve.getSelfProperty()) {
                BeanObserveInfo beanObserve = (BeanObserveInfo) model;
                if (modelProperty != beanObserve.getSelfProperty()) {
                    return false;
                }
            }
        }
        return true;
    }

    public IBindingInfo createBinding(IObserveInfo target, IObserveInfo itargetProperty, IObserveInfo model,
            IObserveInfo imodelProperty) throws Exception {
        BeanObserveInfo beanObserve = null;
        ObserveInfo modelProperty = null;
        WidgetObserveInfo widgetObserve = null;
        ObserveInfo targetProperty = null;
        //
        if (target instanceof WidgetObserveInfo && model instanceof WidgetObserveInfo) {
            ObserveInfo gridObserve = null;
            //
            if (((WidgetObserveInfo) target).isFormPanel()) {
                widgetObserve = (WidgetObserveInfo) target;
                targetProperty = (ObserveInfo) itargetProperty;
                //
                gridObserve = (ObserveInfo) model;
                modelProperty = (ObserveInfo) imodelProperty;
            } else {
                widgetObserve = (WidgetObserveInfo) model;
                targetProperty = (ObserveInfo) imodelProperty;
                //
                gridObserve = (ObserveInfo) target;
                modelProperty = (ObserveInfo) itargetProperty;
            }
            //
            FormBindingInfo formBinding = new FormBindingInfo(widgetObserve, targetProperty);
            formBinding.setModel(gridObserve, modelProperty);
            return formBinding;
        }
        //
        if (target instanceof WidgetObserveInfo) {
            beanObserve = (BeanObserveInfo) model;
            modelProperty = (ObserveInfo) imodelProperty;
            //
            widgetObserve = (WidgetObserveInfo) target;
            targetProperty = (ObserveInfo) itargetProperty;
        } else {
            beanObserve = (BeanObserveInfo) target;
            modelProperty = (ObserveInfo) itargetProperty;
            //
            widgetObserve = (WidgetObserveInfo) model;
            targetProperty = (ObserveInfo) imodelProperty;
        }
        //
        if (modelProperty == beanObserve.getSelfProperty()) {
            if (widgetObserve.isFormPanel()) {
                FormBindingInfo formBinding = new FormBindingInfo(widgetObserve, targetProperty);
                formBinding.setModel(beanObserve, modelProperty);
                return formBinding;
            }
            if (widgetObserve instanceof BindingsWidgetObserveInfo) {
                BindingsInfo bindings = new BindingsInfo();
                bindings.setTarget(widgetObserve, targetProperty);
                bindings.setModel(beanObserve, modelProperty);
                return bindings;
            }
        }
        //
        FieldBindingInfo fieldBinding = widgetObserve.createFieldBinding(targetProperty, null);
        fieldBinding.setModel(beanObserve, modelProperty);
        return fieldBinding;
    }

    public void addBinding(IBindingInfo ibinding) {
        // add
        final BindingInfo binding = (BindingInfo) ibinding;
        m_bindings.add(binding);
        ExecutionUtils.runLog(new RunnableEx() {
            public void run() throws Exception {
                binding.create(m_bindings);
            }
        });
        // save
        saveEdit();
    }

    public void editBinding(final IBindingInfo ibinding) {
        // edit
        ExecutionUtils.runLog(new RunnableEx() {
            public void run() throws Exception {
                BindingInfo binding = (BindingInfo) ibinding;
                binding.edit(m_bindings);
            }
        });
        // save
        saveEdit();
    }

    public void deleteBinding(IBindingInfo ibinding) {
        // delete
        final BindingInfo binding = (BindingInfo) ibinding;
        ExecutionUtils.runLog(new RunnableEx() {
            public void run() throws Exception {
                binding.delete(m_bindings, false);
            }
        });
        m_bindings.remove(binding);
        // save
        saveEdit();
    }

    public void deleteAllBindings() {
        // delete all
        ExecutionUtils.runLog(new RunnableEx() {
            public void run() throws Exception {
                while (!m_bindings.isEmpty()) {
                    m_bindings.remove(0).delete(m_bindings, true);
                }
            }
        });
        // save
        saveEdit();
    }

    public void deleteBindings(JavaInfo javaInfo) throws Exception {
        if (m_javaInfoDeleteManager != null) {
            m_javaInfoDeleteManager.deleteJavaInfo(javaInfo);
        }
    }

    public boolean canMoveBinding(IBindingInfo ibinding, int targetIndex, boolean upDown) {
        if (ibinding instanceof FieldBindingInfo) {
            FieldBindingInfo binding = (FieldBindingInfo) ibinding;
            if (binding.getParentBinding() == null) {
                BindingInfo target = m_bindings.get(targetIndex);
                if (target instanceof FieldBindingInfo) {
                    FieldBindingInfo fieldTarget = (FieldBindingInfo) target;
                    return fieldTarget.getParentBinding() == null;
                }
            } else {
                if (binding.isAutobind()) {
                    return false;
                }
                BindingInfo target = m_bindings.get(targetIndex);
                if (target instanceof FieldBindingInfo) {
                    FieldBindingInfo fieldTarget = (FieldBindingInfo) target;
                    return binding.getParentBinding() == fieldTarget.getParentBinding()
                            && !fieldTarget.isAutobind();
                }
                return false;
            }
        }
        return true;
    }

    public void moveBinding(IBindingInfo ibinding, int sourceIndex, int targetIndex, boolean upDown) {
        // configure target index
        if (upDown) {
            targetIndex = configureMoveUpDown(ibinding, sourceIndex, targetIndex);
        }
        //
        BindingInfo binding = (BindingInfo) ibinding;
        // do reorder
        m_bindings.remove(sourceIndex);
        m_bindings.add(targetIndex, binding);
        binding.move(m_bindings);
        // save
        saveEdit();
    }

    private int configureMoveUpDown(IBindingInfo ibinding, int sourceIndex, int targetIndex) {
        if (ibinding instanceof FieldBindingInfo) {
            FieldBindingInfo binding = (FieldBindingInfo) ibinding;
            if (binding.getParentBinding() != null) {
                return targetIndex;
            }
        }
        //
        boolean up = sourceIndex > targetIndex;
        BindingInfo target = m_bindings.get(targetIndex);
        // configure target index
        if (target instanceof FieldBindingInfo) {
            FieldBindingInfo fieldTarget = (FieldBindingInfo) target;
            BindingsInfo parentBinding = fieldTarget.getParentBinding();
            //
            if (parentBinding != null) {
                if (up) {
                    targetIndex = m_bindings.indexOf(parentBinding);
                } else {
                    // skip all field bindings
                    targetIndex += parentBinding.getFieldBindings().size();
                    //
                    target = m_bindings.get(targetIndex);
                    if (target instanceof BindingsInfo) {
                        // skip all field bindings
                        BindingsInfo bindings = (BindingsInfo) target;
                        targetIndex += bindings.getFieldBindings().size();
                    }
                }
            }
        } else if (target instanceof BindingsInfo && !up) {
            // skip all field bindings
            BindingsInfo bindings = (BindingsInfo) target;
            targetIndex += bindings.getFieldBindings().size();
        }
        //
        return targetIndex;
    }

    public void saveEdit() {
        ExecutionUtils.run(m_javaInfoRoot, new RunnableEx() {
            public void run() throws Exception {
                m_rootInfo.commit(DatabindingsProvider.this);
            }
        });
    }

    public void setBindingPage(Object bindingPage) {
    }

    public void refreshDesigner() {
    }

    public void fillExternalBindingActions(ToolBar toolBar, Menu contextMenu) {
    }
}