/**
* Copyright 2008-2016 Qualogy Solutions B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qualogy.qafe.gwt.client.ui.renderer;
import org.gwt.mosaic.core.client.DOM;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.UIObject;
import com.qualogy.qafe.gwt.client.component.ComponentRendererHelper;
import com.qualogy.qafe.gwt.client.component.DataChangeHandler;
import com.qualogy.qafe.gwt.client.component.HasData;
import com.qualogy.qafe.gwt.client.component.HasDataChangeHandlers;
import com.qualogy.qafe.gwt.client.component.HasEditable;
import com.qualogy.qafe.gwt.client.component.HasRequiredValidationMessage;
import com.qualogy.qafe.gwt.client.component.LabeledTextFieldWidget;
import com.qualogy.qafe.gwt.client.component.QDatePicker;
import com.qualogy.qafe.gwt.client.component.QSuggestBox;
import com.qualogy.qafe.gwt.client.component.QSuggestOracle;
import com.qualogy.qafe.gwt.client.component.QTextField;
import com.qualogy.qafe.gwt.client.component.QValueSpinner;
import com.qualogy.qafe.gwt.client.context.ClientApplicationContext;
import com.qualogy.qafe.gwt.client.vo.functions.SetValueGVO;
import com.qualogy.qafe.gwt.client.vo.ui.ComponentGVO;
import com.qualogy.qafe.gwt.client.vo.ui.EditableComponentGVO;
import com.qualogy.qafe.gwt.client.vo.ui.TextFieldGVO;
public class TextFieldRenderer extends AbstractTextComponentRenderer {
// CHECKSTYLE.OFF: CyclomaticComplexity
public UIObject render(ComponentGVO component, String uuid, String parent, String context) {
UIObject uiObject = null;
if (component != null && component instanceof TextFieldGVO) {
final TextFieldGVO gvo = (TextFieldGVO) component;
final ComponentGVO finalComponentGVO = component;
final String finalUuid = uuid;
final String finalParent = parent;
if (gvo.getDisplayname() == null || gvo.getDisplayname().length() == 0) {
if (gvo.getType() != null) {
if (TextFieldGVO.TYPE_DATE.equals(gvo.getType())) {
if (gvo.getMenu() != null) {
uiObject = new QDatePicker(gvo.getFormat()) {
@Override
public void onBrowserEvent(Event event) {
if (event.getTypeInt() == Event.ONCONTEXTMENU) {
DOM.eventPreventDefault(event);
applyContextMenu(event, finalComponentGVO, finalUuid, finalParent);
}
super.onBrowserEvent(event);
}
@Override
protected void setElement(Element elem) {
super.setElement(elem);
sinkEvents(Event.ONCONTEXTMENU);
}
};
} else {
uiObject = new QDatePicker(gvo.getFormat());
}
uiObject.setHeight(TextFieldGVO.DEFAULT_HEIGHT);
RendererHelper.fillIn(component, ((QDatePicker)uiObject).getTextBox(), uiObject, uuid, parent, context);
RendererHelper.addEvents(component, uiObject, uuid);
} else if (TextFieldGVO.TYPE_SPINNER.equals(gvo.getType())) {
String height = TextFieldGVO.DEFAULT_HEIGHT;
String width = TextFieldGVO.DEFAULT_WIDTH;
int minValue = TextFieldGVO.DEFAULT_MINIMUM;
int maxValue = TextFieldGVO.DEFAULT_MAXIMUM;
if (gvo.getHeight() != null)
height = gvo.getHeight();
if (gvo.getWidth() != null)
width = gvo.getWidth();
if (gvo.getMinValue() != null)
minValue = Integer.parseInt(gvo.getMinValue());
if (gvo.getMaxValue() != null)
maxValue = Integer.parseInt(gvo.getMaxValue());
long initialValue;
if (gvo.getValue() != null) {
initialValue = Long.parseLong(gvo.getValue());
if(initialValue < (long)minValue || initialValue > (long)maxValue) {
initialValue = minValue;
}
} else {
initialValue = minValue;
}
if (gvo.getMenu() != null) {
uiObject = new QValueSpinner(initialValue, minValue, maxValue) {
@Override
public void onBrowserEvent(Event event) {
if (event.getTypeInt() == Event.ONCONTEXTMENU) {
DOM.eventPreventDefault(event);
applyContextMenu(event, finalComponentGVO, finalUuid, finalParent);
}
super.onBrowserEvent(event);
}
@Override
protected void setElement(Element elem) {
super.setElement(elem);
sinkEvents(Event.ONCONTEXTMENU);
}
};
} else {
uiObject = new QValueSpinner(initialValue, minValue, maxValue);
}
TextBox spinnerTextBox = ((QValueSpinner)uiObject).getTextBox();
RendererHelper.setStyleForElement(spinnerTextBox.getElement(), "width", width);
RendererHelper.setStyleForElement(spinnerTextBox.getElement(), "height", height);
//spinnerTextBox.setStylePrimaryName(gvo.getStyleClassName());
//spinnerTextBox.setStyleName(gvo.getStyleClass());
RendererHelper.fillIn(component, spinnerTextBox, uuid, parent, context);
} else if (gvo.getSuggest()) {
QSuggestOracle oracle = new QSuggestOracle();
QSuggestBox suggest = null;
if (gvo.getMenu() != null) {
suggest = new QSuggestBox(oracle) {
@Override
public void onBrowserEvent(Event event) {
if (event.getTypeInt() == Event.ONCONTEXTMENU) {
DOM.eventPreventDefault(event);
applyContextMenu(event, finalComponentGVO, finalUuid, finalParent);
}
super.onBrowserEvent(event);
}
@Override
protected void setElement(Element elem) {
super.setElement(elem);
sinkEvents(Event.ONCONTEXTMENU);
}
};
} else {
suggest = new QSuggestBox(oracle);
}
suggest.setSuggestCharactersLength(gvo.getSuggestCharacters());
uiObject = suggest;
// RendererHelper.fillIn(component, ((QSuggestBox)uiObject).getTextBox(), uuid, parent, context);
RendererHelper.fillIn(component, uiObject, uuid, parent, context);
} else {
if (gvo.getMenu() != null) {
uiObject = new QTextField(gvo) {
@Override
public void onBrowserEvent(Event event) {
if (event.getTypeInt() == Event.ONCONTEXTMENU) {
DOM.eventPreventDefault(event);
applyContextMenu(event, finalComponentGVO, finalUuid, finalParent);
}
super.onBrowserEvent(event);
}
@Override
protected void setElement(Element elem) {
super.setElement(elem);
sinkEvents(Event.ONCONTEXTMENU);
}
};
} else {
uiObject = new QTextField(gvo);
}
RendererHelper.fillIn(component, uiObject, uuid, parent, context);
}
}
} else {
if (gvo.getMenu() != null) {
uiObject = new LabeledTextFieldWidget(gvo, gvo.getDisplayname(), gvo.getOrientation(), gvo.getType(), gvo.getFormat()){
@Override
public void onBrowserEvent(Event event) {
if (event.getTypeInt() == Event.ONCONTEXTMENU) {
DOM.eventPreventDefault(event);
applyContextMenu(event, finalComponentGVO, finalUuid, finalParent);
}
super.onBrowserEvent(event);
}
@Override
protected void setElement(Element elem) {
super.setElement(elem);
sinkEvents(Event.ONCONTEXTMENU);
}
};
}else{
uiObject = new LabeledTextFieldWidget(gvo, gvo.getDisplayname(), gvo.getOrientation(), gvo.getType(), gvo.getFormat());
}
UIObject labeledTextBox = ((LabeledTextFieldWidget) uiObject).getTextbox();
UIObject actualComp = labeledTextBox;
UIObject labelOnComp = ((LabeledTextFieldWidget) uiObject).getLabel();
if (labeledTextBox instanceof QDatePicker) {
actualComp = ((QDatePicker)labeledTextBox).getTextBox();
RendererHelper.addEvents(component, labeledTextBox, uuid);
} else if (labeledTextBox instanceof QValueSpinner) {
actualComp = ((QValueSpinner)labeledTextBox).getTextBox();
} else if (labeledTextBox instanceof QSuggestBox) {
actualComp = ((QSuggestBox)labeledTextBox).getTextBox();
}
RendererHelper.fillIn(component, actualComp, uuid, parent, context);
}
// for checking based on type introduces this.
if( gvo.getRegExp() != null) {
DOM.setElementAttribute(RendererHelper.getElement(uiObject), TextFieldGVO.REGEXPTYPE, gvo.getType());
}
registerDataChange(gvo, uiObject);
handleTypeAttribute(uiObject, gvo.getRegExp(), gvo.getValidationTitle(),gvo.getValidationMessage());
handleEditableAttribute(gvo, uiObject);
handleMinLengthAttribute(gvo, uiObject);
handleMaxLengthAttribute(gvo, uiObject);
handleValueAttribute(gvo, uiObject);
handleRequiredValidationMessageAttribute(gvo, uiObject);
RendererHelper.handleRequiredAttribute(gvo, uiObject);
}
return uiObject;
}
// CHECKSTYLE.ON: CyclomaticComplexity
private void handleValueAttribute(TextFieldGVO gvo, UIObject uiObject) {
String value = gvo.getValue();
if ((value != null) && (value.length() > 0)) {
if (uiObject instanceof HasData) {
HasData hasData = (HasData)uiObject;
hasData.setData(value, SetValueGVO.ACTION_ADD, null);
} else if (uiObject instanceof HasText) {
HasText hasText = (HasText)uiObject;
String oldValue = hasText.getText();
hasText.setText(value);
doDataChange(gvo, uiObject, oldValue, hasText.getText());
}
}
}
private void handleEditableAttribute(TextFieldGVO gvo, UIObject uiObject) {
boolean editable = gvo.getEditable();
if (uiObject instanceof HasEditable) {
HasEditable hasEditable = (HasEditable)uiObject;
hasEditable.setEditable(editable);
}
}
private void handleMinLengthAttribute(final TextFieldGVO gvo, UIObject uiObject) {
if (gvo.getMinLength() != null) {
final int minLength = gvo.getMinLength().intValue();
if (uiObject instanceof TextBox) {
((TextBox) uiObject).addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getCharCode() == KeyCodes.KEY_TAB || event.getCharCode() == KeyCodes.KEY_ENTER) {
if (event.getSource() instanceof TextBox) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() < minLength)) {
ClientApplicationContext.getInstance().log("Textbox minimum length check", "The length of this field [" + gvo.getId() + "] must be larger than " + minLength, true);
}
}
}
}
});
((TextBox) uiObject).addBlurHandler(new BlurHandler() {
public void onBlur(BlurEvent event) {
if (event.getSource() instanceof TextBox) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() < minLength)) {
ClientApplicationContext.getInstance().log("Textbox minimum length check", "The length of this field [" + gvo.getId() + "] must be larger than " + minLength, true);
}
}
}
});
} else if (uiObject instanceof LabeledTextFieldWidget) {
final String prompt = ((LabeledTextFieldWidget) uiObject).getLabel().getText();
((LabeledTextFieldWidget) uiObject).addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getCharCode() == KeyCodes.KEY_TAB || event.getCharCode() == KeyCodes.KEY_ENTER) {
if (event.getSource() instanceof TextBox) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() < minLength)) {
ClientApplicationContext.getInstance().log("Textbox minimum length check", "The length of this field [" + prompt + "] must be larger than " + minLength, true);
}
}
}
}
});
((LabeledTextFieldWidget) uiObject).addBlurHandler(new BlurHandler() {
public void onBlur(BlurEvent event) {
if (event.getSource() instanceof LabeledTextFieldWidget) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() < minLength)) {
ClientApplicationContext.getInstance().log("Textbox minimum length check", "The length of this field [" + prompt + "] must be larger than " + minLength, true);
}
}
}
});
}
}
}
private void handleMaxLengthAttribute(final TextFieldGVO gvo, UIObject uiObject) {
if (gvo.getMaxLength() != null) {
final int maxLength = gvo.getMaxLength().intValue();
if (uiObject instanceof TextBox) {
((TextBox) uiObject).setMaxLength(gvo.getMaxLength().intValue());
((TextBox) uiObject).addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getCharCode() == KeyCodes.KEY_TAB || event.getCharCode() == KeyCodes.KEY_ENTER) {
if (event.getSource() instanceof TextBox) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() > maxLength)) {
ClientApplicationContext.getInstance().log("Textbox maximum length check", "The length of this field [" + gvo.getId() + "] must be smaller than " + maxLength, true);
}
}
}
}
});
((TextBox) uiObject).addBlurHandler(new BlurHandler() {
public void onBlur(BlurEvent event) {
if (event.getSource() instanceof TextBox) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() > maxLength)) {
ClientApplicationContext.getInstance().log("Textbox maximum length check", "The length of this field [" + gvo.getId() + "] must be smaller than " + maxLength, true);
}
}
}
});
} else if (uiObject instanceof LabeledTextFieldWidget) {
((LabeledTextFieldWidget) uiObject).setMaxLength(gvo.getMaxLength().intValue());
final String prompt = ((LabeledTextFieldWidget) uiObject).getLabel().getText();
((LabeledTextFieldWidget) uiObject).addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getCharCode() == KeyCodes.KEY_TAB || event.getCharCode() == KeyCodes.KEY_ENTER) {
if (event.getSource() instanceof TextBox) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() > maxLength)) {
ClientApplicationContext.getInstance().log("Textbox maximum length check", "The length of this field [" + prompt + "] must be smaller than " + maxLength, true);
}
}
}
}
});
((LabeledTextFieldWidget) uiObject).addBlurHandler(new BlurHandler() {
public void onBlur(BlurEvent event) {
if (event.getSource() instanceof LabeledTextFieldWidget) {
TextBox textBox = (TextBox) event.getSource();
if ((textBox.getText() != null && textBox.getText().length() > maxLength)) {
ClientApplicationContext.getInstance().log("Textbox maximum length check", "The length of this field [" + prompt + "] must be smaller than " + maxLength, true);
}
}
}
});
}
}
}
private void registerDataChange(final TextFieldGVO gvo, UIObject uiObject) {
if (uiObject instanceof HasDataChangeHandlers) {
((HasDataChangeHandlers)uiObject).addDataChangeHandler(new DataChangeHandler() {
public void onDataChange(UIObject uiObject, Object oldValue, Object newValue) {
doDataChange(gvo, uiObject, oldValue, newValue);
}
});
}
}
private void doDataChange(EditableComponentGVO component, UIObject uiObject, Object oldValue, Object newValue) {
ComponentRendererHelper.handleDataChange(component, uiObject, oldValue, newValue);
}
private void handleRequiredValidationMessageAttribute(TextFieldGVO gvo, UIObject uiObject) {
if (uiObject instanceof HasRequiredValidationMessage) {
HasRequiredValidationMessage hasRequiredValidationMessage = (HasRequiredValidationMessage)uiObject;
hasRequiredValidationMessage.setRequiredValidationMessage(gvo.getRequiredValidationMessage());
hasRequiredValidationMessage.setRequiredValidationTitle(gvo.getRequiredValidationTitle());
}
}
}