]> source.dussan.org Git - vaadin-framework.git/commitdiff
DIW windows: now closing mechanism is pretty much complete
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Mon, 12 Mar 2007 12:26:35 +0000 (12:26 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Mon, 12 Mar 2007 12:26:35 +0000 (12:26 +0000)
svn changeset:845/svn branch:trunk

src/com/itmill/toolkit/demo/features/FeatureWindow.java
src/com/itmill/toolkit/ui/Window.java

index 7e2a3471f73a829e634bc3d431428646c616a6dc..193ebc7253f5a133c2991ba02411fbcc87818f60 100644 (file)
@@ -29,8 +29,9 @@
 package com.itmill.toolkit.demo.features;
 
 import com.itmill.toolkit.ui.*;
+import com.itmill.toolkit.ui.Window.CloseEvent;
 
-public class FeatureWindow extends Feature {
+public class FeatureWindow extends Feature implements Window.CloseListener {
        Button addButton = new Button("Add to application", this, "addWin");
 
        Button removeButton = new Button("Remove from application", this, "delWin");
@@ -49,6 +50,7 @@ public class FeatureWindow extends Feature {
                OrderedLayout layoutUpper = new OrderedLayout();
                OrderedLayout layoutLower = new OrderedLayout();
                demoWindow = new Window("Feature Test Window");
+               demoWindow.addListener(this);
 
                layoutUpper.addComponent(addButton);
                layoutUpper.addComponent(removeButton);
@@ -127,6 +129,7 @@ public class FeatureWindow extends Feature {
                                                Label.CONTENT_XHTML));
 
                windowProperties.getField("name").setReadOnly(true);
+               demoWindow.setVisible(true);
                updateWinStatus();
        }
 
@@ -145,4 +148,8 @@ public class FeatureWindow extends Feature {
                        removeButton.setEnabled(true);
                }
        }
+
+       public void windowClose(CloseEvent e) {
+               delWin();
+       }
 }
index 5a3f09a16368dff1aceeedc193cd4bb1623c941d..215a0c3d5670358cc8d8fbb8337a1e26a82b3ba8 100644 (file)
@@ -39,6 +39,7 @@ import com.itmill.toolkit.terminal.Terminal;
 import com.itmill.toolkit.terminal.URIHandler;
 
 import java.lang.ref.WeakReference;
+import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.HashMap;
@@ -674,9 +675,8 @@ public class Window extends Panel implements URIHandler, ParameterHandler {
                // Closing
                Boolean close = (Boolean) variables.get("close");
                if (close != null && close.booleanValue()) {
-                       
-                       // TODO We should also throw an event to listeners
                        this.setVisible(false);
+                       fireClose();
                }
        }
 
@@ -767,4 +767,47 @@ public class Window extends Panel implements URIHandler, ParameterHandler {
        public void setPositionY(int positionY) {
                this.positionY = positionY;
        }
+       
+       private static final Method WINDOW_CLOSE_METHOD;
+       static {
+               try {
+                       WINDOW_CLOSE_METHOD =
+                               CloseListener.class.getDeclaredMethod(
+                                       "windowClose",
+                                       new Class[] { CloseEvent.class });
+               } catch (java.lang.NoSuchMethodException e) {
+                       // This should never happen
+                       throw new java.lang.RuntimeException();
+               }
+       }
+
+       
+       public class CloseEvent extends Component.Event {
+               /**
+         * Serial generated by eclipse.
+                */
+               private static final long serialVersionUID = -7235770057344367327L;
+               public CloseEvent(Component source) {
+                       super(source);
+               }
+               public Window getWindow() {
+                       return (Window) getSource();
+               }
+       }
+       
+       public interface CloseListener {
+               public void windowClose(CloseEvent e);
+       }
+       
+       public void addListener(CloseListener listener) {
+               addListener(CloseEvent.class, listener, WINDOW_CLOSE_METHOD);
+       }
+
+       public void removeListener(CloseListener listener) {
+               addListener(CloseEvent.class, listener, WINDOW_CLOSE_METHOD);
+       }
+
+       protected void fireClose() {
+               fireEvent(new Window.CloseEvent(this));
+       }
 }