Skip to content

Content of file LabelSWTRenderer.java

/**
 * 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:
 * Eugen Neufeld - initial API and implementation
 */
package org.eclipse.emf.ecp.view.spi.label.swt;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.inject.Inject;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.label.model.VLabel;
import org.eclipse.emf.ecp.view.spi.label.model.VLabelStyle;
import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
import org.eclipse.emf.ecp.view.spi.swt.reporting.RenderingFailedReport;
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.fontProperties.model.VTFontPropertiesFactory;
import org.eclipse.emf.ecp.view.template.style.fontProperties.model.VTFontPropertiesStyleProperty;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
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.swt.core.AbstractSWTRenderer;
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.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; /** * Renders an {@link VLabel} to a SWT {@link Label}. * * @since 1.5 * */ public class LabelSWTRenderer extends AbstractSWTRenderer<VLabel> { private final EMFDataBindingContext dbc; private final EMFFormsDatabinding emfFormsDatabinding; private final VTViewTemplateProvider vtViewTemplateProvider; /** * Default Constructor. * * @param vElement the view element to be rendered * @param viewContext The view model context * @param reportService the ReportService to use * @param emfFormsDatabinding the EMFFormsDatabinding to use * @param vtViewTemplateProvider the VTViewTemplateProvider to use * @since 1.6 */ @Inject public LabelSWTRenderer(final VLabel vElement, final ViewModelContext viewContext, ReportService reportService, EMFFormsDatabinding emfFormsDatabinding, VTViewTemplateProvider vtViewTemplateProvider) { super(vElement, viewContext, reportService); this.emfFormsDatabinding = emfFormsDatabinding; this.vtViewTemplateProvider = vtViewTemplateProvider; dbc = new EMFDataBindingContext(); } private SWTGridDescription rendererGridDescription; private Font font; private org.eclipse.swt.graphics.Color labelColor; private Map<VLabelStyle, VTFontPropertiesStyleProperty> defaultStyles; private Composite parent; private EMFDataBindingContext dataBindingContext; /** * {@inheritDoc} * * @see org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer#dispose() */ @Override protected void dispose() { rendererGridDescription = null; if (font != null) { font.dispose(); } if (labelColor != null) { labelColor.dispose(); } if (dataBindingContext != null) { dataBindingContext.dispose(); dataBindingContext = null; } dbc.dispose(); super.dispose(); } /** * {@inheritDoc} * * @see org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer#getGridDescription(SWTGridDescription) */ @Override public SWTGridDescription getGridDescription(SWTGridDescription gridDescription) { if (rendererGridDescription == null) { rendererGridDescription = GridDescriptionFactory.INSTANCE.createSimpleGrid(1, 1, this); final SWTGridCell gridCell = rendererGridDescription.getGrid().get(0); gridCell.setVerticalGrab(false); gridCell.setVerticalFill(false); gridCell.setHorizontalFill(true); gridCell.setHorizontalGrab(true); } return rendererGridDescription; } @Override protected Control renderControl(SWTGridCell cell, Composite parent) throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { this.parent = parent; final Label label; if (getVElement().getStyle() == VLabelStyle.SEPARATOR) { label = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); } else { label = new Label(parent, SWT.NONE); setText(label); applyStyle(label); } return label; } private void setText(Label label) { if (getVElement().getDomainModelReference() != null) { try { final IObservableValue observableValue = emfFormsDatabinding .getObservableValue(getVElement().getDomainModelReference(), getViewModelContext().getDomainModel()); final ISWTObservableValue observeText = WidgetProperties.text().observe(label); final Binding binding = getDataBindingContext().bindValue(observeText, observableValue); label.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { binding.dispose(); } }); } catch (final DatabindingFailedException ex) { getReportService().report(new RenderingFailedReport(ex)); label.setText(ex.getMessage()); } } else { final IObservableValue modelValue = EMFEditObservables.observeValue( AdapterFactoryEditingDomain.getEditingDomainFor(getVElement()), getVElement(), VViewPackage.eINSTANCE.getElement_Label()); final IObservableValue targetValue = WidgetProperties.text().observe(label); dbc.bindValue(targetValue, modelValue); } } private DataBindingContext getDataBindingContext() { if (dataBindingContext == null) { dataBindingContext = new EMFDataBindingContext(); } return dataBindingContext; } /** * Applies the style defined in the StyleProperty. * * @param label the {@link Label} to apply the styles onto */ protected void applyStyle(Label label) { final VTFontPropertiesStyleProperty fontProperties = getFontProperty(); if (fontProperties == null) { return; } final FontData[] fD = label.getFont().getFontData(); int style = SWT.NORMAL; if (fontProperties.isBold()) { style = style | SWT.BOLD; } if (fontProperties.isItalic()) { style = style | SWT.ITALIC; } fD[0].setStyle(style); fD[0].setHeight(fontProperties.getHeight()); if (font != null) { font.dispose(); } if (labelColor != null) { labelColor.dispose(); } String fontName = fontProperties.getFontName(); if (fontName == null) { fontName = getDefaultFontName(label); } font = new Font(label.getDisplay(), fontName, fontProperties.getHeight(), style); label.setFont(font); labelColor = getColor(fontProperties.getColorHEX()); label.setForeground(labelColor); } private Color getColor(String colorHex) { final String redString = colorHex.substring(0, 2); final String greenString = colorHex.substring(2, 4); final String blueString = colorHex.substring(4, 6); final int red = Integer.parseInt(redString, 16); final int green = Integer.parseInt(greenString, 16); final int blue = Integer.parseInt(blueString, 16); return new Color(Display.getDefault(), red, green, blue); } private VTFontPropertiesStyleProperty getFontProperty() { VTFontPropertiesStyleProperty fontProperties; final Set<VTStyleProperty> styleProperties = vtViewTemplateProvider .getStyleProperties(getVElement(), getViewModelContext()); for (final VTStyleProperty styleProperty : styleProperties) { if (VTFontPropertiesStyleProperty.class.isInstance(styleProperty)) { fontProperties = VTFontPropertiesStyleProperty.class .cast(styleProperty); return fontProperties; } } fontProperties = getDefaultFontProperties().get(getVElement().getStyle()); return fontProperties; } private Map<VLabelStyle, VTFontPropertiesStyleProperty> getDefaultFontProperties() { if (defaultStyles == null) { defaultStyles = new HashMap<VLabelStyle, VTFontPropertiesStyleProperty>(); final String defaultFontName = parent.getDisplay().getSystemFont().getFontData()[0].getName(); defaultStyles.put(VLabelStyle.H0, createStyle(false, false, "000000", defaultFontName, 10)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H1, createStyle(false, false, "000000", defaultFontName, 12)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H2, createStyle(false, false, "000000", defaultFontName, 14)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H3, createStyle(true, true, "000000", defaultFontName, 10)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H4, createStyle(true, false, "000000", defaultFontName, 10)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H5, createStyle(true, false, "000000", defaultFontName, 12)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H6, createStyle(true, false, "000000", defaultFontName, 14)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H7, createStyle(false, true, "000000", defaultFontName, 10)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H8, createStyle(false, true, "000000", defaultFontName, 12)); //$NON-NLS-1$ defaultStyles.put(VLabelStyle.H9, createStyle(false, true, "000000", defaultFontName, 14)); //$NON-NLS-1$ } return defaultStyles; } private VTFontPropertiesStyleProperty createStyle(boolean bold, boolean italic, String colorHex, String fontName, int fontHeight) { final VTFontPropertiesStyleProperty fontProp = VTFontPropertiesFactory.eINSTANCE .createFontPropertiesStyleProperty(); fontProp.setBold(bold); fontProp.setColorHEX(colorHex); // "ff0000" fontProp.setFontName(fontName); fontProp.setHeight(fontHeight); fontProp.setItalic(italic); return fontProp; } }