--- /dev/null
+/**
+ * @class Ext.LoadMask
+ * A simple utility class for generically masking elements while loading data. If the {@link #store}
+ * config option is specified, the masking will be automatically synchronized with the store's loading
+ * process and the mask element will be cached for reuse.
+ * <p>Example usage:</p>
+ * <pre><code>
+// Basic mask:
+var myMask = new Ext.LoadMask(Ext.getBody(), {msg:"Please wait..."});
+myMask.show();
+</code></pre>
+
+ * @constructor
+ * Create a new LoadMask
+ * @param {Mixed} el The element, element ID, or DOM node you wish to mask. Also, may be a Component who's element you wish to mask.
+ * @param {Object} config The config object
+ */
+
+Ext.define('Ext.LoadMask', {
+
+ /* Begin Definitions */
+
+ mixins: {
+ observable: 'Ext.util.Observable'
+ },
+
+ requires: ['Ext.data.StoreManager'],
+
+ /* End Definitions */
+
+ /**
+ * @cfg {Ext.data.Store} store
+ * Optional Store to which the mask is bound. The mask is displayed when a load request is issued, and
+ * hidden on either load success, or load fail.
+ */
+
+ /**
+ * @cfg {String} msg
+ * The text to display in a centered loading message box (defaults to 'Loading...')
+ */
+ msg : 'Loading...',
+ /**
+ * @cfg {String} msgCls
+ * The CSS class to apply to the loading message element (defaults to "x-mask-loading")
+ */
+ msgCls : Ext.baseCSSPrefix + 'mask-loading',
+
+ /**
+ * @cfg {Boolean} useMsg
+ * Whether or not to use a loading message class or simply mask the bound element.
+ */
+ useMsg: true,
+
+ /**
+ * Read-only. True if the mask is currently disabled so that it will not be displayed (defaults to false)
+ * @type Boolean
+ */
+ disabled: false,
+
+ constructor : function(el, config) {
+ var me = this;
+
+ if (el.isComponent) {
+ me.bindComponent(el);
+ } else {
+ me.el = Ext.get(el);
+ }
+ Ext.apply(me, config);
+
+ me.addEvents('beforeshow', 'show', 'hide');
+ if (me.store) {
+ me.bindStore(me.store, true);
+ }
+ me.mixins.observable.constructor.call(me, config);
+ },
+
+ bindComponent: function(comp) {
+ var me = this,
+ listeners = {
+ resize: me.onComponentResize,
+ scope: me
+ };
+
+ if (comp.el) {
+ me.onComponentRender(comp);
+ } else {
+ listeners.render = {
+ fn: me.onComponentRender,
+ scope: me,
+ single: true
+ };
+ }
+ me.mon(comp, listeners);
+ },
+
+ /**
+ * @private
+ * Called if we were configured with a Component, and that Component was not yet rendered. Collects the element to mask.
+ */
+ onComponentRender: function(comp) {
+ this.el = comp.getContentTarget();
+ },
+
+ /**
+ * @private
+ * Called when this LoadMask's Component is resized. The isMasked method also re-centers any displayed message.
+ */
+ onComponentResize: function(comp, w, h) {
+ this.el.isMasked();
+ },
+
+ /**
+ * Changes the data store bound to this LoadMask.
+ * @param {Store} store The store to bind to this LoadMask
+ */
+ bindStore : function(store, initial) {
+ var me = this;
+
+ if (!initial && me.store) {
+ me.mun(me.store, {
+ scope: me,
+ beforeload: me.onBeforeLoad,
+ load: me.onLoad,
+ exception: me.onLoad
+ });
+ if(!store) {
+ me.store = null;
+ }
+ }
+ if (store) {
+ store = Ext.data.StoreManager.lookup(store);
+ me.mon(store, {
+ scope: me,
+ beforeload: me.onBeforeLoad,
+ load: me.onLoad,
+ exception: me.onLoad
+ });
+
+ }
+ me.store = store;
+ if (store && store.isLoading()) {
+ me.onBeforeLoad();
+ }
+ },
+
+ /**
+ * Disables the mask to prevent it from being displayed
+ */
+ disable : function() {
+ var me = this;
+
+ me.disabled = true;
+ if (me.loading) {
+ me.onLoad();
+ }
+ },
+
+ /**
+ * Enables the mask so that it can be displayed
+ */
+ enable : function() {
+ this.disabled = false;
+ },
+
+ /**
+ * Method to determine whether this LoadMask is currently disabled.
+ * @return {Boolean} the disabled state of this LoadMask.
+ */
+ isDisabled : function() {
+ return this.disabled;
+ },
+
+ // private
+ onLoad : function() {
+ var me = this;
+
+ me.loading = false;
+ me.el.unmask();
+ me.fireEvent('hide', me, me.el, me.store);
+ },
+
+ // private
+ onBeforeLoad : function() {
+ var me = this;
+
+ if (!me.disabled && !me.loading && me.fireEvent('beforeshow', me, me.el, me.store) !== false) {
+ if (me.useMsg) {
+ me.el.mask(me.msg, me.msgCls, false);
+ } else {
+ me.el.mask();
+ }
+
+ me.fireEvent('show', me, me.el, me.store);
+ me.loading = true;
+ }
+ },
+
+ /**
+ * Show this LoadMask over the configured Element.
+ */
+ show: function() {
+ this.onBeforeLoad();
+ },
+
+ /**
+ * Hide this LoadMask.
+ */
+ hide: function() {
+ this.onLoad();
+ },
+
+ // private
+ destroy : function() {
+ this.hide();
+ this.clearListeners();
+ }
+});