]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixes #2010 - Client classes renamed
authorArtur Signell <artur.signell@itmill.com>
Thu, 28 Aug 2008 07:53:45 +0000 (07:53 +0000)
committerArtur Signell <artur.signell@itmill.com>
Thu, 28 Aug 2008 07:53:45 +0000 (07:53 +0000)
svn changeset:5285/svn branch:trunk

54 files changed:
src/com/itmill/toolkit/demo/reservation/gwt/client/ui/ICalendarField.java
src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java
src/com/itmill/toolkit/terminal/gwt/client/Caption.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/DebugConsole.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ErrorMessage.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ICaption.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ICaptionWrapper.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/IDebugConsole.java [new file with mode: 0755]
src/com/itmill/toolkit/terminal/gwt/client/IErrorMessage.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ITooltip.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/Tooltip.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/UIDL.java
src/com/itmill/toolkit/terminal/gwt/client/ui/CalendarPanel.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/ContextMenu.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/IAccordion.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IButton.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendarPanel.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/ICheckBox.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IContextMenu.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IDateFieldCalendar.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IExpandLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ILink.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IMenuBar.java
src/com/itmill/toolkit/terminal/gwt/client/ui/INotification.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IPanel.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupView.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITabsheet.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/IToolkitOverlay.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/IView.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IWindow.java
src/com/itmill/toolkit/terminal/gwt/client/ui/MenuBar.java
src/com/itmill/toolkit/terminal/gwt/client/ui/MenuItem.java
src/com/itmill/toolkit/terminal/gwt/client/ui/Notification.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/Time.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/ToolkitOverlay.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/AbsoluteGrid.java [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/ISizeableGridLayout.java
src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextArea.java
src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextToolbar$Strings.properties [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextToolbar.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar$Strings.properties [deleted file]
src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar.java [deleted file]

index 696f41c353e2558de906fc56edeebb289053beca..6ae47ea05cd0cd86d41e0ef5b089867eca54e415 100644 (file)
@@ -21,12 +21,12 @@ import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
 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
@@ -44,7 +44,7 @@ public class ICalendarField extends IDateField {
     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
@@ -212,7 +212,7 @@ public class ICalendarField extends IDateField {
 \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
index c68f4d073bffb41a041bd7de1af4ed5dcc04b4c3..30c43e7046efe41c5f0b810aef88614fece52995 100755 (executable)
@@ -32,11 +32,11 @@ import com.google.gwt.user.client.ui.FocusWidget;
 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>.
@@ -69,7 +69,7 @@ public class ApplicationConnection {
 
     private final WidgetSet widgetSet;
 
-    private ContextMenu contextMenu = null;
+    private IContextMenu contextMenu = null;
 
     private Timer loadTimer;
     private Timer loadTimer2;
@@ -107,7 +107,7 @@ public class ApplicationConnection {
         configuration = cnf;
 
         if (isDebugMode()) {
-            console = new DebugConsole(this, cnf);
+            console = new IDebugConsole(this, cnf);
         } else {
             console = new NullConsole();
         }
@@ -512,9 +512,9 @@ public class ApplicationConnection {
                 }
 
                 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);
                 }
@@ -880,9 +880,9 @@ public class ApplicationConnection {
      * 
      * @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");
@@ -925,7 +925,7 @@ public class ApplicationConnection {
      * messages, such as session expired.
      * 
      */
-    private class NotificationRedirect implements Notification.EventListener {
+    private class NotificationRedirect implements INotification.EventListener {
         String url;
 
         NotificationRedirect(String url) {
@@ -956,7 +956,7 @@ public class ApplicationConnection {
         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
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Caption.java b/src/com/itmill/toolkit/terminal/gwt/client/Caption.java
deleted file mode 100644 (file)
index a2a33a3..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/* 
-@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, "&nbsp;");
-                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;
-    }
-}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java b/src/com/itmill/toolkit/terminal/gwt/client/CaptionWrapper.java
deleted file mode 100644 (file)
index ec5a585..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* 
-@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;
-    }
-}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DebugConsole.java b/src/com/itmill/toolkit/terminal/gwt/client/DebugConsole.java
deleted file mode 100755 (executable)
index 6407c25..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/* 
-@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");
-    }
-
-}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ErrorMessage.java b/src/com/itmill/toolkit/terminal/gwt/client/ErrorMessage.java
deleted file mode 100644 (file)
index e4ca0f1..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/* 
-@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();
-        }
-    }
-}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ICaption.java b/src/com/itmill/toolkit/terminal/gwt/client/ICaption.java
new file mode 100644 (file)
index 0000000..405ed04
--- /dev/null
@@ -0,0 +1,179 @@
+/* 
+@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, "&nbsp;");
+                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;
+    }
+}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ICaptionWrapper.java b/src/com/itmill/toolkit/terminal/gwt/client/ICaptionWrapper.java
new file mode 100644 (file)
index 0000000..7a5b47a
--- /dev/null
@@ -0,0 +1,32 @@
+/* 
+@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;
+    }
+}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/IDebugConsole.java b/src/com/itmill/toolkit/terminal/gwt/client/IDebugConsole.java
new file mode 100755 (executable)
index 0000000..2005728
--- /dev/null
@@ -0,0 +1,143 @@
+/* 
+@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");
+    }
+
+}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/IErrorMessage.java b/src/com/itmill/toolkit/terminal/gwt/client/IErrorMessage.java
new file mode 100644 (file)
index 0000000..8b1bacf
--- /dev/null
@@ -0,0 +1,73 @@
+/* 
+@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();
+        }
+    }
+}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ITooltip.java b/src/com/itmill/toolkit/terminal/gwt/client/ITooltip.java
new file mode 100644 (file)
index 0000000..f4f879f
--- /dev/null
@@ -0,0 +1,186 @@
+/* 
+@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
+        }
+    }
+
+}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Tooltip.java b/src/com/itmill/toolkit/terminal/gwt/client/Tooltip.java
deleted file mode 100644 (file)
index b10a7ff..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-/* 
-@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
-        }
-    }
-
-}
index b534a675e7db7193df360cb490c73f2ab848a3a2..73a13c130e01071f707eff959210de5879399b59 100644 (file)
@@ -237,12 +237,12 @@ public class UIDL {
         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", "");
 
@@ -254,7 +254,7 @@ public class UIDL {
                 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()) {
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/CalendarPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/CalendarPanel.java
deleted file mode 100644 (file)
index f5ecf33..0000000
+++ /dev/null
@@ -1,491 +0,0 @@
-/* \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, "&nbsp;");\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("&laquo;");\r
-                prevYear.setStyleName("i-button-prevyear");\r
-                nextYear = new IEventButton();\r
-                nextYear.setHTML("&raquo;");\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("&lsaquo;");\r
-                    prevMonth.setStyleName("i-button-prevmonth");\r
-                    nextMonth = new IEventButton();\r
-                    nextMonth.setHTML("&rsaquo;");\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
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ContextMenu.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ContextMenu.java
deleted file mode 100644 (file)
index b97dafe..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/* 
-@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);
-        }*/
-    }
-}
index af2cc4a0d6521cf39688f3fd73b28b4d03ee1a07..bb11a084ddc33d098c8bc9d445ac58ad5d6dbaf1 100644 (file)
@@ -14,7 +14,7 @@ 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.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;
@@ -167,7 +167,7 @@ public class IAccordion extends ITabsheetBase implements
      */
     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();
@@ -175,7 +175,7 @@ public class IAccordion extends ITabsheetBase implements
 
         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());
index c01edf7b6db720777958de1d29f88b2fabaa7ac4..16276d98b4fe943343cbca5a759c3d667349abe8 100644 (file)
@@ -13,7 +13,7 @@ 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.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 {
@@ -48,7 +48,7 @@ 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) {
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendarPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendarPanel.java
new file mode 100644 (file)
index 0000000..2d8e4f5
--- /dev/null
@@ -0,0 +1,491 @@
+/* \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, "&nbsp;");\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("&laquo;");\r
+                prevYear.setStyleName("i-button-prevyear");\r
+                nextYear = new IEventButton();\r
+                nextYear.setHTML("&raquo;");\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("&lsaquo;");\r
+                    prevMonth.setStyleName("i-button-prevmonth");\r
+                    nextMonth = new IEventButton();\r
+                    nextMonth.setHTML("&rsaquo;");\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
index 191db6023a5f2c71d6f317b836e4c913d8ed9aec..026ee9d6fc9cefa632935731c274149f237b1b0a 100644 (file)
@@ -11,7 +11,7 @@ import com.google.gwt.user.client.ui.ClickListener;
 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
@@ -43,7 +43,7 @@ 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) {
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IContextMenu.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IContextMenu.java
new file mode 100644 (file)
index 0000000..5fee01b
--- /dev/null
@@ -0,0 +1,114 @@
+/* 
+@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); }
+         */
+    }
+}
index c5ee3a231a89abb270bea4d91cf23e49d69dbf75..1884c7c8fd0898d75ed4195cb0bf9946caca7bc5 100644 (file)
@@ -14,8 +14,8 @@ import com.google.gwt.user.client.Element;
 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;
@@ -348,13 +348,13 @@ public class ICustomLayout extends ComplexPanel implements 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);
             }
@@ -389,7 +389,7 @@ public class ICustomLayout extends ComplexPanel implements Paintable,
         if (location != null) {
             locationToWidget.remove(location);
         }
-        final CaptionWrapper cw = (CaptionWrapper) widgetToCaptionWrapper
+        final ICaptionWrapper cw = (ICaptionWrapper) widgetToCaptionWrapper
                 .get(w);
         if (cw != null) {
             widgetToCaptionWrapper.remove(w);
index b5b7f031f1c1e029a4bd36668c32afb642c30b6f..9b814b41e2ed7221cc0a07e16a8f226c8be34617 100644 (file)
@@ -13,7 +13,7 @@ import com.itmill.toolkit.terminal.gwt.client.ClientExceptionHandler;
 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
@@ -51,7 +51,7 @@ public class IDateField extends FlowPanel implements Paintable, Field {
     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
index 895b2c78584f8ad7a88a4927981086da07153136..e9474a97f49ed4d61d033fa2fd68b65fdf05ea5d 100644 (file)
@@ -9,11 +9,11 @@ import com.itmill.toolkit.terminal.gwt.client.UIDL;
 \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
index 80b9c2a3fdfc72144f0211560ec262acd7355625..00bf144d731e1e842dcfdf2ceb26a7f8fcfd1c5a 100644 (file)
@@ -18,7 +18,7 @@ import com.google.gwt.user.client.ui.UIObject;
 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;
@@ -504,8 +504,8 @@ public class IExpandLayout extends ComplexPanel implements
     }
 
     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())
@@ -528,7 +528,7 @@ public class IExpandLayout extends ComplexPanel implements
         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;
@@ -537,7 +537,7 @@ public class IExpandLayout extends ComplexPanel implements
     }
 
     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);
@@ -545,7 +545,7 @@ public class IExpandLayout extends ComplexPanel implements
     }
 
     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);
