]> source.dussan.org Git - vaadin-framework.git/commitdiff
fixes #1202, #1465
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 6 Mar 2008 09:26:14 +0000 (09:26 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Thu, 6 Mar 2008 09:26:14 +0000 (09:26 +0000)
svn changeset:3984/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/ui/IWindow.java
src/com/itmill/toolkit/terminal/gwt/client/ui/Notification.java
src/com/itmill/toolkit/tests/tickets/Ticket1465ModalNotification.java

index 85d0f74e410f8ce44b0789c80fd720049b712f1b..bb280172c69958b3b2759099644dc02e4be032bf 100644 (file)
@@ -7,12 +7,15 @@ package com.itmill.toolkit.terminal.gwt.client.ui;
 import java.util.Iterator;
 import java.util.Vector;
 
+import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.DeferredCommand;
 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.Frame;
 import com.google.gwt.user.client.ui.PopupPanel;
+import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.ScrollListener;
 import com.google.gwt.user.client.ui.ScrollPanel;
 import com.google.gwt.user.client.ui.Widget;
@@ -96,6 +99,8 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
 
     private boolean modal = false;
 
+    private Element modalityCurtain;
+
     private Element headerText;
 
     public IWindow() {
@@ -103,7 +108,6 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
         final int order = windowOrder.size();
         setWindowOrder(order);
         windowOrder.add(this);
-        setStyleName(CLASSNAME);
         constructDOM();
         setPopupPosition(order * STACKING_OFFSET_PIXELS, order
                 * STACKING_OFFSET_PIXELS);
@@ -131,8 +135,12 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
     }
 
     public void setWindowOrder(int order) {
-        DOM.setStyleAttribute(getElement(), "zIndex", ""
-                + (order + Z_INDEX_BASE));
+        int zIndex = (order + Z_INDEX_BASE);
+        if (modal) {
+            zIndex += 1000;
+            DOM.setStyleAttribute(modalityCurtain, "zIndex", "" + zIndex);
+        }
+        DOM.setStyleAttribute(getElement(), "zIndex", "" + zIndex);
     }
 
     protected void constructDOM() {
@@ -160,6 +168,7 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
 
         final Element wrapper = DOM.createDiv();
         DOM.setElementProperty(wrapper, "className", CLASSNAME + "-wrap");
+
         final Element wrapper2 = DOM.createDiv();
         DOM.setElementProperty(wrapper2, "className", CLASSNAME + "-wrap2");
 
@@ -171,7 +180,9 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
         DOM.appendChild(wrapper2, contents);
         DOM.appendChild(wrapper2, footer);
         DOM.appendChild(wrapper, wrapper2);
-        DOM.appendChild(getElement(), wrapper);
+        DOM.appendChild(super.getContainerElement(), wrapper);
+        DOM.setElementProperty(getElement(), "className", CLASSNAME);
+
         setWidget(contentPanel);
 
         // set default size
@@ -312,10 +323,53 @@ public class IWindow extends PopupPanel implements Paintable, ScrollListener {
 
     }
 
+    public void show() {
+        if (modal) {
+            showModalityCurtain();
+        }
+        super.show();
+    }
+
+    public void hide() {
+        if (modal) {
+            hideModalityCurtain();
+        }
+        super.hide();
+    }
+
     private void setModal(boolean modality) {
-        // TODO create transparent curtain to create visual clue that window is
-        // modal
         modal = modality;
+        if (modal) {
+            modalityCurtain = DOM.createDiv();
+            DOM.setElementProperty(modalityCurtain, "className", CLASSNAME
+                    + "-modalitycurtain");
+            if (isAttached()) {
+                showModalityCurtain();
+                bringToFront();
+            } else {
+                DeferredCommand.addCommand(new Command() {
+                    public void execute() {
+                        // modal window must on top of others
+                        bringToFront();
+                    }
+                });
+            }
+        } else {
+            if (modalityCurtain != null) {
+                if (isAttached()) {
+                    hideModalityCurtain();
+                }
+                modalityCurtain = null;
+            }
+        }
+    }
+
+    private void showModalityCurtain() {
+        DOM.appendChild(RootPanel.getBodyElement(), modalityCurtain);
+    }
+
+    private void hideModalityCurtain() {
+        DOM.removeChild(RootPanel.getBodyElement(), modalityCurtain);
     }
 
     public void setPopupPosition(int left, int top) {
index 447230367eda221726a16044bc066226e80cd669..97aaa084803457175cc86ea03b765a1fea7f85e7 100644 (file)
@@ -38,6 +38,8 @@ public class Notification extends ToolkitOverlay {
     private EventPreview eventPreview;\r
 \r
     private String temporaryStyle;\r
+    private int x = -1;\r
+    private int y = -1;\r
 \r
     public Notification() {\r
         setStylePrimaryName(STYLENAME);\r
@@ -57,7 +59,7 @@ public class Notification extends ToolkitOverlay {
     }\r
 \r
     public void startDelay() {\r
-        DOM.removeEventPreview(eventPreview);\r
+        DOM.releaseCapture(getElement());\r
         if (delayMsec > 0) {\r
             delay = new Timer() {\r
                 public void run() {\r
@@ -102,39 +104,33 @@ public class Notification extends ToolkitOverlay {
         super.show();\r
         setPosition(position);\r
 \r
-        if (eventPreview == null) {\r
-            eventPreview = new EventPreview() {\r
-                int x = -1;\r
-                int y = -1;\r
-\r
-                public boolean onEventPreview(Event event) {\r
-                    switch (DOM.eventGetType(event)) {\r
-                    case Event.ONMOUSEMOVE:\r
-                        if (x < 0) {\r
-                            x = DOM.eventGetClientX(event);\r
-                            y = DOM.eventGetClientY(event);\r
-                        } else if (Math.abs(DOM.eventGetClientX(event) - x) > mouseMoveThreshold\r
-                                || Math.abs(DOM.eventGetClientY(event) - y) > mouseMoveThreshold) {\r
+        DOM.setCapture(getElement());\r
+\r
+        if (style.equals("error")) {\r
+            if (eventPreview == null) {\r
+                eventPreview = new EventPreview() {\r
+                    public boolean onEventPreview(Event event) {\r
+                        Element target = DOM.eventGetTarget(event);\r
+                        if (DOM.isOrHasChild(getElement(), target)\r
+                                && DOM.eventGetType(event) == Event.ONCLICK) {\r
                             startDelay();\r
+                            DOM.removeEventPreview(this);\r
+                            return true;\r
+                        } else {\r
+                            DOM.eventCancelBubble(event, true);\r
+                            return false;\r
                         }\r
-                        break;\r
-                    case Event.KEYEVENTS:\r
-                    case Event.ONCLICK:\r
-                    case Event.ONDBLCLICK:\r
-                    case Event.ONSCROLL:\r
-                    default:\r
-                        startDelay();\r
                     }\r
-                    return true;\r
-                }\r
-            };\r
+                };\r
+            }\r
+\r
+            DOM.addEventPreview(eventPreview);\r
         }\r
 \r
-        DOM.addEventPreview(eventPreview);\r
     }\r
 \r
     public void hide() {\r
-        DOM.removeEventPreview(eventPreview);\r
+        DOM.releaseCapture(getElement());\r
         cancelDelay();\r
         cancelFade();\r
         if (temporaryStyle != null) {\r
@@ -145,6 +141,7 @@ public class Notification extends ToolkitOverlay {
     }\r
 \r
     public void fade() {\r
+        DOM.releaseCapture(getElement());\r
         cancelDelay();\r
         fader = new Timer() {\r
             int opacity = startOpacity;\r
@@ -223,9 +220,21 @@ public class Notification extends ToolkitOverlay {
     }\r
 \r
     public void onBrowserEvent(Event event) {\r
-        DOM.removeEventPreview(eventPreview);\r
-        if (fader == null) {\r
-            fade();\r
+        switch (DOM.eventGetType(event)) {\r
+        case Event.ONMOUSEMOVE:\r
+            if (x < 0) {\r
+                x = DOM.eventGetClientX(event);\r
+                y = DOM.eventGetClientY(event);\r
+            } else if (Math.abs(DOM.eventGetClientX(event) - x) > mouseMoveThreshold\r
+                    || Math.abs(DOM.eventGetClientY(event) - y) > mouseMoveThreshold) {\r
+                startDelay();\r
+            }\r
+            break;\r
+        default:\r
+            if (fader == null) {\r
+                fade();\r
+            }\r
+            break;\r
         }\r
     }\r
 \r
index a32a3ab63f2ae8257a2110d67e24b34b747749bc..3e941643f3e3e1a940af7608f3dc663f5709ac6a 100644 (file)
@@ -28,6 +28,38 @@ public class Ticket1465ModalNotification extends Application {
                 });
         modal.addComponent(b);
 
+        b = new Button("click to warning notification",
+                new Button.ClickListener() {
+
+                    public void buttonClick(ClickEvent event) {
+                        modal.showNotification(
+                                "Try clicking the button in main window!",
+                                Window.Notification.TYPE_WARNING_MESSAGE);
+                    }
+                });
+        modal.addComponent(b);
+
+        b = new Button("click to Humanized notification",
+                new Button.ClickListener() {
+
+                    public void buttonClick(ClickEvent event) {
+                        modal.showNotification(
+                                "Try clicking the button in main window!",
+                                Window.Notification.TYPE_HUMANIZED_MESSAGE);
+                    }
+                });
+        modal.addComponent(b);
+
+        b = new Button("click to test modality!", new Button.ClickListener() {
+
+            public void buttonClick(ClickEvent event) {
+                mainWin.addComponent(new Label("clicked"));
+
+            }
+        });
+
+        modal.addComponent(b);
+
         mainWin.addWindow(modal);
 
         b = new Button("click to test modality!", new Button.ClickListener() {