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