org.eclipse.emf.ecp.view.spi.categorization.swt.AbstractSWTTabRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.ecp.view.spi.categorization.swt.AbstractSWTTabRenderer.java

Source

/*******************************************************************************
 * Copyright (c) 2011-2014 EclipseSource Muenchen GmbH 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:
 * Eugen Neufeld - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.view.spi.categorization.swt;

import java.util.Set;

import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecp.view.internal.categorization.swt.Activator;
import org.eclipse.emf.ecp.view.spi.categorization.model.VAbstractCategorization;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.model.VElement;
import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
import org.eclipse.emf.ecp.view.spi.model.reporting.StatusReport;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
import org.eclipse.emf.ecp.view.template.model.VTStyleProperty;
import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
import org.eclipse.emf.ecp.view.template.style.tab.model.VTTabStyleProperty;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
import org.eclipse.emfforms.spi.swt.core.EMFFormsNoRendererException;
import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererFactory;
import org.eclipse.emfforms.spi.swt.core.layout.GridDescriptionFactory;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * Abstract class for a tab renderer.
 *
 * @author Eugen Neufeld
 * @param <VELEMENT> the {@link VElement}
 */
public abstract class AbstractSWTTabRenderer<VELEMENT extends VElement> extends AbstractSWTRenderer<VELEMENT> {
    private final EMFFormsRendererFactory emfFormsRendererFactory;
    private final EMFDataBindingContext dataBindingContext;
    private final VTViewTemplateProvider viewTemplateProvider;

    private EMFFormsRendererFactory getEMFFormsRendererFactory() {
        return emfFormsRendererFactory;
    }

    /**
     * Default constructor.
     *
     * @param vElement the view model element to be rendered
     * @param viewContext the view context
     * @param reportService the {@link ReportService}
     * @param emfFormsRendererFactory The {@link EMFFormsRendererFactory}
     * @param viewTemplateProvider the {@link VTViewTemplateProvider}
     * @since 1.8
     */
    public AbstractSWTTabRenderer(VELEMENT vElement, ViewModelContext viewContext, ReportService reportService,
            EMFFormsRendererFactory emfFormsRendererFactory, VTViewTemplateProvider viewTemplateProvider) {
        super(vElement, viewContext, reportService);
        this.emfFormsRendererFactory = emfFormsRendererFactory;
        this.viewTemplateProvider = viewTemplateProvider;
        dataBindingContext = new EMFDataBindingContext();
    }

    /**
     * Returns the view template provider.
     *
     * @return the {@link VTViewTemplateProvider}
     * @since 1.8
     */
    protected final VTViewTemplateProvider getViewTemplateProvider() {
        return viewTemplateProvider;
    }

    @Override
    public SWTGridDescription getGridDescription(SWTGridDescription gridDescription) {
        return GridDescriptionFactory.INSTANCE.createSimpleGrid(1, 1, this);
    }

    @Override
    protected Control renderControl(SWTGridCell cell, Composite parent)
            throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
        final CTabFolder folder = new CTabFolder(parent, getTabFolderStyle());
        folder.setBackground(parent.getBackground());
        final EList<VAbstractCategorization> categorizations = getCategorizations();
        for (final VAbstractCategorization categorization : categorizations) {
            final CTabItem item = new CTabItem(folder, SWT.NULL);
            final ScrolledComposite scrolledComposite = new ScrolledComposite(folder, SWT.V_SCROLL | SWT.H_SCROLL);

            final IObservableValue modelValue = EMFEditObservables.observeValue(
                    AdapterFactoryEditingDomain.getEditingDomainFor(categorization), categorization,
                    VViewPackage.eINSTANCE.getElement_Label());
            final IObservableValue targetValue = WidgetProperties.text().observe(item);
            dataBindingContext.bindValue(targetValue, modelValue);

            AbstractSWTRenderer<VElement> renderer;
            try {
                renderer = getEMFFormsRendererFactory().getRendererInstance(categorization, getViewModelContext());
            } catch (final EMFFormsNoRendererException ex) {
                getReportService().report(new StatusReport(new Status(IStatus.INFO, Activator.PLUGIN_ID,
                        String.format("No Renderer for %s found.", categorization.eClass().getName(), ex)))); //$NON-NLS-1$
                return null;
            }
            final SWTGridDescription gridDescription = renderer
                    .getGridDescription(GridDescriptionFactory.INSTANCE.createEmptyGridDescription());
            for (final SWTGridCell gridCell : gridDescription.getGrid()) {
                final Control render = renderer.render(gridCell, scrolledComposite);
                GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(render);
                scrolledComposite.setExpandHorizontal(true);
                scrolledComposite.setExpandVertical(true);
                scrolledComposite.setContent(render);
                scrolledComposite.setMinSize(render.computeSize(SWT.DEFAULT, SWT.DEFAULT));

                item.setControl(scrolledComposite);
            }

        }
        if (folder.getItemCount() > 0) {
            folder.setSelection(0);
        }
        return folder;
    }

    private int getTabFolderStyle() {
        if (getViewTemplateProvider() == null) {
            return getDefaultFolderStyle();
        }
        final Set<VTStyleProperty> styleProperties = getViewTemplateProvider().getStyleProperties(getVElement(),
                getViewModelContext());
        for (final VTStyleProperty styleProperty : styleProperties) {
            if (!VTTabStyleProperty.class.isInstance(styleProperty)) {
                continue;
            }
            final VTTabStyleProperty style = VTTabStyleProperty.class.cast(styleProperty);
            switch (style.getType()) {
            case BOTTOM:
                return SWT.BOTTOM;
            case TOP:
                return SWT.TOP;
            default:
                return getDefaultFolderStyle();
            }
        }
        return getDefaultFolderStyle();
    }

    private int getDefaultFolderStyle() {
        return SWT.BOTTOM;
    }

    /**
     * The list of categorizations to display in the tree.
     *
     * @return the list of {@link VAbstractCategorization}
     */
    protected abstract EList<VAbstractCategorization> getCategorizations();

    /**
     * {@inheritDoc}
     *
     * @see org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer#dispose()
     */
    @Override
    protected void dispose() {
        dataBindingContext.dispose();
        super.dispose();
    }

}