diff src/IDMContainer.java @ 161:fb33d3796942

Rename source directory.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 21 Jun 2016 12:53:53 +0300
parents game/IDMContainer.java@d6d92845d6a2
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/IDMContainer.java	Tue Jun 21 12:53:53 2016 +0300
@@ -0,0 +1,190 @@
+/*
+ * Ristipolku IDM widget container
+ * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org>
+ */
+package game;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+
+
+
+public class IDMContainer extends IDMWidget
+{
+    private ArrayList<IDMWidget> children, queue;
+    private IDMWidget modal;
+    private int iterated;
+    private boolean modified;
+
+    public IDMContainer()
+    {
+        children = new ArrayList<IDMWidget>();
+        iterated = 0;
+        modified = false;
+    }
+
+    synchronized public void add(IDMWidget widget)
+    {
+        widget.setParent(this);
+        if (iterated > 0)
+        {
+            queue.add(0, widget);
+            modified = true;
+        }
+        else
+            children.add(widget);
+    }
+
+    synchronized public void remove(IDMWidget widget)
+    {
+        widget.setParent(null);
+        if (iterated > 0)
+        {
+            queue.remove(widget);
+            modified = true;
+        }
+        else
+            children.remove(widget);
+    }
+
+    synchronized private void beginIteration()
+    {
+        modified = false;
+        if (iterated == 0)
+        {
+            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--;
+    }
+
+    synchronized public void paint(Graphics2D g)
+    {
+        // Paint in reverse order
+        ListIterator<IDMWidget> iter = children.listIterator(children.size());
+
+        while (iter.hasPrevious())
+        {
+            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;
+    }
+
+    synchronized public boolean mouseReleased(MouseEvent 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;
+    }
+
+    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)
+    {
+        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)
+        {
+            widget.setScale(scale);
+        }
+        endIteration();
+    }
+
+    synchronized public boolean hasObject(Class c)
+    {
+        for (IDMWidget widget : children)
+        {
+            if (widget.getClass() == c)
+                return true;
+        }
+        return false;
+    }
+
+    synchronized public boolean containsObject(Object o)
+    {
+        for (IDMWidget widget : children)
+        {
+            if (widget == o)
+                return true;
+        }
+        return false;
+    }
+}