import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
import com.itmill.toolkit.terminal.gwt.client.ui.CalendarEntry;\r
-import com.itmill.toolkit.terminal.gwt.client.ui.CalendarPanel;\r
+import com.itmill.toolkit.terminal.gwt.client.ui.ICalendarPanel;\r
import com.itmill.toolkit.terminal.gwt.client.ui.IDateField;\r
\r
public class ICalendarField extends IDateField {\r
\r
- private final CalendarPanel calPanel;\r
+ private final ICalendarPanel calPanel;\r
\r
private SimplePanel hourPanel;\r
\r
public ICalendarField() {\r
super();\r
setStyleName(CLASSNAME);\r
- calPanel = new CalendarPanel(this);\r
+ calPanel = new ICalendarPanel(this);\r
add(calPanel);\r
entrySource = new EntrySource();\r
calPanel.setCalendarEntrySource(entrySource);\r
\r
}\r
\r
- private class EntrySource implements CalendarPanel.CalendarEntrySource {\r
+ private class EntrySource implements ICalendarPanel.CalendarEntrySource {\r
\r
private final HashMap dates = new HashMap();\r
\r
import com.google.gwt.user.client.ui.HasFocus;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
-import com.itmill.toolkit.terminal.gwt.client.ui.ContextMenu;
+import com.itmill.toolkit.terminal.gwt.client.ui.IContextMenu;
import com.itmill.toolkit.terminal.gwt.client.ui.Field;
import com.itmill.toolkit.terminal.gwt.client.ui.IView;
-import com.itmill.toolkit.terminal.gwt.client.ui.Notification;
-import com.itmill.toolkit.terminal.gwt.client.ui.Notification.HideEvent;
+import com.itmill.toolkit.terminal.gwt.client.ui.INotification;
+import com.itmill.toolkit.terminal.gwt.client.ui.INotification.HideEvent;
/**
* Entry point classes define <code>onModuleLoad()</code>.
private final WidgetSet widgetSet;
- private ContextMenu contextMenu = null;
+ private IContextMenu contextMenu = null;
private Timer loadTimer;
private Timer loadTimer2;
configuration = cnf;
if (isDebugMode()) {
- console = new DebugConsole(this, cnf);
+ console = new IDebugConsole(this, cnf);
} else {
console = new NullConsole();
}
}
if (html.length() != 0) {
- Notification n = new Notification(1000 * 60 * 45); // 45min
+ INotification n = new INotification(1000 * 60 * 45); // 45min
n.addEventListener(new NotificationRedirect(url));
- n.show(html, Notification.CENTERED_TOP, "system");
+ n.show(html, INotification.CENTERED_TOP, "system");
} else {
redirect(url);
}
*
* @return IContextMenu object
*/
- public ContextMenu getContextMenu() {
+ public IContextMenu getContextMenu() {
if (contextMenu == null) {
- contextMenu = new ContextMenu();
+ contextMenu = new IContextMenu();
if (usePaintableIdsInDOM) {
DOM.setElementProperty(contextMenu.getElement(), "id",
"PID_TOOLKIT_CM");
* messages, such as session expired.
*
*/
- private class NotificationRedirect implements Notification.EventListener {
+ private class NotificationRedirect implements INotification.EventListener {
String url;
NotificationRedirect(String url) {
return info;
}
- private final Tooltip tooltip = new Tooltip(this);
+ private final ITooltip tooltip = new ITooltip(this);
/**
* Component may want to delegate Tooltip handling to client. Layouts add
+++ /dev/null
-/*
-@ITMillApache2LicenseForJavaFiles@
- */
-
-package com.itmill.toolkit.terminal.gwt.client;
-
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.ui.HTML;
-import com.itmill.toolkit.terminal.gwt.client.ui.Icon;
-
-public class Caption extends HTML {
-
- public static final String CLASSNAME = "i-caption";
-
- private final Paintable owner;
-
- private Element errorIndicatorElement;
-
- private Element requiredFieldIndicator;
-
- private Icon icon;
-
- private Element captionText;
-
- private final ApplicationConnection client;
-
- private boolean placedAfterComponent = false;
-
- /**
- *
- * @param component
- * optional owner of caption. If not set, getOwner will
- * return null
- * @param client
- */
- public Caption(Paintable component, ApplicationConnection client) {
- super();
- this.client = client;
- owner = component;
- setStyleName(CLASSNAME);
- }
-
- public void updateCaption(UIDL uidl) {
- setVisible(!uidl.getBooleanAttribute("invisible"));
-
- setStyleName(getElement(), "i-disabled", uidl.hasAttribute("disabled"));
-
- boolean isEmpty = true;
-
- placedAfterComponent = true;
-
- if (uidl.hasAttribute("icon")) {
- if (icon == null) {
- icon = new Icon(client);
- placedAfterComponent = false;
- DOM.insertChild(getElement(), icon.getElement(), 0);
- }
- icon.setUri(uidl.getStringAttribute("icon"));
- isEmpty = false;
- } else {
- if (icon != null) {
- DOM.removeChild(getElement(), icon.getElement());
- icon = null;
- }
- }
-
- if (uidl.hasAttribute("caption")) {
- if (captionText == null) {
- captionText = DOM.createSpan();
- DOM
- .insertChild(getElement(), captionText,
- icon == null ? 0 : 1);
- }
- String c = uidl.getStringAttribute("caption");
- if (c == null) {
- c = "";
- } else {
- isEmpty = false;
- placedAfterComponent = false;
- }
- DOM.setInnerText(captionText, c);
- } else {
- // TODO should span also be removed
- }
-
- if (uidl.hasAttribute("description")) {
- if (captionText != null) {
- addStyleDependentName("hasdescription");
- } else {
- removeStyleDependentName("hasdescription");
- }
- }
-
- if (uidl.getBooleanAttribute("required")) {
- isEmpty = false;
- if (requiredFieldIndicator == null) {
- requiredFieldIndicator = DOM.createSpan();
- DOM.setInnerText(requiredFieldIndicator, "*");
- DOM.setElementProperty(requiredFieldIndicator, "className",
- "i-required-field-indicator");
- DOM.appendChild(getElement(), requiredFieldIndicator);
- }
- } else {
- if (requiredFieldIndicator != null) {
- DOM.removeChild(getElement(), requiredFieldIndicator);
- requiredFieldIndicator = null;
- }
- }
-
- if (uidl.hasAttribute("error")) {
- isEmpty = false;
- if (errorIndicatorElement == null) {
- errorIndicatorElement = DOM.createDiv();
- DOM.setInnerHTML(errorIndicatorElement, " ");
- DOM.setElementProperty(errorIndicatorElement, "className",
- "i-errorindicator");
- DOM.appendChild(getElement(), errorIndicatorElement);
- }
- } else if (errorIndicatorElement != null) {
- DOM.removeChild(getElement(), errorIndicatorElement);
- errorIndicatorElement = null;
- }
-
- // Workaround for IE weirdness, sometimes returns bad height in some
- // circumstances when Caption is empty. See #1444
- // IE7 bugs more often. I wonder what happens when IE8 arrives...
- if (Util.isIE()) {
- if (isEmpty) {
- setHeight("0px");
- DOM.setStyleAttribute(getElement(), "overflow", "hidden");
- } else {
- setHeight("");
- DOM.setStyleAttribute(getElement(), "overflow", "");
- }
-
- }
-
- }
-
- public void onBrowserEvent(Event event) {
- super.onBrowserEvent(event);
- final Element target = DOM.eventGetTarget(event);
- if (client != null && !DOM.compare(target, getElement())) {
- client.handleTooltipEvent(event, owner);
- }
- }
-
- public static boolean isNeeded(UIDL uidl) {
- if (uidl.getStringAttribute("caption") != null) {
- return true;
- }
- if (uidl.hasAttribute("error")) {
- return true;
- }
- if (uidl.hasAttribute("icon")) {
- return true;
- }
- if (uidl.hasAttribute("required")) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Returns Paintable for which this Caption belongs to.
- *
- * @return owner Widget
- */
- public Paintable getOwner() {
- return owner;
- }
-
- public boolean shouldBePlacedAfterComponent() {
- return placedAfterComponent;
- }
-}
+++ /dev/null
-/*
-@ITMillApache2LicenseForJavaFiles@
- */
-
-package com.itmill.toolkit.terminal.gwt.client;
-
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-public class CaptionWrapper extends FlowPanel {
-
- public static final String CLASSNAME = "i-captionwrapper";
- Caption caption;
- Paintable widget;
-
- public CaptionWrapper(Paintable toBeWrapped, ApplicationConnection client) {
- caption = new Caption(toBeWrapped, client);
- add(caption);
- widget = toBeWrapped;
- add((Widget) widget);
- setStyleName(CLASSNAME);
- }
-
- public void updateCaption(UIDL uidl) {
- caption.updateCaption(uidl);
- setVisible(!uidl.getBooleanAttribute("invisible"));
- }
-
- public Paintable getPaintable() {
- return widget;
- }
-}
+++ /dev/null
-/*
-@ITMillApache2LicenseForJavaFiles@
- */
-
-package com.itmill.toolkit.terminal.gwt.client;
-
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.Panel;
-import com.google.gwt.user.client.ui.ScrollPanel;
-import com.google.gwt.user.client.ui.Widget;
-import com.itmill.toolkit.terminal.gwt.client.ui.IWindow;
-
-public final class DebugConsole extends IWindow implements Console {
-
- /**
- * Builds number. For example 0-custom_tag in 5.0.0-custom_tag.
- */
- public static final String VERSION;
-
- /* Initialize version numbers from string replaced by build-script. */
- static {
- if ("@VERSION@".equals("@" + "VERSION" + "@")) {
- VERSION = "5.9.9-INTERNAL-NONVERSIONED-DEBUG-BUILD";
- } else {
- VERSION = "@VERSION@";
- }
- }
-
- private final Panel panel;
-
- public DebugConsole(ApplicationConnection client,
- ApplicationConfiguration cnf) {
- super();
- this.client = client;
- panel = new FlowPanel();
- final ScrollPanel p = new ScrollPanel();
- p.add(panel);
- setWidget(p);
- setCaption("Debug window");
- minimize();
- show();
-
- ;
-
- log("Toolkit application servlet version: " + cnf.getSerletVersion());
- log("Widget set is built on version: " + VERSION);
- log("Application version: " + cnf.getApplicationVersion());
-
- if (!cnf.getSerletVersion().equals(VERSION)) {
- error("Warning: your widget set seems to be built with different "
- + "version than the one used on server. Unexpected "
- + "behavior may occur.");
- }
- }
-
- private void minimize() {
- // TODO stack to bottom (create window manager of some sort)
- setPixelSize(60, 60);
- setPopupPosition(Window.getClientWidth()
- - 142, 0);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.itmill.toolkit.terminal.gwt.client.Console#log(java.lang.String)
- */
- public void log(String msg) {
- panel.add(new HTML(msg));
- System.out.println(msg);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.itmill.toolkit.terminal.gwt.client.Console#error(java.lang.String)
- */
- public void error(String msg) {
- panel.add((new HTML(msg)));
- System.out.println(msg);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.itmill.toolkit.terminal.gwt.client.Console#printObject(java.lang.Object)
- */
- public void printObject(Object msg) {
- panel.add((new Label(msg.toString())));
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.itmill.toolkit.terminal.gwt.client.Console#dirUIDL(com.itmill.toolkit.terminal.gwt.client.UIDL)
- */
- public void dirUIDL(UIDL u) {
- panel.add(u.print_r());
- }
-
- public void setSize(Event event, boolean updateVariables) {
- super.setSize(event, false);
- }
-
- public void onScroll(Widget widget, int scrollLeft, int scrollTop) {
-
- }
-
- public void setPopupPosition(int left, int top) {
- // Keep the popup within the browser's client area, so that they can't
- // get
- // 'lost' and become impossible to interact with. Note that we don't
- // attempt
- // to keep popups pegged to the bottom and right edges, as they will
- // then
- // cause scrollbars to appear, so the user can't lose them.
- if (left < 0) {
- left = 0;
- }
- if (top < 0) {
- top = 0;
- }
-
- // Set the popup's position manually, allowing setPopupPosition() to be
- // called before show() is called (so a popup can be positioned without
- // it
- // 'jumping' on the screen).
- Element elem = getElement();
- DOM.setStyleAttribute(elem, "left", left + "px");
- DOM.setStyleAttribute(elem, "top", top + "px");
- }
-
-}
+++ /dev/null
-/*
-@ITMillApache2LicenseForJavaFiles@
- */
-
-package com.itmill.toolkit.terminal.gwt.client;
-
-import java.util.Iterator;
-
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.HTML;
-import com.itmill.toolkit.terminal.gwt.client.ui.ToolkitOverlay;
-
-public class ErrorMessage extends FlowPanel {
- public static final String CLASSNAME = "i-errormessage";
-
- public ErrorMessage() {
- super();
- setStyleName(CLASSNAME);
- }
-
- public void updateFromUIDL(UIDL uidl) {
- clear();
- if (uidl.getChildCount() == 0) {
- add(new HTML(" "));
- } else {
- for (final Iterator it = uidl.getChildIterator(); it.hasNext();) {
- final Object child = it.next();
- if (child instanceof String) {
- final String errorMessage = (String) child;
- add(new HTML(errorMessage));
- } else if (child instanceof UIDL.XML) {
- final UIDL.XML xml = (UIDL.XML) child;
- add(new HTML(xml.getXMLAsString()));
- } else {
- final ErrorMessage childError = new ErrorMessage();
- add(childError);
- childError.updateFromUIDL((UIDL) child);
- }
- }
- }
- }
-
- /**
- * Shows this error message next to given element.
- *
- * @param indicatorElement
- */
- public void showAt(Element indicatorElement) {
- ToolkitOverlay errorContainer = (ToolkitOverlay) getParent();
- if (errorContainer == null) {
- errorContainer = new ToolkitOverlay();
- errorContainer.setWidget(this);
- }
- errorContainer.setPopupPosition(DOM.getAbsoluteLeft(indicatorElement)
- + 2
- * DOM.getElementPropertyInt(indicatorElement, "offsetHeight"),
- DOM.getAbsoluteTop(indicatorElement)
- + 2
- * DOM.getElementPropertyInt(indicatorElement,
- "offsetHeight"));
- errorContainer.show();
-
- }
-
- public void hide() {
- final ToolkitOverlay errorContainer = (ToolkitOverlay) getParent();
- if (errorContainer != null) {
- errorContainer.hide();
- }
- }
-}
--- /dev/null
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.terminal.gwt.client;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.ui.HTML;
+import com.itmill.toolkit.terminal.gwt.client.ui.Icon;
+
+public class ICaption extends HTML {
+
+ public static final String CLASSNAME = "i-caption";
+
+ private final Paintable owner;
+
+ private Element errorIndicatorElement;
+
+ private Element requiredFieldIndicator;
+
+ private Icon icon;
+
+ private Element captionText;
+
+ private final ApplicationConnection client;
+
+ private boolean placedAfterComponent = false;
+
+ /**
+ *
+ * @param component
+ * optional owner of caption. If not set, getOwner will return
+ * null
+ * @param client
+ */
+ public ICaption(Paintable component, ApplicationConnection client) {
+ super();
+ this.client = client;
+ owner = component;
+ setStyleName(CLASSNAME);
+ }
+
+ public void updateCaption(UIDL uidl) {
+ setVisible(!uidl.getBooleanAttribute("invisible"));
+
+ setStyleName(getElement(), "i-disabled", uidl.hasAttribute("disabled"));
+
+ boolean isEmpty = true;
+
+ placedAfterComponent = true;
+
+ if (uidl.hasAttribute("icon")) {
+ if (icon == null) {
+ icon = new Icon(client);
+ placedAfterComponent = false;
+ DOM.insertChild(getElement(), icon.getElement(), 0);
+ }
+ icon.setUri(uidl.getStringAttribute("icon"));
+ isEmpty = false;
+ } else {
+ if (icon != null) {
+ DOM.removeChild(getElement(), icon.getElement());
+ icon = null;
+ }
+ }
+
+ if (uidl.hasAttribute("caption")) {
+ if (captionText == null) {
+ captionText = DOM.createSpan();
+ DOM
+ .insertChild(getElement(), captionText,
+ icon == null ? 0 : 1);
+ }
+ String c = uidl.getStringAttribute("caption");
+ if (c == null) {
+ c = "";
+ } else {
+ isEmpty = false;
+ placedAfterComponent = false;
+ }
+ DOM.setInnerText(captionText, c);
+ } else {
+ // TODO should span also be removed
+ }
+
+ if (uidl.hasAttribute("description")) {
+ if (captionText != null) {
+ addStyleDependentName("hasdescription");
+ } else {
+ removeStyleDependentName("hasdescription");
+ }
+ }
+
+ if (uidl.getBooleanAttribute("required")) {
+ isEmpty = false;
+ if (requiredFieldIndicator == null) {
+ requiredFieldIndicator = DOM.createSpan();
+ DOM.setInnerText(requiredFieldIndicator, "*");
+ DOM.setElementProperty(requiredFieldIndicator, "className",
+ "i-required-field-indicator");
+ DOM.appendChild(getElement(), requiredFieldIndicator);
+ }
+ } else {
+ if (requiredFieldIndicator != null) {
+ DOM.removeChild(getElement(), requiredFieldIndicator);
+ requiredFieldIndicator = null;
+ }
+ }
+
+ if (uidl.hasAttribute("error")) {
+ isEmpty = false;
+ if (errorIndicatorElement == null) {
+ errorIndicatorElement = DOM.createDiv();
+ DOM.setInnerHTML(errorIndicatorElement, " ");
+ DOM.setElementProperty(errorIndicatorElement, "className",
+ "i-errorindicator");
+ DOM.appendChild(getElement(), errorIndicatorElement);
+ }
+ } else if (errorIndicatorElement != null) {
+ DOM.removeChild(getElement(), errorIndicatorElement);
+ errorIndicatorElement = null;
+ }
+
+ // Workaround for IE weirdness, sometimes returns bad height in some
+ // circumstances when Caption is empty. See #1444
+ // IE7 bugs more often. I wonder what happens when IE8 arrives...
+ if (Util.isIE()) {
+ if (isEmpty) {
+ setHeight("0px");
+ DOM.setStyleAttribute(getElement(), "overflow", "hidden");
+ } else {
+ setHeight("");
+ DOM.setStyleAttribute(getElement(), "overflow", "");
+ }
+
+ }
+
+ }
+
+ public void onBrowserEvent(Event event) {
+ super.onBrowserEvent(event);
+ final Element target = DOM.eventGetTarget(event);
+ if (client != null && !DOM.compare(target, getElement())) {
+ client.handleTooltipEvent(event, owner);
+ }
+ }
+
+ public static boolean isNeeded(UIDL uidl) {
+ if (uidl.getStringAttribute("caption") != null) {
+ return true;
+ }
+ if (uidl.hasAttribute("error")) {
+ return true;
+ }
+ if (uidl.hasAttribute("icon")) {
+ return true;
+ }
+ if (uidl.hasAttribute("required")) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns Paintable for which this Caption belongs to.
+ *
+ * @return owner Widget
+ */
+ public Paintable getOwner() {
+ return owner;
+ }
+
+ public boolean shouldBePlacedAfterComponent() {
+ return placedAfterComponent;
+ }
+}
--- /dev/null
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.terminal.gwt.client;
+
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+public class ICaptionWrapper extends FlowPanel {
+
+ public static final String CLASSNAME = "i-captionwrapper";
+ ICaption caption;
+ Paintable widget;
+
+ public ICaptionWrapper(Paintable toBeWrapped, ApplicationConnection client) {
+ caption = new ICaption(toBeWrapped, client);
+ add(caption);
+ widget = toBeWrapped;
+ add((Widget) widget);
+ setStyleName(CLASSNAME);
+ }
+
+ public void updateCaption(UIDL uidl) {
+ caption.updateCaption(uidl);
+ setVisible(!uidl.getBooleanAttribute("invisible"));
+ }
+
+ public Paintable getPaintable() {
+ return widget;
+ }
+}
--- /dev/null
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.terminal.gwt.client;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Panel;
+import com.google.gwt.user.client.ui.ScrollPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.itmill.toolkit.terminal.gwt.client.ui.IWindow;
+
+public final class IDebugConsole extends IWindow implements Console {
+
+ /**
+ * Builds number. For example 0-custom_tag in 5.0.0-custom_tag.
+ */
+ public static final String VERSION;
+
+ /* Initialize version numbers from string replaced by build-script. */
+ static {
+ if ("@VERSION@".equals("@" + "VERSION" + "@")) {
+ VERSION = "5.9.9-INTERNAL-NONVERSIONED-DEBUG-BUILD";
+ } else {
+ VERSION = "@VERSION@";
+ }
+ }
+
+ private final Panel panel;
+
+ public IDebugConsole(ApplicationConnection client,
+ ApplicationConfiguration cnf) {
+ super();
+ this.client = client;
+ panel = new FlowPanel();
+ final ScrollPanel p = new ScrollPanel();
+ p.add(panel);
+ setWidget(p);
+ setCaption("Debug window");
+ minimize();
+ show();
+
+ ;
+
+ log("Toolkit application servlet version: " + cnf.getSerletVersion());
+ log("Widget set is built on version: " + VERSION);
+ log("Application version: " + cnf.getApplicationVersion());
+
+ if (!cnf.getSerletVersion().equals(VERSION)) {
+ error("Warning: your widget set seems to be built with different "
+ + "version than the one used on server. Unexpected "
+ + "behavior may occur.");
+ }
+ }
+
+ private void minimize() {
+ // TODO stack to bottom (create window manager of some sort)
+ setPixelSize(60, 60);
+ setPopupPosition(Window.getClientWidth() - 142, 0);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.itmill.toolkit.terminal.gwt.client.Console#log(java.lang.String)
+ */
+ public void log(String msg) {
+ panel.add(new HTML(msg));
+ System.out.println(msg);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.itmill.toolkit.terminal.gwt.client.Console#error(java.lang.String)
+ */
+ public void error(String msg) {
+ panel.add((new HTML(msg)));
+ System.out.println(msg);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.itmill.toolkit.terminal.gwt.client.Console#printObject(java.lang.
+ * Object)
+ */
+ public void printObject(Object msg) {
+ panel.add((new Label(msg.toString())));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.itmill.toolkit.terminal.gwt.client.Console#dirUIDL(com.itmill.toolkit
+ * .terminal.gwt.client.UIDL)
+ */
+ public void dirUIDL(UIDL u) {
+ panel.add(u.print_r());
+ }
+
+ public void setSize(Event event, boolean updateVariables) {
+ super.setSize(event, false);
+ }
+
+ public void onScroll(Widget widget, int scrollLeft, int scrollTop) {
+
+ }
+
+ public void setPopupPosition(int left, int top) {
+ // Keep the popup within the browser's client area, so that they can't
+ // get
+ // 'lost' and become impossible to interact with. Note that we don't
+ // attempt
+ // to keep popups pegged to the bottom and right edges, as they will
+ // then
+ // cause scrollbars to appear, so the user can't lose them.
+ if (left < 0) {
+ left = 0;
+ }
+ if (top < 0) {
+ top = 0;
+ }
+
+ // Set the popup's position manually, allowing setPopupPosition() to be
+ // called before show() is called (so a popup can be positioned without
+ // it
+ // 'jumping' on the screen).
+ Element elem = getElement();
+ DOM.setStyleAttribute(elem, "left", left + "px");
+ DOM.setStyleAttribute(elem, "top", top + "px");
+ }
+
+}
--- /dev/null
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.terminal.gwt.client;
+
+import java.util.Iterator;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.HTML;
+import com.itmill.toolkit.terminal.gwt.client.ui.IToolkitOverlay;
+
+public class IErrorMessage extends FlowPanel {
+ public static final String CLASSNAME = "i-errormessage";
+
+ public IErrorMessage() {
+ super();
+ setStyleName(CLASSNAME);
+ }
+
+ public void updateFromUIDL(UIDL uidl) {
+ clear();
+ if (uidl.getChildCount() == 0) {
+ add(new HTML(" "));
+ } else {
+ for (final Iterator it = uidl.getChildIterator(); it.hasNext();) {
+ final Object child = it.next();
+ if (child instanceof String) {
+ final String errorMessage = (String) child;
+ add(new HTML(errorMessage));
+ } else if (child instanceof UIDL.XML) {
+ final UIDL.XML xml = (UIDL.XML) child;
+ add(new HTML(xml.getXMLAsString()));
+ } else {
+ final IErrorMessage childError = new IErrorMessage();
+ add(childError);
+ childError.updateFromUIDL((UIDL) child);
+ }
+ }
+ }
+ }
+
+ /**
+ * Shows this error message next to given element.
+ *
+ * @param indicatorElement
+ */
+ public void showAt(Element indicatorElement) {
+ IToolkitOverlay errorContainer = (IToolkitOverlay) getParent();
+ if (errorContainer == null) {
+ errorContainer = new IToolkitOverlay();
+ errorContainer.setWidget(this);
+ }
+ errorContainer.setPopupPosition(DOM.getAbsoluteLeft(indicatorElement)
+ + 2
+ * DOM.getElementPropertyInt(indicatorElement, "offsetHeight"),
+ DOM.getAbsoluteTop(indicatorElement)
+ + 2
+ * DOM.getElementPropertyInt(indicatorElement,
+ "offsetHeight"));
+ errorContainer.show();
+
+ }
+
+ public void hide() {
+ final IToolkitOverlay errorContainer = (IToolkitOverlay) getParent();
+ if (errorContainer != null) {
+ errorContainer.hide();
+ }
+ }
+}
--- /dev/null
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+package com.itmill.toolkit.terminal.gwt.client;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.itmill.toolkit.terminal.gwt.client.ui.IToolkitOverlay;
+
+/**
+ * TODO open for extension
+ */
+public class ITooltip extends IToolkitOverlay {
+ private static final String CLASSNAME = "i-tooltip";
+ private static final int MARGIN = 4;
+ public static final int TOOLTIP_EVENTS = Event.ONKEYDOWN
+ | Event.ONMOUSEOVER | Event.ONMOUSEOUT | Event.ONMOUSEMOVE
+ | Event.ONCLICK;
+ protected static final int MAX_WIDTH = 500;
+ IErrorMessage em = new IErrorMessage();
+ Element description = DOM.createDiv();
+ private Paintable tooltipOwner;
+ private boolean closing = false;
+ private boolean opening = false;
+ private ApplicationConnection ac;
+
+ public ITooltip(ApplicationConnection client) {
+ super(false, false, true);
+ ac = client;
+ setStyleName(CLASSNAME);
+ FlowPanel layout = new FlowPanel();
+ setWidget(layout);
+ layout.add(em);
+ DOM.setElementProperty(description, "className", CLASSNAME + "-text");
+ DOM.appendChild(layout.getElement(), description);
+ }
+
+ private void show(TooltipInfo info) {
+ boolean hasContent = false;
+ if (info.getErrorUidl() != null) {
+ em.setVisible(true);
+ em.updateFromUIDL(info.getErrorUidl());
+ hasContent = true;
+ } else {
+ em.setVisible(false);
+ }
+ if (info.getTitle() != null && !"".equals(info.getTitle())) {
+ DOM.setInnerHTML(description, info.getTitle());
+ DOM.setStyleAttribute(description, "display", "");
+ hasContent = true;
+ } else {
+ DOM.setInnerHTML(description, "");
+ DOM.setStyleAttribute(description, "display", "none");
+ }
+ if (hasContent) {
+ setPopupPositionAndShow(new PositionCallback() {
+ public void setPosition(int offsetWidth, int offsetHeight) {
+
+ if (offsetWidth > MAX_WIDTH) {
+ setWidth(MAX_WIDTH + "px");
+ }
+
+ offsetWidth = getOffsetWidth();
+
+ int x = tooltipEventMouseX + 10 + Window.getScrollLeft();
+ int y = tooltipEventMouseY + 10 + Window.getScrollTop();
+
+ if (x + offsetWidth + MARGIN - Window.getScrollLeft() > Window
+ .getClientWidth()) {
+ x = Window.getClientWidth() - offsetWidth - MARGIN;
+ }
+
+ if (y + offsetHeight + MARGIN - Window.getScrollTop() > Window
+ .getClientHeight()) {
+ y = tooltipEventMouseY - 5 - offsetHeight;
+ }
+
+ setPopupPosition(x, y);
+ sinkEvents(Event.ONMOUSEOVER | Event.ONMOUSEOUT);
+ }
+ });
+ } else {
+ hide();
+ }
+ }
+
+ public void showTooltip(Paintable owner, Event event) {
+ if (closing && tooltipOwner == owner) {
+ closeTimer.cancel();
+ closing = false;
+ return;
+ }
+ updatePosition(event);
+
+ if (opening) {
+ showTimer.cancel();
+ }
+ tooltipOwner = owner;
+ showTimer.schedule(1000);
+ opening = true;
+
+ }
+
+ private Timer showTimer = new Timer() {
+ public void run() {
+ TooltipInfo info = ac.getTitleInfo(tooltipOwner);
+ show(info);
+ opening = false;
+
+ }
+ };
+
+ private Timer closeTimer = new Timer() {
+ public void run() {
+ hide();
+ closing = false;
+ tooltipOwner = null;
+ setWidth("");
+ }
+ };
+
+ public void hideTooltip() {
+ if (opening) {
+ showTimer.cancel();
+ opening = false;
+ tooltipOwner = null;
+ }
+ if (!isAttached()) {
+ return;
+ }
+ if (closing) {
+ // already about to close
+ return;
+ }
+ closeTimer.schedule(300);
+ closing = true;
+ }
+
+ private int tooltipEventMouseX;
+ private int tooltipEventMouseY;
+
+ public void updatePosition(Event event) {
+ tooltipEventMouseX = DOM.eventGetClientX(event);
+ tooltipEventMouseY = DOM.eventGetClientY(event);
+
+ }
+
+ public void handleTooltipEvent(Event event, Paintable owner) {
+ final int type = DOM.eventGetType(event);
+ if ((ITooltip.TOOLTIP_EVENTS & type) == type) {
+ if (type == Event.ONMOUSEOVER) {
+ showTooltip(owner, event);
+ } else if (type == Event.ONMOUSEMOVE) {
+ updatePosition(event);
+ } else {
+ hideTooltip();
+ }
+ } else {
+ // non-tooltip event, hide tooltip
+ hideTooltip();
+ }
+ }
+
+ public void onBrowserEvent(Event event) {
+ final int type = DOM.eventGetType(event);
+ // cancel closing event if tooltip is mouseovered; the user might want
+ // to scroll of cut&paste
+
+ switch (type) {
+ case Event.ONMOUSEOVER:
+ closeTimer.cancel();
+ closing = false;
+ break;
+ case Event.ONMOUSEOUT:
+ hideTooltip();
+ break;
+ default:
+ // NOP
+ }
+ }
+
+}
+++ /dev/null
-/*
-@ITMillApache2LicenseForJavaFiles@
- */
-package com.itmill.toolkit.terminal.gwt.client;
-
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Timer;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.itmill.toolkit.terminal.gwt.client.ui.ToolkitOverlay;
-
-/**
- * TODO open for extension
- */
-public class Tooltip extends ToolkitOverlay {
- private static final String CLASSNAME = "i-tooltip";
- private static final int MARGIN = 4;
- public static final int TOOLTIP_EVENTS = Event.ONKEYDOWN
- | Event.ONMOUSEOVER | Event.ONMOUSEOUT | Event.ONMOUSEMOVE
- | Event.ONCLICK;
- protected static final int MAX_WIDTH = 500;
- ErrorMessage em = new ErrorMessage();
- Element description = DOM.createDiv();
- private Paintable tooltipOwner;
- private boolean closing = false;
- private boolean opening = false;
- private ApplicationConnection ac;
-
- public Tooltip(ApplicationConnection client) {
- super(false, false, true);
- ac = client;
- setStyleName(CLASSNAME);
- FlowPanel layout = new FlowPanel();
- setWidget(layout);
- layout.add(em);
- DOM.setElementProperty(description, "className", CLASSNAME + "-text");
- DOM.appendChild(layout.getElement(), description);
- }
-
- private void show(TooltipInfo info) {
- boolean hasContent = false;
- if (info.getErrorUidl() != null) {
- em.setVisible(true);
- em.updateFromUIDL(info.getErrorUidl());
- hasContent = true;
- } else {
- em.setVisible(false);
- }
- if (info.getTitle() != null && !"".equals(info.getTitle())) {
- DOM.setInnerHTML(description, info.getTitle());
- DOM.setStyleAttribute(description, "display", "");
- hasContent = true;
- } else {
- DOM.setInnerHTML(description, "");
- DOM.setStyleAttribute(description, "display", "none");
- }
- if (hasContent) {
- setPopupPositionAndShow(new PositionCallback() {
- public void setPosition(int offsetWidth, int offsetHeight) {
-
- if (offsetWidth > MAX_WIDTH) {
- setWidth(MAX_WIDTH + "px");
- }
-
- offsetWidth = getOffsetWidth();
-
- int x = tooltipEventMouseX + 10 + Window.getScrollLeft();
- int y = tooltipEventMouseY + 10 + Window.getScrollTop();
-
- if (x + offsetWidth + MARGIN - Window.getScrollLeft() > Window
- .getClientWidth()) {
- x = Window.getClientWidth() - offsetWidth - MARGIN;
- }
-
- if (y + offsetHeight + MARGIN - Window.getScrollTop() > Window
- .getClientHeight()) {
- y = tooltipEventMouseY - 5 - offsetHeight;
- }
-
- setPopupPosition(x, y);
- sinkEvents(Event.ONMOUSEOVER | Event.ONMOUSEOUT);
- }
- });
- } else {
- hide();
- }
- }
-
- public void showTooltip(Paintable owner, Event event) {
- if (closing && tooltipOwner == owner) {
- closeTimer.cancel();
- closing = false;
- return;
- }
- updatePosition(event);
-
- if (opening) {
- showTimer.cancel();
- }
- tooltipOwner = owner;
- showTimer.schedule(1000);
- opening = true;
-
- }
-
- private Timer showTimer = new Timer() {
- public void run() {
- TooltipInfo info = ac.getTitleInfo(tooltipOwner);
- show(info);
- opening = false;
-
- }
- };
-
- private Timer closeTimer = new Timer() {
- public void run() {
- hide();
- closing = false;
- tooltipOwner = null;
- setWidth("");
- }
- };
-
- public void hideTooltip() {
- if (opening) {
- showTimer.cancel();
- opening = false;
- tooltipOwner = null;
- }
- if (!isAttached()) {
- return;
- }
- if (closing) {
- // already about to close
- return;
- }
- closeTimer.schedule(300);
- closing = true;
- }
-
- private int tooltipEventMouseX;
- private int tooltipEventMouseY;
-
- public void updatePosition(Event event) {
- tooltipEventMouseX = DOM.eventGetClientX(event);
- tooltipEventMouseY = DOM.eventGetClientY(event);
-
- }
-
- public void handleTooltipEvent(Event event, Paintable owner) {
- final int type = DOM.eventGetType(event);
- if ((Tooltip.TOOLTIP_EVENTS & type) == type) {
- if (type == Event.ONMOUSEOVER) {
- showTooltip(owner, event);
- } else if (type == Event.ONMOUSEMOVE) {
- updatePosition(event);
- } else {
- hideTooltip();
- }
- } else {
- // non-tooltip event, hide tooltip
- hideTooltip();
- }
- }
-
- public void onBrowserEvent(Event event) {
- final int type = DOM.eventGetType(event);
- // cancel closing event if tooltip is mouseovered; the user might want
- // to scroll of cut&paste
-
- switch (type) {
- case Event.ONMOUSEOVER:
- closeTimer.cancel();
- closing = false;
- break;
- case Event.ONMOUSEOUT:
- hideTooltip();
- break;
- default:
- // NOP
- }
- }
-
-}
return s;
}
- public UIDLBrowser print_r() {
- return new UIDLBrowser();
+ public IUIDLBrowser print_r() {
+ return new IUIDLBrowser();
}
- private class UIDLBrowser extends Tree {
- public UIDLBrowser() {
+ private class IUIDLBrowser extends Tree {
+ public IUIDLBrowser() {
DOM.setStyleAttribute(getElement(), "position", "");
public void onTreeItemStateChanged(TreeItem item) {
if (item == root) {
removeItem(root);
- UIDLBrowser.this.removeTreeListener(this);
+ IUIDLBrowser.this.removeTreeListener(this);
addItem(dir());
final Iterator it = treeItemIterator();
while (it.hasNext()) {
+++ /dev/null
-/* \r
-@ITMillApache2LicenseForJavaFiles@\r
- */\r
-\r
-package com.itmill.toolkit.terminal.gwt.client.ui;\r
-\r
-import java.util.Date;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import com.google.gwt.user.client.DOM;\r
-import com.google.gwt.user.client.Event;\r
-import com.google.gwt.user.client.Timer;\r
-import com.google.gwt.user.client.ui.ClickListener;\r
-import com.google.gwt.user.client.ui.FlexTable;\r
-import com.google.gwt.user.client.ui.MouseListener;\r
-import com.google.gwt.user.client.ui.MouseListenerCollection;\r
-import com.google.gwt.user.client.ui.SourcesMouseEvents;\r
-import com.google.gwt.user.client.ui.SourcesTableEvents;\r
-import com.google.gwt.user.client.ui.TableListener;\r
-import com.google.gwt.user.client.ui.Widget;\r
-import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
-import com.itmill.toolkit.terminal.gwt.client.LocaleService;\r
-\r
-public class CalendarPanel extends FlexTable implements MouseListener,\r
- ClickListener {\r
-\r
- private final IDateField datefield;\r
-\r
- private IEventButton prevYear;\r
-\r
- private IEventButton nextYear;\r
-\r
- private IEventButton prevMonth;\r
-\r
- private IEventButton nextMonth;\r
-\r
- private Time time;\r
-\r
- private Date minDate = null;\r
-\r
- private Date maxDate = null;\r
-\r
- private CalendarEntrySource entrySource;\r
-\r
- /* Needed to identify resolution changes */\r
- private int resolution = IDateField.RESOLUTION_YEAR;\r
-\r
- /* Needed to identify locale changes */\r
- private String locale = LocaleService.getDefaultLocale();\r
-\r
- public CalendarPanel(IDateField parent) {\r
- datefield = parent;\r
- setStyleName(IDateField.CLASSNAME + "-calendarpanel");\r
- // buildCalendar(true);\r
- addTableListener(new DateClickListener(this));\r
- }\r
-\r
- public CalendarPanel(IDateField parent, Date min, Date max) {\r
- datefield = parent;\r
- setStyleName(IDateField.CLASSNAME + "-calendarpanel");\r
- // buildCalendar(true);\r
- addTableListener(new DateClickListener(this));\r
-\r
- }\r
-\r
- private void buildCalendar(boolean forceRedraw) {\r
- final boolean needsMonth = datefield.getCurrentResolution() > IDateField.RESOLUTION_YEAR;\r
- boolean needsBody = datefield.getCurrentResolution() >= IDateField.RESOLUTION_DAY;\r
- final boolean needsTime = datefield.getCurrentResolution() >= IDateField.RESOLUTION_HOUR;\r
- buildCalendarHeader(forceRedraw, needsMonth);\r
- clearCalendarBody(!needsBody);\r
- if (needsBody) {\r
- buildCalendarBody();\r
- }\r
- if (needsTime) {\r
- buildTime(forceRedraw);\r
- } else if (time != null) {\r
- remove(time);\r
- time = null;\r
- }\r
- }\r
-\r
- private void clearCalendarBody(boolean remove) {\r
- if (!remove) {\r
- for (int row = 2; row < 8; row++) {\r
- for (int col = 0; col < 7; col++) {\r
- setHTML(row, col, " ");\r
- }\r
- }\r
- } else if (getRowCount() > 2) {\r
- while (getRowCount() > 2) {\r
- removeRow(2);\r
- }\r
- }\r
- }\r
-\r
- private void buildCalendarHeader(boolean forceRedraw, boolean needsMonth) {\r
- if (forceRedraw) {\r
- if (prevMonth == null) { // Only do once\r
- prevYear = new IEventButton();\r
- prevYear.setHTML("«");\r
- prevYear.setStyleName("i-button-prevyear");\r
- nextYear = new IEventButton();\r
- nextYear.setHTML("»");\r
- nextYear.setStyleName("i-button-nextyear");\r
- prevYear.addMouseListener(this);\r
- nextYear.addMouseListener(this);\r
- prevYear.addClickListener(this);\r
- nextYear.addClickListener(this);\r
- setWidget(0, 0, prevYear);\r
- setWidget(0, 4, nextYear);\r
-\r
- if (needsMonth) {\r
- prevMonth = new IEventButton();\r
- prevMonth.setHTML("‹");\r
- prevMonth.setStyleName("i-button-prevmonth");\r
- nextMonth = new IEventButton();\r
- nextMonth.setHTML("›");\r
- nextMonth.setStyleName("i-button-nextmonth");\r
- prevMonth.addMouseListener(this);\r
- nextMonth.addMouseListener(this);\r
- prevMonth.addClickListener(this);\r
- nextMonth.addClickListener(this);\r
- setWidget(0, 3, nextMonth);\r
- setWidget(0, 1, prevMonth);\r
- }\r
-\r
- getFlexCellFormatter().setColSpan(0, 2, 3);\r
- getRowFormatter().addStyleName(0,\r
- IDateField.CLASSNAME + "-calendarpanel-header");\r
- } else if (!needsMonth) {\r
- // Remove month traverse buttons\r
- prevMonth.removeClickListener(this);\r
- prevMonth.removeMouseListener(this);\r
- nextMonth.removeClickListener(this);\r
- nextMonth.removeMouseListener(this);\r
- remove(prevMonth);\r
- remove(nextMonth);\r
- prevMonth = null;\r
- nextMonth = null;\r
- }\r
-\r
- // Print weekday names\r
- final int firstDay = datefield.getDateTimeService()\r
- .getFirstDayOfWeek();\r
- for (int i = 0; i < 7; i++) {\r
- int day = i + firstDay;\r
- if (day > 6) {\r
- day = 0;\r
- }\r
- if (datefield.getCurrentResolution() > IDateField.RESOLUTION_MONTH) {\r
- setHTML(1, i, "<strong>"\r
- + datefield.getDateTimeService().getShortDay(day)\r
- + "</strong>");\r
- } else {\r
- setHTML(1, i, "");\r
- }\r
- }\r
- }\r
-\r
- final String monthName = needsMonth ? datefield.getDateTimeService()\r
- .getMonth(datefield.getShowingDate().getMonth()) : "";\r
- final int year = datefield.getShowingDate().getYear() + 1900;\r
- setHTML(0, 2, "<span class=\"" + IDateField.CLASSNAME\r
- + "-calendarpanel-month\">" + monthName + " " + year\r
- + "</span>");\r
- }\r
-\r
- private void buildCalendarBody() {\r
- // date actually selected?\r
- Date currentDate = datefield.getCurrentDate();\r
- Date showing = datefield.getShowingDate();\r
- boolean selected = (currentDate != null\r
- && currentDate.getMonth() == showing.getMonth() && currentDate\r
- .getYear() == showing.getYear());\r
-\r
- final int startWeekDay = datefield.getDateTimeService()\r
- .getStartWeekDay(datefield.getShowingDate());\r
- final int numDays = DateTimeService.getNumberOfDaysInMonth(datefield\r
- .getShowingDate());\r
- int dayCount = 0;\r
- final Date today = new Date();\r
- final Date curr = new Date(datefield.getShowingDate().getTime());\r
- for (int row = 2; row < 8; row++) {\r
- for (int col = 0; col < 7; col++) {\r
- if (!(row == 2 && col < startWeekDay)) {\r
- if (dayCount < numDays) {\r
- final int selectedDate = ++dayCount;\r
- String title = "";\r
- if (entrySource != null) {\r
- curr.setDate(dayCount);\r
- final List entries = entrySource.getEntries(curr,\r
- IDateField.RESOLUTION_DAY);\r
- if (entries != null) {\r
- for (final Iterator it = entries.iterator(); it\r
- .hasNext();) {\r
- final CalendarEntry entry = (CalendarEntry) it\r
- .next();\r
- title += (title.length() > 0 ? ", " : "")\r
- + entry.getStringForDate(curr);\r
- }\r
- }\r
- }\r
- final String baseclass = IDateField.CLASSNAME\r
- + "-calendarpanel-day";\r
- String cssClass = baseclass;\r
- if (!isEnabledDate(curr)) {\r
- cssClass += " " + baseclass + "-disabled";\r
- }\r
- if (selected\r
- && datefield.getShowingDate().getDate() == dayCount) {\r
- cssClass += " " + baseclass + "-selected";\r
- }\r
- if (today.getDate() == dayCount\r
- && today.getMonth() == datefield\r
- .getShowingDate().getMonth()\r
- && today.getYear() == datefield\r
- .getShowingDate().getYear()) {\r
- cssClass += " " + baseclass + "-today";\r
- }\r
- if (title.length() > 0) {\r
- cssClass += " " + baseclass + "-entry";\r
- }\r
- setHTML(row, col, "<span title=\"" + title\r
- + "\" class=\"" + cssClass + "\">"\r
- + selectedDate + "</span>");\r
- } else {\r
- break;\r
- }\r
-\r
- }\r
- }\r
- }\r
- }\r
-\r
- private void buildTime(boolean forceRedraw) {\r
- if (time == null) {\r
- time = new Time(datefield);\r
- setText(8, 0, ""); // Add new row\r
- getFlexCellFormatter().setColSpan(8, 0, 7);\r
- setWidget(8, 0, time);\r
- }\r
- time.updateTime(forceRedraw);\r
- }\r
-\r
- /**\r
- * \r
- * @param forceRedraw\r
- * Build all from scratch, in case of e.g. locale changes\r
- */\r
- public void updateCalendar() {\r
- // Locale and resolution changes force a complete redraw\r
- buildCalendar(locale != datefield.getCurrentLocale()\r
- || resolution != datefield.getCurrentResolution());\r
- if (datefield instanceof ITextualDate) {\r
- ((ITextualDate) datefield).buildDate();\r
- }\r
- locale = datefield.getCurrentLocale();\r
- resolution = datefield.getCurrentResolution();\r
- }\r
-\r
- public void onClick(Widget sender) {\r
- // processClickEvent(sender, true);\r
- }\r
-\r
- private boolean isEnabledDate(Date date) {\r
- if ((minDate != null && date.before(minDate))\r
- || (maxDate != null && date.after(maxDate))) {\r
- return false;\r
- }\r
- return true;\r
- }\r
-\r
- private void processClickEvent(Widget sender, boolean updateVariable) {\r
- if (!datefield.isEnabled() || datefield.isReadonly()) {\r
- return;\r
- }\r
- Date showingDate = datefield.getShowingDate();\r
- if (!updateVariable) {\r
- if (sender == prevYear) {\r
- showingDate.setYear(showingDate.getYear() - 1);\r
- updateCalendar();\r
- } else if (sender == nextYear) {\r
- showingDate.setYear(showingDate.getYear() + 1);\r
- updateCalendar();\r
- } else if (sender == prevMonth) {\r
- showingDate.setMonth(showingDate.getMonth() - 1);\r
- updateCalendar();\r
- } else if (sender == nextMonth) {\r
- showingDate.setMonth(showingDate.getMonth() + 1);\r
- updateCalendar();\r
- }\r
- } else {\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_YEAR\r
- || datefield.getCurrentResolution() == IDateField.RESOLUTION_MONTH) {\r
- // Due to current UI, update variable if res=year/month\r
- datefield.setCurrentDate(new Date(showingDate.getTime()));\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MONTH) {\r
- datefield.getClient().updateVariable(datefield.getId(),\r
- "month", datefield.getCurrentDate().getMonth() + 1,\r
- false);\r
- }\r
- datefield.getClient().updateVariable(datefield.getId(), "year",\r
- datefield.getCurrentDate().getYear() + 1900,\r
- datefield.isImmediate());\r
- }\r
- }\r
- }\r
-\r
- private Timer timer;\r
-\r
- public void onMouseDown(final Widget sender, int x, int y) {\r
- if (sender instanceof IEventButton) {\r
- processClickEvent(sender, false);\r
- timer = new Timer() {\r
- public void run() {\r
- processClickEvent(sender, false);\r
- }\r
- };\r
- timer.scheduleRepeating(100);\r
- }\r
- }\r
-\r
- public void onMouseEnter(Widget sender) {\r
- }\r
-\r
- public void onMouseLeave(Widget sender) {\r
- if (timer != null) {\r
- timer.cancel();\r
- }\r
- }\r
-\r
- public void onMouseMove(Widget sender, int x, int y) {\r
- }\r
-\r
- public void onMouseUp(Widget sender, int x, int y) {\r
- if (timer != null) {\r
- timer.cancel();\r
- }\r
- processClickEvent(sender, true);\r
- }\r
-\r
- private class IEventButton extends IButton implements SourcesMouseEvents {\r
-\r
- private MouseListenerCollection mouseListeners;\r
-\r
- public IEventButton() {\r
- super();\r
- sinkEvents(Event.FOCUSEVENTS | Event.KEYEVENTS | Event.ONCLICK\r
- | Event.MOUSEEVENTS);\r
- }\r
-\r
- public void addMouseListener(MouseListener listener) {\r
- if (mouseListeners == null) {\r
- mouseListeners = new MouseListenerCollection();\r
- }\r
- mouseListeners.add(listener);\r
- }\r
-\r
- public void removeMouseListener(MouseListener listener) {\r
- if (mouseListeners != null) {\r
- mouseListeners.remove(listener);\r
- }\r
- }\r
-\r
- public void onBrowserEvent(Event event) {\r
- super.onBrowserEvent(event);\r
- switch (DOM.eventGetType(event)) {\r
- case Event.ONMOUSEDOWN:\r
- case Event.ONMOUSEUP:\r
- case Event.ONMOUSEMOVE:\r
- case Event.ONMOUSEOVER:\r
- case Event.ONMOUSEOUT:\r
- if (mouseListeners != null) {\r
- mouseListeners.fireMouseEvent(this, event);\r
- }\r
- break;\r
- }\r
- }\r
- }\r
-\r
- private class DateClickListener implements TableListener {\r
-\r
- private final CalendarPanel cal;\r
-\r
- public DateClickListener(CalendarPanel panel) {\r
- cal = panel;\r
- }\r
-\r
- public void onCellClicked(SourcesTableEvents sender, int row, int col) {\r
- if (sender != cal || row < 2 || row > 7\r
- || !cal.datefield.isEnabled() || cal.datefield.isReadonly()) {\r
- return;\r
- }\r
-\r
- final String text = cal.getText(row, col);\r
- if (text.equals(" ")) {\r
- return;\r
- }\r
-\r
- try {\r
- final Integer day = new Integer(text);\r
- final Date newDate = cal.datefield.getShowingDate();\r
- newDate.setDate(day.intValue());\r
- if (!isEnabledDate(newDate)) {\r
- return;\r
- }\r
- if (cal.datefield.getCurrentDate() == null) {\r
- cal.datefield.setCurrentDate(new Date(newDate.getTime()));\r
-\r
- // Init variables with current time\r
- datefield.getClient().updateVariable(cal.datefield.getId(),\r
- "hour", newDate.getHours(), false);\r
- datefield.getClient().updateVariable(cal.datefield.getId(),\r
- "min", newDate.getMinutes(), false);\r
- datefield.getClient().updateVariable(cal.datefield.getId(),\r
- "sec", newDate.getSeconds(), false);\r
- datefield.getClient().updateVariable(cal.datefield.getId(),\r
- "msec", datefield.getMilliseconds(), false);\r
- }\r
-\r
- cal.datefield.getCurrentDate().setTime(newDate.getTime());\r
- cal.datefield.getClient().updateVariable(cal.datefield.getId(),\r
- "day", cal.datefield.getCurrentDate().getDate(), false);\r
- cal.datefield.getClient().updateVariable(cal.datefield.getId(),\r
- "month", cal.datefield.getCurrentDate().getMonth() + 1,\r
- false);\r
- cal.datefield.getClient().updateVariable(cal.datefield.getId(),\r
- "year",\r
- cal.datefield.getCurrentDate().getYear() + 1900,\r
- cal.datefield.isImmediate());\r
-\r
- if (datefield instanceof ITextualDate\r
- && resolution < IDateField.RESOLUTION_HOUR) {\r
- ((ToolkitOverlay) getParent()).hide();\r
- } else {\r
- updateCalendar();\r
- }\r
-\r
- } catch (final NumberFormatException e) {\r
- // Not a number, ignore and stop here\r
- return;\r
- }\r
- }\r
-\r
- }\r
-\r
- public void setLimits(Date min, Date max) {\r
- if (min != null) {\r
- final Date d = new Date(min.getTime());\r
- d.setHours(0);\r
- d.setMinutes(0);\r
- d.setSeconds(1);\r
- minDate = d;\r
- } else {\r
- minDate = null;\r
- }\r
- if (max != null) {\r
- final Date d = new Date(max.getTime());\r
- d.setHours(24);\r
- d.setMinutes(59);\r
- d.setSeconds(59);\r
- maxDate = d;\r
- } else {\r
- maxDate = null;\r
- }\r
- }\r
-\r
- public void setCalendarEntrySource(CalendarEntrySource entrySource) {\r
- this.entrySource = entrySource;\r
- }\r
-\r
- public CalendarEntrySource getCalendarEntrySource() {\r
- return entrySource;\r
- }\r
-\r
- public interface CalendarEntrySource {\r
- public List getEntries(Date date, int resolution);\r
- }\r
-\r
- /**\r
- * Sets focus to Calendar panel.\r
- * \r
- * @param focus\r
- */\r
- public void setFocus(boolean focus) {\r
- nextYear.setFocus(focus);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*
-@ITMillApache2LicenseForJavaFiles@
- */
-
-package com.itmill.toolkit.terminal.gwt.client.ui;
-
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.MenuBar;
-import com.google.gwt.user.client.ui.MenuItem;
-import com.google.gwt.user.client.ui.PopupPanel;
-
-public class ContextMenu extends ToolkitOverlay {
-
- private ActionOwner actionOwner;
-
- private final CMenuBar menu = new CMenuBar();
-
- private int left;
-
- private int top;
-
- /**
- * This method should be used only by Client object as only one per client
- * should exists. Request an instance via client.getContextMenu();
- *
- * @param cli
- * to be set as an owner of menu
- */
- public ContextMenu() {
- super(true, false, true);
- setWidget(menu);
- setStyleName("i-contextmenu");
- }
-
- /**
- * Sets the element from which to build menu
- *
- * @param ao
- */
- public void setActionOwner(ActionOwner ao) {
- actionOwner = ao;
- }
-
- /**
- * Shows context menu at given location.
- *
- * @param left
- * @param top
- */
- public void showAt(int left, int top) {
- this.left = left;
- this.top = top;
- menu.clearItems();
- final Action[] actions = actionOwner.getActions();
- for (int i = 0; i < actions.length; i++) {
- final Action a = actions[i];
- menu.addItem(new MenuItem(a.getHTML(), true, a));
- }
-
- setPopupPositionAndShow(new PositionCallback() {
- public void setPosition(int offsetWidth, int offsetHeight) {
- // mac FF gets bad width due GWT popups overflow hacks,
- // re-determine width
- offsetWidth = menu.getOffsetWidth();
- int left = ContextMenu.this.left;
- int top = ContextMenu.this.top;
- if (offsetWidth + left > Window.getClientWidth()) {
- left = left - offsetWidth;
- if (left < 0) {
- left = 0;
- }
- }
- if (offsetHeight + top > Window.getClientHeight()) {
- top = top - offsetHeight;
- if (top < 0) {
- top = 0;
- }
- }
- setPopupPosition(left, top);
- }
- });
- }
-
- public void showAt(ActionOwner ao, int left, int top) {
- setActionOwner(ao);
- showAt(left, top);
- }
-
- /**
- * Extend standard Gwt MenuBar to set proper settings and to override
- * onPopupClosed method so that PopupPanel gets closed.
- */
- class CMenuBar extends MenuBar {
- public CMenuBar() {
- super(true);
- }
-
- public void onPopupClosed(PopupPanel sender, boolean autoClosed) {
- super.onPopupClosed(sender, autoClosed);
- ContextMenu.this.hide();
- }
-
- /*public void onBrowserEvent(Event event) {
- // Remove current selection when mouse leaves
- if (DOM.eventGetType(event) == Event.ONMOUSEOUT) {
- Element to = DOM.eventGetToElement(event);
- if (!DOM.isOrHasChild(getElement(), to)) {
- DOM.setElementProperty(
- super.getSelectedItem().getElement(), "className",
- super.getSelectedItem().getStylePrimaryName());
- }
- }
-
- super.onBrowserEvent(event);
- }*/
- }
-}
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
*/
protected class StackItem extends ComplexPanel implements ClickListener {
- private Caption caption;
+ private ICaption caption;
private boolean open = false;
private Element content = DOM.createDiv();
private Element captionNode = DOM.createDiv();
public StackItem(UIDL tabUidl) {
setElement(DOM.createDiv());
- caption = new Caption(null, client);
+ caption = new ICaption(null, client);
caption.addClickListener(this);
super.add(caption, captionNode);
DOM.appendChild(captionNode, caption.getElement());
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
-import com.itmill.toolkit.terminal.gwt.client.Tooltip;
+import com.itmill.toolkit.terminal.gwt.client.ITooltip;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
public class IButton extends Button implements Paintable {
client.updateVariable(id, "state", true, true);
}
});
- sinkEvents(Tooltip.TOOLTIP_EVENTS);
+ sinkEvents(ITooltip.TOOLTIP_EVENTS);
}
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
--- /dev/null
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import java.util.Date;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import com.google.gwt.user.client.DOM;\r
+import com.google.gwt.user.client.Event;\r
+import com.google.gwt.user.client.Timer;\r
+import com.google.gwt.user.client.ui.ClickListener;\r
+import com.google.gwt.user.client.ui.FlexTable;\r
+import com.google.gwt.user.client.ui.MouseListener;\r
+import com.google.gwt.user.client.ui.MouseListenerCollection;\r
+import com.google.gwt.user.client.ui.SourcesMouseEvents;\r
+import com.google.gwt.user.client.ui.SourcesTableEvents;\r
+import com.google.gwt.user.client.ui.TableListener;\r
+import com.google.gwt.user.client.ui.Widget;\r
+import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
+import com.itmill.toolkit.terminal.gwt.client.LocaleService;\r
+\r
+public class ICalendarPanel extends FlexTable implements MouseListener,\r
+ ClickListener {\r
+\r
+ private final IDateField datefield;\r
+\r
+ private IEventButton prevYear;\r
+\r
+ private IEventButton nextYear;\r
+\r
+ private IEventButton prevMonth;\r
+\r
+ private IEventButton nextMonth;\r
+\r
+ private ITime time;\r
+\r
+ private Date minDate = null;\r
+\r
+ private Date maxDate = null;\r
+\r
+ private CalendarEntrySource entrySource;\r
+\r
+ /* Needed to identify resolution changes */\r
+ private int resolution = IDateField.RESOLUTION_YEAR;\r
+\r
+ /* Needed to identify locale changes */\r
+ private String locale = LocaleService.getDefaultLocale();\r
+\r
+ public ICalendarPanel(IDateField parent) {\r
+ datefield = parent;\r
+ setStyleName(IDateField.CLASSNAME + "-calendarpanel");\r
+ // buildCalendar(true);\r
+ addTableListener(new DateClickListener(this));\r
+ }\r
+\r
+ public ICalendarPanel(IDateField parent, Date min, Date max) {\r
+ datefield = parent;\r
+ setStyleName(IDateField.CLASSNAME + "-calendarpanel");\r
+ // buildCalendar(true);\r
+ addTableListener(new DateClickListener(this));\r
+\r
+ }\r
+\r
+ private void buildCalendar(boolean forceRedraw) {\r
+ final boolean needsMonth = datefield.getCurrentResolution() > IDateField.RESOLUTION_YEAR;\r
+ boolean needsBody = datefield.getCurrentResolution() >= IDateField.RESOLUTION_DAY;\r
+ final boolean needsTime = datefield.getCurrentResolution() >= IDateField.RESOLUTION_HOUR;\r
+ buildCalendarHeader(forceRedraw, needsMonth);\r
+ clearCalendarBody(!needsBody);\r
+ if (needsBody) {\r
+ buildCalendarBody();\r
+ }\r
+ if (needsTime) {\r
+ buildTime(forceRedraw);\r
+ } else if (time != null) {\r
+ remove(time);\r
+ time = null;\r
+ }\r
+ }\r
+\r
+ private void clearCalendarBody(boolean remove) {\r
+ if (!remove) {\r
+ for (int row = 2; row < 8; row++) {\r
+ for (int col = 0; col < 7; col++) {\r
+ setHTML(row, col, " ");\r
+ }\r
+ }\r
+ } else if (getRowCount() > 2) {\r
+ while (getRowCount() > 2) {\r
+ removeRow(2);\r
+ }\r
+ }\r
+ }\r
+\r
+ private void buildCalendarHeader(boolean forceRedraw, boolean needsMonth) {\r
+ if (forceRedraw) {\r
+ if (prevMonth == null) { // Only do once\r
+ prevYear = new IEventButton();\r
+ prevYear.setHTML("«");\r
+ prevYear.setStyleName("i-button-prevyear");\r
+ nextYear = new IEventButton();\r
+ nextYear.setHTML("»");\r
+ nextYear.setStyleName("i-button-nextyear");\r
+ prevYear.addMouseListener(this);\r
+ nextYear.addMouseListener(this);\r
+ prevYear.addClickListener(this);\r
+ nextYear.addClickListener(this);\r
+ setWidget(0, 0, prevYear);\r
+ setWidget(0, 4, nextYear);\r
+\r
+ if (needsMonth) {\r
+ prevMonth = new IEventButton();\r
+ prevMonth.setHTML("‹");\r
+ prevMonth.setStyleName("i-button-prevmonth");\r
+ nextMonth = new IEventButton();\r
+ nextMonth.setHTML("›");\r
+ nextMonth.setStyleName("i-button-nextmonth");\r
+ prevMonth.addMouseListener(this);\r
+ nextMonth.addMouseListener(this);\r
+ prevMonth.addClickListener(this);\r
+ nextMonth.addClickListener(this);\r
+ setWidget(0, 3, nextMonth);\r
+ setWidget(0, 1, prevMonth);\r
+ }\r
+\r
+ getFlexCellFormatter().setColSpan(0, 2, 3);\r
+ getRowFormatter().addStyleName(0,\r
+ IDateField.CLASSNAME + "-calendarpanel-header");\r
+ } else if (!needsMonth) {\r
+ // Remove month traverse buttons\r
+ prevMonth.removeClickListener(this);\r
+ prevMonth.removeMouseListener(this);\r
+ nextMonth.removeClickListener(this);\r
+ nextMonth.removeMouseListener(this);\r
+ remove(prevMonth);\r
+ remove(nextMonth);\r
+ prevMonth = null;\r
+ nextMonth = null;\r
+ }\r
+\r
+ // Print weekday names\r
+ final int firstDay = datefield.getDateTimeService()\r
+ .getFirstDayOfWeek();\r
+ for (int i = 0; i < 7; i++) {\r
+ int day = i + firstDay;\r
+ if (day > 6) {\r
+ day = 0;\r
+ }\r
+ if (datefield.getCurrentResolution() > IDateField.RESOLUTION_MONTH) {\r
+ setHTML(1, i, "<strong>"\r
+ + datefield.getDateTimeService().getShortDay(day)\r
+ + "</strong>");\r
+ } else {\r
+ setHTML(1, i, "");\r
+ }\r
+ }\r
+ }\r
+\r
+ final String monthName = needsMonth ? datefield.getDateTimeService()\r
+ .getMonth(datefield.getShowingDate().getMonth()) : "";\r
+ final int year = datefield.getShowingDate().getYear() + 1900;\r
+ setHTML(0, 2, "<span class=\"" + IDateField.CLASSNAME\r
+ + "-calendarpanel-month\">" + monthName + " " + year\r
+ + "</span>");\r
+ }\r
+\r
+ private void buildCalendarBody() {\r
+ // date actually selected?\r
+ Date currentDate = datefield.getCurrentDate();\r
+ Date showing = datefield.getShowingDate();\r
+ boolean selected = (currentDate != null\r
+ && currentDate.getMonth() == showing.getMonth() && currentDate\r
+ .getYear() == showing.getYear());\r
+\r
+ final int startWeekDay = datefield.getDateTimeService()\r
+ .getStartWeekDay(datefield.getShowingDate());\r
+ final int numDays = DateTimeService.getNumberOfDaysInMonth(datefield\r
+ .getShowingDate());\r
+ int dayCount = 0;\r
+ final Date today = new Date();\r
+ final Date curr = new Date(datefield.getShowingDate().getTime());\r
+ for (int row = 2; row < 8; row++) {\r
+ for (int col = 0; col < 7; col++) {\r
+ if (!(row == 2 && col < startWeekDay)) {\r
+ if (dayCount < numDays) {\r
+ final int selectedDate = ++dayCount;\r
+ String title = "";\r
+ if (entrySource != null) {\r
+ curr.setDate(dayCount);\r
+ final List entries = entrySource.getEntries(curr,\r
+ IDateField.RESOLUTION_DAY);\r
+ if (entries != null) {\r
+ for (final Iterator it = entries.iterator(); it\r
+ .hasNext();) {\r
+ final CalendarEntry entry = (CalendarEntry) it\r
+ .next();\r
+ title += (title.length() > 0 ? ", " : "")\r
+ + entry.getStringForDate(curr);\r
+ }\r
+ }\r
+ }\r
+ final String baseclass = IDateField.CLASSNAME\r
+ + "-calendarpanel-day";\r
+ String cssClass = baseclass;\r
+ if (!isEnabledDate(curr)) {\r
+ cssClass += " " + baseclass + "-disabled";\r
+ }\r
+ if (selected\r
+ && datefield.getShowingDate().getDate() == dayCount) {\r
+ cssClass += " " + baseclass + "-selected";\r
+ }\r
+ if (today.getDate() == dayCount\r
+ && today.getMonth() == datefield\r
+ .getShowingDate().getMonth()\r
+ && today.getYear() == datefield\r
+ .getShowingDate().getYear()) {\r
+ cssClass += " " + baseclass + "-today";\r
+ }\r
+ if (title.length() > 0) {\r
+ cssClass += " " + baseclass + "-entry";\r
+ }\r
+ setHTML(row, col, "<span title=\"" + title\r
+ + "\" class=\"" + cssClass + "\">"\r
+ + selectedDate + "</span>");\r
+ } else {\r
+ break;\r
+ }\r
+\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private void buildTime(boolean forceRedraw) {\r
+ if (time == null) {\r
+ time = new ITime(datefield);\r
+ setText(8, 0, ""); // Add new row\r
+ getFlexCellFormatter().setColSpan(8, 0, 7);\r
+ setWidget(8, 0, time);\r
+ }\r
+ time.updateTime(forceRedraw);\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param forceRedraw\r
+ * Build all from scratch, in case of e.g. locale changes\r
+ */\r
+ public void updateCalendar() {\r
+ // Locale and resolution changes force a complete redraw\r
+ buildCalendar(locale != datefield.getCurrentLocale()\r
+ || resolution != datefield.getCurrentResolution());\r
+ if (datefield instanceof ITextualDate) {\r
+ ((ITextualDate) datefield).buildDate();\r
+ }\r
+ locale = datefield.getCurrentLocale();\r
+ resolution = datefield.getCurrentResolution();\r
+ }\r
+\r
+ public void onClick(Widget sender) {\r
+ // processClickEvent(sender, true);\r
+ }\r
+\r
+ private boolean isEnabledDate(Date date) {\r
+ if ((minDate != null && date.before(minDate))\r
+ || (maxDate != null && date.after(maxDate))) {\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ private void processClickEvent(Widget sender, boolean updateVariable) {\r
+ if (!datefield.isEnabled() || datefield.isReadonly()) {\r
+ return;\r
+ }\r
+ Date showingDate = datefield.getShowingDate();\r
+ if (!updateVariable) {\r
+ if (sender == prevYear) {\r
+ showingDate.setYear(showingDate.getYear() - 1);\r
+ updateCalendar();\r
+ } else if (sender == nextYear) {\r
+ showingDate.setYear(showingDate.getYear() + 1);\r
+ updateCalendar();\r
+ } else if (sender == prevMonth) {\r
+ showingDate.setMonth(showingDate.getMonth() - 1);\r
+ updateCalendar();\r
+ } else if (sender == nextMonth) {\r
+ showingDate.setMonth(showingDate.getMonth() + 1);\r
+ updateCalendar();\r
+ }\r
+ } else {\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_YEAR\r
+ || datefield.getCurrentResolution() == IDateField.RESOLUTION_MONTH) {\r
+ // Due to current UI, update variable if res=year/month\r
+ datefield.setCurrentDate(new Date(showingDate.getTime()));\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MONTH) {\r
+ datefield.getClient().updateVariable(datefield.getId(),\r
+ "month", datefield.getCurrentDate().getMonth() + 1,\r
+ false);\r
+ }\r
+ datefield.getClient().updateVariable(datefield.getId(), "year",\r
+ datefield.getCurrentDate().getYear() + 1900,\r
+ datefield.isImmediate());\r
+ }\r
+ }\r
+ }\r
+\r
+ private Timer timer;\r
+\r
+ public void onMouseDown(final Widget sender, int x, int y) {\r
+ if (sender instanceof IEventButton) {\r
+ processClickEvent(sender, false);\r
+ timer = new Timer() {\r
+ public void run() {\r
+ processClickEvent(sender, false);\r
+ }\r
+ };\r
+ timer.scheduleRepeating(100);\r
+ }\r
+ }\r
+\r
+ public void onMouseEnter(Widget sender) {\r
+ }\r
+\r
+ public void onMouseLeave(Widget sender) {\r
+ if (timer != null) {\r
+ timer.cancel();\r
+ }\r
+ }\r
+\r
+ public void onMouseMove(Widget sender, int x, int y) {\r
+ }\r
+\r
+ public void onMouseUp(Widget sender, int x, int y) {\r
+ if (timer != null) {\r
+ timer.cancel();\r
+ }\r
+ processClickEvent(sender, true);\r
+ }\r
+\r
+ private class IEventButton extends IButton implements SourcesMouseEvents {\r
+\r
+ private MouseListenerCollection mouseListeners;\r
+\r
+ public IEventButton() {\r
+ super();\r
+ sinkEvents(Event.FOCUSEVENTS | Event.KEYEVENTS | Event.ONCLICK\r
+ | Event.MOUSEEVENTS);\r
+ }\r
+\r
+ public void addMouseListener(MouseListener listener) {\r
+ if (mouseListeners == null) {\r
+ mouseListeners = new MouseListenerCollection();\r
+ }\r
+ mouseListeners.add(listener);\r
+ }\r
+\r
+ public void removeMouseListener(MouseListener listener) {\r
+ if (mouseListeners != null) {\r
+ mouseListeners.remove(listener);\r
+ }\r
+ }\r
+\r
+ public void onBrowserEvent(Event event) {\r
+ super.onBrowserEvent(event);\r
+ switch (DOM.eventGetType(event)) {\r
+ case Event.ONMOUSEDOWN:\r
+ case Event.ONMOUSEUP:\r
+ case Event.ONMOUSEMOVE:\r
+ case Event.ONMOUSEOVER:\r
+ case Event.ONMOUSEOUT:\r
+ if (mouseListeners != null) {\r
+ mouseListeners.fireMouseEvent(this, event);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ private class DateClickListener implements TableListener {\r
+\r
+ private final ICalendarPanel cal;\r
+\r
+ public DateClickListener(ICalendarPanel panel) {\r
+ cal = panel;\r
+ }\r
+\r
+ public void onCellClicked(SourcesTableEvents sender, int row, int col) {\r
+ if (sender != cal || row < 2 || row > 7\r
+ || !cal.datefield.isEnabled() || cal.datefield.isReadonly()) {\r
+ return;\r
+ }\r
+\r
+ final String text = cal.getText(row, col);\r
+ if (text.equals(" ")) {\r
+ return;\r
+ }\r
+\r
+ try {\r
+ final Integer day = new Integer(text);\r
+ final Date newDate = cal.datefield.getShowingDate();\r
+ newDate.setDate(day.intValue());\r
+ if (!isEnabledDate(newDate)) {\r
+ return;\r
+ }\r
+ if (cal.datefield.getCurrentDate() == null) {\r
+ cal.datefield.setCurrentDate(new Date(newDate.getTime()));\r
+\r
+ // Init variables with current time\r
+ datefield.getClient().updateVariable(cal.datefield.getId(),\r
+ "hour", newDate.getHours(), false);\r
+ datefield.getClient().updateVariable(cal.datefield.getId(),\r
+ "min", newDate.getMinutes(), false);\r
+ datefield.getClient().updateVariable(cal.datefield.getId(),\r
+ "sec", newDate.getSeconds(), false);\r
+ datefield.getClient().updateVariable(cal.datefield.getId(),\r
+ "msec", datefield.getMilliseconds(), false);\r
+ }\r
+\r
+ cal.datefield.getCurrentDate().setTime(newDate.getTime());\r
+ cal.datefield.getClient().updateVariable(cal.datefield.getId(),\r
+ "day", cal.datefield.getCurrentDate().getDate(), false);\r
+ cal.datefield.getClient().updateVariable(cal.datefield.getId(),\r
+ "month", cal.datefield.getCurrentDate().getMonth() + 1,\r
+ false);\r
+ cal.datefield.getClient().updateVariable(cal.datefield.getId(),\r
+ "year",\r
+ cal.datefield.getCurrentDate().getYear() + 1900,\r
+ cal.datefield.isImmediate());\r
+\r
+ if (datefield instanceof ITextualDate\r
+ && resolution < IDateField.RESOLUTION_HOUR) {\r
+ ((IToolkitOverlay) getParent()).hide();\r
+ } else {\r
+ updateCalendar();\r
+ }\r
+\r
+ } catch (final NumberFormatException e) {\r
+ // Not a number, ignore and stop here\r
+ return;\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ public void setLimits(Date min, Date max) {\r
+ if (min != null) {\r
+ final Date d = new Date(min.getTime());\r
+ d.setHours(0);\r
+ d.setMinutes(0);\r
+ d.setSeconds(1);\r
+ minDate = d;\r
+ } else {\r
+ minDate = null;\r
+ }\r
+ if (max != null) {\r
+ final Date d = new Date(max.getTime());\r
+ d.setHours(24);\r
+ d.setMinutes(59);\r
+ d.setSeconds(59);\r
+ maxDate = d;\r
+ } else {\r
+ maxDate = null;\r
+ }\r
+ }\r
+\r
+ public void setCalendarEntrySource(CalendarEntrySource entrySource) {\r
+ this.entrySource = entrySource;\r
+ }\r
+\r
+ public CalendarEntrySource getCalendarEntrySource() {\r
+ return entrySource;\r
+ }\r
+\r
+ public interface CalendarEntrySource {\r
+ public List getEntries(Date date, int resolution);\r
+ }\r
+\r
+ /**\r
+ * Sets focus to Calendar panel.\r
+ * \r
+ * @param focus\r
+ */\r
+ public void setFocus(boolean focus) {\r
+ nextYear.setFocus(focus);\r
+ }\r
+\r
+}\r
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
-import com.itmill.toolkit.terminal.gwt.client.Tooltip;
+import com.itmill.toolkit.terminal.gwt.client.ITooltip;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
public class ICheckBox extends com.google.gwt.user.client.ui.CheckBox implements
}
});
- sinkEvents(Tooltip.TOOLTIP_EVENTS);
+ sinkEvents(ITooltip.TOOLTIP_EVENTS);
}
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
--- /dev/null
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.terminal.gwt.client.ui;
+
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.MenuBar;
+import com.google.gwt.user.client.ui.MenuItem;
+import com.google.gwt.user.client.ui.PopupPanel;
+
+public class IContextMenu extends IToolkitOverlay {
+
+ private ActionOwner actionOwner;
+
+ private final CMenuBar menu = new CMenuBar();
+
+ private int left;
+
+ private int top;
+
+ /**
+ * This method should be used only by Client object as only one per client
+ * should exists. Request an instance via client.getContextMenu();
+ *
+ * @param cli
+ * to be set as an owner of menu
+ */
+ public IContextMenu() {
+ super(true, false, true);
+ setWidget(menu);
+ setStyleName("i-contextmenu");
+ }
+
+ /**
+ * Sets the element from which to build menu
+ *
+ * @param ao
+ */
+ public void setActionOwner(ActionOwner ao) {
+ actionOwner = ao;
+ }
+
+ /**
+ * Shows context menu at given location.
+ *
+ * @param left
+ * @param top
+ */
+ public void showAt(int left, int top) {
+ this.left = left;
+ this.top = top;
+ menu.clearItems();
+ final Action[] actions = actionOwner.getActions();
+ for (int i = 0; i < actions.length; i++) {
+ final Action a = actions[i];
+ menu.addItem(new MenuItem(a.getHTML(), true, a));
+ }
+
+ setPopupPositionAndShow(new PositionCallback() {
+ public void setPosition(int offsetWidth, int offsetHeight) {
+ // mac FF gets bad width due GWT popups overflow hacks,
+ // re-determine width
+ offsetWidth = menu.getOffsetWidth();
+ int left = IContextMenu.this.left;
+ int top = IContextMenu.this.top;
+ if (offsetWidth + left > Window.getClientWidth()) {
+ left = left - offsetWidth;
+ if (left < 0) {
+ left = 0;
+ }
+ }
+ if (offsetHeight + top > Window.getClientHeight()) {
+ top = top - offsetHeight;
+ if (top < 0) {
+ top = 0;
+ }
+ }
+ setPopupPosition(left, top);
+ }
+ });
+ }
+
+ public void showAt(ActionOwner ao, int left, int top) {
+ setActionOwner(ao);
+ showAt(left, top);
+ }
+
+ /**
+ * Extend standard Gwt MenuBar to set proper settings and to override
+ * onPopupClosed method so that PopupPanel gets closed.
+ */
+ class CMenuBar extends MenuBar {
+ public CMenuBar() {
+ super(true);
+ }
+
+ public void onPopupClosed(PopupPanel sender, boolean autoClosed) {
+ super.onPopupClosed(sender, autoClosed);
+ hide();
+ }
+
+ /*
+ * public void onBrowserEvent(Event event) { // Remove current selection
+ * when mouse leaves if (DOM.eventGetType(event) == Event.ONMOUSEOUT) {
+ * Element to = DOM.eventGetToElement(event); if
+ * (!DOM.isOrHasChild(getElement(), to)) { DOM.setElementProperty(
+ * super.getSelectedItem().getElement(), "className",
+ * super.getSelectedItem().getStylePrimaryName()); } }
+ *
+ * super.onBrowserEvent(event); }
+ */
+ }
+}
import com.google.gwt.user.client.ui.ComplexPanel;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
-import com.itmill.toolkit.terminal.gwt.client.CaptionWrapper;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
+import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
/** Update caption for given widget */
public void updateCaption(Paintable component, UIDL uidl) {
- CaptionWrapper wrapper = (CaptionWrapper) widgetToCaptionWrapper
+ ICaptionWrapper wrapper = (ICaptionWrapper) widgetToCaptionWrapper
.get(component);
- if (Caption.isNeeded(uidl)) {
+ if (ICaption.isNeeded(uidl)) {
if (wrapper == null) {
final String loc = getLocation((Widget) component);
super.remove((Widget) component);
- wrapper = new CaptionWrapper(component, client);
+ wrapper = new ICaptionWrapper(component, client);
super.add(wrapper, (Element) locationToElement.get(loc));
widgetToCaptionWrapper.put(component, wrapper);
}
if (location != null) {
locationToWidget.remove(location);
}
- final CaptionWrapper cw = (CaptionWrapper) widgetToCaptionWrapper
+ final ICaptionWrapper cw = (ICaptionWrapper) widgetToCaptionWrapper
.get(w);
if (cw != null) {
widgetToCaptionWrapper.remove(w);
import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
import com.itmill.toolkit.terminal.gwt.client.LocaleNotLoadedException;\r
import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
-import com.itmill.toolkit.terminal.gwt.client.Tooltip;\r
+import com.itmill.toolkit.terminal.gwt.client.ITooltip;\r
import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
\r
public class IDateField extends FlowPanel implements Paintable, Field {\r
public IDateField() {\r
setStyleName(CLASSNAME);\r
dts = new DateTimeService();\r
- sinkEvents(Tooltip.TOOLTIP_EVENTS);\r
+ sinkEvents(ITooltip.TOOLTIP_EVENTS);\r
}\r
\r
public void onBrowserEvent(Event event) {\r
\r
public class IDateFieldCalendar extends IDateField {\r
\r
- private final CalendarPanel date;\r
+ private final ICalendarPanel date;\r
\r
public IDateFieldCalendar() {\r
super();\r
- date = new CalendarPanel(this);\r
+ date = new ICalendarPanel(this);\r
add(date);\r
}\r
\r
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
}
protected void insert(Widget w, int beforeIndex) {
- if (w instanceof Caption) {
- final Caption c = (Caption) w;
+ if (w instanceof ICaption) {
+ final ICaption c = (ICaption) w;
// captions go into same container element as their
// owners
final Element container = DOM.getParent(((UIObject) c.getOwner())
final WidgetWrapper ww = getWidgetWrapperFor(w);
final boolean removed = super.remove(w);
if (removed) {
- if (!(w instanceof Caption)) {
+ if (!(w instanceof ICaption)) {
DOM.removeChild(childContainer, ww.getElement());
}
return true;
}
public void removeCaption(Widget w) {
- final Caption c = (Caption) componentToCaption.get(w);
+ final ICaption c = (ICaption) componentToCaption.get(w);
if (c != null) {
this.remove(c);
componentToCaption.remove(w);
}
public boolean removePaintable(Paintable p) {
- final Caption c = (Caption) componentToCaption.get(p);
+ final ICaption c = (ICaption) componentToCaption.get(p);
if (c != null) {
componentToCaption.remove(c);
remove(c);
public void replaceChildComponent(Widget from, Widget to) {
client.unregisterPaintable((Paintable) from);
- final Caption c = (Caption) componentToCaption.get(from);
+ final ICaption c = (ICaption) componentToCaption.get(from);
if (c != null) {
remove(c);
componentToCaption.remove(c);
public void updateCaption(Paintable component, UIDL uidl) {
- Caption c = (Caption) componentToCaption.get(component);
+ ICaption c = (ICaption) componentToCaption.get(component);
- if (Caption.isNeeded(uidl)) {
+ if (ICaption.isNeeded(uidl)) {
if (c == null) {
final int index = getWidgetIndex((Widget) component);
- c = new Caption(component, client);
+ c = new ICaption(component, client);
insert(c, index);
componentToCaption.put(component, c);
}
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.Focusable;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
-import com.itmill.toolkit.terminal.gwt.client.Tooltip;
+import com.itmill.toolkit.terminal.gwt.client.ITooltip;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
* @author mattitahvonen
*
*/
- public class SuggestionPopup extends ToolkitOverlay implements
+ public class SuggestionPopup extends IToolkitOverlay implements
PositionCallback, PopupListener {
private static final int EXTRASPACE = 8;
public IFilterSelect() {
selectedItemIcon.setVisible(false);
panel.add(selectedItemIcon);
- tb.sinkEvents(Tooltip.TOOLTIP_EVENTS);
+ tb.sinkEvents(ITooltip.TOOLTIP_EVENTS);
panel.add(tb);
panel.add(popupOpener);
initWidget(panel);
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;\r
import com.itmill.toolkit.terminal.gwt.client.Container;\r
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;\r
-import com.itmill.toolkit.terminal.gwt.client.ErrorMessage;\r
+import com.itmill.toolkit.terminal.gwt.client.IErrorMessage;\r
import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
import com.itmill.toolkit.terminal.gwt.client.Util;\r
private Element errorIndicatorElement = DOM.createDiv();\r
private Element desc = DOM.createDiv();\r
private Icon icon;\r
- private ErrorMessage errorMessage = new ErrorMessage();\r
+ private IErrorMessage errorMessage = new IErrorMessage();\r
\r
private Element fieldContainer = DOM.createDiv();\r
\r
import com.google.gwt.user.client.ui.HasVerticalAlignment.VerticalAlignmentConstant;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
-import com.itmill.toolkit.terminal.gwt.client.CaptionWrapper;
+import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
formatter.setAlignment(row, column, ha, va);
final Paintable child = client.getPaintable(u);
- CaptionWrapper wr;
+ ICaptionWrapper wr;
if (widgetToCaptionWrapper.containsKey(child)) {
- wr = (CaptionWrapper) widgetToCaptionWrapper
+ wr = (ICaptionWrapper) widgetToCaptionWrapper
.get(child);
oldWidgetWrappers.remove(wr);
} else {
- wr = new CaptionWrapper(child, client);
+ wr = new ICaptionWrapper(child, client);
widgetToCaptionWrapper.put(child, wr);
}
// loop oldWidgetWrappers that where not re-attached and unregister
// them
for (final Iterator it = oldWidgetWrappers.iterator(); it.hasNext();) {
- final CaptionWrapper w = (CaptionWrapper) it.next();
+ final ICaptionWrapper w = (ICaptionWrapper) it.next();
client.unregisterPaintable(w.getPaintable());
widgetToCaptionWrapper.remove(w.getPaintable());
}
}
public void updateCaption(Paintable component, UIDL uidl) {
- final CaptionWrapper wrapper = (CaptionWrapper) widgetToCaptionWrapper
+ final ICaptionWrapper wrapper = (ICaptionWrapper) widgetToCaptionWrapper
.get(component);
wrapper.updateCaption(uidl);
}
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
-import com.itmill.toolkit.terminal.gwt.client.ErrorMessage;
+import com.itmill.toolkit.terminal.gwt.client.IErrorMessage;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
private final Element captionElement = DOM.createSpan();
- private ErrorMessage errorMessage;
+ private IErrorMessage errorMessage;
private Icon icon;
}
DOM.insertChild(getElement(), errorIndicatorElement, 0);
if (errorMessage == null) {
- errorMessage = new ErrorMessage();
+ errorMessage = new IErrorMessage();
}
errorMessage.updateFromUIDL(errorUidl);
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
-import com.itmill.toolkit.terminal.gwt.client.Tooltip;
+import com.itmill.toolkit.terminal.gwt.client.ITooltip;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
public class IListSelect extends IOptionGroupBase {
TooltipListBox(boolean isMultiselect) {
super(isMultiselect);
- sinkEvents(Tooltip.TOOLTIP_EVENTS);
+ sinkEvents(ITooltip.TOOLTIP_EVENTS);
}
public void setClient(ApplicationConnection client) {
boolean subMenu;
ArrayList items;
Element containerElement;
- ToolkitOverlay popup;
+ IToolkitOverlay popup;
IMenuBar visibleChildMenu;
IMenuBar parentMenu;
CustomMenuItem selected;
* @param item
*/
public void showChildMenu(CustomMenuItem item) {
- popup = new ToolkitOverlay(true, false, true);
+ popup = new IToolkitOverlay(true, false, true);
popup.setWidget(item.getSubMenu());
popup.addPopupListener(this);
--- /dev/null
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import java.util.ArrayList;\r
+import java.util.EventObject;\r
+import java.util.Iterator;\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.Timer;\r
+import com.google.gwt.user.client.ui.HTML;\r
+import com.google.gwt.user.client.ui.Widget;\r
+import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;\r
+\r
+public class INotification extends IToolkitOverlay {\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
+\r
+ private int x = -1;\r
+ private int y = -1;\r
+\r
+ private String temporaryStyle;\r
+\r
+ private ArrayList listeners;\r
+\r
+ public INotification() {\r
+ setStylePrimaryName(STYLENAME);\r
+ sinkEvents(Event.ONCLICK);\r
+ DOM.setStyleAttribute(getElement(), "zIndex", "" + Z_INDEX_BASE);\r
+ }\r
+\r
+ public INotification(int delayMsec) {\r
+ this();\r
+ this.delayMsec = delayMsec;\r
+ }\r
+\r
+ public INotification(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(this);\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
+ setOpacity(getElement(), startOpacity);\r
+ if (style != null) {\r
+ temporaryStyle = style;\r
+ addStyleName(style);\r
+ }\r
+ super.show();\r
+ setPosition(position);\r
+ }\r
+\r
+ public void hide() {\r
+ DOM.removeEventPreview(this);\r
+ cancelDelay();\r
+ cancelFade();\r
+ if (temporaryStyle != null) {\r
+ removeStyleName(temporaryStyle);\r
+ temporaryStyle = null;\r
+ }\r
+ super.hide();\r
+ fireEvent(new HideEvent(this));\r
+ }\r
+\r
+ public void fade() {\r
+ DOM.removeEventPreview(this);\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
+ if (BrowserInfo.get().isOpera()) {\r
+ // tray notification on opera needs to explicitly define\r
+ // size, reset it\r
+ DOM.setStyleAttribute(getElement(), "width", "");\r
+ DOM.setStyleAttribute(getElement(), "height", "");\r
+ }\r
+\r
+ }\r
+ }\r
+ };\r
+ final int msec = fadeMsec / (startOpacity / 5);\r
+ fader.scheduleRepeating(msec);\r
+ }\r
+\r
+ public void setPosition(int position) {\r
+ final Element el = getElement();\r
+ DOM.setStyleAttribute(el, "top", "");\r
+ DOM.setStyleAttribute(el, "left", "");\r
+ DOM.setStyleAttribute(el, "bottom", "");\r
+ DOM.setStyleAttribute(el, "right", "");\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
+ if (BrowserInfo.get().isOpera()) {\r
+ // tray notification on opera needs explicitly defined size\r
+ DOM.setStyleAttribute(el, "width", getOffsetWidth() + "px");\r
+ DOM.setStyleAttribute(el, "height", getOffsetHeight() + "px");\r
+ }\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", "");\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(this);\r
+ if (fader == null) {\r
+ fade();\r
+ }\r
+ }\r
+\r
+ public boolean onEventPreview(Event event) {\r
+ int type = DOM.eventGetType(event);\r
+ // "modal"\r
+ if (delayMsec == -1) {\r
+ if (type == Event.ONCLICK\r
+ && DOM\r
+ .isOrHasChild(getElement(), DOM\r
+ .eventGetTarget(event))) {\r
+ fade();\r
+ }\r
+ return false;\r
+ }\r
+ // default\r
+ switch (type) {\r
+ case Event.ONMOUSEMOVE:\r
+\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.ONCLICK:\r
+ case Event.ONDBLCLICK:\r
+ case Event.KEYEVENTS:\r
+ case Event.ONSCROLL:\r
+ default:\r
+ startDelay();\r
+ }\r
+ return true;\r
+ }\r
+\r
+ public void addEventListener(EventListener listener) {\r
+ if (listeners == null) {\r
+ listeners = new ArrayList();\r
+ }\r
+ listeners.add(listener);\r
+ }\r
+\r
+ public void removeEventListener(EventListener listener) {\r
+ if (listeners == null) {\r
+ return;\r
+ }\r
+ listeners.remove(listener);\r
+ }\r
+\r
+ private void fireEvent(HideEvent event) {\r
+ if (listeners != null) {\r
+ for (Iterator it = listeners.iterator(); it.hasNext();) {\r
+ EventListener l = (EventListener) it.next();\r
+ l.notificationHidden(event);\r
+ }\r
+ }\r
+ }\r
+\r
+ public class HideEvent extends EventObject {\r
+ public HideEvent(Object source) {\r
+ super(source);\r
+ }\r
+ }\r
+\r
+ public interface EventListener extends java.util.EventListener {\r
+ public void notificationHidden(HideEvent event);\r
+ }\r
+}\r
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
Element clipperDiv;
/** Caption element when used. */
- Caption caption = null;
+ ICaption caption = null;
/**
* Last set pixel height for the wrapper. -1 if vertical clipping is not
final Element captionWrapper = getElementWrappingWidgetAndCaption();
// The widget needs caption
- if (Caption.isNeeded(uidl)) {
+ if (ICaption.isNeeded(uidl)) {
// If the caption element is missing, create it
boolean justAdded = false;
if (caption == null) {
justAdded = true;
- caption = new Caption(paintable, client);
+ caption = new ICaption(paintable, client);
}
// Update caption contents
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
-import com.itmill.toolkit.terminal.gwt.client.ErrorMessage;
+import com.itmill.toolkit.terminal.gwt.client.IErrorMessage;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
private Element errorIndicatorElement;
- private ErrorMessage errorMessage;
+ private IErrorMessage errorMessage;
private String height;
}
DOM.insertBefore(captionNode, errorIndicatorElement, captionText);
if (errorMessage == null) {
- errorMessage = new ErrorMessage();
+ errorMessage = new IErrorMessage();
}
errorMessage.updateFromUIDL(errorUidl);
\r
private final Button calendarToggle;\r
\r
- private final CalendarPanel calendar;\r
+ private final ICalendarPanel calendar;\r
\r
- private final ToolkitOverlay popup;\r
+ private final IToolkitOverlay popup;\r
private boolean open = false;\r
\r
public IPopupCalendar() {\r
calendarToggle.addClickListener(this);\r
add(calendarToggle);\r
\r
- calendar = new CalendarPanel(this);\r
- popup = new ToolkitOverlay(true, true, true);\r
+ calendar = new ICalendarPanel(this);\r
+ popup = new IToolkitOverlay(true, true, true);\r
popup.setStyleName(IDateField.CLASSNAME + "-popup");\r
popup.setWidget(calendar);\r
popup.addPopupListener(this);\r
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
-import com.itmill.toolkit.terminal.gwt.client.CaptionWrapper;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
+import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
}
}-*/;
- private class CustomPopup extends ToolkitOverlay implements Container {
+ private class CustomPopup extends IToolkitOverlay implements Container {
private Paintable popupComponentPaintable = null;
private Widget popupComponentWidget = null;
- private CaptionWrapper captionWrapper = null;
+ private ICaptionWrapper captionWrapper = null;
private boolean hasHadMouseOver = false;
private Set activeChildren;
}
public void updateCaption(Paintable component, UIDL uidl) {
- if (Caption.isNeeded(uidl)) {
+ if (ICaption.isNeeded(uidl)) {
if (captionWrapper != null) {
captionWrapper.updateCaption(uidl);
} else {
- captionWrapper = new CaptionWrapper(component, client);
+ captionWrapper = new ICaptionWrapper(component, client);
setWidget(captionWrapper);
captionWrapper.updateCaption(uidl);
}
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
return getWidgetCount();
}
- public void addTab(Caption c) {
+ public void addTab(ICaption c) {
Element td = DOM.createTD();
setStyleName(td, CLASSNAME + "-tabitemcell");
}
public boolean remove(Widget w) {
- ((Caption) w).removeClickListener(this);
+ ((ICaption) w).removeClickListener(this);
return super.remove(w);
}
- public Caption getTab(int index) {
+ public ICaption getTab(int index) {
if (index >= getWidgetCount()) {
return null;
}
- return (Caption) getWidget(index);
+ return (ICaption) getWidget(index);
}
}
}
protected void renderTab(final UIDL tabUidl, int index, boolean selected) {
- Caption c = tb.getTab(index);
+ ICaption c = tb.getTab(index);
if (c == null) {
- c = new Caption(null, client);
+ c = new ICaption(null, client);
tb.addTab(c);
}
c.updateCaption(tabUidl);
public void updateCaption(Paintable component, UIDL uidl) {
int i = tp.getWidgetIndex((Widget) component);
- Caption c = (Caption) captions.get("" + i);
+ ICaption c = (ICaption) captions.get("" + i);
c.updateCaption(uidl);
}
}
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
-import com.itmill.toolkit.terminal.gwt.client.Tooltip;
+import com.itmill.toolkit.terminal.gwt.client.ITooltip;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
setStyleName(CLASSNAME);
addChangeListener(this);
addFocusListener(this);
- sinkEvents(Tooltip.TOOLTIP_EVENTS);
+ sinkEvents(ITooltip.TOOLTIP_EVENTS);
}
public void onBrowserEvent(Event event) {
--- /dev/null
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import java.util.Date;\r
+\r
+import com.google.gwt.user.client.ui.ChangeListener;\r
+import com.google.gwt.user.client.ui.FlowPanel;\r
+import com.google.gwt.user.client.ui.ListBox;\r
+import com.google.gwt.user.client.ui.Widget;\r
+\r
+public class ITime extends FlowPanel implements ChangeListener {\r
+\r
+ private final IDateField datefield;\r
+\r
+ private ListBox hours;\r
+\r
+ private ListBox mins;\r
+\r
+ private ListBox sec;\r
+\r
+ private ListBox msec;\r
+\r
+ private ListBox ampm;\r
+\r
+ private int resolution = IDateField.RESOLUTION_HOUR;\r
+\r
+ private boolean readonly;\r
+\r
+ public ITime(IDateField parent) {\r
+ super();\r
+ datefield = parent;\r
+ setStyleName(IDateField.CLASSNAME + "-time");\r
+ }\r
+\r
+ private void buildTime(boolean redraw) {\r
+ final boolean thc = datefield.getDateTimeService().isTwelveHourClock();\r
+ if (redraw) {\r
+ clear();\r
+ final int numHours = thc ? 12 : 24;\r
+ hours = new ListBox();\r
+ hours.setStyleName(INativeSelect.CLASSNAME);\r
+ for (int i = 0; i < numHours; i++) {\r
+ hours.addItem((i < 10) ? "0" + i : "" + i);\r
+ }\r
+ hours.addChangeListener(this);\r
+ if (thc) {\r
+ ampm = new ListBox();\r
+ ampm.setStyleName(INativeSelect.CLASSNAME);\r
+ final String[] ampmText = datefield.getDateTimeService()\r
+ .getAmPmStrings();\r
+ ampm.addItem(ampmText[0]);\r
+ ampm.addItem(ampmText[1]);\r
+ ampm.addChangeListener(this);\r
+ }\r
+\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
+ mins = new ListBox();\r
+ mins.setStyleName(INativeSelect.CLASSNAME);\r
+ for (int i = 0; i < 60; i++) {\r
+ mins.addItem((i < 10) ? "0" + i : "" + i);\r
+ }\r
+ mins.addChangeListener(this);\r
+ }\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
+ sec = new ListBox();\r
+ sec.setStyleName(INativeSelect.CLASSNAME);\r
+ for (int i = 0; i < 60; i++) {\r
+ sec.addItem((i < 10) ? "0" + i : "" + i);\r
+ }\r
+ sec.addChangeListener(this);\r
+ }\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
+ msec = new ListBox();\r
+ msec.setStyleName(INativeSelect.CLASSNAME);\r
+ for (int i = 0; i < 1000; i++) {\r
+ if (i < 10) {\r
+ msec.addItem("00" + i);\r
+ } else if (i < 100) {\r
+ msec.addItem("0" + i);\r
+ } else {\r
+ msec.addItem("" + i);\r
+ }\r
+ }\r
+ msec.addChangeListener(this);\r
+ }\r
+\r
+ final String delimiter = datefield.getDateTimeService()\r
+ .getClockDelimeter();\r
+ final boolean ro = datefield.isReadonly();\r
+\r
+ if (ro) {\r
+ int h = 0;\r
+ if (datefield.getCurrentDate() != null) {\r
+ h = datefield.getCurrentDate().getHours();\r
+ }\r
+ if (thc) {\r
+ h -= h < 12 ? 0 : 12;\r
+ }\r
+ add(new ILabel(h < 10 ? "0" + h : "" + h));\r
+ } else {\r
+ add(hours);\r
+ }\r
+\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
+ add(new ILabel(delimiter));\r
+ if (ro) {\r
+ final int m = mins.getSelectedIndex();\r
+ add(new ILabel(m < 10 ? "0" + m : "" + m));\r
+ } else {\r
+ add(mins);\r
+ }\r
+ }\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
+ add(new ILabel(delimiter));\r
+ if (ro) {\r
+ final int s = sec.getSelectedIndex();\r
+ add(new ILabel(s < 10 ? "0" + s : "" + s));\r
+ } else {\r
+ add(sec);\r
+ }\r
+ }\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
+ add(new ILabel("."));\r
+ if (ro) {\r
+ final int m = datefield.getMilliseconds();\r
+ final String ms = m < 100 ? "0" + m : "" + m;\r
+ add(new ILabel(m < 10 ? "0" + ms : ms));\r
+ } else {\r
+ add(msec);\r
+ }\r
+ }\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_HOUR) {\r
+ add(new ILabel(delimiter + "00")); // o'clock\r
+ }\r
+ if (thc) {\r
+ add(new ILabel(" "));\r
+ if (ro) {\r
+ add(new ILabel(ampm.getItemText(datefield.getCurrentDate()\r
+ .getHours() < 12 ? 0 : 1)));\r
+ } else {\r
+ add(ampm);\r
+ }\r
+ }\r
+\r
+ if (ro) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ // Update times\r
+ Date cdate = datefield.getCurrentDate();\r
+ boolean selected = true;\r
+ if (cdate == null) {\r
+ cdate = new Date();\r
+ selected = false;\r
+ }\r
+ if (thc) {\r
+ int h = cdate.getHours();\r
+ ampm.setSelectedIndex(h < 12 ? 0 : 1);\r
+ h -= ampm.getSelectedIndex() * 12;\r
+ hours.setSelectedIndex(h);\r
+ } else {\r
+ hours.setSelectedIndex(cdate.getHours());\r
+ }\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
+ mins.setSelectedIndex(cdate.getMinutes());\r
+ }\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
+ sec.setSelectedIndex(cdate.getSeconds());\r
+ }\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
+ if (selected) {\r
+ msec.setSelectedIndex(datefield.getMilliseconds());\r
+ } else {\r
+ msec.setSelectedIndex(0);\r
+ }\r
+ }\r
+ if (thc) {\r
+ ampm.setSelectedIndex(cdate.getHours() < 12 ? 0 : 1);\r
+ }\r
+\r
+ if (datefield.isReadonly() && !redraw) {\r
+ // Do complete redraw when in read-only status\r
+ clear();\r
+ final String delimiter = datefield.getDateTimeService()\r
+ .getClockDelimeter();\r
+\r
+ int h = cdate.getHours();\r
+ if (thc) {\r
+ h -= h < 12 ? 0 : 12;\r
+ }\r
+ add(new ILabel(h < 10 ? "0" + h : "" + h));\r
+\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
+ add(new ILabel(delimiter));\r
+ final int m = mins.getSelectedIndex();\r
+ add(new ILabel(m < 10 ? "0" + m : "" + m));\r
+ }\r
+ if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
+ add(new ILabel(delimiter));\r
+ final int s = sec.getSelectedIndex();\r
+ add(new ILabel(s < 10 ? "0" + s : "" + s));\r
+ }\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
+ add(new ILabel("."));\r
+ final int m = datefield.getMilliseconds();\r
+ final String ms = m < 100 ? "0" + m : "" + m;\r
+ add(new ILabel(m < 10 ? "0" + ms : ms));\r
+ }\r
+ if (datefield.getCurrentResolution() == IDateField.RESOLUTION_HOUR) {\r
+ add(new ILabel(delimiter + "00")); // o'clock\r
+ }\r
+ if (thc) {\r
+ add(new ILabel(" "));\r
+ add(new ILabel(ampm.getItemText(cdate.getHours() < 12 ? 0 : 1)));\r
+ }\r
+ }\r
+\r
+ final boolean enabled = datefield.isEnabled();\r
+ hours.setEnabled(enabled);\r
+ if (mins != null) {\r
+ mins.setEnabled(enabled);\r
+ }\r
+ if (sec != null) {\r
+ sec.setEnabled(enabled);\r
+ }\r
+ if (msec != null) {\r
+ msec.setEnabled(enabled);\r
+ }\r
+ if (ampm != null) {\r
+ ampm.setEnabled(enabled);\r
+ }\r
+\r
+ }\r
+\r
+ public void updateTime(boolean redraw) {\r
+ buildTime(redraw || resolution != datefield.getCurrentResolution()\r
+ || readonly != datefield.isReadonly());\r
+ if (datefield instanceof ITextualDate) {\r
+ ((ITextualDate) datefield).buildDate();\r
+ }\r
+ resolution = datefield.getCurrentResolution();\r
+ readonly = datefield.isReadonly();\r
+ }\r
+\r
+ public void onChange(Widget sender) {\r
+ if (datefield.getCurrentDate() == null) {\r
+ // was null on server, need to set\r
+ Date now = datefield.getShowingDate();\r
+ if (now == null) {\r
+ now = new Date();\r
+ datefield.setShowingDate(now);\r
+ }\r
+ datefield.setCurrentDate(new Date(now.getTime()));\r
+\r
+ // Init variables with current time\r
+ datefield.getClient().updateVariable(datefield.getId(), "year",\r
+ now.getYear() + 1900, false);\r
+ datefield.getClient().updateVariable(datefield.getId(), "month",\r
+ now.getMonth() + 1, false);\r
+ datefield.getClient().updateVariable(datefield.getId(), "day",\r
+ now.getDate(), false);\r
+ datefield.getClient().updateVariable(datefield.getId(), "hour",\r
+ now.getHours(), false);\r
+ datefield.getClient().updateVariable(datefield.getId(), "min",\r
+ now.getMinutes(), false);\r
+ datefield.getClient().updateVariable(datefield.getId(), "sec",\r
+ now.getSeconds(), false);\r
+ datefield.getClient().updateVariable(datefield.getId(), "msec",\r
+ datefield.getMilliseconds(), false);\r
+ }\r
+ if (sender == hours) {\r
+ int h = hours.getSelectedIndex();\r
+ if (datefield.getDateTimeService().isTwelveHourClock()) {\r
+ h = h + ampm.getSelectedIndex() * 12;\r
+ }\r
+ datefield.getCurrentDate().setHours(h);\r
+ datefield.getShowingDate().setHours(h);\r
+ datefield.getClient().updateVariable(datefield.getId(), "hour", h,\r
+ datefield.isImmediate());\r
+ updateTime(false);\r
+ } else if (sender == mins) {\r
+ final int m = mins.getSelectedIndex();\r
+ datefield.getCurrentDate().setMinutes(m);\r
+ datefield.getShowingDate().setMinutes(m);\r
+ datefield.getClient().updateVariable(datefield.getId(), "min", m,\r
+ datefield.isImmediate());\r
+ updateTime(false);\r
+ } else if (sender == sec) {\r
+ final int s = sec.getSelectedIndex();\r
+ datefield.getCurrentDate().setSeconds(s);\r
+ datefield.getShowingDate().setSeconds(s);\r
+ datefield.getClient().updateVariable(datefield.getId(), "sec", s,\r
+ datefield.isImmediate());\r
+ updateTime(false);\r
+ } else if (sender == msec) {\r
+ final int ms = msec.getSelectedIndex();\r
+ datefield.setMilliseconds(ms);\r
+ datefield.setShowingMilliseconds(ms);\r
+ datefield.getClient().updateVariable(datefield.getId(), "msec", ms,\r
+ datefield.isImmediate());\r
+ updateTime(false);\r
+ } else if (sender == ampm) {\r
+ final int h = hours.getSelectedIndex() + ampm.getSelectedIndex()\r
+ * 12;\r
+ datefield.getCurrentDate().setHours(h);\r
+ datefield.getShowingDate().setHours(h);\r
+ datefield.getClient().updateVariable(datefield.getId(), "hour", h,\r
+ datefield.isImmediate());\r
+ updateTime(false);\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.itmill.toolkit.terminal.gwt.client.ui;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.PopupListener;
+import com.google.gwt.user.client.ui.PopupPanel;
+import com.google.gwt.user.client.ui.RootPanel;
+import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
+
+/**
+ * In Toolkit UI this Overlay should always be used for all elements that
+ * temporary float over other components like context menus etc. This is to deal
+ * stacking order correctly with IWindow objects.
+ */
+public class IToolkitOverlay extends PopupPanel {
+
+ public static final int Z_INDEX = 20000;
+
+ private Shadow shadow;
+
+ public IToolkitOverlay() {
+ super();
+ adjustZIndex();
+ }
+
+ public IToolkitOverlay(boolean autoHide) {
+ super(autoHide);
+ adjustZIndex();
+ }
+
+ public IToolkitOverlay(boolean autoHide, boolean modal) {
+ super(autoHide, modal);
+ adjustZIndex();
+ }
+
+ public IToolkitOverlay(boolean autoHide, boolean modal, boolean showShadow) {
+ super(autoHide, modal);
+ if (showShadow) {
+ shadow = new Shadow();
+ }
+ adjustZIndex();
+ }
+
+ private void adjustZIndex() {
+ DOM.setStyleAttribute(getElement(), "zIndex", "" + Z_INDEX);
+ }
+
+ public void setPopupPosition(int left, int top) {
+ super.setPopupPosition(left, top);
+ if (shadow != null) {
+ shadow.updateSizeAndPosition();
+ }
+ }
+
+ public void show() {
+ super.show();
+ if (shadow != null) {
+ DOM.appendChild(RootPanel.get().getElement(), shadow.getElement());
+ shadow.updateSizeAndPosition();
+ }
+ if (BrowserInfo.get().isIE6()) {
+ adjustIE6Frame(getElement(), Z_INDEX - 1);
+ }
+ }
+
+ private native void adjustIE6Frame(Element popup, int zindex)
+ /*-{
+ // relies on PopupImplIE6
+ popup.__frame.style.zIndex = zindex;
+ }-*/;
+
+ public void setShadowOffset(int top, int right, int bottom, int left) {
+ if (shadow != null) {
+ shadow.setOffset(top, right, bottom, left);
+ }
+ }
+
+ private class Shadow extends HTML {
+
+ private static final String CLASSNAME = "i-shadow";
+
+ private static final String HTML = "<div class=\"top-left\"></div><div class=\"top\"></div><div class=\"top-right\"></div><div class=\"left\"></div><div class=\"center\"></div><div class=\"right\"></div><div class=\"bottom-left\"></div><div class=\"bottom\"></div><div class=\"bottom-right\"></div>";
+
+ // Amount of shadow on each side.
+ private int top = 2;
+ private int right = 5;
+ private int bottom = 6;
+ private int left = 5;
+
+ public Shadow() {
+ super(HTML);
+ setStyleName(CLASSNAME);
+ DOM.setStyleAttribute(getElement(), "position", "absolute");
+
+ addPopupListener(new PopupListener() {
+ public void onPopupClosed(PopupPanel sender, boolean autoClosed) {
+ DOM.removeChild(RootPanel.get().getElement(), shadow
+ .getElement());
+ }
+ });
+ }
+
+ public void updateSizeAndPosition() {
+ // Calculate proper z-index
+ String zIndex = DOM.getStyleAttribute(IToolkitOverlay.this
+ .getElement(), "zIndex");
+ if (zIndex == null) {
+ zIndex = "" + Z_INDEX;
+ }
+
+ // Calculate position and size
+ if (BrowserInfo.get().isIE()) {
+ // Shake IE
+ IToolkitOverlay.this.getOffsetHeight();
+ IToolkitOverlay.this.getOffsetWidth();
+ }
+ int x = IToolkitOverlay.this.getAbsoluteLeft() - left;
+ int y = IToolkitOverlay.this.getAbsoluteTop() - top;
+ int width = IToolkitOverlay.this.getOffsetWidth() + left + right;
+ int height = IToolkitOverlay.this.getOffsetHeight() + top + bottom;
+ if (width < 0) {
+ width = 0;
+ }
+ if (height < 0) {
+ height = 0;
+ }
+
+ // Update correct values
+ DOM.setStyleAttribute(shadow.getElement(), "zIndex", ""
+ + (Integer.parseInt(zIndex) - 1));
+ DOM.setStyleAttribute(getElement(), "width", width + "px");
+ DOM.setStyleAttribute(getElement(), "height", height + "px");
+ DOM.setStyleAttribute(getElement(), "top", y + "px");
+ DOM.setStyleAttribute(getElement(), "left", x + "px");
+ }
+
+ public void setOffset(int top, int right, int bottom, int left) {
+ this.top = top;
+ this.right = right;
+ this.bottom = bottom;
+ this.left = left;
+ if (IToolkitOverlay.this.isAttached()) {
+ updateSizeAndPosition();
+ }
+ }
+
+ }
+
+}
final int position = notification
.getIntAttribute("position");
final int delay = notification.getIntAttribute("delay");
- new Notification(delay).show(html, position, style);
+ new INotification(delay).show(html, position, style);
}
}
}
final int position = notification
.getIntAttribute("position");
final int delay = notification.getIntAttribute("delay");
- new Notification(delay).show(html, position, style);
+ new INotification(delay).show(html, position, style);
}
}
}
DOM.setStyleAttribute(draggingCurtain, "width", "100%");
DOM.setStyleAttribute(draggingCurtain, "height", "100%");
DOM.setStyleAttribute(draggingCurtain, "zIndex", ""
- + ToolkitOverlay.Z_INDEX);
+ + IToolkitOverlay.Z_INDEX);
DOM.appendChild(RootPanel.getBodyElement(), draggingCurtain);
} else if (!show && draggingCurtain != null) {
* <img class='gallery' src='MenuBar.png'/>
* </p>
*
- * <h3>CSS Style Rules</h3>
- * <ul class='css'>
- * <li>.gwt-MenuBar { the menu bar itself }</li>
- * <li>.gwt-MenuBar .gwt-MenuItem { menu items }</li>
- * <li>.gwt-MenuBar .gwt-MenuItem-selected { selected menu items }</li>
- * </ul>
+ * <h3>CSS Style Rules</h3> <ul class='css'> <li>.gwt-MenuBar { the menu bar
+ * itself }</li> <li>.gwt-MenuBar .gwt-MenuItem { menu items }</li> <li>
+ * .gwt-MenuBar .gwt-MenuItem-selected { selected menu items }</li> </ul>
*
* <p>
* <h3>Example</h3>
* Creates an empty menu bar.
*
* @param vertical
- * <code>true</code> to orient the menu bar vertically
+ * <code>true</code> to orient the menu bar vertically
*/
public MenuBar(boolean vertical) {
super();
* Adds a menu item to the bar.
*
* @param item
- * the item to be added
+ * the item to be added
*/
public void addItem(MenuItem item) {
Element tr;
* selected.
*
* @param text
- * the item's text
+ * the item's text
* @param asHTML
- * <code>true</code> to treat the specified text as html
+ * <code>true</code> to treat the specified text as html
* @param cmd
- * the command to be fired
+ * the command to be fired
* @return the {@link MenuItem} object created
*/
public MenuItem addItem(String text, boolean asHTML, Command cmd) {
* selected.
*
* @param text
- * the item's text
+ * the item's text
* @param asHTML
- * <code>true</code> to treat the specified text as html
+ * <code>true</code> to treat the specified text as html
* @param popup
- * the menu to be cascaded from it
+ * the menu to be cascaded from it
* @return the {@link MenuItem} object created
*/
public MenuItem addItem(String text, boolean asHTML, MenuBar popup) {
* selected.
*
* @param text
- * the item's text
+ * the item's text
* @param cmd
- * the command to be fired
+ * the command to be fired
* @return the {@link MenuItem} object created
*/
public MenuItem addItem(String text, Command cmd) {
* selected.
*
* @param text
- * the item's text
+ * the item's text
* @param popup
- * the menu to be cascaded from it
+ * the menu to be cascaded from it
* @return the {@link MenuItem} object created
*/
public MenuItem addItem(String text, MenuBar popup) {
* Removes the specified menu item from the bar.
*
* @param item
- * the item to be removed
+ * the item to be removed
*/
public void removeItem(MenuItem item) {
final int idx = items.indexOf(item);
* moved over it.
*
* @param autoOpen
- * <code>true</code> to cause child menus to auto-open
+ * <code>true</code> to cause child menus to auto-open
*/
public void setAutoOpen(boolean autoOpen) {
this.autoOpen = autoOpen;
* fired. Popups associated with other items will be hidden.
*
* @param item the item whose popup is to be shown. @param fireCommand
- * <code>true</code> if the item's command should be fired, <code>false</code>
- * otherwise.
+ * <code>true</code> if the item's command should be fired,
+ * <code>false</code> otherwise.
*/
void doItemAction(final MenuItem item, boolean fireCommand) {
// If the given item is already showing its menu, we're done.
// Create a new popup for this item, and position it next to
// the item (below if this is a horizontal menu bar, to the
// right if it's a vertical bar).
- popup = new ToolkitOverlay(true) {
+ popup = new IToolkitOverlay(true) {
{
setWidget(item.getSubMenu());
item.getSubMenu().onShow();
* Constructs a new menu item that fires a command when it is selected.
*
* @param text
- * the item's text
+ * the item's text
* @param cmd
- * the command to be fired when it is selected
+ * the command to be fired when it is selected
*/
public MenuItem(String text, Command cmd) {
this(text, false);
* Constructs a new menu item that fires a command when it is selected.
*
* @param text
- * the item's text
+ * the item's text
* @param asHTML
- * <code>true</code> to treat the specified text as html
+ * <code>true</code> to treat the specified text as html
* @param cmd
- * the command to be fired when it is selected
+ * the command to be fired when it is selected
*/
public MenuItem(String text, boolean asHTML, Command cmd) {
this(text, asHTML);
* selected.
*
* @param text
- * the item's text
+ * the item's text
* @param subMenu
- * the sub-menu to be displayed when it is selected
+ * the sub-menu to be displayed when it is selected
*/
public MenuItem(String text, MenuBar subMenu) {
this(text, false);
* selected.
*
* @param text
- * the item's text
+ * the item's text
* @param asHTML
- * <code>true</code> to treat the specified text as html
+ * <code>true</code> to treat the specified text as html
* @param subMenu
- * the sub-menu to be displayed when it is selected
+ * the sub-menu to be displayed when it is selected
*/
public MenuItem(String text, boolean asHTML, MenuBar subMenu) {
this(text, asHTML);
* Sets the command associated with this item.
*
* @param cmd
- * the command to be associated with this item
+ * the command to be associated with this item
*/
public void setCommand(Command cmd) {
command = cmd;
* Sets the sub-menu associated with this item.
*
* @param subMenu
- * this item's new sub-menu
+ * this item's new sub-menu
*/
public void setSubMenu(MenuBar subMenu) {
this.subMenu = subMenu;
+++ /dev/null
-/* \r
-@ITMillApache2LicenseForJavaFiles@\r
- */\r
-\r
-package com.itmill.toolkit.terminal.gwt.client.ui;\r
-\r
-import java.util.ArrayList;\r
-import java.util.EventObject;\r
-import java.util.Iterator;\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.Timer;\r
-import com.google.gwt.user.client.ui.HTML;\r
-import com.google.gwt.user.client.ui.Widget;\r
-import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;\r
-\r
-public class Notification extends ToolkitOverlay {\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
-\r
- private int x = -1;\r
- private int y = -1;\r
-\r
- private String temporaryStyle;\r
-\r
- private ArrayList listeners;\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(this);\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
- setOpacity(getElement(), startOpacity);\r
- if (style != null) {\r
- temporaryStyle = style;\r
- addStyleName(style);\r
- }\r
- super.show();\r
- setPosition(position);\r
- }\r
-\r
- public void hide() {\r
- DOM.removeEventPreview(this);\r
- cancelDelay();\r
- cancelFade();\r
- if (temporaryStyle != null) {\r
- removeStyleName(temporaryStyle);\r
- temporaryStyle = null;\r
- }\r
- super.hide();\r
- fireEvent(new HideEvent(this));\r
- }\r
-\r
- public void fade() {\r
- DOM.removeEventPreview(this);\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
- if (BrowserInfo.get().isOpera()) {\r
- // tray notification on opera needs to explicitly define\r
- // size, reset it\r
- DOM.setStyleAttribute(getElement(), "width", "");\r
- DOM.setStyleAttribute(getElement(), "height", "");\r
- }\r
-\r
- }\r
- }\r
- };\r
- final int msec = fadeMsec / (startOpacity / 5);\r
- fader.scheduleRepeating(msec);\r
- }\r
-\r
- public void setPosition(int position) {\r
- final Element el = getElement();\r
- DOM.setStyleAttribute(el, "top", "");\r
- DOM.setStyleAttribute(el, "left", "");\r
- DOM.setStyleAttribute(el, "bottom", "");\r
- DOM.setStyleAttribute(el, "right", "");\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
- if (BrowserInfo.get().isOpera()) {\r
- // tray notification on opera needs explicitly defined size\r
- DOM.setStyleAttribute(el, "width", getOffsetWidth() + "px");\r
- DOM.setStyleAttribute(el, "height", getOffsetHeight() + "px");\r
- }\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", "");\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(this);\r
- if (fader == null) {\r
- fade();\r
- }\r
- }\r
-\r
- public boolean onEventPreview(Event event) {\r
- int type = DOM.eventGetType(event);\r
- // "modal"\r
- if (delayMsec == -1) {\r
- if (type == Event.ONCLICK\r
- && DOM\r
- .isOrHasChild(getElement(), DOM\r
- .eventGetTarget(event))) {\r
- fade();\r
- }\r
- return false;\r
- }\r
- // default\r
- switch (type) {\r
- case Event.ONMOUSEMOVE:\r
-\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.ONCLICK:\r
- case Event.ONDBLCLICK:\r
- case Event.KEYEVENTS:\r
- case Event.ONSCROLL:\r
- default:\r
- startDelay();\r
- }\r
- return true;\r
- }\r
-\r
- public void addEventListener(EventListener listener) {\r
- if (listeners == null) {\r
- listeners = new ArrayList();\r
- }\r
- listeners.add(listener);\r
- }\r
-\r
- public void removeEventListener(EventListener listener) {\r
- if (listeners == null) {\r
- return;\r
- }\r
- listeners.remove(listener);\r
- }\r
-\r
- private void fireEvent(HideEvent event) {\r
- if (listeners != null) {\r
- for (Iterator it = listeners.iterator(); it.hasNext();) {\r
- EventListener l = (EventListener) it.next();\r
- l.notificationHidden(event);\r
- }\r
- }\r
- }\r
-\r
- public class HideEvent extends EventObject {\r
- public HideEvent(Object source) {\r
- super(source);\r
- }\r
- }\r
-\r
- public interface EventListener extends java.util.EventListener {\r
- public void notificationHidden(HideEvent event);\r
- }\r
-}\r
+++ /dev/null
-/* \r
-@ITMillApache2LicenseForJavaFiles@\r
- */\r
-\r
-package com.itmill.toolkit.terminal.gwt.client.ui;\r
-\r
-import java.util.Date;\r
-\r
-import com.google.gwt.user.client.ui.ChangeListener;\r
-import com.google.gwt.user.client.ui.FlowPanel;\r
-import com.google.gwt.user.client.ui.ListBox;\r
-import com.google.gwt.user.client.ui.Widget;\r
-\r
-public class Time extends FlowPanel implements ChangeListener {\r
-\r
- private final IDateField datefield;\r
-\r
- private ListBox hours;\r
-\r
- private ListBox mins;\r
-\r
- private ListBox sec;\r
-\r
- private ListBox msec;\r
-\r
- private ListBox ampm;\r
-\r
- private int resolution = IDateField.RESOLUTION_HOUR;\r
-\r
- private boolean readonly;\r
-\r
- public Time(IDateField parent) {\r
- super();\r
- datefield = parent;\r
- setStyleName(IDateField.CLASSNAME + "-time");\r
- }\r
-\r
- private void buildTime(boolean redraw) {\r
- final boolean thc = datefield.getDateTimeService().isTwelveHourClock();\r
- if (redraw) {\r
- clear();\r
- final int numHours = thc ? 12 : 24;\r
- hours = new ListBox();\r
- hours.setStyleName(INativeSelect.CLASSNAME);\r
- for (int i = 0; i < numHours; i++) {\r
- hours.addItem((i < 10) ? "0" + i : "" + i);\r
- }\r
- hours.addChangeListener(this);\r
- if (thc) {\r
- ampm = new ListBox();\r
- ampm.setStyleName(INativeSelect.CLASSNAME);\r
- final String[] ampmText = datefield.getDateTimeService()\r
- .getAmPmStrings();\r
- ampm.addItem(ampmText[0]);\r
- ampm.addItem(ampmText[1]);\r
- ampm.addChangeListener(this);\r
- }\r
-\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
- mins = new ListBox();\r
- mins.setStyleName(INativeSelect.CLASSNAME);\r
- for (int i = 0; i < 60; i++) {\r
- mins.addItem((i < 10) ? "0" + i : "" + i);\r
- }\r
- mins.addChangeListener(this);\r
- }\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
- sec = new ListBox();\r
- sec.setStyleName(INativeSelect.CLASSNAME);\r
- for (int i = 0; i < 60; i++) {\r
- sec.addItem((i < 10) ? "0" + i : "" + i);\r
- }\r
- sec.addChangeListener(this);\r
- }\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
- msec = new ListBox();\r
- msec.setStyleName(INativeSelect.CLASSNAME);\r
- for (int i = 0; i < 1000; i++) {\r
- if (i < 10) {\r
- msec.addItem("00" + i);\r
- } else if (i < 100) {\r
- msec.addItem("0" + i);\r
- } else {\r
- msec.addItem("" + i);\r
- }\r
- }\r
- msec.addChangeListener(this);\r
- }\r
-\r
- final String delimiter = datefield.getDateTimeService()\r
- .getClockDelimeter();\r
- final boolean ro = datefield.isReadonly();\r
-\r
- if (ro) {\r
- int h = 0;\r
- if (datefield.getCurrentDate() != null) {\r
- h = datefield.getCurrentDate().getHours();\r
- }\r
- if (thc) {\r
- h -= h < 12 ? 0 : 12;\r
- }\r
- add(new ILabel(h < 10 ? "0" + h : "" + h));\r
- } else {\r
- add(hours);\r
- }\r
-\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
- add(new ILabel(delimiter));\r
- if (ro) {\r
- final int m = mins.getSelectedIndex();\r
- add(new ILabel(m < 10 ? "0" + m : "" + m));\r
- } else {\r
- add(mins);\r
- }\r
- }\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
- add(new ILabel(delimiter));\r
- if (ro) {\r
- final int s = sec.getSelectedIndex();\r
- add(new ILabel(s < 10 ? "0" + s : "" + s));\r
- } else {\r
- add(sec);\r
- }\r
- }\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
- add(new ILabel("."));\r
- if (ro) {\r
- final int m = datefield.getMilliseconds();\r
- final String ms = m < 100 ? "0" + m : "" + m;\r
- add(new ILabel(m < 10 ? "0" + ms : ms));\r
- } else {\r
- add(msec);\r
- }\r
- }\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_HOUR) {\r
- add(new ILabel(delimiter + "00")); // o'clock\r
- }\r
- if (thc) {\r
- add(new ILabel(" "));\r
- if (ro) {\r
- add(new ILabel(ampm.getItemText(datefield.getCurrentDate()\r
- .getHours() < 12 ? 0 : 1)));\r
- } else {\r
- add(ampm);\r
- }\r
- }\r
-\r
- if (ro) {\r
- return;\r
- }\r
- }\r
-\r
- // Update times\r
- Date cdate = datefield.getCurrentDate();\r
- boolean selected = true;\r
- if (cdate == null) {\r
- cdate = new Date();\r
- selected = false;\r
- }\r
- if (thc) {\r
- int h = cdate.getHours();\r
- ampm.setSelectedIndex(h < 12 ? 0 : 1);\r
- h -= ampm.getSelectedIndex() * 12;\r
- hours.setSelectedIndex(h);\r
- } else {\r
- hours.setSelectedIndex(cdate.getHours());\r
- }\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
- mins.setSelectedIndex(cdate.getMinutes());\r
- }\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
- sec.setSelectedIndex(cdate.getSeconds());\r
- }\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
- if (selected) {\r
- msec.setSelectedIndex(datefield.getMilliseconds());\r
- } else {\r
- msec.setSelectedIndex(0);\r
- }\r
- }\r
- if (thc) {\r
- ampm.setSelectedIndex(cdate.getHours() < 12 ? 0 : 1);\r
- }\r
-\r
- if (datefield.isReadonly() && !redraw) {\r
- // Do complete redraw when in read-only status\r
- clear();\r
- final String delimiter = datefield.getDateTimeService()\r
- .getClockDelimeter();\r
-\r
- int h = cdate.getHours();\r
- if (thc) {\r
- h -= h < 12 ? 0 : 12;\r
- }\r
- add(new ILabel(h < 10 ? "0" + h : "" + h));\r
-\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) {\r
- add(new ILabel(delimiter));\r
- final int m = mins.getSelectedIndex();\r
- add(new ILabel(m < 10 ? "0" + m : "" + m));\r
- }\r
- if (datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) {\r
- add(new ILabel(delimiter));\r
- final int s = sec.getSelectedIndex();\r
- add(new ILabel(s < 10 ? "0" + s : "" + s));\r
- }\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) {\r
- add(new ILabel("."));\r
- final int m = datefield.getMilliseconds();\r
- final String ms = m < 100 ? "0" + m : "" + m;\r
- add(new ILabel(m < 10 ? "0" + ms : ms));\r
- }\r
- if (datefield.getCurrentResolution() == IDateField.RESOLUTION_HOUR) {\r
- add(new ILabel(delimiter + "00")); // o'clock\r
- }\r
- if (thc) {\r
- add(new ILabel(" "));\r
- add(new ILabel(ampm.getItemText(cdate.getHours() < 12 ? 0 : 1)));\r
- }\r
- }\r
-\r
- final boolean enabled = datefield.isEnabled();\r
- hours.setEnabled(enabled);\r
- if (mins != null) {\r
- mins.setEnabled(enabled);\r
- }\r
- if (sec != null) {\r
- sec.setEnabled(enabled);\r
- }\r
- if (msec != null) {\r
- msec.setEnabled(enabled);\r
- }\r
- if (ampm != null) {\r
- ampm.setEnabled(enabled);\r
- }\r
-\r
- }\r
-\r
- public void updateTime(boolean redraw) {\r
- buildTime(redraw || resolution != datefield.getCurrentResolution()\r
- || readonly != datefield.isReadonly());\r
- if (datefield instanceof ITextualDate) {\r
- ((ITextualDate) datefield).buildDate();\r
- }\r
- resolution = datefield.getCurrentResolution();\r
- readonly = datefield.isReadonly();\r
- }\r
-\r
- public void onChange(Widget sender) {\r
- if (datefield.getCurrentDate() == null) {\r
- // was null on server, need to set\r
- Date now = datefield.getShowingDate();\r
- if (now == null) {\r
- now = new Date();\r
- datefield.setShowingDate(now);\r
- }\r
- datefield.setCurrentDate(new Date(now.getTime()));\r
-\r
- // Init variables with current time\r
- datefield.getClient().updateVariable(datefield.getId(), "year",\r
- now.getYear() + 1900, false);\r
- datefield.getClient().updateVariable(datefield.getId(), "month",\r
- now.getMonth() + 1, false);\r
- datefield.getClient().updateVariable(datefield.getId(), "day",\r
- now.getDate(), false);\r
- datefield.getClient().updateVariable(datefield.getId(), "hour",\r
- now.getHours(), false);\r
- datefield.getClient().updateVariable(datefield.getId(), "min",\r
- now.getMinutes(), false);\r
- datefield.getClient().updateVariable(datefield.getId(), "sec",\r
- now.getSeconds(), false);\r
- datefield.getClient().updateVariable(datefield.getId(), "msec",\r
- datefield.getMilliseconds(), false);\r
- }\r
- if (sender == hours) {\r
- int h = hours.getSelectedIndex();\r
- if (datefield.getDateTimeService().isTwelveHourClock()) {\r
- h = h + ampm.getSelectedIndex() * 12;\r
- }\r
- datefield.getCurrentDate().setHours(h);\r
- datefield.getShowingDate().setHours(h);\r
- datefield.getClient().updateVariable(datefield.getId(), "hour", h,\r
- datefield.isImmediate());\r
- updateTime(false);\r
- } else if (sender == mins) {\r
- final int m = mins.getSelectedIndex();\r
- datefield.getCurrentDate().setMinutes(m);\r
- datefield.getShowingDate().setMinutes(m);\r
- datefield.getClient().updateVariable(datefield.getId(), "min", m,\r
- datefield.isImmediate());\r
- updateTime(false);\r
- } else if (sender == sec) {\r
- final int s = sec.getSelectedIndex();\r
- datefield.getCurrentDate().setSeconds(s);\r
- datefield.getShowingDate().setSeconds(s);\r
- datefield.getClient().updateVariable(datefield.getId(), "sec", s,\r
- datefield.isImmediate());\r
- updateTime(false);\r
- } else if (sender == msec) {\r
- final int ms = msec.getSelectedIndex();\r
- datefield.setMilliseconds(ms);\r
- datefield.setShowingMilliseconds(ms);\r
- datefield.getClient().updateVariable(datefield.getId(), "msec", ms,\r
- datefield.isImmediate());\r
- updateTime(false);\r
- } else if (sender == ampm) {\r
- final int h = hours.getSelectedIndex() + ampm.getSelectedIndex()\r
- * 12;\r
- datefield.getCurrentDate().setHours(h);\r
- datefield.getShowingDate().setHours(h);\r
- datefield.getClient().updateVariable(datefield.getId(), "hour", h,\r
- datefield.isImmediate());\r
- updateTime(false);\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*
-@ITMillApache2LicenseForJavaFiles@
- */
-
-package com.itmill.toolkit.terminal.gwt.client.ui;
-
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.PopupListener;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.RootPanel;
-import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
-
-/**
- * In Toolkit UI this Overlay should always be used for all elements that
- * temporary float over other components like context menus etc. This is to deal
- * stacking order correctly with IWindow objects.
- */
-public class ToolkitOverlay extends PopupPanel {
-
- public static final int Z_INDEX = 20000;
-
- private Shadow shadow;
-
- public ToolkitOverlay() {
- super();
- adjustZIndex();
- }
-
- public ToolkitOverlay(boolean autoHide) {
- super(autoHide);
- adjustZIndex();
- }
-
- public ToolkitOverlay(boolean autoHide, boolean modal) {
- super(autoHide, modal);
- adjustZIndex();
- }
-
- public ToolkitOverlay(boolean autoHide, boolean modal, boolean showShadow) {
- super(autoHide, modal);
- if (showShadow) {
- shadow = new Shadow();
- }
- adjustZIndex();
- }
-
- private void adjustZIndex() {
- DOM.setStyleAttribute(getElement(), "zIndex", "" + Z_INDEX);
- }
-
- public void setPopupPosition(int left, int top) {
- super.setPopupPosition(left, top);
- if (shadow != null) {
- shadow.updateSizeAndPosition();
- }
- }
-
- public void show() {
- super.show();
- if (shadow != null) {
- DOM.appendChild(RootPanel.get().getElement(), shadow.getElement());
- shadow.updateSizeAndPosition();
- }
- if (BrowserInfo.get().isIE6()) {
- adjustIE6Frame(getElement(), Z_INDEX - 1);
- }
- }
-
- private native void adjustIE6Frame(Element popup, int zindex)
- /*-{
- // relies on PopupImplIE6
- popup.__frame.style.zIndex = zindex;
- }-*/;
-
- public void setShadowOffset(int top, int right, int bottom, int left) {
- if (shadow != null) {
- shadow.setOffset(top, right, bottom, left);
- }
- }
-
- private class Shadow extends HTML {
-
- private static final String CLASSNAME = "i-shadow";
-
- private static final String HTML = "<div class=\"top-left\"></div><div class=\"top\"></div><div class=\"top-right\"></div><div class=\"left\"></div><div class=\"center\"></div><div class=\"right\"></div><div class=\"bottom-left\"></div><div class=\"bottom\"></div><div class=\"bottom-right\"></div>";
-
- // Amount of shadow on each side.
- private int top = 2;
- private int right = 5;
- private int bottom = 6;
- private int left = 5;
-
- public Shadow() {
- super(HTML);
- setStyleName(CLASSNAME);
- DOM.setStyleAttribute(getElement(), "position", "absolute");
-
- addPopupListener(new PopupListener() {
- public void onPopupClosed(PopupPanel sender, boolean autoClosed) {
- DOM.removeChild(RootPanel.get().getElement(), shadow
- .getElement());
- }
- });
- }
-
- public void updateSizeAndPosition() {
- // Calculate proper z-index
- String zIndex = DOM.getStyleAttribute(ToolkitOverlay.this
- .getElement(), "zIndex");
- if (zIndex == null) {
- zIndex = "" + Z_INDEX;
- }
-
- // Calculate position and size
- if (BrowserInfo.get().isIE()) {
- // Shake IE
- ToolkitOverlay.this.getOffsetHeight();
- ToolkitOverlay.this.getOffsetWidth();
- }
- int x = ToolkitOverlay.this.getAbsoluteLeft() - left;
- int y = ToolkitOverlay.this.getAbsoluteTop() - top;
- int width = ToolkitOverlay.this.getOffsetWidth() + left + right;
- int height = ToolkitOverlay.this.getOffsetHeight() + top + bottom;
- if (width < 0) {
- width = 0;
- }
- if (height < 0) {
- height = 0;
- }
-
- // Update correct values
- DOM.setStyleAttribute(shadow.getElement(), "zIndex", ""
- + (Integer.parseInt(zIndex) - 1));
- DOM.setStyleAttribute(getElement(), "width", width + "px");
- DOM.setStyleAttribute(getElement(), "height", height + "px");
- DOM.setStyleAttribute(getElement(), "top", y + "px");
- DOM.setStyleAttribute(getElement(), "left", x + "px");
- }
-
- public void setOffset(int top, int right, int bottom, int left) {
- this.top = top;
- this.right = right;
- this.bottom = bottom;
- this.left = left;
- if (ToolkitOverlay.this.isAttached()) {
- updateSizeAndPosition();
- }
- }
-
- }
-
-}
+++ /dev/null
-package com.itmill.toolkit.terminal.gwt.client.ui.absolutegrid;
-
-import java.util.HashMap;
-import java.util.Iterator;
-
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.ui.AbsolutePanel;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.SimplePanel;
-import com.google.gwt.user.client.ui.Widget;
-import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
-import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
-import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.ui.AlignmentInfo;
-
-/**
- * Prototype helper widget to implement complex sized Toolkit layouts like
- * GridLayout and OrderedLayout. Supports size, margins, spacing, but has bit
- * expensive layout function.
- */
-public class AbsoluteGrid extends Composite implements ContainerResizedListener {
-
- protected HashMap cells = new HashMap();
-
- private int cols = 1;
- private int rows = 1;
-
- private AbsolutePanel ap;
-
- protected int marginTop;
- protected int marginBottom;
- protected int marginLeft;
- protected int marginRight;
-
- private int offsetWidth;
-
- private int offsetHeight;
-
- public AbsoluteGrid() {
- ap = new AbsolutePanel();
- initWidget(ap);
- }
-
- public AbsoluteGridCell getCell(int col, int row) {
- AbsoluteGridCell p = (AbsoluteGridCell) cells.get(col + "." + row);
- if (p == null) {
- p = new AbsoluteGridCell(col, row);
- cells.put(col + "." + row, p);
- ap.add(p);
- }
- return p;
- }
-
- public void clear() {
- ap.clear();
- cells.clear();
- }
-
- public Iterator getCellIterator() {
- return cells.values().iterator();
- }
-
- private float getCellWidth(int colspan) {
- int total = ap.getOffsetWidth();
- total -= getMarginWidth();
- total -= getSpacingSize() * (cols - colspan);
- if (total < 0) {
- return 0;
- }
- return total * colspan / (float) cols;
- }
-
- /**
- *
- * @return space used by left and right margin
- */
- private int getMarginWidth() {
- return marginLeft + marginRight;
- }
-
- /**
- * @return pixels reserved for space between components
- */
- protected int getSpacingSize() {
- return 0;
- }
-
- private float getCellHeight(int rowspan) {
- int total = ap.getOffsetHeight();
- total -= getMarginHeight();
- total -= getSpacingSize() * (rows - rowspan);
- if (total < 0) {
- return 0;
- }
- return total * rowspan / (float) rows;
- }
-
- /**
- *
- * @return space used by top and bottom margin
- */
- private int getMarginHeight() {
- return marginBottom + marginTop;
- }
-
- /**
- * TODO contains Caption (which is a widget) in a very bad way, cannot be
- * simple panel
- */
- public class AbsoluteGridCell extends SimplePanel {
-
- int rowIndex;
- int colIndex;
- int colSpan = 1;
- int rowSpan = 1;
- private Element container = DOM.createDiv();
-
- private Caption caption;
- private AlignmentInfo alignmentInfo = new AlignmentInfo(
- AlignmentInfo.ALIGNMENT_TOP + AlignmentInfo.ALIGNMENT_LEFT);
-
- AbsoluteGridCell(int colIndex, int rowIndex) {
- super();
- if (BrowserInfo.get().isIE6()) {
- DOM.setStyleAttribute(getElement(), "overflow", "hidden");
- }
- DOM.appendChild(getElement(), container);
- this.rowIndex = rowIndex;
- this.colIndex = colIndex;
- }
-
- public void clear() {
- super.clear();
- if (caption != null) {
- DOM.removeChild(getElement(), caption.getElement());
- caption = null;
- }
- }
-
- protected Element getContainerElement() {
- return container;
- }
-
- void setColSpan(int s) {
- // TODO Should remove possibly collapsing cells
- colSpan = s;
- }
-
- void setRowSpan(int s) {
- // TODO Should remove possibly collapsing cells
- rowSpan = s;
- }
-
- private int getLeft() {
- int left = marginLeft;
- left += colIndex * getCellWidth(1);
- left += getSpacingSize() * colIndex;
- return left;
- }
-
- private int getTop() {
- int top = marginTop;
- top += rowIndex * getCellHeight(1);
- top += getSpacingSize() * rowIndex;
- return top;
- }
-
- public void render() {
- setPixelSize((int) getCellWidth(colSpan),
- (int) getCellHeight(rowSpan));
- ap.setWidgetPosition(this, getLeft(), getTop());
- }
-
- /**
- * Does vertical positioning based on DOM values
- */
- public void vAling() {
- DOM.setStyleAttribute(getElement(), "paddingTop", "0");
- if (!alignmentInfo.isTop()) {
- Widget c = getWidget();
- if (c != null) {
-
- int oh = getOffsetHeight();
- int wt = DOM.getElementPropertyInt(container, "offsetTop");
- int wh = c.getOffsetHeight();
-
- int freeSpace = getOffsetHeight()
- - (DOM
- .getElementPropertyInt(container,
- "offsetTop") + c.getOffsetHeight());
- if (Util.isIE()) {
- freeSpace -= DOM.getElementPropertyInt(c.getElement(),
- "offsetTop");
- }
- if (freeSpace < 0) {
- freeSpace = 0; // clipping rest of contents when object
- // larger than reserved area
- }
- if (alignmentInfo.isVerticalCenter()) {
- DOM.setStyleAttribute(getElement(), "paddingTop",
- (freeSpace / 2) + "px");
- } else {
- DOM.setStyleAttribute(getElement(), "paddingTop",
- (freeSpace) + "px");
- }
- }
- }
- }
-
- public void setPixelSize(int width, int height) {
- super.setPixelSize(width, height);
- DOM.setStyleAttribute(container, "width", width + "px");
- int contHeight = height - getCaptionHeight();
- if (contHeight < 0) {
- contHeight = 0;
- }
- DOM.setStyleAttribute(container, "height", contHeight + "px");
- }
-
- private int getCaptionHeight() {
- // remove hard coded caption height
- return (caption == null) ? 0 : caption.getOffsetHeight();
- }
-
- public Caption getCaption() {
- return caption;
- }
-
- public void setCaption(Caption newCaption) {
- // TODO check for existing, shouldn't happen though
- caption = newCaption;
- DOM.insertChild(getElement(), caption.getElement(), 0);
- }
-
- public void setAlignment(int bitmask) {
- if (alignmentInfo.getBitMask() != bitmask) {
- alignmentInfo = new AlignmentInfo(bitmask);
- setHorizontalAling();
- // vertical align is set in render() method
- }
- }
-
- private void setHorizontalAling() {
- DOM.setStyleAttribute(getElement(), "textAlign", alignmentInfo
- .getHorizontalAlignment());
- if (getWidget() != null) {
- Element el = getWidget().getElement();
- if (alignmentInfo.isHorizontalCenter()
- || alignmentInfo.isRight()) {
- DOM.setStyleAttribute(el, "marginLeft", "auto");
- } else {
- DOM.setStyleAttribute(el, "marginLeft", "");
- }
- if (alignmentInfo.isHorizontalCenter()
- || alignmentInfo.isLeft()) {
- DOM.setStyleAttribute(el, "marginRight", "auto");
- } else {
- DOM.setStyleAttribute(el, "marginRight", "");
- }
- }
- }
- }
-
- public void iLayout() {
- boolean sizeChanged = false;
- int newWidth = getOffsetWidth();
- if (offsetWidth != newWidth) {
- offsetWidth = newWidth;
- sizeChanged = true;
- }
- int newHeight = getOffsetHeight();
- if (offsetHeight != newHeight) {
- offsetHeight = newHeight;
- sizeChanged = true;
- }
- if (sizeChanged) {
- for (Iterator it = cells.values().iterator(); it.hasNext();) {
- AbsoluteGridCell cell = (AbsoluteGridCell) it.next();
- cell.render();
- cell.vAling();
- }
- Util.runDescendentsLayout(ap);
- }
- }
-
- public int getCols() {
- return cols;
- }
-
- public void setCols(int cols) {
- this.cols = cols;
- // force relayout
- offsetHeight = 0;
- offsetWidth = 0;
- }
-
- public int getRows() {
- return rows;
- }
-
- public void setRows(int rows) {
- this.rows = rows;
- // force relayout
- offsetHeight = 0;
- offsetWidth = 0;
- }
-}
--- /dev/null
+package com.itmill.toolkit.terminal.gwt.client.ui.absolutegrid;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.AbsolutePanel;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
+import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
+import com.itmill.toolkit.terminal.gwt.client.Util;
+import com.itmill.toolkit.terminal.gwt.client.ui.AlignmentInfo;
+
+/**
+ * Prototype helper widget to implement complex sized Toolkit layouts like
+ * GridLayout and OrderedLayout. Supports size, margins, spacing, but has bit
+ * expensive layout function.
+ */
+public class IAbsoluteGrid extends Composite implements
+ ContainerResizedListener {
+
+ protected HashMap cells = new HashMap();
+
+ private int cols = 1;
+ private int rows = 1;
+
+ private AbsolutePanel ap;
+
+ protected int marginTop;
+ protected int marginBottom;
+ protected int marginLeft;
+ protected int marginRight;
+
+ private int offsetWidth;
+
+ private int offsetHeight;
+
+ public IAbsoluteGrid() {
+ ap = new AbsolutePanel();
+ initWidget(ap);
+ }
+
+ public IAbsoluteGridCell getCell(int col, int row) {
+ IAbsoluteGridCell p = (IAbsoluteGridCell) cells.get(col + "." + row);
+ if (p == null) {
+ p = new IAbsoluteGridCell(col, row);
+ cells.put(col + "." + row, p);
+ ap.add(p);
+ }
+ return p;
+ }
+
+ public void clear() {
+ ap.clear();
+ cells.clear();
+ }
+
+ public Iterator getCellIterator() {
+ return cells.values().iterator();
+ }
+
+ private float getCellWidth(int colspan) {
+ int total = ap.getOffsetWidth();
+ total -= getMarginWidth();
+ total -= getSpacingSize() * (cols - colspan);
+ if (total < 0) {
+ return 0;
+ }
+ return total * colspan / (float) cols;
+ }
+
+ /**
+ *
+ * @return space used by left and right margin
+ */
+ private int getMarginWidth() {
+ return marginLeft + marginRight;
+ }
+
+ /**
+ * @return pixels reserved for space between components
+ */
+ protected int getSpacingSize() {
+ return 0;
+ }
+
+ private float getCellHeight(int rowspan) {
+ int total = ap.getOffsetHeight();
+ total -= getMarginHeight();
+ total -= getSpacingSize() * (rows - rowspan);
+ if (total < 0) {
+ return 0;
+ }
+ return total * rowspan / (float) rows;
+ }
+
+ /**
+ *
+ * @return space used by top and bottom margin
+ */
+ private int getMarginHeight() {
+ return marginBottom + marginTop;
+ }
+
+ /**
+ * TODO contains Caption (which is a widget) in a very bad way, cannot be
+ * simple panel
+ */
+ public class IAbsoluteGridCell extends SimplePanel {
+
+ int rowIndex;
+ int colIndex;
+ int colSpan = 1;
+ int rowSpan = 1;
+ private Element container = DOM.createDiv();
+
+ private ICaption caption;
+ private AlignmentInfo alignmentInfo = new AlignmentInfo(
+ AlignmentInfo.ALIGNMENT_TOP + AlignmentInfo.ALIGNMENT_LEFT);
+
+ IAbsoluteGridCell(int colIndex, int rowIndex) {
+ super();
+ if (BrowserInfo.get().isIE6()) {
+ DOM.setStyleAttribute(getElement(), "overflow", "hidden");
+ }
+ DOM.appendChild(getElement(), container);
+ this.rowIndex = rowIndex;
+ this.colIndex = colIndex;
+ }
+
+ public void clear() {
+ super.clear();
+ if (caption != null) {
+ DOM.removeChild(getElement(), caption.getElement());
+ caption = null;
+ }
+ }
+
+ protected Element getContainerElement() {
+ return container;
+ }
+
+ void setColSpan(int s) {
+ // TODO Should remove possibly collapsing cells
+ colSpan = s;
+ }
+
+ void setRowSpan(int s) {
+ // TODO Should remove possibly collapsing cells
+ rowSpan = s;
+ }
+
+ private int getLeft() {
+ int left = marginLeft;
+ left += colIndex * getCellWidth(1);
+ left += getSpacingSize() * colIndex;
+ return left;
+ }
+
+ private int getTop() {
+ int top = marginTop;
+ top += rowIndex * getCellHeight(1);
+ top += getSpacingSize() * rowIndex;
+ return top;
+ }
+
+ public void render() {
+ setPixelSize((int) getCellWidth(colSpan),
+ (int) getCellHeight(rowSpan));
+ ap.setWidgetPosition(this, getLeft(), getTop());
+ }
+
+ /**
+ * Does vertical positioning based on DOM values
+ */
+ public void vAling() {
+ DOM.setStyleAttribute(getElement(), "paddingTop", "0");
+ if (!alignmentInfo.isTop()) {
+ Widget c = getWidget();
+ if (c != null) {
+
+ int oh = getOffsetHeight();
+ int wt = DOM.getElementPropertyInt(container, "offsetTop");
+ int wh = c.getOffsetHeight();
+
+ int freeSpace = getOffsetHeight()
+ - (DOM
+ .getElementPropertyInt(container,
+ "offsetTop") + c.getOffsetHeight());
+ if (Util.isIE()) {
+ freeSpace -= DOM.getElementPropertyInt(c.getElement(),
+ "offsetTop");
+ }
+ if (freeSpace < 0) {
+ freeSpace = 0; // clipping rest of contents when object
+ // larger than reserved area
+ }
+ if (alignmentInfo.isVerticalCenter()) {
+ DOM.setStyleAttribute(getElement(), "paddingTop",
+ (freeSpace / 2) + "px");
+ } else {
+ DOM.setStyleAttribute(getElement(), "paddingTop",
+ (freeSpace) + "px");
+ }
+ }
+ }
+ }
+
+ public void setPixelSize(int width, int height) {
+ super.setPixelSize(width, height);
+ DOM.setStyleAttribute(container, "width", width + "px");
+ int contHeight = height - getCaptionHeight();
+ if (contHeight < 0) {
+ contHeight = 0;
+ }
+ DOM.setStyleAttribute(container, "height", contHeight + "px");
+ }
+
+ private int getCaptionHeight() {
+ // remove hard coded caption height
+ return (caption == null) ? 0 : caption.getOffsetHeight();
+ }
+
+ public ICaption getCaption() {
+ return caption;
+ }
+
+ public void setCaption(ICaption newCaption) {
+ // TODO check for existing, shouldn't happen though
+ caption = newCaption;
+ DOM.insertChild(getElement(), caption.getElement(), 0);
+ }
+
+ public void setAlignment(int bitmask) {
+ if (alignmentInfo.getBitMask() != bitmask) {
+ alignmentInfo = new AlignmentInfo(bitmask);
+ setHorizontalAling();
+ // vertical align is set in render() method
+ }
+ }
+
+ private void setHorizontalAling() {
+ DOM.setStyleAttribute(getElement(), "textAlign", alignmentInfo
+ .getHorizontalAlignment());
+ if (getWidget() != null) {
+ Element el = getWidget().getElement();
+ if (alignmentInfo.isHorizontalCenter()
+ || alignmentInfo.isRight()) {
+ DOM.setStyleAttribute(el, "marginLeft", "auto");
+ } else {
+ DOM.setStyleAttribute(el, "marginLeft", "");
+ }
+ if (alignmentInfo.isHorizontalCenter()
+ || alignmentInfo.isLeft()) {
+ DOM.setStyleAttribute(el, "marginRight", "auto");
+ } else {
+ DOM.setStyleAttribute(el, "marginRight", "");
+ }
+ }
+ }
+ }
+
+ public void iLayout() {
+ boolean sizeChanged = false;
+ int newWidth = getOffsetWidth();
+ if (offsetWidth != newWidth) {
+ offsetWidth = newWidth;
+ sizeChanged = true;
+ }
+ int newHeight = getOffsetHeight();
+ if (offsetHeight != newHeight) {
+ offsetHeight = newHeight;
+ sizeChanged = true;
+ }
+ if (sizeChanged) {
+ for (Iterator it = cells.values().iterator(); it.hasNext();) {
+ IAbsoluteGridCell cell = (IAbsoluteGridCell) it.next();
+ cell.render();
+ cell.vAling();
+ }
+ Util.runDescendentsLayout(ap);
+ }
+ }
+
+ public int getCols() {
+ return cols;
+ }
+
+ public void setCols(int cols) {
+ this.cols = cols;
+ // force relayout
+ offsetHeight = 0;
+ offsetWidth = 0;
+ }
+
+ public int getRows() {
+ return rows;
+ }
+
+ public void setRows(int rows) {
+ this.rows = rows;
+ // force relayout
+ offsetHeight = 0;
+ offsetWidth = 0;
+ }
+}
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
-import com.itmill.toolkit.terminal.gwt.client.Caption;
+import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
* All cell's will be equally sized.
*
*/
-public class ISizeableGridLayout extends AbsoluteGrid implements Paintable,
+public class ISizeableGridLayout extends IAbsoluteGrid implements Paintable,
Container {
public static final String CLASSNAME = "i-gridlayout";
private int spacing;
final UIDL u = c.getChildUIDL(0);
if (u != null) {
final Paintable child = client.getPaintable(u);
- AbsoluteGridCell cell = getCell(column, row);
+ IAbsoluteGridCell cell = getCell(column, row);
paintableToCellMap.put(child, cell);
cell.rowSpan = rowSpan;
cell.colSpan = colSpan;
// loop oldWidgetWrappers that where not re-attached and unregister them
for (final Iterator it = oldCells.iterator(); it.hasNext();) {
- final AbsoluteGridCell w = (AbsoluteGridCell) it.next();
+ final IAbsoluteGridCell w = (IAbsoluteGridCell) it.next();
client.unregisterPaintable((Paintable) w.getWidget());
w.removeFromParent();
paintableToCellMap.remove(w.getWidget());
}
public void updateCaption(Paintable component, UIDL uidl) {
- AbsoluteGridCell cell = (AbsoluteGridCell) paintableToCellMap
+ IAbsoluteGridCell cell = (IAbsoluteGridCell) paintableToCellMap
.get(component);
- Caption c = cell.getCaption();
+ ICaption c = cell.getCaption();
if (c == null) {
- c = new Caption(component, client);
+ c = new ICaption(component, client);
cell.setCaption(c);
}
c.updateCaption(uidl);
private RichTextArea rta = new RichTextArea();
- private RichTextToolbar formatter = new RichTextToolbar(rta);
+ private IRichTextToolbar formatter = new IRichTextToolbar(rta);
private HTML html = new HTML();
--- /dev/null
+bold = Toggle Bold
+createLink = Create Link
+hr = Insert Horizontal Rule
+indent = Indent Right
+insertImage = Insert Image
+italic = Toggle Italic
+justifyCenter = Center
+justifyLeft = Left Justify
+justifyRight = Right Justify
+ol = Insert Ordered List
+outdent = Indent Left
+removeFormat = Remove Formatting
+removeLink = Remove Link
+strikeThrough = Toggle Strikethrough
+subscript = Toggle Subscript
+superscript = Toggle Superscript
+ul = Insert Unordered List
+underline = Toggle Underline
+color = Color
+black = Black
+white = White
+red = Red
+green = Green
+yellow = Yellow
+blue = Blue
+font = Font
+normal = Normal
+size = Size
+xxsmall = XX-Small
+xsmall = X-Small
+small = Small
+medium = Medium
+large = Large
+xlarge = X-Large
+xxlarge = XX-Large
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright 2007 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.itmill.toolkit.terminal.gwt.client.ui.richtextarea;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.i18n.client.Constants;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+import com.google.gwt.user.client.ui.ChangeListener;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.ImageBundle;
+import com.google.gwt.user.client.ui.KeyboardListener;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.PushButton;
+import com.google.gwt.user.client.ui.RichTextArea;
+import com.google.gwt.user.client.ui.ToggleButton;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * A sample toolbar for use with {@link RichTextArea}. It provides a simple UI
+ * for all rich text formatting, dynamically displayed only for the available
+ * functionality.
+ */
+public class IRichTextToolbar extends Composite {
+
+ /**
+ * This {@link ImageBundle} is used for all the button icons. Using an image
+ * bundle allows all of these images to be packed into a single image, which
+ * saves a lot of HTTP requests, drastically improving startup time.
+ */
+ public interface Images extends ImageBundle {
+
+ /**
+ * @gwt.resource bold.gif
+ */
+ AbstractImagePrototype bold();
+
+ /**
+ * @gwt.resource createLink.gif
+ */
+ AbstractImagePrototype createLink();
+
+ /**
+ * @gwt.resource hr.gif
+ */
+ AbstractImagePrototype hr();
+
+ /**
+ * @gwt.resource indent.gif
+ */
+ AbstractImagePrototype indent();
+
+ /**
+ * @gwt.resource insertImage.gif
+ */
+ AbstractImagePrototype insertImage();
+
+ /**
+ * @gwt.resource italic.gif
+ */
+ AbstractImagePrototype italic();
+
+ /**
+ * @gwt.resource justifyCenter.gif
+ */
+ AbstractImagePrototype justifyCenter();
+
+ /**
+ * @gwt.resource justifyLeft.gif
+ */
+ AbstractImagePrototype justifyLeft();
+
+ /**
+ * @gwt.resource justifyRight.gif
+ */
+ AbstractImagePrototype justifyRight();
+
+ /**
+ * @gwt.resource ol.gif
+ */
+ AbstractImagePrototype ol();
+
+ /**
+ * @gwt.resource outdent.gif
+ */
+ AbstractImagePrototype outdent();
+
+ /**
+ * @gwt.resource removeFormat.gif
+ */
+ AbstractImagePrototype removeFormat();
+
+ /**
+ * @gwt.resource removeLink.gif
+ */
+ AbstractImagePrototype removeLink();
+
+ /**
+ * @gwt.resource strikeThrough.gif
+ */
+ AbstractImagePrototype strikeThrough();
+
+ /**
+ * @gwt.resource subscript.gif
+ */
+ AbstractImagePrototype subscript();
+
+ /**
+ * @gwt.resource superscript.gif
+ */
+ AbstractImagePrototype superscript();
+
+ /**
+ * @gwt.resource ul.gif
+ */
+ AbstractImagePrototype ul();
+
+ /**
+ * @gwt.resource underline.gif
+ */
+ AbstractImagePrototype underline();
+ }
+
+ /**
+ * This {@link Constants} interface is used to make the toolbar's strings
+ * internationalizable.
+ */
+ public interface Strings extends Constants {
+
+ String black();
+
+ String blue();
+
+ String bold();
+
+ String color();
+
+ String createLink();
+
+ String font();
+
+ String green();
+
+ String hr();
+
+ String indent();
+
+ String insertImage();
+
+ String italic();
+
+ String justifyCenter();
+
+ String justifyLeft();
+
+ String justifyRight();
+
+ String large();
+
+ String medium();
+
+ String normal();
+
+ String ol();
+
+ String outdent();
+
+ String red();
+
+ String removeFormat();
+
+ String removeLink();
+
+ String size();
+
+ String small();
+
+ String strikeThrough();
+
+ String subscript();
+
+ String superscript();
+
+ String ul();
+
+ String underline();
+
+ String white();
+
+ String xlarge();
+
+ String xsmall();
+
+ String xxlarge();
+
+ String xxsmall();
+
+ String yellow();
+ }
+
+ /**
+ * We use an inner EventListener class to avoid exposing event methods on
+ * the RichTextToolbar itself.
+ */
+ private class EventListener implements ClickListener, ChangeListener,
+ KeyboardListener {
+
+ public void onChange(Widget sender) {
+ if (sender == backColors) {
+ basic.setBackColor(backColors.getValue(backColors
+ .getSelectedIndex()));
+ backColors.setSelectedIndex(0);
+ } else if (sender == foreColors) {
+ basic.setForeColor(foreColors.getValue(foreColors
+ .getSelectedIndex()));
+ foreColors.setSelectedIndex(0);
+ } else if (sender == fonts) {
+ basic.setFontName(fonts.getValue(fonts.getSelectedIndex()));
+ fonts.setSelectedIndex(0);
+ } else if (sender == fontSizes) {
+ basic.setFontSize(fontSizesConstants[fontSizes
+ .getSelectedIndex() - 1]);
+ fontSizes.setSelectedIndex(0);
+ }
+ }
+
+ public void onClick(Widget sender) {
+ if (sender == bold) {
+ basic.toggleBold();
+ } else if (sender == italic) {
+ basic.toggleItalic();
+ } else if (sender == underline) {
+ basic.toggleUnderline();
+ } else if (sender == subscript) {
+ basic.toggleSubscript();
+ } else if (sender == superscript) {
+ basic.toggleSuperscript();
+ } else if (sender == strikethrough) {
+ extended.toggleStrikethrough();
+ } else if (sender == indent) {
+ extended.rightIndent();
+ } else if (sender == outdent) {
+ extended.leftIndent();
+ } else if (sender == justifyLeft) {
+ basic.setJustification(RichTextArea.Justification.LEFT);
+ } else if (sender == justifyCenter) {
+ basic.setJustification(RichTextArea.Justification.CENTER);
+ } else if (sender == justifyRight) {
+ basic.setJustification(RichTextArea.Justification.RIGHT);
+ } else if (sender == insertImage) {
+ final String url = Window.prompt("Enter an image URL:",
+ "http://");
+ if (url != null) {
+ extended.insertImage(url);
+ }
+ } else if (sender == createLink) {
+ final String url = Window
+ .prompt("Enter a link URL:", "http://");
+ if (url != null) {
+ extended.createLink(url);
+ }
+ } else if (sender == removeLink) {
+ extended.removeLink();
+ } else if (sender == hr) {
+ extended.insertHorizontalRule();
+ } else if (sender == ol) {
+ extended.insertOrderedList();
+ } else if (sender == ul) {
+ extended.insertUnorderedList();
+ } else if (sender == removeFormat) {
+ extended.removeFormat();
+ } else if (sender == richText) {
+ // We use the RichTextArea's onKeyUp event to update the toolbar
+ // status.
+ // This will catch any cases where the user moves the cursur
+ // using the
+ // keyboard, or uses one of the browser's built-in keyboard
+ // shortcuts.
+ updateStatus();
+ }
+ }
+
+ public void onKeyDown(Widget sender, char keyCode, int modifiers) {
+ }
+
+ public void onKeyPress(Widget sender, char keyCode, int modifiers) {
+ }
+
+ public void onKeyUp(Widget sender, char keyCode, int modifiers) {
+ if (sender == richText) {
+ // We use the RichTextArea's onKeyUp event to update the toolbar
+ // status.
+ // This will catch any cases where the user moves the cursur
+ // using the
+ // keyboard, or uses one of the browser's built-in keyboard
+ // shortcuts.
+ updateStatus();
+ }
+ }
+ }
+
+ private static final RichTextArea.FontSize[] fontSizesConstants = new RichTextArea.FontSize[] {
+ RichTextArea.FontSize.XX_SMALL, RichTextArea.FontSize.X_SMALL,
+ RichTextArea.FontSize.SMALL, RichTextArea.FontSize.MEDIUM,
+ RichTextArea.FontSize.LARGE, RichTextArea.FontSize.X_LARGE,
+ RichTextArea.FontSize.XX_LARGE };
+
+ private final Images images = (Images) GWT.create(Images.class);
+ private final Strings strings = (Strings) GWT.create(Strings.class);
+ private final EventListener listener = new EventListener();
+
+ private final RichTextArea richText;
+ private final RichTextArea.BasicFormatter basic;
+ private final RichTextArea.ExtendedFormatter extended;
+
+ private final VerticalPanel outer = new VerticalPanel();
+ private final HorizontalPanel topPanel = new HorizontalPanel();
+ private final HorizontalPanel bottomPanel = new HorizontalPanel();
+ private ToggleButton bold;
+ private ToggleButton italic;
+ private ToggleButton underline;
+ private ToggleButton subscript;
+ private ToggleButton superscript;
+ private ToggleButton strikethrough;
+ private PushButton indent;
+ private PushButton outdent;
+ private PushButton justifyLeft;
+ private PushButton justifyCenter;
+ private PushButton justifyRight;
+ private PushButton hr;
+ private PushButton ol;
+ private PushButton ul;
+ private PushButton insertImage;
+ private PushButton createLink;
+ private PushButton removeLink;
+ private PushButton removeFormat;
+
+ private ListBox backColors;
+ private ListBox foreColors;
+ private ListBox fonts;
+ private ListBox fontSizes;
+
+ /**
+ * Creates a new toolbar that drives the given rich text area.
+ *
+ * @param richText
+ * the rich text area to be controlled
+ */
+ public IRichTextToolbar(RichTextArea richText) {
+ this.richText = richText;
+ basic = richText.getBasicFormatter();
+ extended = richText.getExtendedFormatter();
+
+ outer.add(topPanel);
+ outer.add(bottomPanel);
+ topPanel.setWidth("100%");
+ bottomPanel.setWidth("100%");
+
+ initWidget(outer);
+ setStyleName("gwt-RichTextToolbar");
+
+ if (basic != null) {
+ topPanel.add(bold = createToggleButton(images.bold(), strings
+ .bold()));
+ topPanel.add(italic = createToggleButton(images.italic(), strings
+ .italic()));
+ topPanel.add(underline = createToggleButton(images.underline(),
+ strings.underline()));
+ topPanel.add(subscript = createToggleButton(images.subscript(),
+ strings.subscript()));
+ topPanel.add(superscript = createToggleButton(images.superscript(),
+ strings.superscript()));
+ topPanel.add(justifyLeft = createPushButton(images.justifyLeft(),
+ strings.justifyLeft()));
+ topPanel.add(justifyCenter = createPushButton(images
+ .justifyCenter(), strings.justifyCenter()));
+ topPanel.add(justifyRight = createPushButton(images.justifyRight(),
+ strings.justifyRight()));
+ }
+
+ if (extended != null) {
+ topPanel.add(strikethrough = createToggleButton(images
+ .strikeThrough(), strings.strikeThrough()));
+ topPanel.add(indent = createPushButton(images.indent(), strings
+ .indent()));
+ topPanel.add(outdent = createPushButton(images.outdent(), strings
+ .outdent()));
+ topPanel.add(hr = createPushButton(images.hr(), strings.hr()));
+ topPanel.add(ol = createPushButton(images.ol(), strings.ol()));
+ topPanel.add(ul = createPushButton(images.ul(), strings.ul()));
+ topPanel.add(insertImage = createPushButton(images.insertImage(),
+ strings.insertImage()));
+ topPanel.add(createLink = createPushButton(images.createLink(),
+ strings.createLink()));
+ topPanel.add(removeLink = createPushButton(images.removeLink(),
+ strings.removeLink()));
+ topPanel.add(removeFormat = createPushButton(images.removeFormat(),
+ strings.removeFormat()));
+ }
+
+ if (basic != null) {
+ bottomPanel.add(backColors = createColorList("Background"));
+ bottomPanel.add(foreColors = createColorList("Foreground"));
+ bottomPanel.add(fonts = createFontList());
+ bottomPanel.add(fontSizes = createFontSizes());
+
+ // We only use these listeners for updating status, so don't hook
+ // them up
+ // unless at least basic editing is supported.
+ richText.addKeyboardListener(listener);
+ richText.addClickListener(listener);
+ }
+ }
+
+ private ListBox createColorList(String caption) {
+ final ListBox lb = new ListBox();
+ lb.addChangeListener(listener);
+ lb.setVisibleItemCount(1);
+
+ lb.addItem(caption);
+ lb.addItem(strings.white(), "white");
+ lb.addItem(strings.black(), "black");
+ lb.addItem(strings.red(), "red");
+ lb.addItem(strings.green(), "green");
+ lb.addItem(strings.yellow(), "yellow");
+ lb.addItem(strings.blue(), "blue");
+ return lb;
+ }
+
+ private ListBox createFontList() {
+ final ListBox lb = new ListBox();
+ lb.addChangeListener(listener);
+ lb.setVisibleItemCount(1);
+
+ lb.addItem(strings.font(), "");
+ lb.addItem(strings.normal(), "");
+ lb.addItem("Times New Roman", "Times New Roman");
+ lb.addItem("Arial", "Arial");
+ lb.addItem("Courier New", "Courier New");
+ lb.addItem("Georgia", "Georgia");
+ lb.addItem("Trebuchet", "Trebuchet");
+ lb.addItem("Verdana", "Verdana");
+ return lb;
+ }
+
+ private ListBox createFontSizes() {
+ final ListBox lb = new ListBox();
+ lb.addChangeListener(listener);
+ lb.setVisibleItemCount(1);
+
+ lb.addItem(strings.size());
+ lb.addItem(strings.xxsmall());
+ lb.addItem(strings.xsmall());
+ lb.addItem(strings.small());
+ lb.addItem(strings.medium());
+ lb.addItem(strings.large());
+ lb.addItem(strings.xlarge());
+ lb.addItem(strings.xxlarge());
+ return lb;
+ }
+
+ private PushButton createPushButton(AbstractImagePrototype img, String tip) {
+ final PushButton pb = new PushButton(img.createImage());
+ pb.addClickListener(listener);
+ pb.setTitle(tip);
+ return pb;
+ }
+
+ private ToggleButton createToggleButton(AbstractImagePrototype img,
+ String tip) {
+ final ToggleButton tb = new ToggleButton(img.createImage());
+ tb.addClickListener(listener);
+ tb.setTitle(tip);
+ return tb;
+ }
+
+ /**
+ * Updates the status of all the stateful buttons.
+ */
+ private void updateStatus() {
+ if (basic != null) {
+ bold.setDown(basic.isBold());
+ italic.setDown(basic.isItalic());
+ underline.setDown(basic.isUnderlined());
+ subscript.setDown(basic.isSubscript());
+ superscript.setDown(basic.isSuperscript());
+ }
+
+ if (extended != null) {
+ strikethrough.setDown(extended.isStrikethrough());
+ }
+ }
+}
+++ /dev/null
-bold = Toggle Bold
-createLink = Create Link
-hr = Insert Horizontal Rule
-indent = Indent Right
-insertImage = Insert Image
-italic = Toggle Italic
-justifyCenter = Center
-justifyLeft = Left Justify
-justifyRight = Right Justify
-ol = Insert Ordered List
-outdent = Indent Left
-removeFormat = Remove Formatting
-removeLink = Remove Link
-strikeThrough = Toggle Strikethrough
-subscript = Toggle Subscript
-superscript = Toggle Superscript
-ul = Insert Unordered List
-underline = Toggle Underline
-color = Color
-black = Black
-white = White
-red = Red
-green = Green
-yellow = Yellow
-blue = Blue
-font = Font
-normal = Normal
-size = Size
-xxsmall = XX-Small
-xsmall = X-Small
-small = Small
-medium = Medium
-large = Large
-xlarge = X-Large
-xxlarge = XX-Large
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright 2007 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.itmill.toolkit.terminal.gwt.client.ui.richtextarea;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.i18n.client.Constants;
-import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.AbstractImagePrototype;
-import com.google.gwt.user.client.ui.ChangeListener;
-import com.google.gwt.user.client.ui.ClickListener;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.ImageBundle;
-import com.google.gwt.user.client.ui.KeyboardListener;
-import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwt.user.client.ui.PushButton;
-import com.google.gwt.user.client.ui.RichTextArea;
-import com.google.gwt.user.client.ui.ToggleButton;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * A sample toolbar for use with {@link RichTextArea}. It provides a simple UI
- * for all rich text formatting, dynamically displayed only for the available
- * functionality.
- */
-public class RichTextToolbar extends Composite {
-
- /**
- * This {@link ImageBundle} is used for all the button icons. Using an image
- * bundle allows all of these images to be packed into a single image, which
- * saves a lot of HTTP requests, drastically improving startup time.
- */
- public interface Images extends ImageBundle {
-
- /**
- * @gwt.resource bold.gif
- */
- AbstractImagePrototype bold();
-
- /**
- * @gwt.resource createLink.gif
- */
- AbstractImagePrototype createLink();
-
- /**
- * @gwt.resource hr.gif
- */
- AbstractImagePrototype hr();
-
- /**
- * @gwt.resource indent.gif
- */
- AbstractImagePrototype indent();
-
- /**
- * @gwt.resource insertImage.gif
- */
- AbstractImagePrototype insertImage();
-
- /**
- * @gwt.resource italic.gif
- */
- AbstractImagePrototype italic();
-
- /**
- * @gwt.resource justifyCenter.gif
- */
- AbstractImagePrototype justifyCenter();
-
- /**
- * @gwt.resource justifyLeft.gif
- */
- AbstractImagePrototype justifyLeft();
-
- /**
- * @gwt.resource justifyRight.gif
- */
- AbstractImagePrototype justifyRight();
-
- /**
- * @gwt.resource ol.gif
- */
- AbstractImagePrototype ol();
-
- /**
- * @gwt.resource outdent.gif
- */
- AbstractImagePrototype outdent();
-
- /**
- * @gwt.resource removeFormat.gif
- */
- AbstractImagePrototype removeFormat();
-
- /**
- * @gwt.resource removeLink.gif
- */
- AbstractImagePrototype removeLink();
-
- /**
- * @gwt.resource strikeThrough.gif
- */
- AbstractImagePrototype strikeThrough();
-
- /**
- * @gwt.resource subscript.gif
- */
- AbstractImagePrototype subscript();
-
- /**
- * @gwt.resource superscript.gif
- */
- AbstractImagePrototype superscript();
-
- /**
- * @gwt.resource ul.gif
- */
- AbstractImagePrototype ul();
-
- /**
- * @gwt.resource underline.gif
- */
- AbstractImagePrototype underline();
- }
-
- /**
- * This {@link Constants} interface is used to make the toolbar's strings
- * internationalizable.
- */
- public interface Strings extends Constants {
-
- String black();
-
- String blue();
-
- String bold();
-
- String color();
-
- String createLink();
-
- String font();
-
- String green();
-
- String hr();
-
- String indent();
-
- String insertImage();
-
- String italic();
-
- String justifyCenter();
-
- String justifyLeft();
-
- String justifyRight();
-
- String large();
-
- String medium();
-
- String normal();
-
- String ol();
-
- String outdent();
-
- String red();
-
- String removeFormat();
-
- String removeLink();
-
- String size();
-
- String small();
-
- String strikeThrough();
-
- String subscript();
-
- String superscript();
-
- String ul();
-
- String underline();
-
- String white();
-
- String xlarge();
-
- String xsmall();
-
- String xxlarge();
-
- String xxsmall();
-
- String yellow();
- }
-
- /**
- * We use an inner EventListener class to avoid exposing event methods on
- * the RichTextToolbar itself.
- */
- private class EventListener implements ClickListener, ChangeListener,
- KeyboardListener {
-
- public void onChange(Widget sender) {
- if (sender == backColors) {
- basic.setBackColor(backColors.getValue(backColors
- .getSelectedIndex()));
- backColors.setSelectedIndex(0);
- } else if (sender == foreColors) {
- basic.setForeColor(foreColors.getValue(foreColors
- .getSelectedIndex()));
- foreColors.setSelectedIndex(0);
- } else if (sender == fonts) {
- basic.setFontName(fonts.getValue(fonts.getSelectedIndex()));
- fonts.setSelectedIndex(0);
- } else if (sender == fontSizes) {
- basic.setFontSize(fontSizesConstants[fontSizes
- .getSelectedIndex() - 1]);
- fontSizes.setSelectedIndex(0);
- }
- }
-
- public void onClick(Widget sender) {
- if (sender == bold) {
- basic.toggleBold();
- } else if (sender == italic) {
- basic.toggleItalic();
- } else if (sender == underline) {
- basic.toggleUnderline();
- } else if (sender == subscript) {
- basic.toggleSubscript();
- } else if (sender == superscript) {
- basic.toggleSuperscript();
- } else if (sender == strikethrough) {
- extended.toggleStrikethrough();
- } else if (sender == indent) {
- extended.rightIndent();
- } else if (sender == outdent) {
- extended.leftIndent();
- } else if (sender == justifyLeft) {
- basic.setJustification(RichTextArea.Justification.LEFT);
- } else if (sender == justifyCenter) {
- basic.setJustification(RichTextArea.Justification.CENTER);
- } else if (sender == justifyRight) {
- basic.setJustification(RichTextArea.Justification.RIGHT);
- } else if (sender == insertImage) {
- final String url = Window.prompt("Enter an image URL:",
- "http://");
- if (url != null) {
- extended.insertImage(url);
- }
- } else if (sender == createLink) {
- final String url = Window
- .prompt("Enter a link URL:", "http://");
- if (url != null) {
- extended.createLink(url);
- }
- } else if (sender == removeLink) {
- extended.removeLink();
- } else if (sender == hr) {
- extended.insertHorizontalRule();
- } else if (sender == ol) {
- extended.insertOrderedList();
- } else if (sender == ul) {
- extended.insertUnorderedList();
- } else if (sender == removeFormat) {
- extended.removeFormat();
- } else if (sender == richText) {
- // We use the RichTextArea's onKeyUp event to update the toolbar
- // status.
- // This will catch any cases where the user moves the cursur
- // using the
- // keyboard, or uses one of the browser's built-in keyboard
- // shortcuts.
- updateStatus();
- }
- }
-
- public void onKeyDown(Widget sender, char keyCode, int modifiers) {
- }
-
- public void onKeyPress(Widget sender, char keyCode, int modifiers) {
- }
-
- public void onKeyUp(Widget sender, char keyCode, int modifiers) {
- if (sender == richText) {
- // We use the RichTextArea's onKeyUp event to update the toolbar
- // status.
- // This will catch any cases where the user moves the cursur
- // using the
- // keyboard, or uses one of the browser's built-in keyboard
- // shortcuts.
- updateStatus();
- }
- }
- }
-
- private static final RichTextArea.FontSize[] fontSizesConstants = new RichTextArea.FontSize[] {
- RichTextArea.FontSize.XX_SMALL, RichTextArea.FontSize.X_SMALL,
- RichTextArea.FontSize.SMALL, RichTextArea.FontSize.MEDIUM,
- RichTextArea.FontSize.LARGE, RichTextArea.FontSize.X_LARGE,
- RichTextArea.FontSize.XX_LARGE };
-
- private final Images images = (Images) GWT.create(Images.class);
- private final Strings strings = (Strings) GWT.create(Strings.class);
- private final EventListener listener = new EventListener();
-
- private final RichTextArea richText;
- private final RichTextArea.BasicFormatter basic;
- private final RichTextArea.ExtendedFormatter extended;
-
- private final VerticalPanel outer = new VerticalPanel();
- private final HorizontalPanel topPanel = new HorizontalPanel();
- private final HorizontalPanel bottomPanel = new HorizontalPanel();
- private ToggleButton bold;
- private ToggleButton italic;
- private ToggleButton underline;
- private ToggleButton subscript;
- private ToggleButton superscript;
- private ToggleButton strikethrough;
- private PushButton indent;
- private PushButton outdent;
- private PushButton justifyLeft;
- private PushButton justifyCenter;
- private PushButton justifyRight;
- private PushButton hr;
- private PushButton ol;
- private PushButton ul;
- private PushButton insertImage;
- private PushButton createLink;
- private PushButton removeLink;
- private PushButton removeFormat;
-
- private ListBox backColors;
- private ListBox foreColors;
- private ListBox fonts;
- private ListBox fontSizes;
-
- /**
- * Creates a new toolbar that drives the given rich text area.
- *
- * @param richText
- * the rich text area to be controlled
- */
- public RichTextToolbar(RichTextArea richText) {
- this.richText = richText;
- basic = richText.getBasicFormatter();
- extended = richText.getExtendedFormatter();
-
- outer.add(topPanel);
- outer.add(bottomPanel);
- topPanel.setWidth("100%");
- bottomPanel.setWidth("100%");
-
- initWidget(outer);
- setStyleName("gwt-RichTextToolbar");
-
- if (basic != null) {
- topPanel.add(bold = createToggleButton(images.bold(), strings
- .bold()));
- topPanel.add(italic = createToggleButton(images.italic(), strings
- .italic()));
- topPanel.add(underline = createToggleButton(images.underline(),
- strings.underline()));
- topPanel.add(subscript = createToggleButton(images.subscript(),
- strings.subscript()));
- topPanel.add(superscript = createToggleButton(images.superscript(),
- strings.superscript()));
- topPanel.add(justifyLeft = createPushButton(images.justifyLeft(),
- strings.justifyLeft()));
- topPanel.add(justifyCenter = createPushButton(images
- .justifyCenter(), strings.justifyCenter()));
- topPanel.add(justifyRight = createPushButton(images.justifyRight(),
- strings.justifyRight()));
- }
-
- if (extended != null) {
- topPanel.add(strikethrough = createToggleButton(images
- .strikeThrough(), strings.strikeThrough()));
- topPanel.add(indent = createPushButton(images.indent(), strings
- .indent()));
- topPanel.add(outdent = createPushButton(images.outdent(), strings
- .outdent()));
- topPanel.add(hr = createPushButton(images.hr(), strings.hr()));
- topPanel.add(ol = createPushButton(images.ol(), strings.ol()));
- topPanel.add(ul = createPushButton(images.ul(), strings.ul()));
- topPanel.add(insertImage = createPushButton(images.insertImage(),
- strings.insertImage()));
- topPanel.add(createLink = createPushButton(images.createLink(),
- strings.createLink()));
- topPanel.add(removeLink = createPushButton(images.removeLink(),
- strings.removeLink()));
- topPanel.add(removeFormat = createPushButton(images.removeFormat(),
- strings.removeFormat()));
- }
-
- if (basic != null) {
- bottomPanel.add(backColors = createColorList("Background"));
- bottomPanel.add(foreColors = createColorList("Foreground"));
- bottomPanel.add(fonts = createFontList());
- bottomPanel.add(fontSizes = createFontSizes());
-
- // We only use these listeners for updating status, so don't hook
- // them up
- // unless at least basic editing is supported.
- richText.addKeyboardListener(listener);
- richText.addClickListener(listener);
- }
- }
-
- private ListBox createColorList(String caption) {
- final ListBox lb = new ListBox();
- lb.addChangeListener(listener);
- lb.setVisibleItemCount(1);
-
- lb.addItem(caption);
- lb.addItem(strings.white(), "white");
- lb.addItem(strings.black(), "black");
- lb.addItem(strings.red(), "red");
- lb.addItem(strings.green(), "green");
- lb.addItem(strings.yellow(), "yellow");
- lb.addItem(strings.blue(), "blue");
- return lb;
- }
-
- private ListBox createFontList() {
- final ListBox lb = new ListBox();
- lb.addChangeListener(listener);
- lb.setVisibleItemCount(1);
-
- lb.addItem(strings.font(), "");
- lb.addItem(strings.normal(), "");
- lb.addItem("Times New Roman", "Times New Roman");
- lb.addItem("Arial", "Arial");
- lb.addItem("Courier New", "Courier New");
- lb.addItem("Georgia", "Georgia");
- lb.addItem("Trebuchet", "Trebuchet");
- lb.addItem("Verdana", "Verdana");
- return lb;
- }
-
- private ListBox createFontSizes() {
- final ListBox lb = new ListBox();
- lb.addChangeListener(listener);
- lb.setVisibleItemCount(1);
-
- lb.addItem(strings.size());
- lb.addItem(strings.xxsmall());
- lb.addItem(strings.xsmall());
- lb.addItem(strings.small());
- lb.addItem(strings.medium());
- lb.addItem(strings.large());
- lb.addItem(strings.xlarge());
- lb.addItem(strings.xxlarge());
- return lb;
- }
-
- private PushButton createPushButton(AbstractImagePrototype img, String tip) {
- final PushButton pb = new PushButton(img.createImage());
- pb.addClickListener(listener);
- pb.setTitle(tip);
- return pb;
- }
-
- private ToggleButton createToggleButton(AbstractImagePrototype img,
- String tip) {
- final ToggleButton tb = new ToggleButton(img.createImage());
- tb.addClickListener(listener);
- tb.setTitle(tip);
- return tb;
- }
-
- /**
- * Updates the status of all the stateful buttons.
- */
- private void updateStatus() {
- if (basic != null) {
- bold.setDown(basic.isBold());
- italic.setDown(basic.isItalic());
- underline.setDown(basic.isUnderlined());
- subscript.setDown(basic.isSubscript());
- superscript.setDown(basic.isSuperscript());
- }
-
- if (extended != null) {
- strikethrough.setDown(extended.isStrikethrough());
- }
- }
-}