blob: 6d0a6073218ae9bc8b1fb06465ff801376a5c112 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.eef.ide.ui.internal.widgets;
import java.util.Optional;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.eef.EEFCheckboxDescription;
import org.eclipse.eef.EEFCheckboxStyle;
import org.eclipse.eef.EEFWidgetDescription;
import org.eclipse.eef.EEFWidgetStyle;
import org.eclipse.eef.common.ui.api.EEFWidgetFactory;
import org.eclipse.eef.common.ui.api.IEEFFormContainer;
import org.eclipse.eef.common.ui.api.SWTUtils;
import org.eclipse.eef.core.api.EditingContextAdapter;
import org.eclipse.eef.core.api.controllers.EEFControllersFactory;
import org.eclipse.eef.core.api.controllers.IEEFCheckboxController;
import org.eclipse.eef.core.api.controllers.IEEFWidgetController;
import org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager;
import org.eclipse.eef.ide.ui.api.widgets.EEFStyleHelper;
import org.eclipse.eef.ide.ui.api.widgets.EEFStyleHelper.IEEFTextStyleCallback;
import org.eclipse.eef.ide.ui.internal.EEFIdeUiPlugin;
import org.eclipse.sirius.common.interpreter.api.IInterpreter;
import org.eclipse.sirius.common.interpreter.api.IVariableManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* This class will be used in order to manager the lifecycle of a checkbox.
*
* @author mbats
*/
public class EEFCheckboxLifecycleManager extends AbstractEEFWidgetLifecycleManager {
/**
* The description.
*/
private EEFCheckboxDescription description;
/**
* The checkbox.
*/
private Button checkbox;
/**
* The controller.
*/
private IEEFCheckboxController controller;
/**
* The listener on the checkbox.
*/
private SelectionListener selectionListener;
/**
* The reference value of the checkbox, as last rendered from the state of the actual model.
*/
private boolean referenceValue;
/**
* The constructor.
*
* @param description
* The description
* @param variableManager
* The variable manager
* @param interpreter
* The interpreter
* @param editingContextAdapter
* The editing context adapter
*/
public EEFCheckboxLifecycleManager(EEFCheckboxDescription description, IVariableManager variableManager, IInterpreter interpreter,
EditingContextAdapter editingContextAdapter) {
super(variableManager, interpreter, editingContextAdapter);
this.description = description;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#createMainControl(org.eclipse.swt.widgets.Composite,
* org.eclipse.eef.common.ui.api.IEEFFormContainer)
*/
@Override
protected void createMainControl(Composite parent, IEEFFormContainer formContainer) {
EEFWidgetFactory widgetFactory = formContainer.getWidgetFactory();
this.checkbox = widgetFactory.createButton(parent, "", SWT.CHECK); //$NON-NLS-1$
GridData gridData = new GridData();
gridData.horizontalIndent = VALIDATION_MARKER_OFFSET;
this.checkbox.setLayoutData(gridData);
this.controller = new EEFControllersFactory().createCheckboxController(this.description, this.variableManager, this.interpreter,
this.editingContextAdapter);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#needSeparatedLabel()
*/
@Override
protected boolean needSeparatedLabel() {
return false;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#getController()
*/
@Override
protected IEEFWidgetController getController() {
return this.controller;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#getValidationControl()
*/
@Override
protected Control getValidationControl() {
return this.checkbox;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.internal.widgets.AbstractEEFWidgetLifecycleManager#getWidgetDescription()
*/
@Override
protected EEFWidgetDescription getWidgetDescription() {
return this.description;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.IEEFLifecycleManager#aboutToBeShown()
*/
@Override
public void aboutToBeShown() {
super.aboutToBeShown();
this.getController().onNewLabel((value) -> {
if (!this.checkbox.isDisposed() && !(this.checkbox.getText() != null && this.checkbox.getText().equals(value))) {
this.checkbox.setText(Optional.ofNullable(value).orElse("")); //$NON-NLS-1$
}
});
// UI edited by user => update model if possible, revert UI change otherwise
this.selectionListener = SWTUtils.widgetSelectedAdapter((event) -> {
IStatus result = controller.updateValue(checkbox.getSelection());
if (result != null && result.getSeverity() == IStatus.ERROR) {
EEFIdeUiPlugin.INSTANCE.log(result);
checkbox.setSelection(referenceValue);
} else {
refresh();
}
});
this.checkbox.addSelectionListener(this.selectionListener);
// Model changed => update UI
this.controller.onNewValue((value) -> {
if (!checkbox.isDisposed()) {
if (value != null && checkbox.getSelection() != value.booleanValue()) {
checkbox.setSelection(value.booleanValue());
referenceValue = value.booleanValue();
}
}
});
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.IEEFLifecycleManager#aboutToBeHidden()
*/
@Override
public void aboutToBeHidden() {
super.aboutToBeHidden();
if (!checkbox.isDisposed()) {
this.checkbox.removeSelectionListener(this.selectionListener);
}
this.controller.removeNewValueConsumer();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#refresh()
*/
@Override
public void refresh() {
super.refresh();
EEFStyleHelper styleHelper = new EEFStyleHelper(this.interpreter, this.variableManager);
EEFWidgetStyle widgetStyle = styleHelper.getWidgetStyle(this.description);
if (widgetStyle instanceof EEFCheckboxStyle) {
EEFCheckboxStyle style = (EEFCheckboxStyle) widgetStyle;
IEEFTextStyleCallback callback = new EEFCheckboxStyleCallback(this.checkbox);
styleHelper.applyTextStyle(style.getLabelFontNameExpression(), style.getLabelFontSizeExpression(), style.getLabelFontStyleExpression(),
this.checkbox.getFont(), style.getLabelBackgroundColorExpression(), style.getLabelForegroundColorExpression(), callback);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#setEnabled(boolean)
*/
@Override
protected void setEnabled(boolean isEnabled) {
if (!this.checkbox.isDisposed()) {
this.checkbox.setEnabled(isEnabled);
}
}
}