UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

198 lines (165 loc) 4.94 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) * Fabian Jakobs (fjakobs) * Martin Wittemann (martinwittemann) ************************************************************************ */ /** * This mixin is included by all widgets, which support an 'execute' like * buttons or menu entries. */ qx.Mixin.define("qx.ui.core.MExecutable", { /* ***************************************************************************** EVENTS ***************************************************************************** */ events : { /** Fired if the {@link #execute} method is invoked.*/ "execute" : "qx.event.type.Event" }, /* ***************************************************************************** PROPERTIES ***************************************************************************** */ properties : { /** * A command called if the {@link #execute} method is called, e.g. on a * button tap. */ command : { check : "qx.ui.command.Command", apply : "_applyCommand", event : "changeCommand", nullable : true } }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { __executableBindingIds : null, __semaphore : false, __executeListenerId : null, /** * @type {Map} Set of properties, which will by synced from the command to the * including widget * * @lint ignoreReferenceField(_bindableProperties) */ _bindableProperties : [ "label", "icon", "toolTipText", "value", "menu" ], /** * Initiate the execute action. */ execute : function() { var cmd = this.getCommand(); if (cmd) { if (this.__semaphore) { this.__semaphore = false; } else { this.__semaphore = true; cmd.execute(this); } } this.fireEvent("execute"); }, /** * Handler for the execute event of the command. * * @param e {qx.event.type.Event} The execute event of the command. */ __onCommandExecute : function(e) { if (this.isEnabled()) { if (this.__semaphore) { this.__semaphore = false; return; } if (this.isEnabled()) { this.__semaphore = true; this.execute(); } } }, // property apply _applyCommand : function(value, old) { // execute forwarding if (old != null) { old.removeListenerById(this.__executeListenerId); } if (value != null) { this.__executeListenerId = value.addListener( "execute", this.__onCommandExecute, this ); } // binding stuff var ids = this.__executableBindingIds; if (ids == null) { this.__executableBindingIds = ids = {}; } var selfPropertyValue; for (var i = 0; i < this._bindableProperties.length; i++) { var property = this._bindableProperties[i]; // remove the old binding if (old != null && !old.isDisposed() && ids[property] != null) { old.removeBinding(ids[property]); ids[property] = null; } // add the new binding if (value != null && qx.Class.hasProperty(this.constructor, property)) { // handle the init value (don't sync the initial null) var cmdPropertyValue = value.get(property); if (cmdPropertyValue == null) { selfPropertyValue = this.get(property); // check also for themed values [BUG #5906] if (selfPropertyValue == null) { // update the appearance to make sure every themed property is up to date this.$$resyncNeeded = true; this.syncAppearance(); selfPropertyValue = qx.util.PropertyUtil.getThemeValue( this, property ); } } else { // Reset the self property value [BUG #4534] selfPropertyValue = null; } // set up the binding ids[property] = value.bind(property, this, property); // reapply the former value if (selfPropertyValue) { this.set(property, selfPropertyValue); } } } } }, destruct : function() { this._applyCommand(null, this.getCommand()); this.__executableBindingIds = null; } });