org.pentaho.gwt.widgets.client.text.ValidationTextBox.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.gwt.widgets.client.text.ValidationTextBox.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.gwt.widgets.client.text;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.PopupPanel.PositionCallback;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import org.pentaho.gwt.widgets.client.utils.ElementUtils;
import org.pentaho.gwt.widgets.client.utils.Rectangle;

public class ValidationTextBox extends HorizontalPanel implements IValidationTextBox {

    private TextBox textBox;

    private PopupPanel popupPanel;

    private String validationMessage;

    private SimplePanel imagePanel;

    private Image image;

    private ValidationTextBoxKeyUpHandlerCollection handlers;

    private ValidationTextBoxListenerCollection listeners;

    public ValidationTextBox() {
        textBox = new TextBox();
        textBox.addKeyUpHandler(new KeyUpHandler() {

            @Override
            public void onKeyUp(KeyUpEvent event) {
                performValidation(true);
                fireOnKeyUp(event);
            }
        });

        imagePanel = new SimplePanel() {

            @Override
            public void onBrowserEvent(Event event) {
                super.onBrowserEvent(event);
                switch (DOM.eventGetType(event)) {
                case Event.ONMOUSEOVER: {
                    if (!validate()) {
                        showMessagePopup();
                    }
                    break;
                }

                case Event.ONMOUSEOUT: {
                    hideMessagePopup();
                    break;
                }
                }
            }
        };
        imagePanel.setStylePrimaryName("validation-textbox-image-panel"); //$NON-NLS-1$
        imagePanel.sinkEvents(Event.ONMOUSEOVER | Event.ONMOUSEOUT);
        this.add(textBox);
        textBox.setWidth("100%");
        this.setCellWidth(textBox, "100%");
        this.setStylePrimaryName("custom-text-box"); //$NON-NLS-1$
        SimplePanel hSpacer = new SimplePanel();
        hSpacer.setWidth("10px");
        this.add(hSpacer);
        image = new Image(GWT.getModuleBaseURL() + "images/spacer.gif"); //$NON-NLS-1$
        image.setStylePrimaryName("validation-textbox-image");
        imagePanel.add(image);
        imagePanel.addStyleDependentName("invalid");
        this.add(imagePanel);
    }

    public void addKeyUpHandler(KeyUpHandler handler) {
        if (handlers == null) {
            handlers = new ValidationTextBoxKeyUpHandlerCollection();
        }
        handlers.add(handler);
    }

    public void removeKeyUpHandler(KeyUpHandler handler) {
        if (handlers != null) {
            handlers.remove(handler);
        }
    }

    /**
     * Fire all current {@link KeyUpHandler}.
     */
    void fireOnKeyUp(KeyUpEvent event) {

        if (handlers != null) {
            handlers.fireOnKeyUp(event);
        }
    }

    public void addValidatableTextBoxListener(IValidationTextBoxListener listener) {
        if (listeners == null) {
            listeners = new ValidationTextBoxListenerCollection();
        }
        listeners.add(listener);
    }

    public void removeValidatableTextBoxListener(IValidationTextBoxListener listener) {
        if (listeners != null) {
            listeners.remove(listener);
        }
    }

    /**
     * Fire all current {@link IValidationTextBoxListener}.
     */
    void fireOnSuccess() {
        if (listeners != null) {
            listeners.fireOnSuccess(this);
        }
    }

    /**
     * Fire all current {@link IValidationTextBoxListener}.
     */
    void fireOnFailure() {
        if (listeners != null) {
            listeners.fireOnFailure(this);
        }
    }

    private void performValidation(boolean showPopUp) {
        if (!validate()) {
            fireOnFailure();
            imagePanel.removeStyleDependentName("valid");
            imagePanel.addStyleDependentName("invalid");
            if (showPopUp) {
                showMessagePopup();
            }
        } else {
            fireOnSuccess();
            imagePanel.removeStyleDependentName("invalid");
            imagePanel.addStyleDependentName("valid");
            hideMessagePopup();
        }
    }

    @Override
    public boolean validate() {
        // TODO Auto-generated method stub
        return false;
    }

    public String getValidationMessage() {
        return validationMessage;
    }

    public void setValidationMessage(String validationMessage) {
        this.validationMessage = validationMessage;
    }

    public TextBox getManagedObject() {
        return textBox;
    }

    public String getValue() {
        return textBox.getValue();
    }

    public void setValue(String value) {
        textBox.setValue(value);
        performValidation(false);
    }

    public String getText() {
        return textBox.getText();
    }

    private void showMessagePopup() {
        Label validationMessageLabel = new Label();
        validationMessageLabel.setStyleName("validation-textbox-message-label"); //$NON-NLS-1$
        validationMessageLabel.setText(getValidationMessage());
        VerticalPanel messagePanel = new VerticalPanel();
        messagePanel.add(validationMessageLabel);
        HorizontalPanel bottomPanel = new HorizontalPanel();
        SimplePanel hSpacer = new SimplePanel();
        hSpacer.setStylePrimaryName("validation-textbox-left-image-buffer"); //$NON-NLS-1$
        bottomPanel.add(hSpacer);
        SimplePanel tailImagePanel = new SimplePanel();
        image = new Image(GWT.getModuleBaseURL() + "images/spacer.gif"); //$NON-NLS-1$
        image.setStylePrimaryName("validation-textbox-tail-image"); //$NON-NLS-1$
        tailImagePanel.add(image);
        bottomPanel.add(tailImagePanel);
        messagePanel.add(bottomPanel);
        popupPanel = new PopupPanel(true, false);
        popupPanel.setWidget(messagePanel);
        popupPanel.setPopupPositionAndShow(new PositionCallback() {
            public void setPosition(int offsetWidth, int offsetHeight) {
                int absLeft = -1;
                int absTop = -1;
                absLeft = textBox.getAbsoluteLeft();
                absTop = textBox.getAbsoluteTop();
                Rectangle popupSize = ElementUtils.getSize(popupPanel.getElement());
                popupPanel.setPopupPosition(absLeft,
                        absTop - popupSize.height >= 0 ? absTop - popupSize.height : absTop);
            }
        });
        popupPanel.show();
    }

    private void hideMessagePopup() {
        if (popupPanel != null) {
            popupPanel.hide();
        }
    }

}