@@ -559,7 +559,7 @@ public class IExpandLayout extends ComplexPanel implements
 
     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);
@@ -573,12 +573,12 @@ public class IExpandLayout extends ComplexPanel implements
 
     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);
             }
index a28d725af5f18301df57f8bc318a08b2c5213521..786d3b04ef072192ac62a8a3375c4baf075194be 100644 (file)
@@ -30,7 +30,7 @@ import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 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;
 
@@ -88,7 +88,7 @@ public class IFilterSelect extends Composite implements Paintable, Field,
      * @author mattitahvonen
      * 
      */
-    public class SuggestionPopup extends ToolkitOverlay implements
+    public class SuggestionPopup extends IToolkitOverlay implements
             PositionCallback, PopupListener {
         private static final int EXTRASPACE = 8;
 
@@ -481,7 +481,7 @@ public class IFilterSelect extends Composite implements Paintable, Field,
     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);
index 6722e1e42103a1971cd046761a47bbb2516efc54..639d5fbb88003d30ec914d4f6399574e0170a121 100644 (file)
@@ -11,7 +11,7 @@ import com.google.gwt.user.client.ui.Widget;
 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
@@ -27,7 +27,7 @@ public class IForm extends ComplexPanel implements Paintable,
     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
index c1a9b0dee3801ad7bd23d5fccd00bf9a91bdffb8..ad1fcf461b1dd6588105ba7c681c92b900db2da8 100644 (file)
@@ -21,7 +21,7 @@ import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentC
 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;
