blob: 695e6a64b2cddebd624566b1eb2e06d6746b34a6 [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.EEFButtonDescription;
import org.eclipse.eef.EEFWidgetDescription;
import org.eclipse.eef.common.ui.api.EEFWidgetFactory;
import org.eclipse.eef.common.ui.api.IEEFFormContainer;
import org.eclipse.eef.core.api.EditingContextAdapter;
import org.eclipse.eef.core.api.controllers.EEFControllersFactory;
import org.eclipse.eef.core.api.controllers.IEEFButtonController;
import org.eclipse.eef.core.api.controllers.IEEFWidgetController;
import org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager;
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.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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 button.
*
* @author pcdavid
*/
public class EEFButtonLifecycleManager extends AbstractEEFWidgetLifecycleManager {
/**
* The minimum width of the button.
*/
private static final int MINIMUM_BUTTON_WIDTH = 80;
/**
* The description.
*/
private EEFButtonDescription description;
/**
* The button.
*/
private Button button;
/**
* The controller.
*/
private IEEFButtonController controller;
/**
* The listener on the button.
*/
private SelectionListener selectionListener;
/**
* The constructor.
*
* @param description
* The description
* @param variableManager
* The variable manager
* @param interpreter
* The interpreter
* @param editingContextAdapter
* The editing context adapter
*/
public EEFButtonLifecycleManager(EEFButtonDescription 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.button = widgetFactory.createButton(parent, "", SWT.NONE); //$NON-NLS-1$
GridData gridData = new GridData();
gridData.minimumWidth = MINIMUM_BUTTON_WIDTH;
gridData.horizontalIndent = VALIDATION_MARKER_OFFSET;
this.button.setLayoutData(gridData);
widgetFactory.paintBordersFor(parent);
this.controller = new EEFControllersFactory().createButtonController(this.description, this.variableManager, this.interpreter,
this.editingContextAdapter);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#getLabelVerticalAlignment()
*/
@Override
protected int getLabelVerticalAlignment() {
return GridData.VERTICAL_ALIGN_CENTER;
}
/**
* {@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.internal.widgets.AbstractEEFWidgetLifecycleManager#getWidgetDescription()
*/
@Override
protected EEFWidgetDescription getWidgetDescription() {
return this.description;
}
@Override
public void aboutToBeShown() {
super.aboutToBeShown();
this.selectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!EEFButtonLifecycleManager.this.container.isRenderingInProgress()) {
IStatus result = controller.pushed();
if (result != null && result.getSeverity() == IStatus.ERROR) {
EEFIdeUiPlugin.INSTANCE.log(result);
} else {
refresh();
}
}
}
};
this.button.addSelectionListener(this.selectionListener);
this.controller.onNewButtonLabel((value) -> {
if (!button.isDisposed() && !(button.getText() != null && button.getText().equals(value))) {
button.setText(Optional.ofNullable(value).orElse("")); //$NON-NLS-1$
}
});
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#getValidationControl()
*/
@Override
protected Control getValidationControl() {
return this.button;
}
@Override
public void aboutToBeHidden() {
super.aboutToBeHidden();
if (!button.isDisposed()) {
this.button.removeSelectionListener(this.selectionListener);
}
this.controller.removeNewButtonLabelConsumer();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.eef.ide.ui.api.widgets.AbstractEEFWidgetLifecycleManager#setEnabled(boolean)
*/
@Override
protected void setEnabled(boolean isEnabled) {
if (!this.button.isDisposed()) {
this.button.setEnabled(isEnabled);
}
}
}