package org.openrosa.client.widget;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.TextBox;
/**
* Widget for entering time.
*
* @author daniel
*
*/
public class TimeWidget extends TextBox{
/** The input mask. */
private String MASK = "--:-- --";
/** Flag to tell whether we are setting selection range or not. */
private boolean settingSelRange = false;
/**
* Creates a new instance of the time widget.
*/
public TimeWidget(){
setText(MASK);
addKeyPressHandler();
setMaxLength(8);
}
/**
* Adds handler for key board events.
*/
private void addKeyPressHandler(){
addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
handleKeyEvent((TextBox)event.getSource(), event.getCharCode());
}
});
addKeyDownHandler(new KeyDownHandler() {
public void onKeyDown(KeyDownEvent event) {
//if((event.getNativeKeyCode() == KeyCodes.KEY_BACKSPACE))
// handleKeyEvent((TextBox)event.getSource(), (char)event.getNativeKeyCode());
}
});
}
/**
* Handles a key board event.
*
* @param source the sender of the event.
* @param keyCode the key code.
*/
private void handleKeyEvent(TextBox source, char keyCode){
String text = source.getText().trim();
int pos = source.getCursorPos();
if ((!Character.isDigit(keyCode)) && (keyCode != KeyCodes.KEY_TAB)
&& (keyCode != KeyCodes.KEY_BACKSPACE) && (keyCode != KeyCodes.KEY_LEFT)
&& (keyCode != KeyCodes.KEY_UP) && (keyCode != KeyCodes.KEY_RIGHT)
&& (keyCode != KeyCodes.KEY_DOWN)&& (keyCode != KeyCodes.KEY_DELETE)) {
if(pos == 5 && (keyCode == 'a' || keyCode == 'p' || keyCode == 'A' || keyCode == 'P'))
pos = 6;
if(pos == 6 && (keyCode == 'a' || keyCode == 'p' || keyCode == 'A' || keyCode == 'P')){
char[] chars = text.toCharArray();
chars[pos] = Character.toUpperCase(keyCode);
chars[pos+1] = 'M';
setText(new String(chars));
source.setCursorPos(pos);
}
else if(pos == 7 && (keyCode == 'm' || keyCode == 'M')){
char[] chars = text.toCharArray();
chars[pos] = Character.toUpperCase(keyCode);
setText(new String(chars));
source.setCursorPos(pos+1);
}
source.cancelKey();
}
else{
if(keyCode == KeyCodes.KEY_TAB || keyCode == KeyCodes.KEY_LEFT
|| keyCode == KeyCodes.KEY_UP || keyCode == KeyCodes.KEY_RIGHT)
return;
else if((keyCode == KeyCodes.KEY_BACKSPACE)){
if(source.getSelectionLength() == 8){
source.cancelKey();
setText(MASK);
source.setCursorPos(0);
return;
}
else if(source.getSelectionLength() > 0){
source.setCursorPos(pos);
source.cancelKey();
}
else if(pos == 0)
return;
else if(pos == 3)
pos = 2;
else if(pos == 6)
pos = 5;
pos -= 1;
char[] chars = text.toCharArray();
chars[pos] = '-';
setText(new String(chars));
source.setCursorPos(pos);
source.cancelKey();
}
else if(pos == 5 || pos == 6 || pos == 7)
source.cancelKey();
else{
if(pos == 2)
pos = 3;
else if(pos == 5)
pos = 6;
else if(pos == 8)
pos = 7;
setSelectionRange(pos, 1);
}
}
}
/**
* Sets the widget text.
*
* @param text the text to set.
*/
public void setText(String text){
if(text == null || text.trim().length() == 0)
text = MASK;
super.setText(text);
}
/**
* Gets the widget text without the inpiut mask.
*
* @return the text.
*/
public String getText(){
String text = super.getText();
if(!settingSelRange && text.equals(MASK))
text = "";
return text;
}
/**
* Gets the widget text including the input mask.
*
* @return the widget text.
*/
public String getTextWithMask(){
return super.getText();
}
/**
* @see com.google.gwt.user.client.ui.FocusWidget#setFocus(boolean)
*/
public void setFocus(boolean focused){
super.setFocus(focused);
if(super.getText().length() == 0)
setText(MASK);
setSelectionRange(0, 1);
}
/**
* @see com.google.gwt.user.client.ui.TextBoxBase#setSelectionRange(int, int)
*/
public void setSelectionRange(int pos, int length) {
settingSelRange = true;
super.setSelectionRange(pos, length);
settingSelRange = false;
}
}