blob: 1128a10ede21844e57e0a2833ba9135a1d5c10f1 [file] [log] [blame]
/*******************************************************************************
* 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.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.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.typed.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 = getViewModelContext()
.getService(VTViewTemplateProvider.class);
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 = WidgetProperties.text(SWT.FocusOut).observe(text);
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.
*/
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;
}
}
}
}