From 7d400e45f2b0f277e26f58ac02dd63b703fc6412 Mon Sep 17 00:00:00 2001 From: Ray Greenwell Date: Wed, 6 Feb 2008 01:41:10 +0000 Subject: [PATCH] - Moved common code to internal static methods in CommandButton. - Fixed CommandButton to turn off buttonMode when disabled. - Created CommandCheckBox. All CommandButtons that are toggle buttons will use their 'selected' state as their arg if they have no regular arg. CommandCheckBoxes are of course always toggles. git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@409 ed5b42cb-e716-0410-a449-f6a68f950b19 --- src/as/com/threerings/flex/CommandButton.as | 37 +++++--- src/as/com/threerings/flex/CommandCheckBox.as | 85 +++++++++++++++++++ .../com/threerings/flex/CommandLinkButton.as | 14 +-- 3 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 src/as/com/threerings/flex/CommandCheckBox.as diff --git a/src/as/com/threerings/flex/CommandButton.as b/src/as/com/threerings/flex/CommandButton.as index 085097d3..6a1c2e15 100644 --- a/src/as/com/threerings/flex/CommandButton.as +++ b/src/as/com/threerings/flex/CommandButton.as @@ -44,10 +44,7 @@ public class CommandButton extends Button */ public function CommandButton (label :String = null, cmdOrFn :* = null, arg :Object = null) { - if (cmdOrFn != null && !(cmdOrFn is String) && !(cmdOrFn is Function)) { - // runtime errors suck, but this is actionscript - throw new Error("cmdOrFn must be a String or Function."); - } + validateCmd(cmdOrFn); this.label = label; _cmdOrFn = cmdOrFn; _arg = arg; @@ -72,21 +69,35 @@ public class CommandButton extends Button _arg = arg; } + override public function set enabled (val :Boolean) :void + { + super.enabled = val; + buttonMode = val; + } + override protected function clickHandler (event :MouseEvent) :void { super.clickHandler(event); + processCommandClick(this, event, _cmdOrFn, _arg); + } - if (enabled) { - // stop the click event + internal static function validateCmd (cmdOrFn :Object) :void + { + if (cmdOrFn != null && !(cmdOrFn is String) && !(cmdOrFn is Function)) { + // runtime errors suck, but this is actionscript + throw new Error("cmdOrFn must be a String or Function."); + } + } + + internal static function processCommandClick ( + button :Button, event :MouseEvent, cmdOrFn :Object, arg :Object) :void + { + if (button.enabled) { event.stopImmediatePropagation(); - - // dispatch the command event - // if the arg is null and we're a toggle button, dispatch our state - var arg :Object = _arg; - if (arg == null && toggle) { - arg = selected; + if (arg == null && button.toggle) { + arg = button.selected; } - CommandEvent.dispatch(this, _cmdOrFn, arg); + CommandEvent.dispatch(button, cmdOrFn, arg); } } diff --git a/src/as/com/threerings/flex/CommandCheckBox.as b/src/as/com/threerings/flex/CommandCheckBox.as new file mode 100644 index 00000000..70a3d031 --- /dev/null +++ b/src/as/com/threerings/flex/CommandCheckBox.as @@ -0,0 +1,85 @@ +// +// $Id: CommandButton.as 408 2008-02-06 01:03:55Z ray $ +// +// Nenya library - tools for developing networked games +// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved +// http://www.threerings.net/code/nenya/ +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.threerings.flex { + +import flash.events.MouseEvent; + +import mx.controls.CheckBox; + +import com.threerings.util.CommandEvent; + +/** + * A checkbox that dispatches a command (or calls a function) when it is toggled. + */ +public class CommandCheckBox extends CheckBox +{ + /** + * Create a command button. + * + * @param label the label text for the button. + * @param cmdOrFn either a String, which will be the CommandEvent command to dispatch, + * or a function, which will be called when clicked. + * @param arg the argument for the CommentEvent or the function. If the arg is an Array + * then those parameters are used for calling the function. + * Note that if arg is null, the actual argument passed will be the selected state of the + * button. + */ + public function CommandCheckBox (label :String = null, cmdOrFn :* = null, arg :Object = null) + { + CommandButton.validateCmd(cmdOrFn); + this.label = label; + _cmdOrFn = cmdOrFn; + _arg = arg; + } + + /** + * Set the command and argument to be issued when this button is pressed. + */ + public function setCommand (cmd :String, arg :Object = null) :void + { + _cmdOrFn = cmd; + _arg = arg; + } + + /** + * Set a callback function to call when the button is pressed. + */ + public function setCallback (fn :Function, arg :Object = null) :void + { + _cmdOrFn = fn; + _arg = arg; + } + + override protected function clickHandler (event :MouseEvent) :void + { + super.clickHandler(event); + CommandButton.processCommandClick(this, event, _cmdOrFn, _arg); + } + + /** The command (String) to submit, or the function (Function) to call + * when clicked, */ + protected var _cmdOrFn :Object; + + /** The argument that accompanies our command. */ + protected var _arg :Object; +} +} diff --git a/src/as/com/threerings/flex/CommandLinkButton.as b/src/as/com/threerings/flex/CommandLinkButton.as index 0fa5afb4..d4905e16 100644 --- a/src/as/com/threerings/flex/CommandLinkButton.as +++ b/src/as/com/threerings/flex/CommandLinkButton.as @@ -44,10 +44,7 @@ public class CommandLinkButton extends LinkButton */ public function CommandLinkButton (label :String = null, cmdOrFn :* = null, arg :Object = null) { - if (cmdOrFn != null && !(cmdOrFn is String) && !(cmdOrFn is Function)) { - // runtime errors suck, but this is actionscript - throw new Error("cmdOrFn must be a String or Function."); - } + CommandButton.validateCmd(cmdOrFn); this.label = label; _cmdOrFn = cmdOrFn; _arg = arg; @@ -74,14 +71,7 @@ public class CommandLinkButton extends LinkButton override protected function clickHandler (event :MouseEvent) :void { super.clickHandler(event); - - if (enabled) { - // stop the click event - event.stopImmediatePropagation(); - - // dispatch the command event - CommandEvent.dispatch(this, _cmdOrFn, _arg); - } + CommandButton.processCommandClick(this, event, _cmdOrFn, _arg); } /** The command (String) to submit, or the function (Function) to call