public void show(Mode mode, Type type, String message) {

        if (mode == null) {
            mode = Mode.NORMAL;
        }
        final String restoreMessage;
        if (Notification.shouldRestoreMessage(m_mode, mode, m_type, type)) {
            restoreMessage = getMessage();
        } else {
            restoreMessage = null;
        }
        // remove last notification if still shown
        hide(true);

        // keep state
        final Type oldType = m_type;
        m_type = type;
        m_mode = mode;

        // set the new notification message
        setMessage(message);

        // set the right class
        setClassForType(type);

        // show the widget
        animateShow();

        // set timer to hide non sticky messages or restore superior message
        if (Mode.NORMAL.equals(m_mode) || ClientStringUtil.isNotEmptyOrWhitespaceOnly(restoreMessage)) {
            m_timer = new Timer() {

                /**
                 * @see com.google.gwt.user.client.Timer#run()
                 */
                @Override
                public void run() {

                    hide(false);
                    if (ClientStringUtil.isNotEmptyOrWhitespaceOnly(restoreMessage)) {
                        show(Mode.STICKY, oldType, restoreMessage);
                    }
                }
            };
            m_timer.schedule(3000 * (type == Type.NORMAL ? 1 : 2));
        }

    }