@@ -210,13 +210,13 @@ public class IGridLayout extends SimplePanel implements Paintable, Container,
                                 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);
                                 }
 
@@ -240,7 +240,7 @@ public class IGridLayout extends SimplePanel implements Paintable, Container,
             // 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());
             }
@@ -281,7 +281,7 @@ public class IGridLayout extends SimplePanel implements Paintable, Container,
         }
 
         public void updateCaption(Paintable component, UIDL uidl) {
-            final CaptionWrapper wrapper = (CaptionWrapper) widgetToCaptionWrapper
+            final ICaptionWrapper wrapper = (ICaptionWrapper) widgetToCaptionWrapper
                     .get(component);
             wrapper.updateCaption(uidl);
         }
index e7977c9defbe9fb8eb76d5764669dfbd4508046f..37fa0038531bfc60bdb9bfbebed7a2ca1d63f736 100644 (file)
@@ -12,7 +12,7 @@ import com.google.gwt.user.client.ui.ClickListener;
 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;
 
@@ -42,7 +42,7 @@ public class ILink extends HTML implements Paintable, ClickListener {
 
     private final Element captionElement = DOM.createSpan();
 
-    private ErrorMessage errorMessage;
+    private IErrorMessage errorMessage;
 
     private Icon icon;
 
@@ -101,7 +101,7 @@ public class ILink extends HTML implements Paintable, ClickListener {
             }
             DOM.insertChild(getElement(), errorIndicatorElement, 0);
             if (errorMessage == null) {
-                errorMessage = new ErrorMessage();
+                errorMessage = new IErrorMessage();
             }
             errorMessage.updateFromUIDL(errorUidl);
 
index 6c4584edf2be14a296cb24ca086cbc82c4107f20..ddeda05a8aebe010dd610138d27ad0743a78078b 100644 (file)
@@ -12,7 +12,7 @@ import com.google.gwt.user.client.ui.ListBox;
 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 {
@@ -110,7 +110,7 @@ class TooltipListBox extends ListBox {
 
     TooltipListBox(boolean isMultiselect) {
         super(isMultiselect);
-        sinkEvents(Tooltip.TOOLTIP_EVENTS);
+        sinkEvents(ITooltip.TOOLTIP_EVENTS);
     }
 
     public void setClient(ApplicationConnection client) {
index cf3eddb737782633098ce022f4505b15a6813cc4..61e5c2175fb00a9a5dafcfff81f6277ed6043821 100644 (file)
@@ -43,7 +43,7 @@ public class IMenuBar extends Widget implements Paintable, PopupListener {
     boolean subMenu;
     ArrayList items;
     Element containerElement;
-    ToolkitOverlay popup;
+    IToolkitOverlay popup;
     IMenuBar visibleChildMenu;
     IMenuBar parentMenu;
     CustomMenuItem selected;
@@ -443,7 +443,7 @@ public class IMenuBar extends Widget implements Paintable, PopupListener {
      * @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);
 
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/INotification.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/INotification.java
new file mode 100644 (file)
index 0000000..52ae830
--- /dev/null
@@ -0,0 +1,289 @@
+/* \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
index 48594a5ec9a40e3b9044edae52d4208ec92a165a..096b2ec07bcc83bb82e00762916bcc10da463c75 100644 (file)
@@ -14,7 +14,7 @@ import com.google.gwt.user.client.ui.Panel;
 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;
@@ -634,7 +634,7 @@ public class IOrderedLayout extends Panel implements Container,
         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
@@ -854,13 +854,13 @@ public class IOrderedLayout extends Panel implements Container,
             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
index 8a408597c3fece3b81cef5389db7f384abbaa371..7c2171cbfb9688b6e5209f1910ab8662966cb8ac 100644 (file)
@@ -12,7 +12,7 @@ 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.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;
@@ -38,7 +38,7 @@ public class IPanel extends SimplePanel implements Paintable,
 
     private Element errorIndicatorElement;
 
-    private ErrorMessage errorMessage;
+    private IErrorMessage errorMessage;
 
     private String height;
 
@@ -200,7 +200,7 @@ public class IPanel extends SimplePanel implements Paintable,
             }
             DOM.insertBefore(captionNode, errorIndicatorElement, captionText);
             if (errorMessage == null) {
-                errorMessage = new ErrorMessage();
+                errorMessage = new IErrorMessage();
             }
             errorMessage.updateFromUIDL(errorUidl);
 
index 917aa1d28890bcd856ef0fd630c7f5b4ebd67ab1..138c07d730cebd86d179e4f6f82c38cd31823531 100644 (file)
@@ -22,9 +22,9 @@ public class IPopupCalendar extends ITextualDate implements Paintable, Field,
 \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
@@ -36,8 +36,8 @@ public class IPopupCalendar extends ITextualDate implements Paintable, Field,
         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
index 750af5c2a26ebc166bbaae24132ddcbfe3f0f71a..b169f23d4ef733ebf407b30945d7c8685ddf85d3 100644 (file)
@@ -16,8 +16,8 @@ import com.google.gwt.user.client.ui.PopupPanel;
 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;
@@ -196,11 +196,11 @@ public class IPopupView extends HTML implements Paintable, Container {
                                                   }
                                               }-*/;
 
-    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;
@@ -288,11 +288,11 @@ public class IPopupView extends HTML implements Paintable, Container {
         }
 
         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);
                 }
index 79391cb3caaa2912d3ff34ecc3d3f8eb5980aef1..7fbf3809181f78af205e0e6a7c9f7bc23fefd946 100644 (file)
@@ -17,7 +17,7 @@ import com.google.gwt.user.client.ui.ComplexPanel;
 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;
@@ -53,7 +53,7 @@ public class ITabsheet extends ITabsheetBase implements
             return getWidgetCount();
         }
 
-        public void addTab(Caption c) {
+        public void addTab(ICaption c) {
             Element td = DOM.createTD();
             setStyleName(td, CLASSNAME + "-tabitemcell");
 
@@ -90,15 +90,15 @@ public class ITabsheet extends ITabsheetBase implements
         }
 
         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);
         }
 
     }
