| /******************************************************************************* |
| * Copyright (c) 2016 ALL4TEC & CEA LIST. |
| * 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: |
| * ALL4TEC & CEA LIST - initial API and implementation |
| ******************************************************************************/ |
| package org.polarsys.esf.core.common.ui.editingsupport; |
| |
| import java.math.BigDecimal; |
| import java.util.Map.Entry; |
| |
| import org.apache.commons.lang3.StringUtils; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.jface.viewers.CellEditor; |
| import org.eclipse.jface.viewers.ColumnViewer; |
| import org.eclipse.jface.viewers.EditingSupport; |
| import org.eclipse.jface.viewers.ICellEditorListener; |
| import org.eclipse.jface.viewers.ICellEditorValidator; |
| import org.eclipse.jface.viewers.TextCellEditor; |
| import org.eclipse.jface.viewers.ViewerCell; |
| import org.eclipse.swt.widgets.Composite; |
| import org.polarsys.esf.core.common.ui.CommonUIActivator; |
| import org.polarsys.esf.core.common.ui.statusline.StatusLinesUtil; |
| |
| |
| /** |
| * Implementation of editing support for set value of probability rule's parameters. |
| * |
| * @author $Author: jdumont $ |
| * @version $Revision: 83 $ |
| */ |
| public class ParameterValueEditingSupport |
| extends EditingSupport { |
| |
| /** Cell editor for parameter value. */ |
| private CellEditor mCellEditor = null; |
| |
| /** |
| * Default constructor. |
| * |
| * @param pViewer Viewer used to edit the rules parameter |
| */ |
| public ParameterValueEditingSupport(final ColumnViewer pViewer) { |
| super(pViewer); |
| |
| // Initialise the cell editor to use |
| initialiseCellEditor(); |
| } |
| |
| /** |
| * Initialise the cell editor, which will manage the value validation. |
| */ |
| private void initialiseCellEditor() { |
| // Create the cell editor |
| mCellEditor = new TextCellEditor((Composite) getViewer().getControl()); |
| |
| // Add a new validator to ensure that the value is correct |
| mCellEditor.setValidator(new ICellEditorValidator() { |
| |
| /** |
| * {@inheritDoc} |
| * |
| * A parameter value must be a numerical value. |
| */ |
| @Override |
| public String isValid(final Object pValue) { |
| |
| // Initialise result with valid state |
| String vMessage = null; |
| |
| // Verify if value is a non empty string |
| if ((pValue instanceof String) && StringUtils.isNotEmpty((String) pValue)) { |
| |
| |
| try { |
| // Check that value can be converted in big decimal |
| new BigDecimal((String) pValue); |
| |
| } catch (final NumberFormatException pException) { |
| // Set the error message top warn the user |
| vMessage = CommonUIActivator.getMessages() |
| .getString("ParameterValueEditingSupport.warning.notnumerical"); //$NON-NLS-1$ |
| } |
| } |
| |
| return vMessage; |
| } |
| }); |
| |
| |
| // Add a new listener on the cell editor to react to the value validation |
| // and display any message to the user |
| mCellEditor.addListener(new ICellEditorListener() { |
| |
| /** |
| * {@inheritDoc} |
| * |
| * This implementation aim is to display error message when the value is not valid. |
| */ |
| @Override |
| public void editorValueChanged(final boolean pOldValidState, final boolean pNewValidState) { |
| if (!pNewValidState) { |
| // The new state is not valid, thus display an error message |
| StatusLinesUtil.outputMessage(mCellEditor.getErrorMessage(), IStatus.WARNING); |
| } else { |
| // The new state is valid, clear the status message |
| StatusLinesUtil.clearMessage(); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void cancelEditor() { |
| // The new state is valid, clear the status message |
| StatusLinesUtil.clearMessage(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void applyEditorValue() { |
| // Nothing to do |
| } |
| }); |
| |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected CellEditor getCellEditor(final Object pElement) { |
| return mCellEditor; |
| |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| protected boolean canEdit(final Object pElement) { |
| return true; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * The rule's parameters are stored in a map, with the parameter |
| * name as key, and its value as value. The edited object is an entry |
| * of this map, and the value returned by this method must thus be the |
| * value of this entry. |
| */ |
| @Override |
| protected Object getValue(final Object pElement) { |
| Object vValue = null; |
| |
| // Check if the given object is an entry of a map |
| if (pElement instanceof Entry<?, ?>) { |
| // Get the value of this entry, which corresponds to the |
| // value of the edited parameter, as String |
| vValue = ((Entry<?, ?>) pElement).getValue(); |
| } |
| return vValue; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * The rule's parameters are stored in a map, with the parameter |
| * name as key, and its value as value. The edited object is an entry |
| * of this map, and the value to set must thus be the value of this entry. |
| */ |
| @Override |
| protected void setValue(final Object pElement, final Object pValue) { |
| // Check if the given object is an entry of a map |
| if (pElement instanceof Entry<?, ?>) { |
| // Update the entry value with the given value |
| ((Entry) pElement).setValue(pValue); |
| } |
| |
| // Update the viewer |
| getViewer().update(pElement, null); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * If there is no error the value is saved and the status line message is cleared. |
| * Otherwise, display an error message. |
| * |
| * @param pCellEditor The cell editor |
| * @param pViewerCell The cell on which the cell editor is working |
| */ |
| @Override |
| protected void saveCellEditorValue(final CellEditor pCellEditor, final ViewerCell pViewerCell) { |
| |
| // Check if the cell editor consider the value as valid |
| if (pCellEditor.isValueValid()) { |
| // Clear the status message |
| StatusLinesUtil.clearMessage(); |
| |
| // Call the parent method to save the value in the model |
| super.saveCellEditorValue(pCellEditor, pViewerCell); |
| |
| } else { |
| // The value is not valid, display an error message and don't save the new value |
| StatusLinesUtil.outputMessage(pCellEditor.getErrorMessage(), IStatus.WARNING); |
| } |
| } |
| } |