// -*- mode: java; c-basic-offset: 2; -*-
// Copyright 2009-2011 Google, All Rights reserved
// Copyright 2011-2012 MIT, All rights reserved
// Released under the Apache License, Version 2.0
// http://www.apache.org/licenses/LICENSE-2.0
package com.google.appinventor.client.widgets;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* A TextBox with a leading label.
*
*/
public class LabeledTextBox extends Composite {
// Backing TextBox
private final TextBox textbox;
private String defaultTextBoxColor;
private String errorMessage = "";
private Label errorLabel;
private Validator validator;
/**
* Creates a new TextBox with the given leading caption.
*
* @param caption caption for leading label
*/
public LabeledTextBox(String caption) {
HorizontalPanel panel = new HorizontalPanel();
Label label = new Label(caption);
panel.add(label);
textbox = new TextBox();
textbox.setWidth("100%");
panel.add(textbox);
panel.setCellWidth(label, "40%");
initWidget(panel);
setWidth("100%");
}
/**
* Use this TextBox if you want to have text validation while a user is typing
*
* @param caption caption for leading label
* @param validator The validator to use for a specific textBox
*/
public LabeledTextBox(String caption, Validator validator) {
this.validator = validator;
HorizontalPanel panel = new HorizontalPanel();
Label label = new Label(caption);
panel.add(label);
textbox = new TextBox();
defaultTextBoxColor = textbox.getElement().getStyle().getBorderColor();
textbox.setWidth("100%");
panel.add(textbox);
panel.setCellWidth(label, "40%");
HorizontalPanel errorPanel = new HorizontalPanel();
errorLabel = new Label("");
errorPanel.add(errorLabel);
VerticalPanel vp = new VerticalPanel();
vp.add(panel);
vp.add(errorPanel);
vp.setHeight("85px");
initWidget(vp);
setWidth("100%");
}
/**
* Sets the content of the TextBox.
*
* @param text new TextBox content
*/
public void setText(String text) {
textbox.setText(text);
}
/**
* Returns the current content of the TextBox.
*
* @return current TextBox content
*/
public String getText() {
return textbox.getText();
}
/**
* Explicitly focus/unfocus this widget. Only one widget can have focus at a
* time, and the widget that does will receive all keyboard events.
*
* @param focused whether this widget should take focus or release it
*/
public void setFocus(boolean focused) {
textbox.setFocus(focused);
}
/**
* Selects all of the text in the TextBox.
*/
public void selectAll() {
textbox.selectAll();
}
/**
* Sets whether the textbox is enabled.
*
* @param enabled {@code true} to enable the textbox, {@code false} to
* disable it
*/
public void setEnabled(boolean enabled) {
textbox.setEnabled(enabled);
}
/**
* Returns the TextBox.
*
* @return the TextBox
*/
public TextBox getTextBox() {
return textbox;
}
/**
* Returns the error message resulting from a specific validation error
*
* @return errorMessage
*/
public String getErrorMessage() {
return errorMessage;
}
/**
* Set the specific error message for invalid text in a textbox.
*
* @param errorMessage to use for textBox
*/
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
/**
* Check to see if a textbox contains valid text. True if text is valid, false otherwise
*
* @return validationResult
*/
public boolean validate() {
boolean validationResult = validator.validate(getTextBox().getValue());
setErrorMessage(validator.getErrorMessage());
setErrorStyles(validationResult);
return validationResult;
}
/**
* Set the style of the textbox depending on whether the text is currently valid or not
*
* @param validationResult
*/
private void setErrorStyles(boolean validationResult) {
if (validationResult) {
textbox.getElement().getStyle().setBorderColor(defaultTextBoxColor);
errorLabel.setText("");
} else {
String errorColor = "red";
textbox.getElement().getStyle().setBorderColor(errorColor);
errorLabel.setText(errorMessage);
}
}
}