@qooxdoo/framework
Version:
The JS Framework for Coders
181 lines (156 loc) • 4.99 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: qx.core.Environment.select("qx.command.bindEnabled", {
true: ["enabled", "label", "icon", "toolTipText", "value", "menu"],
false: ["label", "icon", "toolTipText", "value", "menu"]
}),
/**
* Initiate the execute action.
*/
execute() {
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(e) {
if (this.isEnabled()) {
if (this.__semaphore) {
this.__semaphore = false;
return;
}
if (this.isEnabled()) {
this.__semaphore = true;
this.execute();
}
}
},
// property apply
_applyCommand(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() {
this._applyCommand(null, this.getCommand());
this.__executableBindingIds = null;
}
});