org.eclipse.wb.internal.rcp.databinding.ui.contentproviders.ChooseClassAndTreePropertiesUiContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wb.internal.rcp.databinding.ui.contentproviders.ChooseClassAndTreePropertiesUiContentProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Google, Inc.
 * 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
 *
 * Contributors:
 *    Google, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.wb.internal.rcp.databinding.ui.contentproviders;

import com.google.common.collect.Lists;

import org.eclipse.wb.internal.core.DesignerPlugin;
import org.eclipse.wb.internal.core.databinding.model.IObserveInfo;
import org.eclipse.wb.internal.core.databinding.model.IObserveInfo.ChildrenContext;
import org.eclipse.wb.internal.core.databinding.model.IObservePresentation;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.CheckboxTreeViewerWrapper;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.ChooseClassAndPropertiesConfiguration;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.ICheckboxViewerWrapper;
import org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.PropertyAdapter;
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.state.EditorState;
import org.eclipse.wb.internal.rcp.databinding.model.BindableInfo;
import org.eclipse.wb.internal.rcp.databinding.model.beans.bindables.BeanBindableInfo;
import org.eclipse.wb.internal.rcp.databinding.model.beans.bindables.BeanSupport;
import org.eclipse.wb.internal.rcp.databinding.model.beans.bindables.PropertyBindableInfo;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

import org.apache.commons.collections.CollectionUtils;

import java.util.List;

/**
 * Content provider for choose properties from Tree (properties + sub properties) and make order
 * choosen properties.
 * 
 * @author lobas_av
 * @coverage bindings.rcp.ui
 */
