diff game/IDMContainer.java @ 75:b586ce4f6d97

Large GUI code cleanup.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 03 Mar 2011 04:04:57 +0200
parents f81f76458b92
children 4c0dec72e2f0
line wrap: on
line diff
--- a/game/IDMContainer.java	Wed Mar 02 23:48:17 2011 +0200
+++ b/game/IDMContainer.java	Thu Mar 03 04:04:57 2011 +0200
@@ -9,75 +9,182 @@
 import java.util.*;
 
 
+
 public class IDMContainer extends IDMWidget
 {
-    ArrayList<IDMWidget> widgets;
+    private ArrayList<IDMWidget> children, queue;
+    private IDMWidget modal;
+    private int iterated;
+    private boolean modified;
 
     public IDMContainer()
     {
-        widgets = new ArrayList<IDMWidget>();
+        children = new ArrayList<IDMWidget>();
+        iterated = 0;
+        modified = false;
     }
     
-    public void add(IDMWidget widget)
+    synchronized public void add(IDMWidget widget)
     {
-        widgets.add(widget);
+        widget.setParent(this);
+        if (iterated > 0)
+        {
+            queue.add(0, widget);
+            modified = true;
+        }
+        else
+            children.add(widget);
     }
     
-    public void paint(Graphics2D g)
+    synchronized public void remove(IDMWidget widget)
     {
-        for (IDMWidget widget : widgets)
-            widget.paint(g);
+        widget.setParent(null);
+        if (iterated > 0)
+        {
+            queue.remove(widget);
+            modified = true;
+        }
+        else
+            children.remove(widget);
     }
-    
-    public void mousePressed(MouseEvent e)
+
+    synchronized private void beginIteration()
     {
-        for (IDMWidget widget : widgets)
+        modified = false;
+        if (iterated == 0)
         {
-            if (widget.contains(e.getPoint()))
-                widget.mousePressed(e);
+            queue = new ArrayList<IDMWidget>();
+            for (IDMWidget widget : children)
+                queue.add(widget);
         }
+        iterated++;
+    }
+
+    synchronized private void endIteration()
+    {
+        if (modified && iterated == 1)
+        {
+            children = queue;
+            queue = null;
+        }
+        iterated--;
     }
 
-    public void mouseReleased(MouseEvent e)
+    synchronized public void paint(Graphics2D g)
     {
-        for (IDMWidget widget : widgets)
+        // Paint in reverse order
+        ListIterator<IDMWidget> iter = children.listIterator(children.size());
+
+        while (iter.hasPrevious())
         {
-            widget.mouseReleased(e);
-        }
-    }
-
-    public void mouseExited(MouseEvent e)
-    {
-        for (IDMWidget widget : widgets)
-        {
-            widget.mouseExited(e);
+            final IDMWidget widget = iter.previous();
+            widget.paint(g);
         }
     }
+    
+    synchronized public boolean mousePressed(MouseEvent e)
+    {
+        try {
+            beginIteration();
+            for (IDMWidget widget : children)
+            {
+                if (widget.contains(e.getPoint()))
+                {
+                    if (widget.mousePressed(e))
+                        return true;
+                }
+            }
+        }
+        finally { endIteration(); }
+        return false;
+    }
 
-    public void mouseEntered(MouseEvent e)
+    synchronized public boolean mouseReleased(MouseEvent e)
     {
-        for (IDMWidget widget : widgets)
-        {
-            if (widget.contains(e.getPoint()))
-                widget.mouseEntered(e);
+        try {
+            beginIteration();
+            for (IDMWidget widget : children)
+            {
+                if (widget.mouseReleased(e))
+                    return true;
+            }
         }
+        finally { endIteration(); }
+        return false;
+    }
+
+    synchronized public boolean mouseExited(MouseEvent e)
+    {
+        try {
+            beginIteration();
+            for (IDMWidget widget : children)
+            {
+                if (widget.mouseExited(e))
+                    return true;
+            }
+        }
+        finally { endIteration(); }
+        return false;
     }
 
-    public boolean keyPressed(KeyEvent e)
+    synchronized public boolean mouseEntered(MouseEvent e)
+    {
+        try {
+            beginIteration();
+            for (IDMWidget widget : children)
+            {
+                if (widget.contains(e.getPoint()))
+                {
+                    if (widget.mouseEntered(e))
+                        return true;
+                }
+            }
+        }
+        finally { endIteration(); }
+        return false;
+    }
+
+    synchronized public boolean keyPressed(KeyEvent e)
     {
-        for (IDMWidget widget : widgets)
+        try {
+            beginIteration();
+            for (IDMWidget widget : children)
+            {
+                 if (widget.keyPressed(e))
+                    return true;
+            }
+        }
+        finally { endIteration(); }
+        return false;
+    }
+
+    synchronized public void setScale(IDMPoint scale)
+    {
+        beginIteration();
+        for (IDMWidget widget : children)
         {
-            if (widget.keyPressed(e))
+            widget.setScale(scale);
+        }
+        endIteration();
+    }
+
+    synchronized public boolean hasObject(Class c)
+    {
+        for (IDMWidget widget : children)
+        {
+            if (widget.getClass() == c)
                 return true;
         }
         return false;
     }
 
-    public void setScale(IDMPoint scale)
+    synchronized public boolean containsObject(Object o)
     {
-        for (IDMWidget widget : widgets)
+        for (IDMWidget widget : children)
         {
-            widget.setScale(scale);
+            if (widget == o)
+                return true;
         }
+        return false;
     }
 }