cc.kune.common.client.msgs.UserMessageWidget.java Source code

Java tutorial

Introduction

Here is the source code for cc.kune.common.client.msgs.UserMessageWidget.java

Source

/*
 *
 * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
 * one or more contributor license agreements (see COPYRIGHT for details).
 * The CA licenses this file to you under the GNU Affero General Public
 * License version 3, (the "License"); you may not use this file except in
 * compliance with the License. This file is part of kune.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package cc.kune.common.client.msgs;

import static com.google.gwt.query.client.GQuery.$;
import static com.google.gwt.query.client.GQuery.Effects;
import cc.kune.common.client.msgs.resources.UserMessageImagesUtil;
import cc.kune.common.client.notify.NotifyLevel;
import cc.kune.common.client.ui.Animations;
import cc.kune.common.shared.utils.TextUtils;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.query.client.Function;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.safehtml.shared.SimpleHtmlSanitizer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineHTML;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.Widget;

// TODO: Auto-generated Javadoc
/**
 * The Class UserMessageWidget.
 *
 * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
 */
public class UserMessageWidget extends Composite implements HasText, UserMessage {

    /**
     * The Interface MsgTemplate.
     *
     * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
     */
    public interface MsgTemplate extends SafeHtmlTemplates {

        /**
         * Format.
         *
         * @param message the message
         * @return the safe html
         */
        @Template("<span>{0}</span>")
        SafeHtml format(SafeHtml message);
    }

    /**
     * The Interface MsgWithTitleTemplate.
     *
     * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
     */
    public interface MsgWithTitleTemplate extends SafeHtmlTemplates {

        /**
         * Format.
         *
         * @param title the title
         * @param message the message
         * @return the safe html
         */
        @Template("<span><span class=\"k-msg-title\">{0}</span><p>{1}</p></span>")
        SafeHtml format(SafeHtml title, SafeHtml message);
    }

    /**
     * The Interface UserMessageWidgetUiBinder.
     *
     * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
     */
    interface UserMessageWidgetUiBinder extends UiBinder<Widget, UserMessageWidget> {
    }

    /** The Constant AVATAR_SIZE. */
    private static final String AVATAR_SIZE = "40px";

    /** The close title. */
    private static String closeTitle = "Close";

    /** The fade mills. */
    private static int fadeMills = 5000;

    /** The Constant MSG_NO_TITLE. */
    private static final MsgTemplate MSG_NO_TITLE = GWT.create(MsgTemplate.class);

    /** The Constant MSG_WITH_TITLE. */
    private static final MsgWithTitleTemplate MSG_WITH_TITLE = GWT.create(MsgWithTitleTemplate.class);

    /** The ui binder. */
    private static UserMessageWidgetUiBinder uiBinder = GWT.create(UserMessageWidgetUiBinder.class);

    /**
     * Sets the close title.
     *
     * @param title the new close title
     */
    public static void setCloseTitle(final String title) {
        closeTitle = title;
    }

    /**
     * Sets the fade mills.
     *
     * @param mills the new fade mills
     */
    public static void setFadeMills(final int mills) {
        fadeMills = mills;
    }

    /** The close. */
    @UiField
    PushButton close;

    /** The close callback. */
    private final CloseCallback closeCallback;

    /** The icon. */
    @UiField
    Image icon;

    /** The label. */
    @UiField
    InlineHTML label;

    /** The panel. */
    @UiField
    HorizontalPanel panel;

    /** The time. */
    private Timer time;

    /**
     * Instantiates a new user message widget.
     *
     * @param level the level
     * @param title the title
     * @param message the message
     * @param id the id
     * @param closeable the closeable
     * @param closeCallback the close callback
     */
    public UserMessageWidget(final NotifyLevel level, final String title, final String message, final String id,
            final boolean closeable, final CloseCallback closeCallback) {
        this.closeCallback = closeCallback;
        initWidget(uiBinder.createAndBindUi(this));
        getElement().getStyle().setOpacity(0);
        // setVisible(false);
        if (TextUtils.notEmpty(id)) {
            close.ensureDebugId(id);
        }
        if (TextUtils.notEmpty(message)) {
            setMsg(title, message);
            close.setVisible(closeable);
            close.setTitle(closeTitle);
            if (!closeable) {
                time = new Timer() {
                    @Override
                    public void run() {
                        close();
                    }
                };
                time.schedule(fadeMills);
            }
            setIcon(level);
            if (Animations.enabled) {
                $(this).as(Effects).fadeTo(200, 1d);
            } else {
                setVisible(true);
            }

        }
    }

