/*
* NumericValueWidget.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.core.client.widget;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.*;
import org.rstudio.core.client.events.EnsureVisibleEvent;
import org.rstudio.core.client.events.EnsureVisibleHandler;
import org.rstudio.core.client.events.HasEnsureVisibleHandlers;
import org.rstudio.studio.client.RStudioGinjector;
public class NumericValueWidget extends Composite
implements HasValue<String>,
HasEnsureVisibleHandlers
{
public NumericValueWidget(String label)
{
FlowPanel flowPanel = new FlowPanel();
flowPanel.add(new SpanLabel(label, true));
textBox_ = new TextBox();
textBox_.setWidth("30px");
textBox_.getElement().getStyle().setMarginLeft(0.6, Unit.EM);
flowPanel.add(textBox_);
initWidget(flowPanel);
}
public String getValue()
{
return textBox_.getValue();
}
public void setValue(String value)
{
textBox_.setValue(value);
}
public void setValue(String value, boolean fireEvents)
{
textBox_.setValue(value, fireEvents);
}
public void setWidth(String width)
{
textBox_.setWidth(width);
}
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<String> handler)
{
return textBox_.addValueChangeHandler(handler);
}
public boolean validate(String fieldName)
{
return validateRange(fieldName, null, null);
}
public boolean validatePositive(String fieldName)
{
return validateRange(fieldName, 1, null);
}
/**
* Make sure field is a valid integer in the range [min, max). If min or max
* are null, then 0 and infinity are assumed, respectively.
*/
public boolean validateRange(String fieldName, Integer min, Integer max)
{
String value = textBox_.getValue().trim();
if (!value.matches("^\\d+$"))
{
fireEvent(new EnsureVisibleEvent());
textBox_.getElement().focus();
RStudioGinjector.INSTANCE.getGlobalDisplay().showErrorMessage(
"Error",
fieldName + " must be a valid number.");
return false;
}
if (min != null || max != null)
{
int intVal = Integer.parseInt(value);
if (min != null && intVal < min)
{
RStudioGinjector.INSTANCE.getGlobalDisplay().showErrorMessage(
"Error",
fieldName + " must be greater than or equal to " + min + ".");
return false;
}
if (max != null && intVal >= max)
{
RStudioGinjector.INSTANCE.getGlobalDisplay().showErrorMessage(
"Error",
fieldName + " must be less than " + max + ".");
return false;
}
}
return true;
}
public HandlerRegistration addEnsureVisibleHandler(EnsureVisibleHandler handler)
{
return addHandler(handler, EnsureVisibleEvent.TYPE);
}
private TextBox textBox_;
}