/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
/**
*
*/
package org.roda.wui.common.client.widgets;
import org.roda.wui.common.client.widgets.wcag.AccessibleFocusPanel;
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.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import config.i18n.client.ClientMessages;
/**
* @author Luis Faria
*
*/
public class Toast extends PopupPanel {
private static final int PADDING = 10;
private static final int SLOTS_NUMBER = 7;
private static final Toast[] slots = new Toast[SLOTS_NUMBER];
private static int currentSlot = 0;
private static int getNextSlot(Toast next) {
if (slots[currentSlot] != null) {
currentSlot = (currentSlot + 1) % SLOTS_NUMBER;
if (slots[currentSlot] != null) {
slots[currentSlot].hide();
}
}
slots[currentSlot] = next;
return currentSlot;
}
private static final int HIDE_DELAY_MS = 7000;
/**
* The type of message
*/
public enum MessagePopupType {
/**
* An error message
*/
ERROR_MESSAGE, INFO
}
private static final ClientMessages messages = (ClientMessages) GWT.create(ClientMessages.class);
private final int slotNumber;
private final MessagePopupType type;
private final AccessibleFocusPanel focus;
private final FlowPanel layout;
private final Label titleLabel;
private final Label messageLabel;
private final Timer hideTimer;
/**
* Create a new message popup
*
* @param type
* @param title
* @param message
*/
public Toast(MessagePopupType type, String title, String message) {
super(false);
this.type = type;
slotNumber = getNextSlot(this);
layout = new FlowPanel();
focus = new AccessibleFocusPanel(layout);
titleLabel = new Label(title);
messageLabel = new Label(message);
if (type.equals(MessagePopupType.ERROR_MESSAGE)) {
layout.addStyleName("toast-error");
} else if (type.equals(MessagePopupType.INFO)) {
layout.addStyleName("toast-info");
}
layout.add(titleLabel);
layout.add(messageLabel);
setWidget(focus);
focus.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
hideTimer = new Timer() {
@Override
public void run() {
hide();
}
};
layout.addStyleName("wui-toast");
titleLabel.addStyleName("toast-title");
messageLabel.addStyleName("toast-message");
}
@Override
public void hide() {
super.hide();
slots[slotNumber] = null;
}
/**
* Start showing popup
*/
public void start() {
setPopupPositionAndShow(new PositionCallback() {
@Override
public void setPosition(int offsetWidth, int offsetHeight) {
int slotOffset = 0;
for (int i = 0; i < slotNumber; i++) {
if (slots[i] != null) {
slotOffset += slots[i].getOffsetHeight() + PADDING;
}
}
// scrollTo - go to the top of the page when showing toast
Window.scrollTo(Window.getScrollLeft(), 0);
Toast.this.setPopupPosition(Window.getClientWidth() - offsetWidth - PADDING,
Window.getScrollTop() + PADDING + slotOffset);
}
});
hideTimer.schedule(HIDE_DELAY_MS);
}
/**
* Show a error message
*
* @param message
*/
public static void showError(String message) {
Toast errorPopup = new Toast(MessagePopupType.ERROR_MESSAGE, messages.alertErrorTitle(), message);
errorPopup.start();
}
/**
* Show an error message
*
* @param title
* @param message
*/
public static void showError(String title, String message) {
Toast errorPopup = new Toast(MessagePopupType.ERROR_MESSAGE, title, message);
errorPopup.start();
}
/**
* Show a error message
*
* @param message
*/
public static void showInfo(String title, String message) {
Toast errorPopup = new Toast(MessagePopupType.INFO, title, message);
errorPopup.start();
}
/**
* Get the message popup type
*
* @return
*/
public MessagePopupType getType() {
return type;
}
public static void showError(Throwable caught) {
showError(caught.getClass().getName(), caught.getMessage());
}
}