@qooxdoo/framework
Version:
The JS Framework for Coders
198 lines (165 loc) • 4.94 kB
JavaScript
/* ************************************************************************
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;
}
});