/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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. */ package gov.redhawk.core.graphiti.ui.internal.preferences; import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; public class DoubleFieldEditor extends StringFieldEditor { /** * a 64-bit double has 15-17 decimal digit precision * + 7 (1 for decimal point, 1 for negative sign, 5 for E-xxx) */ static final int DEFAULT_TEXT_LIMIT = 24; private Double minValidValue; private Double maxValidValue; private final Composite parent; /** * Creates an double field editor. * @param name the name of the preference this field editor works on * @param labelText the label text of the field editor * @param parent the parent of the field editor's control */ public DoubleFieldEditor(String name, String labelText, Composite parent) { this(name, labelText, parent, DoubleFieldEditor.DEFAULT_TEXT_LIMIT); } /** * Creates an double field editor. * @param name the name of the preference this field editor works on * @param labelText the label text of the field editor * @param parent the parent of the field editor's control * @param textLimit the maximum number of characters in the text. */ public DoubleFieldEditor(String name, String labelText, Composite parent, int textLimit) { init(name, labelText); this.parent = parent; setTextLimit(textLimit); setEmptyStringAllowed(false); setErrorMessage(labelText + " " + JFaceResources.getString("not a valid double")); //$NON-NLS-1$ createControl(parent); } /** * Sets the range of valid values for this field. * @param min the minimum allowed value (inclusive) * @param max the maximum allowed value (inclusive) */ public void setValidRange(Double min, Double max) { minValidValue = min; maxValidValue = max; setErrorMessage(JFaceResources.format("Entry must be a value between {1} and {2}", //$NON-NLS-1$ new Object[] { getLabelText(), min, max })); } @Override protected boolean checkState() { Text text = getTextControl(); if (text == null) { return false; } String numberString = text.getText(); try { double number = Double.valueOf(numberString).doubleValue(); if ((minValidValue == null || number >= minValidValue) && (maxValidValue == null || number <= maxValidValue)) { clearErrorMessage(); return true; } showErrorMessage(); return false; } catch (NumberFormatException e1) { showErrorMessage(); } return false; } @Override protected void doLoad() { Text text = getTextControl(); if (text != null) { double value = getPreferenceStore().getDouble(getPreferenceName()); text.setText("" + value); //$NON-NLS-1$ oldValue = "" + value; //$NON-NLS-1$ } } @Override protected void doLoadDefault() { Text text = getTextControl(); if (text != null) { double value = getPreferenceStore().getDefaultDouble(getPreferenceName()); text.setText("" + value); //$NON-NLS-1$ } valueChanged(); } @Override protected void doStore() { Text text = getTextControl(); if (text != null) { Double i = new Double(text.getText()); getPreferenceStore().setValue(getPreferenceName(), i.doubleValue()); } } /** * Returns this field editor's current value as an double. * @return the value * @exception NumberFormatException if the <code>String</code> does not contain a parsable double */ public double getDoubleValue() throws NumberFormatException { return new Double(getStringValue()).doubleValue(); } public void setToolTipText(String toolTipText) { Text textControl = getTextControl(); if (textControl != null) { textControl.setToolTipText(toolTipText); } } public void addFocusListener(FocusListener listener) { getTextControl().addFocusListener(listener); } public void removeFocusListener(FocusListener listener) { getTextControl().removeFocusListener(listener); } public void setEnabled(boolean enabled) { setEnabled(enabled, this.parent); } }