public abstract class ChooseClassAndTreePropertiesUiContentProvider extends
        org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders.ChooseClassAndPropertiesUiContentProvider {
    private CheckboxTreeViewer m_treeViewer;
    private TableViewer m_orderPropertiesViewer;
    private final List<PropertyAdapter> m_orderProperties = Lists.newArrayList();

    ////////////////////////////////////////////////////////////////////////////
    //
    // Constructor
    //
    ////////////////////////////////////////////////////////////////////////////
    public ChooseClassAndTreePropertiesUiContentProvider(ChooseClassAndPropertiesConfiguration configuration) {
        super(configuration);
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // GUI
    //
    ////////////////////////////////////////////////////////////////////////////
    @Override
    protected Control createViewers(Composite parent) {
        SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL);
        //
        super.createViewers(sashForm);
        //
        m_orderPropertiesViewer = new TableViewer(sashForm,
                SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
        m_orderPropertiesViewer.setContentProvider(new ArrayContentProvider());
        m_orderPropertiesViewer.setLabelProvider(new PropertyAdapterLabelProvider(m_orderPropertiesViewer) {
            @Override
            public String getText(Object element) {
                ObservePropertyAdapter adapter = getAdapter(element);
                return adapter.fullName;
            }
        });
        m_orderPropertiesViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (!event.getSelection().isEmpty()) {
                    m_treeViewer.setSelection(event.getSelection(), true);
                }
                calculateUpDowButtons();
            }
        });
        m_orderPropertiesViewer.setInput(m_orderProperties);
        //
        return sashForm;
    }

    @Override
    protected ICheckboxViewerWrapper createPropertiesViewer(Composite parent) {
        m_treeViewer = new CheckboxTreeViewer(parent,
                SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
        m_treeViewer.setContentProvider(new PropertyAdapterContentProvider());
        m_treeViewer.setLabelProvider(new PropertyAdapterLabelProvider(m_treeViewer));
        m_treeViewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                if (m_orderPropertiesViewer != null) {
                    PropertyAdapter adapter = (PropertyAdapter) event.getElement();
                    //
                    if (event.getChecked()) {
                        m_orderProperties.add(adapter);
                    } else {
                        m_orderProperties.remove(adapter);
                    }
                    //
                    m_orderPropertiesViewer.refresh();
                }
            }
        });
        return new CheckboxTreeViewerWrapper(m_treeViewer);
    }

    @Override
    protected void configureDND() {
        configureDND(m_orderPropertiesViewer, m_orderProperties);
    }

    @Override
    protected void calculateUpDowButtons() {
        calculateUpDowButtons(m_orderPropertiesViewer, m_orderProperties);
    }

    @Override
    protected void handleMoveElement(boolean up) {
        handleMoveElement(up, m_orderPropertiesViewer, m_orderProperties);
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Update
    //
    ////////////////////////////////////////////////////////////////////////////
    protected void setClassNameAndProperties(Class<?> beanClass, String beanClassName, List<String> properties)
            throws Exception {
        if (beanClassName == null) {
            setClassName(CoreUtils.getClassName(beanClass));
        } else {
            setClassName(beanClassName);
        }
        //
        ClassLoader classLoader = JavaInfoUtils.getClassLoader(EditorState.getActiveJavaInfo());
        BeanSupport beanSupport = new BeanSupport(classLoader, null);
        BeanBindableInfo beanObjectInfo = new BeanBindableInfo(beanSupport, null, beanClass, null,
                (IObservePresentation) null);
        //
        Object[] adapters = new Object[properties.size()];
        for (int i = 0; i < adapters.length; i++) {
            adapters[i] = convertPropertyToAdapter(beanObjectInfo.resolvePropertyReference(properties.get(i)));
        }
        //
        setCheckedAndExpand(adapters);
        //
        if (m_orderPropertiesViewer != null) {
            CollectionUtils.addAll(m_orderProperties, adapters);
            m_orderPropertiesViewer.refresh();
        }
        //
        calculatePropertiesFinish();
    }

    protected final void setCheckedAndExpand(Object[] adapters) {
        for (int i = 0; i < adapters.length; i++) {
            if (adapters[i] == null) {
                return;
            }
            m_treeViewer.expandToLevel(adapters[i], 0);
        }
        m_treeViewer.setCheckedElements(adapters);
        if (adapters.length > 0) {
            m_treeViewer.setSelection(new StructuredSelection(adapters[0]), true);
        }
    }

    protected ObservePropertyAdapter convertPropertyToAdapter(IObserveInfo observe) throws Exception {
        if (observe instanceof PropertyBindableInfo) {
            PropertyBindableInfo property = (PropertyBindableInfo) observe;
            ObservePropertyAdapter adapter = new ObservePropertyAdapter(
                    convertPropertyToAdapter(property.getParent()), property);
            adapter.addToParent();
            return adapter;
        }
        return null;
    }

    @Override
    protected final List<PropertyAdapter> getChoosenProperties() {
        return m_orderProperties;
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Properties
    //
    ////////////////////////////////////////////////////////////////////////////
    @Override
    protected List<PropertyAdapter> getProperties(Class<?> choosenClass) throws Exception {
        m_orderProperties.clear();
        if (m_orderPropertiesViewer != null) {
            m_orderPropertiesViewer.refresh();
        }
        //
        List<PropertyAdapter> adapters = Lists.newArrayList();
        //
        ClassLoader classLoader = JavaInfoUtils.getClassLoader(EditorState.getActiveJavaInfo());
        BeanSupport beanSupport = new BeanSupport(classLoader, null);
        BeanBindableInfo beanObjectInfo = new BeanBindableInfo(beanSupport, null, choosenClass, null,
                (IObservePresentation) null);
        //
        for (PropertyBindableInfo property : beanSupport.getProperties(beanObjectInfo)) {
            adapters.add(new ObservePropertyAdapter(null, property));
        }
        //
        return adapters;
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Classes
    //
    ////////////////////////////////////////////////////////////////////////////
    public static class ObservePropertyAdapter extends PropertyAdapter {
        private final ObservePropertyAdapter m_parent;
        protected final BindableInfo m_property;
        protected List<ObservePropertyAdapter> m_children;
        public String fullName;

        ////////////////////////////////////////////////////////////////////////////
        //
        // Constructor
        //
        ////////////////////////////////////////////////////////////////////////////
        public ObservePropertyAdapter(ObservePropertyAdapter parent, BindableInfo property) throws Exception {
            super(property.getPresentation().getText(), property.getObjectType());
            m_parent = parent;
            m_property = property;
            if (m_parent == null) {
                fullName = getName();
            } else {
                fullName = m_parent.fullName + "." + getName();
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        // Access
        //
        ////////////////////////////////////////////////////////////////////////////
        public ObservePropertyAdapter getParent() {
            return m_parent;
        }

        public BindableInfo getProperty() {
            return m_property;
        }

        public List<ObservePropertyAdapter> getChildren() {
            if (m_children == null) {
                m_children = Lists.newArrayList();
                List<BindableInfo> properties = CoreUtils
                        .cast(m_property.getChildren(ChildrenContext.ChildrenForPropertiesTable));
                for (BindableInfo property : properties) {
                    try {
                        m_children.add(new ObservePropertyAdapter(this, property));
                    } catch (Throwable e) {
                        DesignerPlugin.log(e);
                    }
                }
            }
            return m_children;
        }

        public void setChildren(List<ObservePropertyAdapter> children) {
            m_children = children;
        }

        public void addToParent() {
            if (m_parent != null) {
                m_parent.m_children = Lists.newArrayList();
                m_parent.m_children.add(this);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        // Object
        //
        ////////////////////////////////////////////////////////////////////////////
        @Override
        public int hashCode() {
            int parentHash = m_parent == null ? 1 : m_parent.hashCode();
            return parentHash * super.hashCode();
        }

        @Override
        public boolean equals(Object object) {
            // self check
            if (object == this) {
                return true;
            }
            // compare with other adapter
            if (object instanceof ObservePropertyAdapter) {
                ObservePropertyAdapter adapter = (ObservePropertyAdapter) object;
                if (m_parent == null && adapter.m_parent == null) {
                } else if (m_parent != null && adapter.m_parent == null
                        || m_parent == null && adapter.m_parent != null) {
                    return false;
                } else if (m_parent != null && adapter.m_parent != null) {
                    if (!m_parent.equals(adapter.m_parent)) {
                        return false;
                    }
                }
                return m_name.equals(adapter.m_name) && m_type == adapter.m_type;
            }
            // default
            return false;
        }
    }

    private static class PropertyAdapterContentProvider implements ITreeContentProvider {
        public Object[] getElements(Object input) {
            return ((List<?>) input).toArray();
        }

        public Object getParent(Object element) {
            return getAdapter(element).getParent();
        }

        public boolean hasChildren(Object element) {
            return !getAdapter(element).getChildren().isEmpty();
        }

        public Object[] getChildren(Object element) {
            return getAdapter(element).getChildren().toArray();
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }
    }

    private static class PropertyAdapterLabelProvider extends LabelProvider
            implements IColorProvider, IFontProvider {
        private final ObserveDecoratingLabelProvider m_labelProvider;

        ////////////////////////////////////////////////////////////////////////////
        //
        // Constructor
        //
        ////////////////////////////////////////////////////////////////////////////
        public PropertyAdapterLabelProvider(StructuredViewer viewer) {
            m_labelProvider = new ObserveDecoratingLabelProvider(viewer);
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        // LabelProvider
        //
        ////////////////////////////////////////////////////////////////////////////
        @Override
        public void dispose() {
            super.dispose();
            m_labelProvider.dispose();
        }

        @Override
        public String getText(Object element) {
            return getAdapter(element).getName();
        }

        @Override
        public Image getImage(Object element) {
            try {
                return getAdapterProperty(element).getPresentation().getImage();
            } catch (Throwable e) {
            }
            return super.getImage(element);
        }

        ////////////////////////////////////////////////////////////////////////////
        //
        // Decoration
        //
        ////////////////////////////////////////////////////////////////////////////
        public Color getForeground(Object element) {
            return m_labelProvider.getForeground(getAdapterProperty(element));
        }

        public Color getBackground(Object element) {
            return m_labelProvider.getBackground(getAdapterProperty(element));
        }

        public Font getFont(Object element) {
            return m_labelProvider.getFont(getAdapterProperty(element));
        }
    }

    private static ObservePropertyAdapter getAdapter(Object element) {
        return (ObservePropertyAdapter) element;
    }

    private static BindableInfo getAdapterProperty(Object element) {
        return getAdapter(element).getProperty();
    }
}