/* * Copyright (c) 2010 Stiftung Deutsches Elektronen-Synchrotron, * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. * * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM */ package org.csstudio.sds.components.ui.internal.editparts; import static org.csstudio.sds.model.AbstractTextTypeWidgetModel.PROP_PRECISION; import static org.csstudio.sds.model.AbstractTextTypeWidgetModel.PROP_TEXT_TYPE; import static org.csstudio.sds.model.AbstractWidgetModel.PROP_ALIASES; import static org.csstudio.sds.model.AbstractWidgetModel.PROP_PRIMARY_PV; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; import org.csstudio.sds.model.AbstractTextTypeWidgetModel; import org.csstudio.sds.model.TextTypeEnum; import org.csstudio.sds.ui.editparts.AbstractWidgetEditPart; import org.csstudio.sds.ui.editparts.IWidgetPropertyChangeHandler; import org.csstudio.sds.ui.figures.ITextFigure; import org.csstudio.sds.util.ChannelReferenceValidationException; import org.csstudio.sds.util.ChannelReferenceValidationUtil; import org.eclipse.draw2d.IFigure; /** * Give two Properties for format a String representation. * * * @author hrickens * @author $Author: hrickens $ * @version $Revision: 1.6 $ * @since 11.05.2010 */ public abstract class AbstractTextTypeWidgetEditPart extends AbstractWidgetEditPart { /** * The actual figure will be surrounded with a small frame that can be used * to drag the figure around (even if the cell editor is activated). */ protected static final int FRAME_WIDTH = 1; /** * The input field will be slightly brighter than the actual figure so it * can be easily recognized. */ protected static final int INPUT_FIELD_BRIGHTNESS = 10; private final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); /** * * {@inheritDoc} */ @Override protected void registerPropertyChangeHandlers() { final IWidgetPropertyChangeHandler handle = new IWidgetPropertyChangeHandler() { @Override public boolean handleChange(final Object oldValue, final Object newValue, final IFigure refreshableFigure) { final ITextFigure labelFigure = (ITextFigure) refreshableFigure; labelFigure.setTextValue(determineLabel(null)); return true; } }; setPropertyChangeHandler(PROP_TEXT_TYPE, handle); // precision final IWidgetPropertyChangeHandler handler = new IWidgetPropertyChangeHandler() { @Override public boolean handleChange(final Object oldValue, final Object newValue, final IFigure refreshableFigure) { final ITextFigure labelFigure = (ITextFigure) refreshableFigure; labelFigure.setTextValue(determineLabel(PROP_PRECISION)); return true; } }; setPropertyChangeHandler(PROP_PRECISION, handler); // aliases final IWidgetPropertyChangeHandler aliasHandler = new IWidgetPropertyChangeHandler() { @Override public boolean handleChange(final Object oldValue, final Object newValue, final IFigure refreshableFigure) { final ITextFigure labelFigure = (ITextFigure) refreshableFigure; labelFigure.setTextValue(determineLabel(PROP_ALIASES)); return true; } }; setPropertyChangeHandler(PROP_ALIASES, aliasHandler); // primary pv final IWidgetPropertyChangeHandler pvHandler = new IWidgetPropertyChangeHandler() { @Override public boolean handleChange(final Object oldValue, final Object newValue, final IFigure refreshableFigure) { final ITextFigure labelFigure = (ITextFigure) refreshableFigure; labelFigure.setTextValue(determineLabel(PROP_ALIASES)); return true; } }; setPropertyChangeHandler(PROP_PRIMARY_PV, pvHandler); } /** * Format a String on the base of the properties PROP_TEXT_TYPE and PROP_PRECISION. * * @param updatedPropertyId the Property that was updated * @return the new string value */ protected String determineLabel(final String updatedPropertyId) { final AbstractTextTypeWidgetModel model = (AbstractTextTypeWidgetModel) getCastedModel(); final TextTypeEnum type = model.getValueType(); final String text = model.getStringValue(); String toprint = "none"; switch (type) { case TEXT: toprint = handleText(updatedPropertyId, model, text, toprint); break; case DOUBLE: toprint = handleDouble(updatedPropertyId, model, text, toprint); break; case ALIAS: toprint = handleAlias(updatedPropertyId, model, toprint); break; case HEX: toprint = handleHex(updatedPropertyId, model, text, toprint); break; case EXP: toprint = handleExp(updatedPropertyId, model, text, toprint); break; default: toprint = "unknown value type"; } return toprint; } /** * @param updatedPropertyId * @param model * @param text * @param toprint * @return */ protected String handleText(final String updatedPropertyId, final AbstractTextTypeWidgetModel model, final String text, final String toprint) { if ( updatedPropertyId == null || updatedPropertyId.equals(model.getStringValueID())) { return text; } return toprint; } /** * @param updatedPropertyId * @param model * @param text * @param toprint * @return */ private String handleHex(final String updatedPropertyId, final AbstractTextTypeWidgetModel model, final String text, final String toprint) { if ( updatedPropertyId == null || updatedPropertyId.equals(model.getStringValueID())) { try { final long l = Long.parseLong(text); return Long.toHexString(l); } catch (final Exception e1) { try { final double d = Double.parseDouble(text); return Double.toHexString(d); } catch (final Exception e2) { return text; } } } return toprint; } /** * @param updatedPropertyId * @param model * @param text * @param toprint * @return */ private static String handleExp(final String updatedPropertyId, final AbstractTextTypeWidgetModel model, final String text, final String toprint) { if ( updatedPropertyId == null || updatedPropertyId.equals(model.getStringValueID()) || updatedPropertyId.equals(AbstractTextTypeWidgetModel.PROP_PRECISION)) { try { String pattern = "0."; for (int i = 0; i < model.getPrecision(); i++) { if (i == 0) { pattern = pattern.concat("0"); } else { pattern = pattern.concat("#"); } } pattern = pattern.concat("E00"); final DecimalFormat expFormat = new DecimalFormat(pattern); final double d = Double.parseDouble(text); return expFormat.format(d); } catch (final Exception e) { return text; } } return toprint; } /** * @param updatedPropertyId * @param model * @param toprint * @return */ private static String handleAlias(final String updatedPropertyId, final AbstractTextTypeWidgetModel model, final String toprint) { if ( updatedPropertyId == null || updatedPropertyId.equals(AbstractTextTypeWidgetModel.PROP_ALIASES) || updatedPropertyId.equals(AbstractTextTypeWidgetModel.PROP_PRIMARY_PV)) { try { return ChannelReferenceValidationUtil.createCanonicalName(model .getPrimaryPV(), model.getAllInheritedAliases()); } catch (final ChannelReferenceValidationException e) { return model.getPrimaryPV(); } } return toprint; } /** * @param updatedPropertyId * @param model * @param text * @param toprint * @return */ private String handleDouble(final String updatedPropertyId, final AbstractTextTypeWidgetModel model, final String text, final String toprint) { if ( updatedPropertyId == null || updatedPropertyId.equals(model.getStringValueID()) || updatedPropertyId.equals(AbstractTextTypeWidgetModel.PROP_PRECISION)) { try { final double d = Double.parseDouble(text); final int min = model.getPrecision(); numberFormat.setMinimumFractionDigits(min); numberFormat.setMaximumFractionDigits(model.getPrecision()); return numberFormat.format(d); } catch (final Exception e) { return text; } } return toprint; } }