/** * 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.mgwt.client.ui.component; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.KeyEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; import com.googlecode.mgwt.dom.client.event.mouse.HandlerRegistrationCollection; import com.googlecode.mgwt.dom.client.event.touch.TouchCancelHandler; import com.googlecode.mgwt.dom.client.event.touch.TouchEndHandler; import com.googlecode.mgwt.dom.client.event.touch.TouchHandler; import com.googlecode.mgwt.dom.client.event.touch.TouchMoveHandler; import com.googlecode.mgwt.dom.client.event.touch.TouchStartHandler; import com.googlecode.mgwt.ui.client.widget.ScrollPanel; import com.googlecode.mgwt.ui.client.widget.event.scroll.ScrollEndEvent; import com.googlecode.mgwt.ui.client.widget.touch.TouchWidgetImpl; import com.qualogy.qafe.mgwt.client.ui.events.DataChangeEvent; import com.qualogy.qafe.mgwt.client.ui.events.DataChangeHandler; import com.qualogy.qafe.mgwt.client.ui.events.ScrollBottomEvent; import com.qualogy.qafe.mgwt.client.ui.renderer.events.exception.RequiredFieldException; import com.qualogy.qafe.mgwt.client.vo.ui.HasRequired; import com.qualogy.qafe.mgwt.client.vo.ui.HasRequiredValidationMessage; import com.qualogy.qafe.mgwt.shared.QAMLUtil; public abstract class ComponentHelper { public static final String STYLE_DISABLED = "qafe_item_disabled"; public static final String STYLE_SHOWPANEL_CLOSE = "qafe_close_on_showPanel"; private static TouchWidgetImpl touchWidgetImpl = GWT.create(TouchWidgetImpl.class); public static HandlerRegistration addDataChangeHandler(Widget widget, DataChangeHandler handler) { return widget.addHandler(handler, DataChangeEvent.getType()); } public static void handleDataChange(Widget widget, Object newData, Object oldData) { if (isDataChanged(newData, oldData)) { fireDataChange(widget, newData, oldData); } } public static boolean isDataChanged(Object newData, Object oldData) { return (oldData != newData) && (oldData == null || !oldData.equals(newData)); } public static void fireDataChange(Widget widget, Object newData, Object oldData) { DataChangeEvent event = new DataChangeEvent(widget, newData, oldData); widget.fireEvent(event); } public static HandlerRegistration addTouchStartHandler(Widget widget, TouchStartHandler handler) { return touchWidgetImpl.addTouchStartHandler(widget, handler); } public static HandlerRegistration addTouchMoveHandler(Widget widget, TouchMoveHandler handler) { return touchWidgetImpl.addTouchMoveHandler(widget, handler); } public static HandlerRegistration addTouchCancelHandler(Widget widget, TouchCancelHandler handler) { return touchWidgetImpl.addTouchCancelHandler(widget, handler); } public static HandlerRegistration addTouchEndHandler(Widget widget, TouchEndHandler handler) { return touchWidgetImpl.addTouchEndHandler(widget, handler); } public static HandlerRegistration addTouchHandler(Widget widget, TouchHandler handler) { HandlerRegistrationCollection handlerRegistrationCollection = new HandlerRegistrationCollection(); handlerRegistrationCollection.addHandlerRegistration(addTouchCancelHandler(widget, handler)); handlerRegistrationCollection.addHandlerRegistration(addTouchStartHandler(widget, handler)); handlerRegistrationCollection.addHandlerRegistration(addTouchEndHandler(widget, handler)); handlerRegistrationCollection.addHandlerRegistration(addTouchMoveHandler(widget, handler)); return handlerRegistrationCollection; } public static void setStyle(UIObject widget, String styleClass, String[][] inlineStyles) { List<UIObject> styleWidgets = getStyleWidgets(widget); for (UIObject styleWidget : styleWidgets) { setStyle(styleWidget.getElement(), styleClass, inlineStyles); } } public static void setStyle(UIObject widget, String attribute, String value) { List<UIObject> styleWidgets = getStyleWidgets(widget); for (UIObject styleWidget : styleWidgets) { setStyle(styleWidget.getElement(), attribute, value); } } public static void setStyle(UIObject widget, String style) { List<UIObject> styleWidgets = getStyleWidgets(widget); for (UIObject styleWidget : styleWidgets) { setStyle(styleWidget.getElement(), style); } } public static void addStyle(UIObject widget, String style) { List<UIObject> styleWidgets = getStyleWidgets(widget); for (UIObject styleWidget : styleWidgets) { addStyle(styleWidget.getElement(), style); } } public static void removeStyle(UIObject widget, String style) { List<UIObject> styleWidgets = getStyleWidgets(widget); for (UIObject styleWidget : styleWidgets) { removeStyle(styleWidget.getElement(), style); } } public static void setStyle(Element element, String styleClass, String[][] inlineStyles) { if (element == null) { return; } if (styleClass != null) { if (!element.getClassName().contains(styleClass)) { addStyle(element, styleClass); } } if (inlineStyles != null) { for (int i=0; i<inlineStyles.length; i++) { if (inlineStyles[i].length == 2) { String attribute = inlineStyles[i][0]; String value = inlineStyles[i][1]; setStyle(element, attribute, value); } } } } public static void setStyle(Element element, String attribute, String value) { if (element == null) { return; } attribute = QAMLUtil.camelize(attribute); DOM.setStyleAttribute(element, attribute, value); } public static void setStyle(Element element, String style) { if (element == null) { return; } element.setClassName(style); } public static void addStyle(Element element, String style) { if (element == null) { return; } element.addClassName(style); } public static void removeStyle(Element element, String style) { if (element == null) { return; } element.removeClassName(style); } public static List<UIObject> getStyleWidgets(UIObject widget) { List<UIObject> styleWidgets = new ArrayList<UIObject>(); if (widget != null) { if (widget instanceof HasStyle) { HasStyle hasStyle = (HasStyle)widget; styleWidgets.addAll(hasStyle.getStyleWidgets()); } else { styleWidgets.add(widget); } } return styleWidgets; } public static boolean isNonCharKeyPressed(KeyEvent event, char charCode) { if (event.isAnyModifierKeyDown()) { return true; } return (charCode == 0); } public static void handleKeyConstraints(HasConstraints widget, String value, KeyEvent event, char charCode) { if (widget == null) { return; } if (isNonCharKeyPressed(event, charCode)) { return; } List<String> constraints = widget.getKeyConstraints(); if ((constraints == null) || (constraints.size() == 0)) { return; } String newValue = value + charCode; if (newValue == null) { return; } for (String constraint : constraints) { if (newValue.matches(constraint)) { continue; } event.preventDefault(); return; } } public static HandlerRegistration registerScroll(Widget widget) { if (widget == null) { return null; } final Widget source = widget; HandlerRegistration handlerRegistration = null; while (widget.getParent() != null) { widget = widget.getParent(); if (widget instanceof ScrollPanel) { ScrollPanel scrollPanel = (ScrollPanel)widget; handlerRegistration = (HandlerRegistration)scrollPanel.addScrollEndHandler(new ScrollEndEvent.Handler() { @Override public void onScrollEnd(ScrollEndEvent event) { if (isScrolledToBottom(source)) { fireScrollBottom(source); } } }); break; } } return handlerRegistration; } public static void unregisterScroll(HandlerRegistration handlerRegistration) { if (handlerRegistration == null) { return; } handlerRegistration.removeHandler(); } public static void refreshScroll(Widget widget) { // After setting data which results in a long list, // the ScrollPanel needs to be refreshed for recalculating the size of the child to scroll, // otherwise the scrolling will not work properly, this is a workaround // see https://groups.google.com/group/mgwt/tree/browse_frm/month/2012-5/b47fc71b23b2b40e?rnum=201&_done=/group/mgwt/browse_frm/month/2012-5?scoring%3Dd%26start%3D0%26sa%3DN%26fwc%3D1%26&scoring=d&pli=1 if (widget == null) { return; } while (widget.getParent() != null) { widget = widget.getParent(); if (widget instanceof ScrollPanel) { ScrollPanel scrollPanel = (ScrollPanel)widget; scrollPanel.refresh(); return; } } } public static boolean isScrolledToBottom(UIObject source) { Element element = source.getElement(); int pageClientHeight = element.getOwnerDocument().getClientHeight(); int clientHeight = element.getClientHeight(); if (clientHeight > pageClientHeight) { int delta = clientHeight - pageClientHeight; // When scrolling down the absoluteTop will be negative int absoluteTop = element.getAbsoluteTop() * -1; if (absoluteTop >= delta) { return true; } } return false; } public static void fireScrollBottom(Widget widget) { ScrollBottomEvent event = new ScrollBottomEvent(widget); widget.fireEvent(event); } public static String toString(Object value, String defaultValue) { return QAMLUtil.toString(value, defaultValue); } public static Boolean toBoolean(Object value, Boolean defaultValue) { return QAMLUtil.toBoolean(value, defaultValue); } public static Boolean toBoolean(Object value, String value4True, String value4False, Boolean defaultValue) { return QAMLUtil.toBoolean(value, value4True, value4False, defaultValue); } public static Integer toInteger(Object value, Integer defaultValue) { return QAMLUtil.toInteger(value, defaultValue); } public static Double toDouble(Object value, Double defaultValue) { return QAMLUtil.toDouble(value, defaultValue); } public static Date toDate(Object value, Date defaultValue) { return QAMLUtil.toDate(value, defaultValue); } public static void checkRequired(HasRequired widget, Object data) { if (widget == null) { return; } boolean empty = (data == null) || data.toString().isEmpty(); if (!(widget.getRequired() && empty)) { return; } String message = null; String title = null; if(widget instanceof HasRequiredValidationMessage) { HasRequiredValidationMessage hasRequiredValidationMessage = (HasRequiredValidationMessage) widget; message = hasRequiredValidationMessage.getRequiredValidationMessage(); title = hasRequiredValidationMessage.getRequiredValidationTitle(); } throw new RequiredFieldException(title, message); } }