Mercurial > hg > ristipolku
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; } }