    /**
     * Instantiates a new user message widget.
     *
     * @param message the message
     * @param closeCallback the close callback
     */
    public UserMessageWidget(final String message, final CloseCallback closeCallback) {
        this("", message, false, closeCallback);
    }

    /**
     * Instantiates a new user message widget.
     *
     * @param title the title
     * @param message the message
     * @param closeable the closeable
     * @param closeCallback the close callback
     */
    public UserMessageWidget(final String title, final String message, final boolean closeable,
            final CloseCallback closeCallback) {
        this(NotifyLevel.info, title, message, "", closeable, closeCallback);
    }

    /**
     * Instantiates a new user message widget.
     *
     * @param title the title
     * @param message the message
     * @param closeCallback the close callback
     */
    public UserMessageWidget(final String title, final String message, final CloseCallback closeCallback) {
        this(title, message, false, closeCallback);
    }

    /* (non-Javadoc)
     * @see com.google.gwt.event.dom.client.HasClickHandlers#addClickHandler(com.google.gwt.event.dom.client.ClickHandler)
     */
    @Override
    public HandlerRegistration addClickHandler(final ClickHandler handler) {
        panel.addStyleName("k-pointer");
        return addDomHandler(handler, ClickEvent.getType());
    }

    /* (non-Javadoc)
     * @see cc.kune.common.client.msgs.UserMessage#appendMsg(java.lang.String)
     */
    @Override
    public void appendMsg(final String message) {
        resetTimer();
        label.setHTML(sanitize(label.getHTML() + "<p class='k-msg-topsep'>" + message + "</p>"));
    }

    /* (non-Javadoc)
     * @see cc.kune.common.client.msgs.UserMessage#close()
     */
    @Override
    public void close() {
        $(this).as(Effects).fadeOut(300, new Function() {
            @Override
            public void f() {
                removeFromParent();
                setVisible(false);
                closeCallback.onClose();
            }
        });

    }

    /* (non-Javadoc)
     * @see com.google.gwt.user.client.ui.HasText#getText()
     */
    @Override
    public String getText() {
        return label.getText();
    }

    /**
     * Handle click.
     *
     * @param e the e
     */
    @UiHandler("close")
    void handleClick(final ClickEvent e) {
        close();
    }

    /**
     * Reset timer.
     */
    private void resetTimer() {
        if (time != null) {
            // More time to read it!
            time.schedule(fadeMills);
        }
    }

    /**
     * Sanitize.
     *
     * @param message the message
     * @return the safe html
     */
    private SafeHtml sanitize(final String message) {
        return SafeHtmlUtils.fromTrustedString(message);
    }

    /**
     * Sets the icon.
     *
     * @param level the new icon
     */
    private void setIcon(final NotifyLevel level) {
        if (level.equals(NotifyLevel.avatar)) {
            icon.setUrl(level.getUrl());
            icon.setSize(AVATAR_SIZE, AVATAR_SIZE);
        } else {
            icon.setResource(UserMessageImagesUtil.getIcon(level));
        }
    }

    /**
     * Sets the msg.
     *
     * @param title the title
     * @param message the message
     */
    private void setMsg(final String title, final String message) {
        if (TextUtils.notEmpty(title)) {
            label.setHTML(MSG_WITH_TITLE.format(SimpleHtmlSanitizer.sanitizeHtml(title), sanitize(message)));
        } else {
            label.setHTML(MSG_NO_TITLE.format(sanitize(message)));
        }
    }

    /* (non-Javadoc)
     * @see com.google.gwt.user.client.ui.HasText#setText(java.lang.String)
     */
    @Override
    public void setText(final String text) {
        label.setText(text);
    }

}