Upgrade to ExtJS 3.2.0 - Released 03/30/2010
[extjs.git] / src / widgets / grid / AbstractSelectionModel.js
index dd4e45f..e567cc9 100644 (file)
@@ -1,57 +1,99 @@
 /*!
- * Ext JS Library 3.1.1
- * Copyright(c) 2006-2010 Ext JS, LLC
+ * Ext JS Library 3.2.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
  * licensing@extjs.com
  * http://www.extjs.com/license
  */
-/**\r
- * @class Ext.grid.AbstractSelectionModel\r
- * @extends Ext.util.Observable\r
- * Abstract base class for grid SelectionModels.  It provides the interface that should be\r
- * implemented by descendant classes.  This class should not be directly instantiated.\r
- * @constructor\r
- */\r
-Ext.grid.AbstractSelectionModel = Ext.extend(Ext.util.Observable,  {\r
-    /**\r
-     * The GridPanel for which this SelectionModel is handling selection. Read-only.\r
-     * @type Object\r
-     * @property grid\r
-     */\r
-    \r
-    constructor : function(){\r
-        this.locked = false;\r
-        Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);\r
-    },\r
-\r
-    /** @ignore Called by the grid automatically. Do not call directly. */\r
-    init : function(grid){\r
-        this.grid = grid;\r
-        this.initEvents();\r
-    },\r
-\r
-    /**\r
-     * Locks the selections.\r
-     */\r
-    lock : function(){\r
-        this.locked = true;\r
-    },\r
-\r
-    /**\r
-     * Unlocks the selections.\r
-     */\r
-    unlock : function(){\r
-        this.locked = false;\r
-    },\r
-\r
-    /**\r
-     * Returns true if the selections are locked.\r
-     * @return {Boolean}\r
-     */\r
-    isLocked : function(){\r
-        return this.locked;\r
-    },\r
-    \r
-    destroy: function(){\r
-        this.purgeListeners();\r
-    }\r
+/**
+ * @class Ext.grid.AbstractSelectionModel
+ * @extends Ext.util.Observable
+ * Abstract base class for grid SelectionModels.  It provides the interface that should be
+ * implemented by descendant classes.  This class should not be directly instantiated.
+ * @constructor
+ */
+Ext.grid.AbstractSelectionModel = Ext.extend(Ext.util.Observable,  {
+    /**
+     * The GridPanel for which this SelectionModel is handling selection. Read-only.
+     * @type Object
+     * @property grid
+     */
+
+    constructor : function(){
+        this.locked = false;
+        Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);
+    },
+
+    /** @ignore Called by the grid automatically. Do not call directly. */
+    init : function(grid){
+        this.grid = grid;
+        if(this.lockOnInit){
+            delete this.lockOnInit;
+            this.locked = false;
+            this.lock();
+        }
+        this.initEvents();
+    },
+
+    /**
+     * Locks the selections.
+     */
+    lock : function(){
+        if(!this.locked){
+            this.locked = true;
+            // If the grid has been set, then the view is already initialized.
+            var g = this.grid;
+            if(g){
+                g.getView().on({
+                    scope: this,
+                    beforerefresh: this.sortUnLock,
+                    refresh: this.sortLock
+                });
+            }else{
+                this.lockOnInit = true;
+            }
+        }
+    },
+
+    // set the lock states before and after a view refresh
+    sortLock : function() {
+        this.locked = true;
+    },
+
+    // set the lock states before and after a view refresh
+    sortUnLock : function() {
+        this.locked = false;
+    },
+
+    /**
+     * Unlocks the selections.
+     */
+    unlock : function(){
+        if(this.locked){
+            this.locked = false;
+            var g = this.grid,
+                gv;
+                
+            // If the grid has been set, then the view is already initialized.
+            if(g){
+                gv = g.getView();
+                gv.un('beforerefresh', this.sortUnLock, this);
+                gv.un('refresh', this.sortLock, this);    
+            }else{
+                delete this.lockOnInit;
+            }
+        }
+    },
+
+    /**
+     * Returns true if the selections are locked.
+     * @return {Boolean}
+     */
+    isLocked : function(){
+        return this.locked;
+    },
+
+    destroy: function(){
+        this.unlock();
+        this.purgeListeners();
+    }
 });
\ No newline at end of file