diff --git a/src/java/com/threerings/media/MediaPanel.java b/src/java/com/threerings/media/MediaPanel.java index cd7c8992d..e95aaf469 100644 --- a/src/java/com/threerings/media/MediaPanel.java +++ b/src/java/com/threerings/media/MediaPanel.java @@ -56,6 +56,12 @@ import com.threerings.media.sprite.ButtonSprite; import com.threerings.media.sprite.Sprite; import com.threerings.media.sprite.SpriteManager; +import com.threerings.media.sprite.action.ActionSprite; +import com.threerings.media.sprite.action.ArmingSprite; +import com.threerings.media.sprite.action.CommandSprite; +import com.threerings.media.sprite.action.DisableableSprite; +import com.threerings.media.sprite.action.HoverSprite; + /** * Provides a useful extensible framework for rendering animated displays * that use sprites and animations. Sprites and animations can be added to @@ -185,13 +191,13 @@ public class MediaPanel extends JComponent { _spritemgr.addSprite(sprite); - if (sprite instanceof ButtonSprite && - _buttonSpriteCount++ == 0) { - if (_buttonHandler == null) { - _buttonHandler = new ButtonHandler(); + if (((sprite instanceof ActionSprite) || + (sprite instanceof HoverSprite)) && (_actionSpriteCount++ == 0)) { + if (_actionHandler == null) { + _actionHandler = new ActionSpriteHandler(); } - addMouseListener(_buttonHandler); - addMouseMotionListener(_buttonHandler); + addMouseListener(_actionHandler); + addMouseMotionListener(_actionHandler); } } @@ -210,11 +216,10 @@ public class MediaPanel extends JComponent { _spritemgr.removeSprite(sprite); - if (sprite instanceof ButtonSprite && - --_buttonSpriteCount == 0) - { - removeMouseListener(_buttonHandler); - removeMouseMotionListener(_buttonHandler); + if (((sprite instanceof ActionSprite) || + (sprite instanceof HoverSprite)) && (--_actionSpriteCount == 0)) { + removeMouseListener(_actionHandler); + removeMouseMotionListener(_actionHandler); } } @@ -224,6 +229,12 @@ public class MediaPanel extends JComponent public void clearSprites () { _spritemgr.clearMedia(); + + if (_actionHandler != null) { + removeMouseListener(_actionHandler); + removeMouseMotionListener(_actionHandler); + _actionSpriteCount = 0; + } } /** @@ -607,51 +618,100 @@ public class MediaPanel extends JComponent /** Used to keep metrics. */ protected float _dirtyPerTick; - /** Handles button manipulation. */ - protected class ButtonHandler extends MouseInputAdapter + /** Handles ActionSprite/HoverSprite/ArmingSprite manipulation. */ + protected class ActionSpriteHandler extends MouseInputAdapter { + // documentation inherited public void mousePressed (MouseEvent me) { - Sprite highestHit = _spritemgr.getHighestHitSprite( - me.getX(), me.getY()); - - if (highestHit instanceof ButtonSprite && - ((ButtonSprite)highestHit).isEnabled()) { - _activeButton = (ButtonSprite)highestHit; - _activeButton.setPressed(true); + if (_activeSprite == null) { + // see if we can find one + Sprite s = getHit(me); + if (s instanceof ActionSprite) { + _activeSprite = s; + } + } + + if (_activeSprite instanceof ArmingSprite) { + ((ArmingSprite) _activeSprite).setArmed(true); } } + // documentation inherited public void mouseReleased (MouseEvent me) { - if (_activeButton != null) { - CommandEvent ce = new CommandEvent(MediaPanel.this, - _activeButton.getActionCommand(), - _activeButton.getCommandArgument(), - me.getWhen(), me.getModifiers()); - Controller.postAction(ce); - _activeButton.setPressed(false); - _activeButton = null; + if ((_activeSprite instanceof ActionSprite) && + _activeSprite.hitTest(me.getX(), me.getY())) { + if (_activeSprite instanceof CommandSprite) { + CommandSprite cs = (CommandSprite) _activeSprite; + Controller.postAction(MediaPanel.this, + cs.getActionCommand(), cs.getCommandArgument()); + + } else { + Controller.postAction(MediaPanel.this, + ((ActionSprite) _activeSprite).getActionCommand()); + } } + + if (!(_activeSprite instanceof HoverSprite)) { + _activeSprite = null; + } + + mouseMoved(me); } - + + // documentation inherited public void mouseDragged (MouseEvent me) { - if (_activeButton != null && - !_activeButton.contains(me.getX(), me.getY())) { - _activeButton.setPressed(false); - _activeButton = null; + if (_activeSprite instanceof ArmingSprite) { + ((ArmingSprite) _activeSprite).setArmed( + _activeSprite.hitTest(me.getX(), me.getY())); } } - - protected ButtonSprite _activeButton; + + // documentation inherited + public void mouseMoved (MouseEvent me) + { + if (_activeSprite instanceof HoverSprite) { + if (!_activeSprite.hitTest(me.getX(), me.getY())) { + ((HoverSprite) _activeSprite).setHovered(false); + _activeSprite = null; + } + } + + if (_activeSprite == null) { + Sprite s = getHit(me); + if (s instanceof HoverSprite) { + ((HoverSprite) s).setHovered(true); + _activeSprite = s; + } + } + } + + /** + * Utility method, get the highest sprite, return it + * if it's enabled. + */ + protected Sprite getHit (MouseEvent me) + { + Sprite s = _spritemgr.getHighestHitSprite(me.getX(), me.getY()); + if (!(s instanceof DisableableSprite) || + ((DisableableSprite) s).isEnabled()) { + return s; + } else { + return null; + } + } + + /** The active hover sprite, or action sprite. */ + protected Sprite _activeSprite; } - /** The active button handler, or null for none. */ - protected ButtonHandler _buttonHandler; + /** The action sprite handler, or null for none. */ + protected ActionSpriteHandler _actionHandler; - /** The number of button sprites being managed. */ - protected int _buttonSpriteCount; + /** The number of action/hover sprites being managed. */ + protected int _actionSpriteCount; // used to render performance metrics protected String _perfStatus = ""; diff --git a/src/java/com/threerings/media/sprite/ButtonSprite.java b/src/java/com/threerings/media/sprite/ButtonSprite.java index 6d46bdd1a..4533aa10d 100644 --- a/src/java/com/threerings/media/sprite/ButtonSprite.java +++ b/src/java/com/threerings/media/sprite/ButtonSprite.java @@ -29,10 +29,15 @@ import java.awt.Shape; import com.samskivert.swing.Label; import com.samskivert.swing.util.SwingUtil; +import com.threerings.media.sprite.action.ArmingSprite; +import com.threerings.media.sprite.action.CommandSprite; +import com.threerings.media.sprite.action.DisableableSprite; + /** * A sprite that acts as a button. */ public class ButtonSprite extends Sprite + implements CommandSprite, ArmingSprite, DisableableSprite { /** The normal, square button style. */ public static final int NORMAL = 0; @@ -188,9 +193,7 @@ public class ButtonSprite extends Sprite _actionCommand = actionCommand; } - /** - * Returns the action command generated by this button. - */ + // documentation inherited from interface CommandSprite public String getActionCommand () { return _actionCommand; @@ -204,9 +207,7 @@ public class ButtonSprite extends Sprite _commandArgument = commandArgument; } - /** - * Returns the command argument generated by this button. - */ + // documentation inherited from interface CommandSprite public Object getCommandArgument () { return _commandArgument; @@ -223,19 +224,14 @@ public class ButtonSprite extends Sprite } } - /** - * Checks whether or not this button is enabled. - */ + // documentation inherited from interface DisableableSprite public boolean isEnabled () { return _enabled; } - /** - * Sets whether or not this button appears pressed - * (does not fire an event). - */ - public void setPressed (boolean pressed) + // documentation inherited from interface ArmingSprite + public void setArmed (boolean pressed) { if (_pressed != pressed) { _pressed = pressed; @@ -246,7 +242,7 @@ public class ButtonSprite extends Sprite /** * Checks whether or not this button appears pressed. */ - public boolean isPressed () + public boolean isArmed () { return _pressed; } diff --git a/src/java/com/threerings/media/sprite/action/ActionSprite.java b/src/java/com/threerings/media/sprite/action/ActionSprite.java new file mode 100644 index 000000000..30bb61587 --- /dev/null +++ b/src/java/com/threerings/media/sprite/action/ActionSprite.java @@ -0,0 +1,16 @@ +// +// $Id$ + +package com.threerings.media.sprite.action; + +/** + * An Action sprite is a sprite that may be pressed to generate an + * ActionEvent that will be posted to the Controller hierarchy. + */ +public interface ActionSprite +{ + /** + * @return the action command to submit if this sprite is clicked. + */ + public String getActionCommand (); +} diff --git a/src/java/com/threerings/media/sprite/action/ArmingSprite.java b/src/java/com/threerings/media/sprite/action/ArmingSprite.java new file mode 100644 index 000000000..8d0763f3c --- /dev/null +++ b/src/java/com/threerings/media/sprite/action/ArmingSprite.java @@ -0,0 +1,16 @@ +// +// $Id$ + +package com.threerings.media.sprite.action; + +/** + * An ActionSprite that wishes to be notified of events when it is armed + * or not. + */ +public interface ArmingSprite extends ActionSprite +{ + /** + * Render this sprite such that is is drawn "armed". + */ + public void setArmed (boolean armed); +} diff --git a/src/java/com/threerings/media/sprite/action/CommandSprite.java b/src/java/com/threerings/media/sprite/action/CommandSprite.java new file mode 100644 index 000000000..8384be2b4 --- /dev/null +++ b/src/java/com/threerings/media/sprite/action/CommandSprite.java @@ -0,0 +1,16 @@ +// +// $Id$ + +package com.threerings.media.sprite.action; + +/** + * Extends CommandSprite to be a sprite that posts CommandEvents to + * the Controller hierarchy. + */ +public interface CommandSprite extends ActionSprite +{ + /** + * @return the argument to the action command. + */ + public Object getCommandArgument(); +} diff --git a/src/java/com/threerings/media/sprite/action/DisableableSprite.java b/src/java/com/threerings/media/sprite/action/DisableableSprite.java new file mode 100644 index 000000000..c19a7d8b9 --- /dev/null +++ b/src/java/com/threerings/media/sprite/action/DisableableSprite.java @@ -0,0 +1,16 @@ +// +// $Id$ + +package com.threerings.media.sprite.action; + +/** + * Indicates a Sprite that may or may not be enabled to receive + * action / hover / arming notifications. + */ +public interface DisableableSprite +{ + /** + * @return true if this sprite is currently enabled. + */ + public boolean isEnabled (); +} diff --git a/src/java/com/threerings/media/sprite/action/HoverSprite.java b/src/java/com/threerings/media/sprite/action/HoverSprite.java new file mode 100644 index 000000000..409da3da6 --- /dev/null +++ b/src/java/com/threerings/media/sprite/action/HoverSprite.java @@ -0,0 +1,16 @@ +// +// $Id$ + +package com.threerings.media.sprite.action; + +/** + * An interface indicating that a sprite wishes to be notified when + * the mouse hovers over it. + */ +public interface HoverSprite +{ + /** + * Set the current hover state. + */ + public void setHovered (boolean hovered); +}