--- /dev/null
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import com.google.gwt.user.client.DOM;\r
+import com.google.gwt.user.client.Element;\r
+import com.google.gwt.user.client.Event;\r
+import com.google.gwt.user.client.EventPreview;\r
+import com.google.gwt.user.client.Timer;\r
+import com.google.gwt.user.client.ui.HTML;\r
+import com.google.gwt.user.client.ui.PopupPanel;\r
+import com.google.gwt.user.client.ui.Widget;\r
+\r
+public class Notification extends PopupPanel {\r
+\r
+ public static final int CENTERED = 1;\r
+ public static final int CENTERED_TOP = 2;\r
+ public static final int CENTERED_BOTTOM = 3;\r
+ public static final int TOP_LEFT = 4;\r
+ public static final int TOP_RIGHT = 5;\r
+ public static final int BOTTOM_LEFT = 6;\r
+ public static final int BOTTOM_RIGHT = 7;\r
+\r
+ public static final int DELAY_FOREVER = -1;\r
+ public static final int DELAY_NONE = 0;\r
+\r
+ private static final String STYLENAME = "i-Notification";\r
+ private static final int mouseMoveThreshold = 7;\r
+ private static final int Z_INDEX_BASE = 20000;\r
+\r
+ private int startOpacity = 90;\r
+ private int fadeMsec = 400;\r
+ private int delayMsec = 1000;\r
+\r
+ private Timer fader;\r
+ private Timer delay;\r
+ private EventPreview eventPreview;\r
+\r
+ private String temporaryStyle;\r
+\r
+ public Notification() {\r
+ setStylePrimaryName(STYLENAME);\r
+ sinkEvents(Event.ONCLICK);\r
+ DOM.setStyleAttribute(getElement(), "zIndex", "" + Z_INDEX_BASE);\r
+ }\r
+\r
+ public Notification(int delayMsec) {\r
+ this();\r
+ this.delayMsec = delayMsec;\r
+ }\r
+\r
+ public Notification(int delayMsec, int fadeMsec, int startOpacity) {\r
+ this(delayMsec);\r
+ this.fadeMsec = fadeMsec;\r
+ this.startOpacity = startOpacity;\r
+ }\r
+\r
+ public void startDelay() {\r
+ DOM.removeEventPreview(eventPreview);\r
+ if (delayMsec > 0) {\r
+ delay = new Timer() {\r
+ public void run() {\r
+ fade();\r
+ }\r
+ };\r
+ delay.scheduleRepeating(delayMsec);\r
+ } else if (delayMsec == 0) {\r
+ fade();\r
+ }\r
+ }\r
+\r
+ public void show() {\r
+ show(CENTERED);\r
+ }\r
+\r
+ public void show(String style) {\r
+ show(CENTERED, style);\r
+ }\r
+\r
+ public void show(int position) {\r
+ show(position, null);\r
+ }\r
+\r
+ public void show(Widget widget, int position, String style) {\r
+ setWidget(widget);\r
+ show(position, style);\r
+ }\r
+\r
+ public void show(String html, int position, String style) {\r
+ setWidget(new HTML(html));\r
+ show(position, style);\r
+ }\r
+\r
+ public void show(int position, String style) {\r
+ hide();\r
+ setOpacity(getElement(), startOpacity);\r
+ if (style != null) {\r
+ this.temporaryStyle = style;\r
+ addStyleName(style);\r
+ }\r
+ super.show();\r
+ setPosition(position);\r
+\r
+ if (eventPreview == null) {\r
+ eventPreview = new EventPreview() {\r
+ int x = -1;\r
+ int y = -1;\r
+\r
+ public boolean onEventPreview(Event event) {\r
+ switch (DOM.eventGetType(event)) {\r
+ case Event.ONMOUSEMOVE:\r
+ if (x < 0) {\r
+ x = DOM.eventGetClientX(event);\r
+ y = DOM.eventGetClientY(event);\r
+ } else if (Math.abs(DOM.eventGetClientX(event) - x) > mouseMoveThreshold\r
+ || Math.abs(DOM.eventGetClientY(event) - y) > mouseMoveThreshold) {\r
+ startDelay();\r
+ }\r
+ break;\r
+ case Event.KEYEVENTS:\r
+ case Event.ONCLICK:\r
+ case Event.ONDBLCLICK:\r
+ case Event.ONSCROLL:\r
+ default:\r
+ startDelay();\r
+ }\r
+ return true;\r
+ }\r
+ };\r
+ }\r
+\r
+ DOM.addEventPreview(eventPreview);\r
+ }\r
+\r
+ public void hide() {\r
+ DOM.removeEventPreview(eventPreview);\r
+ cancelDelay();\r
+ cancelFade();\r
+ if (this.temporaryStyle != null) {\r
+ removeStyleName(this.temporaryStyle);\r
+ this.temporaryStyle = null;\r
+ }\r
+ super.hide();\r
+ }\r
+\r
+ public void fade() {\r
+ cancelDelay();\r
+ fader = new Timer() {\r
+ int opacity = startOpacity;\r
+\r
+ public void run() {\r
+ opacity -= 5;\r
+ setOpacity(getElement(), opacity);\r
+ if (opacity <= 0) {\r
+ cancel();\r
+ hide();\r
+ }\r
+ }\r
+ };\r
+ int msec = fadeMsec / (startOpacity / 5);\r
+ fader.scheduleRepeating(msec);\r
+ }\r
+\r
+ public void setPosition(int position) {\r
+ Element el = getElement();\r
+ DOM.setStyleAttribute(el, "top", null);\r
+ DOM.setStyleAttribute(el, "left", null);\r
+ DOM.setStyleAttribute(el, "bottom", null);\r
+ DOM.setStyleAttribute(el, "right", null);\r
+ switch (position) {\r
+ case TOP_LEFT:\r
+ DOM.setStyleAttribute(el, "top", "0px");\r
+ DOM.setStyleAttribute(el, "left", "0px");\r
+ break;\r
+ case TOP_RIGHT:\r
+ DOM.setStyleAttribute(el, "top", "0px");\r
+ DOM.setStyleAttribute(el, "right", "0px");\r
+ break;\r
+ case BOTTOM_RIGHT:\r
+ DOM.setStyleAttribute(el, "position", "absolute");\r
+ DOM.setStyleAttribute(el, "bottom", "0px");\r
+ DOM.setStyleAttribute(el, "right", "0px");\r
+ break;\r
+ case BOTTOM_LEFT:\r
+ DOM.setStyleAttribute(el, "bottom", "0px");\r
+ DOM.setStyleAttribute(el, "left", "0px");\r
+ break;\r
+ case CENTERED_TOP:\r
+ center();\r
+ DOM.setStyleAttribute(el, "top", "0px");\r
+ break;\r
+ case CENTERED_BOTTOM:\r
+ center();\r
+ DOM.setStyleAttribute(el, "top", null);\r
+ DOM.setStyleAttribute(el, "bottom", "0px");\r
+ break;\r
+ default:\r
+ case CENTERED:\r
+ center();\r
+ break;\r
+ }\r
+ }\r
+\r
+ private void cancelFade() {\r
+ if (fader != null) {\r
+ fader.cancel();\r
+ fader = null;\r
+ }\r
+ }\r
+\r
+ private void cancelDelay() {\r
+ if (delay != null) {\r
+ delay.cancel();\r
+ delay = null;\r
+ }\r
+ }\r
+\r
+ private void setOpacity(Element el, int opacity) {\r
+ DOM.setStyleAttribute(el, "opacity", "" + (opacity / 100.0));\r
+ DOM.setStyleAttribute(el, "filter", "Alpha(opacity=" + opacity + ")");\r
+\r
+ }\r
+\r
+ public void onBrowserEvent(Event event) {\r
+ DOM.removeEventPreview(eventPreview);\r
+ if (fader == null) {\r
+ fade();\r
+ }\r
+ }\r
+\r
+}\r
package com.itmill.toolkit.ui;
-import com.itmill.toolkit.Application;
-import com.itmill.toolkit.Application.WindowAttachEvent;
-import com.itmill.toolkit.Application.WindowAttachListener;
-import com.itmill.toolkit.terminal.DownloadStream;
-import com.itmill.toolkit.terminal.PaintException;
-import com.itmill.toolkit.terminal.PaintTarget;
-import com.itmill.toolkit.terminal.ParameterHandler;
-import com.itmill.toolkit.terminal.Resource;
-import com.itmill.toolkit.terminal.Sizeable;
-import com.itmill.toolkit.terminal.Terminal;
-import com.itmill.toolkit.terminal.URIHandler;
-
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
-import java.util.Iterator;
import java.util.Set;
+import com.itmill.toolkit.Application;
+import com.itmill.toolkit.terminal.DownloadStream;
+import com.itmill.toolkit.terminal.PaintException;
+import com.itmill.toolkit.terminal.PaintTarget;
+import com.itmill.toolkit.terminal.ParameterHandler;
+import com.itmill.toolkit.terminal.Resource;
+import com.itmill.toolkit.terminal.Sizeable;
+import com.itmill.toolkit.terminal.Terminal;
+import com.itmill.toolkit.terminal.URIHandler;
+
/**
* Application window component.
*
private LinkedList parameterHandlerList = null;
/** Set of subwindows */
- private HashSet subwindows = new HashSet();
+ private final HashSet subwindows = new HashSet();
/**
* Explicitly specified theme of this window. If null, application theme is
/**
* Resources to be opened automatically on next repaint.
*/
- private LinkedList openList = new LinkedList();
+ private final LinkedList openList = new LinkedList();
/**
* The name of the window.
*/
private int scrollLeft = 0;
+ private LinkedList notifications;
+
/* ********************************************************************* */
/**
* @return the parent application of the component.
*/
public final Application getApplication() {
- if (getParent() == null)
+ if (getParent() == null) {
return this.application;
+ }
return ((Window) getParent()).getApplication();
}
public void addURIHandler(URIHandler handler) {
// TODO Subwindow support
- if (uriHandlerList == null)
+ if (uriHandlerList == null) {
uriHandlerList = new LinkedList();
+ }
synchronized (uriHandlerList) {
- if (!uriHandlerList.contains(handler))
+ if (!uriHandlerList.contains(handler)) {
uriHandlerList.addLast(handler);
+ }
}
}
public void removeURIHandler(URIHandler handler) {
// TODO Subwindow support
- if (handler == null || uriHandlerList == null)
+ if (handler == null || uriHandlerList == null) {
return;
+ }
synchronized (uriHandlerList) {
uriHandlerList.remove(handler);
- if (uriHandlerList.isEmpty())
+ if (uriHandlerList.isEmpty()) {
uriHandlerList = null;
+ }
}
}
DownloadStream ds = ((URIHandler) handlers[i]).handleURI(
context, relativeUri);
if (ds != null) {
- if (result != null)
+ if (result != null) {
throw new RuntimeException("handleURI for " + context
+ " uri: '" + relativeUri
+ "' returns ambigious result.");
+ }
result = ds;
}
}
*/
public void addParameterHandler(ParameterHandler handler) {
// TODO Subwindow support
- if (parameterHandlerList == null)
+ if (parameterHandlerList == null) {
parameterHandlerList = new LinkedList();
+ }
synchronized (parameterHandlerList) {
- if (!parameterHandlerList.contains(handler))
+ if (!parameterHandlerList.contains(handler)) {
parameterHandlerList.addLast(handler);
+ }
}
}
*/
public void removeParameterHandler(ParameterHandler handler) {
// TODO Subwindow support
- if (handler == null || parameterHandlerList == null)
+ if (handler == null || parameterHandlerList == null) {
return;
+ }
synchronized (parameterHandlerList) {
parameterHandlerList.remove(handler);
- if (parameterHandlerList.isEmpty())
+ if (parameterHandlerList.isEmpty()) {
parameterHandlerList = null;
+ }
}
}
synchronized (parameterHandlerList) {
handlers = parameterHandlerList.toArray();
}
- for (int i = 0; i < handlers.length; i++)
+ for (int i = 0; i < handlers.length; i++) {
((ParameterHandler) handlers[i]).handleParameters(parameters);
+ }
}
}
* returned
*/
public String getTheme() {
- if (getParent() != null)
+ if (getParent() != null) {
return ((Window) getParent()).getTheme();
- if (theme != null)
+ }
+ if (theme != null) {
return theme;
- if ((application != null) && (application.getTheme() != null))
+ }
+ if ((application != null) && (application.getTheme() != null)) {
return application.getTheme();
- if (terminal != null)
+ }
+ if (terminal != null) {
return terminal.getDefaultTheme();
+ }
return null;
}
* the New theme for this window. Null implies the default theme.
*/
public void setTheme(String theme) {
- if (getParent() != null)
+ if (getParent() != null) {
throw new UnsupportedOperationException(
"Setting theme for sub-windws is not supported.");
+ }
this.theme = theme;
requestRepaint();
}
// Marks the main window
if (getApplication() != null
- && this == getApplication().getMainWindow())
+ && this == getApplication().getMainWindow()) {
target.addAttribute("main", true);
+ }
// Open requested resource
synchronized (openList) {
if (!openList.isEmpty()) {
- for (Iterator i = openList.iterator(); i.hasNext();)
+ for (Iterator i = openList.iterator(); i.hasNext();) {
((OpenResource) i.next()).paintContent(target);
+ }
openList.clear();
}
}
target.addVariable(this, "close", false);
// Sets the focused component
- if (this.focusedComponent != null)
+ if (this.focusedComponent != null) {
target.addVariable(this, "focused", ""
+ this.focusedComponent.getFocusableId());
- else
+ } else {
target.addVariable(this, "focused", "");
+ }
// Paint subwindows
for (Iterator i = subwindows.iterator(); i.hasNext();) {
w.paint(target);
}
+ // Paint notifications
+ if (this.notifications != null) {
+ target.startTag("notifications");
+ for (Iterator it = this.notifications.iterator(); it.hasNext();) {
+ Notification n = (Notification) it.next();
+ target.startTag("notification");
+ if (n.getCaption() != null) {
+ target.addAttribute("caption", n.getCaption());
+ }
+ if (n.getMessage() != null) {
+ target.addAttribute("message", n.getMessage());
+ }
+ target.addAttribute("position", n.getPosition());
+ target.addAttribute("delay", n.getDelayMsec());
+ if (n.getStyleName() != null) {
+ target.addAttribute("style", n.getStyleName());
+ }
+ target.endTag("notification");
+ }
+ target.endTag("notifications");
+ this.notifications = null;
+ }
+
}
/* ********************************************************************* */
*/
public void open(Resource resource) {
synchronized (openList) {
- if (!openList.contains(resource))
+ if (!openList.contains(resource)) {
openList.add(new OpenResource(resource, null, -1, -1,
BORDER_DEFAULT));
+ }
}
requestRepaint();
}
*/
public void open(Resource resource, String windowName) {
synchronized (openList) {
- if (!openList.contains(resource))
+ if (!openList.contains(resource)) {
openList.add(new OpenResource(resource, windowName, -1, -1,
BORDER_DEFAULT));
+ }
}
requestRepaint();
}
public void open(Resource resource, String windowName, int width,
int height, int border) {
synchronized (openList) {
- if (!openList.contains(resource))
+ if (!openList.contains(resource)) {
openList.add(new OpenResource(resource, windowName, width,
height, border));
+ }
}
requestRepaint();
}
*/
public URL getURL() {
- if (application == null)
+ if (application == null) {
return null;
+ }
try {
return new URL(application.getURL(), getName() + "/");
public void setApplication(Application application) {
// If the application is not changed, dont do nothing
- if (application == this.application)
+ if (application == this.application) {
return;
+ }
// Sends detach event if the window is connected to application
if (this.application != null) {
this.application = application;
// Sends the attach event if connected to a window
- if (application != null)
+ if (application != null) {
attach();
+ }
}
/**
public void setName(String name) {
// The name can not be changed in application
- if (getApplication() != null)
+ if (getApplication() != null) {
throw new IllegalStateException(
"Window name can not be changed while "
+ "the window is in application");
+ }
this.name = name;
}
* @see com.itmill.toolkit.terminal.Sizeable#getHeightUnits()
*/
public void setHeightUnits(int units) {
- if (units != Sizeable.UNITS_PIXELS)
+ if (units != Sizeable.UNITS_PIXELS) {
throw new IllegalArgumentException("Only pixels are supported");
+ }
}
/**
* @see com.itmill.toolkit.terminal.Sizeable#getWidthUnits()
*/
public void setWidthUnits(int units) {
- if (units != Sizeable.UNITS_PIXELS)
+ if (units != Sizeable.UNITS_PIXELS) {
throw new IllegalArgumentException("Only pixels are supported");
+ }
}
/**
*/
private class OpenResource {
- private Resource resource;
+ private final Resource resource;
- private String name;
+ private final String name;
- private int width;
+ private final int width;
- private int height;
+ private final int height;
- private int border;
+ private final int border;
/**
* Creates a new open resource.
private void paintContent(PaintTarget target) throws PaintException {
target.startTag("open");
target.addAttribute("src", resource);
- if (name != null && name.length() > 0)
+ if (name != null && name.length() > 0) {
target.addAttribute("name", name);
- if (width >= 0)
+ }
+ if (width >= 0) {
target.addAttribute("width", width);
- if (height >= 0)
+ }
+ if (height >= 0) {
target.addAttribute("height", height);
+ }
switch (border) {
case Window.BORDER_MINIMAL:
target.addAttribute("border", "minimal");
public void addWindow(Window window) throws IllegalArgumentException,
NullPointerException {
- if (getParent() != null)
+ if (getParent() != null) {
throw new IllegalArgumentException(
"You can only add windows inside application-level windows");
+ }
- if (window == null)
+ if (window == null) {
throw new NullPointerException("Argument must not be null");
+ }
subwindows.add(window);
window.setParent(this);
this.scrollLeft = scrollLeft;
}
+ public void showNotification(String message) {
+ addNotification(new Notification(message));
+ }
+
+ public void showNotification(String message, int type) {
+ addNotification(new Notification(message, type));
+ }
+
+ public void showNotification(String caption, String message, int type) {
+ addNotification(new Notification(caption, message, type));
+ }
+
+ public void showNotification(Notification notification) {
+ addNotification(notification);
+ }
+
+ private void addNotification(Notification notification) {
+ if (this.notifications == null) {
+ this.notifications = new LinkedList();
+ }
+ this.notifications.add(notification);
+ requestRepaint();
+ }
+
+ public class Notification {
+ public static final int TYPE_HUMANIZED_MESSAGE = 1;
+ public static final int TYPE_WARNING_MESSAGE = 2;
+ public static final int TYPE_ERROR_MESSAGE = 3;
+ public static final int TYPE_TRAY_NOTIFICATION = 4;
+
+ public static final int POSITION_CENTERED = 1;
+ public static final int POSITION_CENTERED_TOP = 2;
+ public static final int POSITION_CENTERED_BOTTOM = 3;
+ public static final int POSITION_TOP_LEFT = 4;
+ public static final int POSITION_TOP_RIGHT = 5;
+ public static final int POSITION_BOTTOM_LEFT = 6;
+ public static final int POSITION_BOTTOM_RIGHT = 7;
+
+ public static final int DELAY_FOREVER = -1;
+ public static final int DELAY_NONE = 0;
+
+ private String caption;
+ private String message;
+ private Resource icon;
+ private int position = POSITION_CENTERED;
+ private int delayMsec = 0;
+ private String styleName;
+
+ public Notification(String message) {
+ this(null, message, TYPE_HUMANIZED_MESSAGE);
+ }
+
+ public Notification(String message, int type) {
+ this(null, message, type);
+ }
+
+ public Notification(String caption, String message, int type) {
+ this.caption = caption;
+ this.message = message;
+ setType(type);
+ }
+
+ private void setType(int type) {
+ switch (type) {
+ case TYPE_WARNING_MESSAGE:
+ delayMsec = 1500;
+ styleName = "warning";
+ break;
+ case TYPE_ERROR_MESSAGE:
+ delayMsec = -1;
+ styleName = "error";
+ break;
+ case TYPE_TRAY_NOTIFICATION:
+ delayMsec = 3000;
+ position = POSITION_BOTTOM_RIGHT;
+ styleName = "tray";
+
+ case TYPE_HUMANIZED_MESSAGE:
+ default:
+ break;
+ }
+
+ }
+
+ public String getCaption() {
+ return caption;
+ }
+
+ public void setCaption(String caption) {
+ this.caption = caption;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public int getPosition() {
+ return position;
+ }
+
+ public void setPosition(int position) {
+ this.position = position;
+ }
+
+ public Resource getIcon() {
+ return icon;
+ }
+
+ public void setIcon(Resource icon) {
+ this.icon = icon;
+ }
+
+ public int getDelayMsec() {
+ return delayMsec;
+ }
+
+ public void setDelayMsec(int delayMsec) {
+ this.delayMsec = delayMsec;
+ }
+
+ public void setStyleName(String styleName) {
+ this.styleName = styleName;
+ }
+
+ public String getStyleName() {
+ return this.styleName;
+ }
+ }
}