2003/08/10 20:33:06
[org.ibex.core.git] / src / org / xwt / Surface.java
index 1266466..082bb8b 100644 (file)
@@ -54,9 +54,6 @@ public abstract class Surface {
 
     // Public Members and State Variables /////////////////////////////////////////////////////////
 
-    /** this is the box on this surface which the mouse was inside at the time that the currently-executing event was enqueued */
-    public Box boxContainingMouse = null;
-
     /** false if the surface has never been rendered; used to determine if the surface should be repositioned to be centered on the screen */
     public boolean centerSurfaceOnRender = true;
 
@@ -154,14 +151,13 @@ public abstract class Surface {
         else if (button == 2) button2 = true;
         else if (button == 3) button3 = true;
 
-        if (button == 1) new SimpleMessage("Press1", Boolean.TRUE, root.whoIs(mousex, mousey));
-        else if (button == 2) new SimpleMessage("Press2", Boolean.TRUE, root.whoIs(mousex, mousey));
+        if (button == 1) new SimpleMessage("Press1", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
+        else if (button == 2) new SimpleMessage("Press2", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
         else if (button == 3) {
-            final Box who = root.whoIs(mousex, mousey);
+            final Box who = Box.whoIs(root, mousex, mousey);
             MessageQueue.add(new Message() { public void perform() {
-                Surface.this.boxContainingMouse = who;
                 Platform.clipboardReadEnabled = true;
-                root.put("Press3", null, Boolean.TRUE);
+                root.put("Press3", Boolean.TRUE);
                 Platform.clipboardReadEnabled = false;
             }});
         }
@@ -172,9 +168,9 @@ public abstract class Surface {
         else if (button == 2) button2 = false;
         else if (button == 3) button3 = false;
 
-        if (button == 1) new SimpleMessage("Release1", Boolean.TRUE, root.whoIs(mousex, mousey));
-        else if (button == 2) new SimpleMessage("Release2", Boolean.TRUE, root.whoIs(mousex, mousey));
-        else if (button == 3) new SimpleMessage("Release3", Boolean.TRUE, root.whoIs(mousex, mousey));
+        if (button == 1) new SimpleMessage("Release1", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
+        else if (button == 2) new SimpleMessage("Release2", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
+        else if (button == 3) new SimpleMessage("Release3", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
 
         if (Platform.needsAutoClick() && Math.abs(last_press_x - mousex) < 5 && Math.abs(last_press_y - mousey) < 5) Click(button);
         last_press_x = Integer.MAX_VALUE;
@@ -182,9 +178,9 @@ public abstract class Surface {
     }
 
     protected final void Click(int button) {
-        if (button == 1) new SimpleMessage("Click1", Boolean.TRUE, root.whoIs(mousex, mousey));
-        else if (button == 2) new SimpleMessage("Click2", Boolean.TRUE, root.whoIs(mousex, mousey));
-        else if (button == 3) new SimpleMessage("Click3", Boolean.TRUE, root.whoIs(mousex, mousey));
+        if (button == 1) new SimpleMessage("Click1", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
+        else if (button == 2) new SimpleMessage("Click2", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
+        else if (button == 3) new SimpleMessage("Click3", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
         if (Platform.needsAutoDoubleClick()) {
             long now = System.currentTimeMillis();
             if (lastClickButton == button && now - lastClickTime < 350) DoubleClick(button);
@@ -194,9 +190,9 @@ public abstract class Surface {
     }
 
     protected final void DoubleClick(int button) {
-        if (button == 1) new SimpleMessage("DoubleClick1", Boolean.TRUE, root.whoIs(mousex, mousey));
-        else if (button == 2) new SimpleMessage("DoubleClick2", Boolean.TRUE, root.whoIs(mousex, mousey));
-        else if (button == 3) new SimpleMessage("DoubleClick3", Boolean.TRUE, root.whoIs(mousex, mousey));
+        if (button == 1) new SimpleMessage("DoubleClick1", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
+        else if (button == 2) new SimpleMessage("DoubleClick2", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
+        else if (button == 3) new SimpleMessage("DoubleClick3", Boolean.TRUE, Box.whoIs(root, mousex, mousey));
     }
 
     /** sends a KeyPressed message; subclasses should not add the C- or A- prefixes, nor should they capitalize alphabet characters */
@@ -226,7 +222,7 @@ public abstract class Surface {
                 Box b = (Box)keywatchers.elementAt(i);
                 for(Box cur = b; cur != null; cur = cur.getParent())
                     if (cur.invisible) continue outer;
-                b.put("KeyPressed", null, key);
+                b.put("KeyPressed", key);
             }
             Platform.clipboardReadEnabled = false;
         }
@@ -243,7 +239,7 @@ public abstract class Surface {
                 Box b = (Box)keywatchers.elementAt(i);
                 for(Box cur = b; cur != null; cur = cur.getParent())
                     if (cur.invisible) continue outer;
-                b.put("KeyReleased", null, key);
+                b.put("KeyReleased", key);
             }
         }});
     }
@@ -270,8 +266,8 @@ public abstract class Surface {
                 cursor = "default";
 
                 // Root gets motion events outside itself (if trapped, of course)
-                if (root.is_trapped("Move") && !root.inside(oldmousex, oldmousey) && !root.inside(mousex, mousey) && (button1 || button2 || button3))
-                    root.put("Move", null, Boolean.TRUE);
+                if (!root.inside(oldmousex, oldmousey) && !root.inside(mousex, mousey) && (button1 || button2 || button3))
+                    root.put("Move", Boolean.TRUE);
 
                 root.Move(oldmousex, oldmousey, mousex, mousey);
                 if (!cursor.equals(oldcursor)) syncCursor();
@@ -290,15 +286,15 @@ public abstract class Surface {
     }
 
     protected final void PosChange(int x, int y) {
-        root.set(Box.abs, 0, x);
-        root.set(Box.abs, 1, y);
-        new SimpleMessage("PosChange", Boolean.TRUE, null);
+        if (x != root.x) root.put("x", new Integer(x));
+        if (y != root.y) root.put("y", new Integer(y));
+        new SimpleMessage("PosChange", Boolean.TRUE, root);
     }
 
-    protected final void Close() { new SimpleMessage("Close", Boolean.TRUE, null); }
-    protected final void Minimized(boolean b) { minimized = b; new SimpleMessage("Minimized", b ? Boolean.TRUE : Boolean.FALSE, null); }
-    protected final void Maximized(boolean b) { maximized = b; new SimpleMessage("Maximized", b ? Boolean.TRUE : Boolean.FALSE, null); }
-    protected final void Focused(boolean b) { new SimpleMessage("Focused", b ? Boolean.TRUE : Boolean.FALSE, null); }
+    protected final void Close() { new SimpleMessage("Close", Boolean.TRUE, root); }
+    protected final void Minimized(boolean b) { minimized = b; new SimpleMessage("Minimized", b ? Boolean.TRUE : Boolean.FALSE, root); }
+    protected final void Maximized(boolean b) { maximized = b; new SimpleMessage("Maximized", b ? Boolean.TRUE : Boolean.FALSE, root); }
+    protected final void Focused(boolean b) { new SimpleMessage("Focused", b ? Boolean.TRUE : Boolean.FALSE, root); }
     public static void Refresh() { MessageQueue.refresh(); }
 
     // the following value is split into two int's to work around GCJ bug java/6393
@@ -331,7 +327,7 @@ public abstract class Surface {
     Vec keywatchers = new Vec();
 
     /** When set to true, render() should abort as soon as possible and restart the rendering process */
-    volatile boolean abort = false;
+    static volatile boolean abort = false;
 
     /** a solid red 10x10 double buffer */
     private DoubleBuffer showRenderBuf = null;
@@ -365,7 +361,7 @@ public abstract class Surface {
             width = Math.max(width, scarPicture.getWidth());
             height = Math.max(height, scarPicture.getHeight());
             dirty(hscar,
-                  root.size(1) - vscar - scarPicture.getHeight(),
+                  root.height - vscar - scarPicture.getHeight(),
                   scarPicture.getWidth(), scarPicture.getHeight());
         }
         setSize(width, height);
@@ -381,7 +377,7 @@ public abstract class Surface {
         _dispose();
 
         // quit when all windows are closed
-        if (allSurfaces.size() == 0 && quitIfAllSurfacesGone) {
+        if (allSurfaces.size() == 0 && quitIfAllSurfacesGone && Main.doneInitializing) {
             if (Log.on) {
                 if (refreshableSurfaceWasCreated) Log.log(this, "exiting because last remaining surface was disposed");
                 else Log.log(this, "exiting because no surface was ever created");
@@ -392,6 +388,7 @@ public abstract class Surface {
 
     /** Indicates that the backbuffer region x,y,w,h is no longer correct and must be regenerated */
     public void dirty(int x, int y, int w, int h) {
+        x = 0; y = 0; w = 1000; h = 1000;
         backbufferDirtyRegions.dirty(x, y, w, h);
         Refresh();
     }
@@ -405,18 +402,17 @@ public abstract class Surface {
         } else {
             root.remove();
         }
-        root.setSurface(this);
+        root.surface = this;
 
         // make sure the root is properly sized
-        while (root.needs_prerender || abort) {
+        do {
             abort = false;
-            root.prerender();
-        }
+            root.reflow();
+        } while(abort);
 
         // this is a bit dangerous since we're passing ourselves to another method before subclasses' ctors have run...        
         backbuffer = Platform.createDoubleBuffer(Platform.getScreenWidth(), Platform.getScreenHeight(), this);
 
-        root.mark_for_prerender();
         root.dirty();
         Refresh();
     }
@@ -425,39 +421,39 @@ public abstract class Surface {
     public synchronized void render() {
 
         // if the window size changed as a result of a user action, we have to update the root box's size
-        if (root.size(0) != width || root.size(1) != height) {
+        if (root.width != width || root.height != height) {
 
             // since the scar will be moving, dirty the place it used to be
             if (scarred) dirty(hscar,
-                               root.size(1) - vscar - scarPicture.getHeight(),
+                               root.height - vscar - scarPicture.getHeight(),
                                scarPicture.getWidth(), scarPicture.getHeight());
 
             // sort of ugly; we can't use set() here because it will cause an infinite mutual recursion
-            root._size_0 = (short)width;
-            root._size_1 = (short)height;
+            root.width = (int)width;
+            root.height = (int)height;
 
-            root.mark_for_prerender();
-            root.put("SizeChange", null, Boolean.TRUE);
+            root.needs_reflow = true;
+            root.put("SizeChange", Boolean.TRUE);
         }
 
-        while (root.needs_prerender || abort) {
+        // make sure the root is properly sized
+        do {
             abort = false;
-            root.prerender();
-
+            root.reflow();
             // update mouseinside and trigger Enter/Leave as a result of box size/position changes
             String oldcursor = cursor;
             cursor = "default";
             root.Move(mousex, mousey, mousex, mousey);
             if (!cursor.equals(oldcursor)) syncCursor();
-        }
+        } while(abort);
 
         if (centerSurfaceOnRender) {
             centerSurfaceOnRender = false;
             int x = (Platform.getScreenWidth() - width) / 2;
             int y = (Platform.getScreenHeight() - height) / 2;
             setLocation(x, y);
-            root.set(Box.abs, 0, x);
-            root.set(Box.abs, 1, y);
+            root.x = x;
+            root.y = y;
         }
 
         sizePosChangesSinceLastRender = 0;
@@ -534,8 +530,8 @@ public abstract class Surface {
             int h = dirt[i][3];
             if (x < 0) x = 0;
             if (y < 0) y = 0;
-            if (x+w > root.size(0)) w = root.size(0) - x;
-            if (y+h > root.size(1)) h = root.size(1) - y;
+            if (x+w > root.width) w = root.width - x;
+            if (y+h > root.height) h = root.height - y;
             if (w <= 0 || h <= 0) continue;
 
             // if any part of this region falls within the "bad region", just skip it
@@ -589,14 +585,8 @@ public abstract class Surface {
             MessageQueue.add(this);
         }
         
-        public void perform() {
-            Surface.this.boxContainingMouse = this.boxContainingMouse;
-            root.put(name, root, value);
-        }
-
-        public String toString() {
-            return "SimpleMessage [name=" + name + ", value=" + value + "]";
-        }
+        public void perform() { boxContainingMouse.put(name, value); }
+        public String toString() { return "SimpleMessage [name=" + name + ", value=" + value + "]"; }
         
     }