| /******************************************************************************* |
| * Copyright (c) 2011-2013 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 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Edagr Mueller - initial API and implementation |
| * Eugen Neufeld - Refactoring |
| ******************************************************************************/ |
| package org.eclipse.emf.ecp.view.spi.core.swt; |
| |
| import org.eclipse.core.databinding.Binding; |
| import org.eclipse.emf.ecp.view.spi.context.ViewModelContext; |
| import org.eclipse.emf.ecp.view.spi.model.VControl; |
| import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider; |
| import org.eclipse.emfforms.spi.common.report.ReportService; |
| import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException; |
| import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding; |
| import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.events.DisposeEvent; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| |
| /** |
| * Renderer for {@link org.eclipse.swt.widgets.Control Controls} which uses a {@link Viewer}. |
| * |
| * @author Eugen Neufeld |
| * |
| */ |
| public abstract class SimpleControlJFaceViewerSWTRenderer extends SimpleControlSWTRenderer { |
| |
| private Binding[] bindings; |
| private Viewer viewer; |
| |
| /** |
| * Default constructor. |
| * |
| * @param vElement the view model element to be rendered |
| * @param viewContext the view context |
| * @param reportService The {@link ReportService} |
| * @param emfFormsDatabinding The {@link EMFFormsDatabinding} |
| * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider} |
| * @param vtViewTemplateProvider The {@link VTViewTemplateProvider} |
| * @since 1.6 |
| */ |
| public SimpleControlJFaceViewerSWTRenderer(VControl vElement, ViewModelContext viewContext, |
| ReportService reportService, |
| EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider, |
| VTViewTemplateProvider vtViewTemplateProvider) { |
| super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider); |
| } |
| |
| /** |
| * Creates the control itself. |
| * |
| * @param parent the {@link Composite} to render onto |
| * @return the rendered control |
| * @throws DatabindingFailedException if the creation of the control fails due to failed databinding |
| */ |
| @Override |
| protected final Control createControl(Composite parent) throws DatabindingFailedException { |
| viewer = createJFaceViewer(parent); |
| bindings = createBindings(viewer); |
| |
| viewer.getControl().addDisposeListener(new DisposeListener() { |
| |
| @Override |
| public void widgetDisposed(DisposeEvent e) { |
| disposeBindings(); |
| } |
| }); |
| return viewer.getControl(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.ecp.view.spi.core.swt.AbstractControlSWTRenderer#rootDomainModelChanged() |
| */ |
| @Override |
| protected void rootDomainModelChanged() throws DatabindingFailedException { |
| disposeBindings(); |
| bindings = createBindings(viewer); |
| } |
| |
| /** |
| * Disposes all bindings of this renderer. |
| */ |
| private void disposeBindings() { |
| if (bindings != null) { |
| for (final Binding binding : bindings) { |
| binding.dispose(); |
| } |
| } |
| } |
| |
| /** |
| * Create the {@link Binding Bindings} for this controls. |
| * |
| * @param viewer the {@link Viewer} to create the binding for |
| * @return all the bindings created by this renderer |
| * @throws DatabindingFailedException if the creation of the bindings failed |
| * @since 1.6 |
| */ |
| protected abstract Binding[] createBindings(Viewer viewer) throws DatabindingFailedException; |
| |
| /** |
| * Creates the {@link Viewer}. |
| * |
| * @param parent the {@link Composite} to use as a parent |
| * @return the created {@link Viewer} |
| * @throws DatabindingFailedException if the databinding fails |
| * @since 1.6 |
| */ |
| protected abstract Viewer createJFaceViewer(Composite parent) throws DatabindingFailedException; |
| |
| } |