org.eclipse.emf.ecp.edit.internal.swt.controls.AbstractTextControl.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.ecp.edit.internal.swt.controls.AbstractTextControl.java

Source

/*******************************************************************************
 * 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 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.edit.internal.swt.controls;

import java.util.Set;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.ecp.edit.internal.swt.Activator;
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.textControlEnablement.model.VTTextControlEnablementStyleProperty;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emfforms.spi.localization.LocalizationServiceHelper;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolTip;

/**
 * This abstract class is used as a common superclass for all widgets that use a {@link Text} widget.
 *
 * @author Eugen Neufeld
 */
@Deprecated
public abstract class AbstractTextControl extends SingleControl {

    /**
     * The {@link Text} holding the value.
     */
    private Text text;
    private boolean doVerify;

    @Override
    protected void updateValidationColor(Color color) {
        text.setBackground(color);
    }

    @Override
    protected void fillControlComposite(Composite composite) {
        doVerify = false;
        createTextWidget(composite);
        addControlDecoration(text);
    }

    private void createTextWidget(Composite composite) {
        text = new Text(composite, getTextWidgetStyle());
        text.setLayoutData(getTextWidgetLayoutData());

        if (getFirstStructuralFeature().isUnsettable()) {
            text.setMessage(LocalizationServiceHelper.getString(getClass(),
                    DepricatedControlMessageKeys.AbstractTextControl_Unset));
        }
        text.setData(CUSTOM_VARIANT, getTextVariantID());
        customizeText(text);

    }

    /**
     * Creates a {@link ToolTip}.
     *
     * @param style the SWT style
     * @param text the text
     * @param message the message
     * @return a {@link ToolTip}
     */
    protected ToolTip createToolTip(int style, String text, String message) {
        final ToolTip toolTip = new ToolTip(this.text.getShell(), style);
        toolTip.setText(text);
        toolTip.setMessage(message);
        return toolTip;

    }

    /**
     * This method allows to set custom values to the text field, e.g. a tooltip or a validation.
     *
     * @param text the text widget to customize
     */
    protected void customizeText(Text text) {

    }

    /**
     * The VariantId to use e.g. for RAP
     *
     * @return the String identifying this control
     */
    protected abstract String getTextVariantID();

    /**
     * The LayoutData for the created {@link Text} widget. Can be changed by the concrete classes.
     *
     * @return the {@link GridData} to apply
     */
    protected GridData getTextWidgetLayoutData() {
        return new GridData(SWT.FILL, SWT.FILL, true, true);
    }

    /**
     * The style to apply to the text widget. This can be changed by the concrete classes.
     *
     * @return the style to apply
     */
    protected int getTextWidgetStyle() {
        return SWT.SINGLE | SWT.BORDER;
    }

    @Override
    protected Control[] getControlsForTooltip() {
        // return new Control[] { text };
        return new Control[0];
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setEditable(boolean isEditable) {
        if (isDisableRenderedAsEditable()) {
            text.setEditable(isEditable);
        }
        text.setEnabled(isEditable);
    }

    private boolean isDisableRenderedAsEditable() {
        final VTViewTemplateProvider vtViewTemplateProvider = Activator.getDefault().getVTViewTemplateProvider();
        if (vtViewTemplateProvider == null) {
            return false;
        }
        final Set<VTStyleProperty> styleProperties = vtViewTemplateProvider.getStyleProperties(getControl(),
                getViewModelContext());
        for (final VTStyleProperty styleProperty : styleProperties) {
            if (VTTextControlEnablementStyleProperty.class.isInstance(styleProperty)) {
                return VTTextControlEnablementStyleProperty.class.cast(styleProperty).isRenderDisableAsEditable();
            }
        }
        return false;
    }

    @Override
    public Binding bindValue() {
        final IObservableValue value = SWTObservables.observeText(text, SWT.FocusOut);
        final TargetToModelUpdateStrategy targetToModelUpdateStrategy = new TargetToModelUpdateStrategy();
        final ModelToTargetUpdateStrategy modelToTargetUpdateStrategy = new ModelToTargetUpdateStrategy();
        final Binding binding = getDataBindingContext().bindValue(value, getModelValue(),
                targetToModelUpdateStrategy, modelToTargetUpdateStrategy);

        createTooltipBinding(targetToModelUpdateStrategy, modelToTargetUpdateStrategy);

        return binding;
    }

    /**
     * Creates a tooltip binding for this control.
     *
     * @param targetToModel the {@link UpdateValueStrategy} from target to Model
     * @param modelToTarget the {@link UpdateValueStrategy} from model to target
     * @return the created {@link Binding}
     */
    protected Binding createTooltipBinding(UpdateValueStrategy targetToModel, UpdateValueStrategy modelToTarget) {
        final IObservableValue toolTip = WidgetProperties.tooltipText().observe(text);
        return getDataBindingContext().bindValue(toolTip, getModelValue(), targetToModel, modelToTarget);
    }

    /**
     * Sets the content of the SWT text control to the given string without calling {@link #validateString(String)}.
     *
     * @param string
     *            the content of the SWT Text control
     */
    protected void setUnvalidatedString(String string) {
        final boolean oldDoVerify = doVerify;
        doVerify = false;
        text.setText(string);
        doVerify = oldDoVerify;
    }

    @Override
    public void dispose() {
        text.dispose();
        super.dispose();
    }

    /**
     * @return the text
     */
    public Text getText() {
        return text;
    }

    /**
     * An {@link EMFUpdateConvertValueStrategy} that encapsulates the converting
     * of the actual value. Use this class to provide a specific context
     * for the conversion of the value, but likewise enable it clients to modify
     * the conversion behavior.
     *
     * @author emueller
     *
     */
    class EMFUpdateConvertValueStrategy extends EMFUpdateValueStrategy {

        /**
         * Constructor.
         */
        public EMFUpdateConvertValueStrategy() {
            super();
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.core.databinding.UpdateValueStrategy#convert(java.lang.Object)
         */
        @Override
        public Object convert(Object value) {
            return convertValue(value);
        }

        protected Object convertValue(Object value) {
            return super.convert(value);
        }
    }

    protected class ModelToTargetUpdateStrategy extends EMFUpdateConvertValueStrategy {

        @Override
        public Object convert(Object value) {
            // controlDecoration.hide();
            // updateValidationColor(null);
            return convertValue(value);
        }

    }

    protected class TargetToModelUpdateStrategy extends EMFUpdateConvertValueStrategy {

        @Override
        public IStatus validateAfterGet(Object value) {
            final IStatus status = super.validateAfterGet(value);
            // if (status.getSeverity() == IStatus.ERROR) {
            // controlDecoration.show();
            // controlDecoration.setDescriptionText(status.getMessage());
            // } else {
            // controlDecoration.hide();
            // controlDecoration.setDescriptionText(null);
            // }
            return status;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public Object convert(Object value) {
            try {

                // controlDecoration.hide();
                // updateValidationColor(null);
                if ("".equals(value)) { //$NON-NLS-1$
                    value = null;
                }
                if (value == null && getFirstStructuralFeature().isUnsettable()) {
                    return SetCommand.UNSET_VALUE;
                }

                final Object convertedValue = convertValue(value);

                return convertedValue;

            } catch (final IllegalArgumentException e) {
                // controlDecoration.show();
                // updateValidationColor(getText().getShell().getDisplay().getSystemColor(SWT.COLOR_RED));
                // controlDecoration.setDescriptionText(ControlMessages.AbstractTextControl_InvalidInputSpace
                // + e.getLocalizedMessage());
                throw e;
            }
        }
    }
}