de.walware.ecommons.emf.ui.forms.DropDownProperty.java Source code

Java tutorial

Introduction

Here is the source code for de.walware.ecommons.emf.ui.forms.DropDownProperty.java

Source

/*=============================================================================#
 # Copyright (c) 2012-2014 Stephan Wahlbrink (WalWare.de) and others.
 # 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:
 #     Stephan Wahlbrink - initial API and implementation
 #=============================================================================*/

package de.walware.ecommons.emf.ui.forms;

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

import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.databinding.edit.IEMFEditValueProperty;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

import de.walware.ecommons.emf.core.util.IEMFEditContext;
import de.walware.ecommons.emf.ui.databinding.CustomViewerObservables;
import de.walware.ecommons.emf.ui.databinding.DetailContext;
import de.walware.ecommons.ui.util.LayoutUtil;

public class DropDownProperty extends EFProperty {

    private Composite fComposite;

    private ComboViewer fComboViewer;

    private DetailStack fDetailStack;

    private IObservableValue fModelObservable;

    private final List<Object> fInitialInput;

    public DropDownProperty(final String label, final String tooltip, final EClass eClass,
            final EStructuralFeature eFeature) {
        super(label, tooltip, eClass, eFeature);

        fInitialInput = createInitialInput();
    }

    protected List<Object> createInitialInput() {
        return Collections.emptyList();
    }

    @Override
    public void create(final Composite parent, final IEFFormPage page) {
        final EFToolkit toolkit = page.getToolkit();

        toolkit.createPropLabel(parent, getLabel(), getTooltip());

        fComposite = new Composite(parent, SWT.NULL);
        toolkit.adapt(fComposite);
        fComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
        fComposite.setLayout(LayoutUtil.createCompositeGrid(3));

        {
            final ComboViewer viewer = new ComboViewer(fComposite, SWT.READ_ONLY | SWT.DROP_DOWN | SWT.SINGLE);
            fComboViewer = viewer;

            final ILabelProvider labelProvider = createLabelProvider(page);

            viewer.setLabelProvider(labelProvider);
            viewer.setContentProvider(ArrayContentProvider.getInstance());

            final GridData gd = new GridData(SWT.FILL, SWT.CENTER, false, false);
            gd.widthHint = LayoutUtil.hintWidth(getCombo(), fInitialInput, labelProvider);
            viewer.getControl().setLayoutData(gd);
        }

        fDetailStack = createDetails(fComposite, page);
        fDetailStack.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
    }

    @Override
    public Control getControl() {
        return fComposite;
    }

    protected Combo getCombo() {
        return fComboViewer.getCombo();
    }

    protected ILabelProvider createLabelProvider(final IEFFormPage page) {
        return new AdapterFactoryLabelProvider(page.getEditor().getAdapterFactory());
    }

    protected DetailStack createDetails(final Composite parent, final IEFFormPage page) {
        return new DetailStack(page, fComposite);
    }

    @Override
    public void bind(final IEMFEditContext context) {
        super.bind(context);

        final IEMFEditValueProperty emfProperty = EMFEditProperties.value(getEditingDomain(), getEFeature());
        fModelObservable = emfProperty.observeDetail(getBaseObservable());

        context.getDataBindingContext().bindValue(
                CustomViewerObservables.observeComboSelection(fComboViewer, fInitialInput), fModelObservable);

        final IEMFEditContext detailContext = new DetailContext(context, fModelObservable);
        fDetailStack.setContext(detailContext);
    }

    @Override
    public IObservableValue getPropertyObservable() {
        return fModelObservable;
    }

}