Ext.ux.Notification for GXT GWT
This is a conversion of the Ext.ux.Notification plugin (http://www.sencha.com/forum/showthre...x.Notification) to use with GWT, using the GXT components.
Any improvement or suggestion is welcome.
GXT Rocks!
Code:
package com.extjs.gxt.ui.client.plugins.notification;
/**
* NotificationWindow is translation of Ext.ux.ToastWindow
*
* @author Edouard Fattal
* @date March 14, 2008
*
* @class Ext.ux.ToastWindow
* @extends Ext.Window
*
*********************************************************************
*
* NotificationWindow
*
* @author Alejandro Casagrande - Advenio Software
* @company Advenio Software
* @website http://www.advenio.com.ar
* @date August 4, 2011
*
* @class com.extjs.gxt.ui.client.plugins.notification.NotificationWindow
* @extends com.extjs.gxt.ui.client.widget.Window
*
*/
import java.util.ArrayList;
import com.extjs.gxt.ui.client.Style.Direction;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.fx.FxConfig;
import com.extjs.gxt.ui.client.util.DelayedTask;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Html;
import com.extjs.gxt.ui.client.widget.Window;
public class NotificationWindow extends Window{
protected static ArrayList<Integer> positions = new ArrayList<Integer>();
protected DelayedTask task = null;
protected boolean autoDestroy = false;
protected int hideDelay = 5000;
protected int position = 0;
protected com.google.gwt.user.client.Element document;
protected String message;
protected String iconCls;
protected Listener<BaseEvent> clickListener;
public int getHideDelay() {
return hideDelay;
}
public void setHideDelay(int hideDelay) {
this.hideDelay = hideDelay;
}
public NotificationWindow(boolean autoDestroy,com.google.gwt.user.client.Element document,String iconCls){
super();
this.setWidth(200);
this.document = document;
this.setAutoHeight(true);
this.setPlain(false);
this.iconCls = iconCls;
this.setDraggable(false);
this.setBodyStyle("text-align:center");
this.autoDestroy = autoDestroy;
this.setResizable(false);
this.setStyleName("x-notification");
if (autoDestroy){
this.setClosable(false);
task = new DelayedTask(new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
animOnhide();
}
});
clickListener = new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
removeListener(Events.OnMouseDown, clickListener);
cancelHiding();
}
};
this.addListener(Events.OnMouseDown, clickListener);
}else{
this.setClosable(true);
}
if (iconCls!=null){
this.setIcon(IconHelper.createStyle(iconCls));
}
}
public void setMessage(String message){
this.message = message;
}
protected void cancelHiding(){
setClosable(true);
initTools();
this.addStyleName("fixed");
if(this.autoDestroy) {
this.task.cancel();
}
}
@Override
protected void afterShow() {
super.afterShow();
if(this.autoDestroy) {
this.task.delay(this.hideDelay);
}
Html html = new Html(message);
this.body.update(html.getHtml());
animShow();
}
protected void animOnhide(){
FxConfig fxConfig = FxConfig.NONE;
fxConfig.setDuration(1000);
el().slideOut(Direction.DOWN, fxConfig);
el().fadeOut(fxConfig);
focusable = false;
if (positions.indexOf(this.position)!=-1){
positions.remove(positions.indexOf(this.position));
this.position=-1;
}
}
@Override
protected void onHide() {
if (positions.indexOf(this.position)!=-1){
positions.remove(positions.indexOf(this.position));
this.position=-1;
}
super.onHide();
}
protected void animShow(){
this.position = 0;
while (positions.indexOf(position)>-1){
position++;
}
positions.add(position);
this.setSize(200,100);
int[] offsets = new int[2];
offsets[0] = -20;
offsets[1] = -20-((this.getSize().height+10)*this.position);
this.el().alignTo(document, "br-br", offsets);
FxConfig cfg = FxConfig.NONE;
cfg.setDuration(1);
el().slideIn(Direction.UP, cfg);
}
}