Hi, I believe this widget could be quite needed within Ajax based applications. As a starting point, I coded this in about 20 minutes for a small project we're doing, but it would be nice to have an official one.
As I said, this is a simplistic widget and it works for my needs, but this is to illustrate how fairly easy implementing a Growl-like notification is easy.
Code:
public class GrowlPanel extends VLayout { static public final int DEFAULT_MESSAGE_DELAY = 30000; static public final int MESSAGE_WIDTH = 300; static private class GrowlMessage extends Canvas { private Label label; private Button close; private Timer timeout; public GrowlMessage(String html, int delay) { super(); setShowEdges(false); setShowShadow(false); setMargin(4); label = new Label(html); label.setShowEdges(true); label.setEdgeSize(2); label.setShowShadow(true); label.setShadowDepth(2); label.setBackgroundColor("#FFD255"); label.setOpacity(85); label.setAutoHeight(); label.setWidth100(); label.setMargin(2); label.setPadding(8); addChild(label); close = new Button("X"); close.setPosition(Positioning.ABSOLUTE); close.setLeft( MESSAGE_WIDTH - 32 ); close.setTop(8); close.setWidth(16); close.setHeight(16); close.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { clearMessage(); } }); close.setVisible(false); addChild(close); initTimeout(delay); initHover(); } private void initTimeout(int delay) { timeout = new Timer() { @Override public void run() { clearMessage(); } }; timeout.schedule(delay); } private void initHover() { addMouseOverHandler(new MouseOverHandler() { @Override public void onMouseOver(MouseOverEvent event) { //close.animateShow(AnimationEffect.FADE); close.setVisible(true); event.cancel(); } }); addMouseOutHandler(new MouseOutHandler() { @Override public void onMouseOut(MouseOutEvent event) { //close.animateHide(AnimationEffect.FADE); close.setVisible(false); event.cancel(); } }); } protected void clearMessage() { timeout.cancel(); close.removeFromParent(); close.destroy(); animateFade(0, new AnimationCallback() { @Override public void execute(boolean earlyFinish) { removeFromParent(); destroy(); } }); } } public GrowlPanel() { setPosition(Positioning.ABSOLUTE); setWidth( MESSAGE_WIDTH ); // default width setAutoHeight(); // auto height setTop( 6 ); Window.addResizeHandler(new ResizeHandler() { @Override public void onResize(ResizeEvent event) { refreshPosition(); } }); refreshPosition(); } private void refreshPosition() { setLeft((Window.getClientWidth() - MESSAGE_WIDTH) - 20); } public void addMessage(String html) { addMember(new GrowlMessage(html, DEFAULT_MESSAGE_DELAY)); } public void addMessage(String html, int delay) { addMember(new GrowlMessage(html, delay)); } }
Comment