@@ -285,9 +285,9 @@ public class ITabsheet extends ITabsheetBase implements
     }
 
     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);
@@ -468,7 +468,7 @@ public class ITabsheet extends ITabsheetBase implements
 
     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);
     }
 }
index 591435ec6a90d6e252fbcfd0df9c633853f3c19a..3862b7ca8e67c28e521472af72427f97d451421a 100644 (file)
@@ -14,7 +14,7 @@ import com.google.gwt.user.client.ui.Widget;
 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;
 
@@ -55,7 +55,7 @@ public class ITextField extends TextBoxBase implements Paintable, Field,
         setStyleName(CLASSNAME);
         addChangeListener(this);
         addFocusListener(this);
-        sinkEvents(Tooltip.TOOLTIP_EVENTS);
+        sinkEvents(ITooltip.TOOLTIP_EVENTS);
     }
 
     public void onBrowserEvent(Event event) {
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java
new file mode 100644 (file)
index 0000000..52793cc
--- /dev/null
@@ -0,0 +1,317 @@
+/* \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("&nbsp;"));\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("&nbsp;"));\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
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IToolkitOverlay.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IToolkitOverlay.java
new file mode 100644 (file)
index 0000000..61c368b
--- /dev/null
@@ -0,0 +1,154 @@
+/* 
+@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();
+            }
+        }
+
+    }
+
+}
index 13a41fc82edad42a33ed0d5729ac29c98ec476bf..0415904aa57b2a1f07ab2358d5fb4ada112436a8 100644 (file)
@@ -210,7 +210,7 @@ public class IView extends SimplePanel implements Paintable,
                     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);
                 }
             }
         }
index 95dbebf47f094e49b7022e1e4a6925e539847c45..ba3795e805a44696d784f22c5d5dbda47e335683 100644 (file)
@@ -361,7 +361,7 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
                         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);
                     }
                 }
             }
@@ -490,7 +490,7 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
             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) {
index b446e7d595f52362e3d3b1c59276c7b0409612c4..dd2f8688165e8253ae0e4d86f5f8212d9bf3cd80 100644 (file)
@@ -42,12 +42,9 @@ import com.google.gwt.user.client.ui.Widget;
  * <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>
@@ -78,7 +75,7 @@ public class MenuBar extends Widget implements PopupListener {
      * 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();
@@ -106,7 +103,7 @@ public class MenuBar extends Widget implements PopupListener {
      * 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;
@@ -129,11 +126,11 @@ public class MenuBar extends Widget implements PopupListener {
      * 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) {
@@ -147,11 +144,11 @@ public class MenuBar extends Widget implements PopupListener {
      * 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) {
@@ -165,9 +162,9 @@ public class MenuBar extends Widget implements PopupListener {
      * 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) {
@@ -181,9 +178,9 @@ public class MenuBar extends Widget implements PopupListener {
      * 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) {
@@ -259,7 +256,7 @@ public class MenuBar extends Widget implements PopupListener {
      * 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);
@@ -277,7 +274,7 @@ public class MenuBar extends Widget implements PopupListener {
      * 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;
@@ -340,8 +337,8 @@ public class MenuBar extends Widget implements PopupListener {
      * 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.
@@ -376,7 +373,7 @@ public class MenuBar extends Widget implements PopupListener {
         // 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();
index a9651e8e64b64ec4c9aebdb4e2b9f9cb996cc09b..35bd20982586b9837e60fc96b4e8c420b35bd395 100644 (file)
@@ -45,9 +45,9 @@ public class MenuItem extends UIObject implements HasHTML {
      * 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);
@@ -58,11 +58,11 @@ public class MenuItem extends UIObject implements HasHTML {
      * 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);
@@ -74,9 +74,9 @@ public class MenuItem extends UIObject implements HasHTML {
      * 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);
@@ -88,11 +88,11 @@ public class MenuItem extends UIObject implements HasHTML {
      * 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);
@@ -150,7 +150,7 @@ public class MenuItem extends UIObject implements HasHTML {
      * 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;
@@ -164,7 +164,7 @@ public class MenuItem extends UIObject implements HasHTML {
      * 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;
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/Notification.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/Notification.java
deleted file mode 100644 (file)
index 267a07d..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-/* \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
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/Time.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/Time.java
deleted file mode 100644 (file)
index ee7b40f..0000000
+++ /dev/null
@@ -1,317 +0,0 @@
-/* \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("&nbsp;"));\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("&nbsp;"));\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
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ToolkitOverlay.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ToolkitOverlay.java
deleted file mode 100644 (file)
index 1936c33..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/* 
-@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();
-            }
-        }
-
-    }
-
-}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/AbsoluteGrid.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/AbsoluteGrid.java
deleted file mode 100644 (file)
index 4694a7c..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-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;
-    }
-}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/absolutegrid/IAbsoluteGrid.java
new file mode 100644 (file)
index 0000000..f6941f0
--- /dev/null
@@ -0,0 +1,310 @@
+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;
+    }
+}
index 562d868216b085e41cc853c96c3089add7bfffe7..7024a5c09cc45704d31036d7fd6b61428aff76b0 100644 (file)
@@ -10,7 +10,7 @@ import com.google.gwt.user.client.DeferredCommand;
 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;
@@ -22,7 +22,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.MarginInfo;
  * 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;
@@ -113,7 +113,7 @@ public class ISizeableGridLayout extends AbsoluteGrid implements Paintable,
                         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;
@@ -141,7 +141,7 @@ public class ISizeableGridLayout extends AbsoluteGrid implements Paintable,
 
         // 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());
@@ -182,11 +182,11 @@ public class ISizeableGridLayout extends AbsoluteGrid implements Paintable,
     }
 
     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);
index f0ea0c07d8391f3622fb3255b6fc3514c68bd35d..0435cb21939a6405afadfa256441a2196993074f 100644 (file)
@@ -38,7 +38,7 @@ public class IRichTextArea extends Composite implements Paintable, Field,
 
     private RichTextArea rta = new RichTextArea();
 
-    private RichTextToolbar formatter = new RichTextToolbar(rta);
+    private IRichTextToolbar formatter = new IRichTextToolbar(rta);
 
     private HTML html = new HTML();
 
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextToolbar$Strings.properties b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextToolbar$Strings.properties
new file mode 100644 (file)
index 0000000..363b704
--- /dev/null
@@ -0,0 +1,35 @@
+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
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextToolbar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextToolbar.java
new file mode 100644 (file)
index 0000000..cc35167
--- /dev/null
@@ -0,0 +1,509 @@
+/*
+ * 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());
+        }
+    }
+}
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar$Strings.properties b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar$Strings.properties
deleted file mode 100644 (file)
index 363b704..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-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
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar.java
deleted file mode 100644 (file)
index 4d3d11d..0000000
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- * 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());
-        }
-    }
-}