UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

143 lines (117 loc) 3.87 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) * Mustafa Sak (msak) ************************************************************************ */ /** * The widget queue handles the deferred computation of certain widget properties. * It is used e.g. for the tree to update the indentation of tree nodes. * * This queue calls the method {@link qx.ui.core.Widget#syncWidget} of each * queued widget before the layout queues are processed. */ qx.Class.define("qx.ui.core.queue.Widget", { statics : { /** @type {Array} This contains all the queued widgets for the next flush. */ __queue : [], /** * @type {Object} This contains a map of widgets hash ($$hash) and their * corresponding map of jobs. */ __jobs : {}, /** * Clears given job of a widget from the internal queue. If no jobs left, the * widget will be removed completely from queue. If job param is <code>null</code> * or <code>undefined</code> widget will be removed completely from queue. * Normally only used during interims disposes of one or a few widgets. * * @param widget {qx.ui.core.Widget} The widget to clear * @param job {String?} Job identifier. If not used, it will be converted to * "$$default". */ remove : function(widget, job) { var queue = this.__queue; if (!queue.includes(widget)) { return; } var hash = widget.$$hash; // remove widget and all corresponding jobs, if job param is not given. if(job == null) { qx.lang.Array.remove(queue, widget); delete this.__jobs[hash]; return; } if (this.__jobs[hash]) { delete this.__jobs[hash][job]; if(qx.lang.Object.getLength(this.__jobs[hash]) == 0) { qx.lang.Array.remove(queue, widget); } } }, /** * Adds a widget to the queue. The second param can be used to identify * several jobs. You can add one job at once, which will be returned as * an map at flushing on method {@link qx.ui.core.Widget#syncWidget}. * * @param widget {qx.ui.core.Widget} The widget to add. * @param job {String?} Job identifier. If not used, it will be converted to * "$$default". */ add : function(widget, job) { var queue = this.__queue; //add widget if not containing if (!queue.includes(widget)){ queue.unshift(widget); } //add job if (job == null) { job = "$$default"; } var hash = widget.$$hash; if (!this.__jobs[hash]) { this.__jobs[hash] = {}; } this.__jobs[hash][job] = true; qx.ui.core.queue.Manager.scheduleFlush("widget"); }, /** * Flushes the widget queue. * * This is used exclusively by the {@link qx.ui.core.queue.Manager}. */ flush : function() { // Process all registered widgets var queue = this.__queue; var obj, jobs; for (var i = queue.length - 1 ; i >= 0; i--) { // Order is important to allow the same widget to be requeued directly obj = queue[i]; jobs = this.__jobs[obj.$$hash]; queue.splice(i, 1); obj.syncWidget(jobs); } // Empty check if (queue.length != 0) { return; } // Recreate the array is cheaper compared to keep a sparse array over time this.__queue = []; this.__jobs = {}; } } });