Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / src / grid / LockingView.js
1 /*
2
3 This file is part of Ext JS 4
4
5 Copyright (c) 2011 Sencha Inc
6
7 Contact:  http://www.sencha.com/contact
8
9 GNU General Public License Usage
10 This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.  Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
11
12 If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
13
14 */
15 /**
16  * @class Ext.grid.LockingView
17  * This class is used internally to provide a single interface when using
18  * a locking grid. Internally, the locking grid creates two separate grids,
19  * so this class is used to map calls appropriately.
20  * @ignore
21  */
22 Ext.define('Ext.grid.LockingView', {
23
24     mixins: {
25         observable: 'Ext.util.Observable'
26     },
27
28     eventRelayRe: /^(beforeitem|beforecontainer|item|container|cell)/,
29
30     constructor: function(config){
31         var me = this,
32             eventNames = [],
33             eventRe = me.eventRelayRe,
34             locked = config.locked.getView(),
35             normal = config.normal.getView(),
36             events,
37             event;
38
39         Ext.apply(me, {
40             lockedView: locked,
41             normalView: normal,
42             lockedGrid: config.locked,
43             normalGrid: config.normal,
44             panel: config.panel
45         });
46         me.mixins.observable.constructor.call(me, config);
47
48         // relay events
49         events = locked.events;
50         for (event in events) {
51             if (events.hasOwnProperty(event) && eventRe.test(event)) {
52                 eventNames.push(event);
53             }
54         }
55         me.relayEvents(locked, eventNames);
56         me.relayEvents(normal, eventNames);
57
58         normal.on({
59             scope: me,
60             itemmouseleave: me.onItemMouseLeave,
61             itemmouseenter: me.onItemMouseEnter
62         });
63
64         locked.on({
65             scope: me,
66             itemmouseleave: me.onItemMouseLeave,
67             itemmouseenter: me.onItemMouseEnter
68         });
69     },
70
71     getGridColumns: function() {
72         var cols = this.lockedGrid.headerCt.getGridColumns();
73         return cols.concat(this.normalGrid.headerCt.getGridColumns());
74     },
75
76     getEl: function(column){
77         return this.getViewForColumn(column).getEl();
78     },
79
80     getViewForColumn: function(column) {
81         var view = this.lockedView,
82             inLocked;
83
84         view.headerCt.cascade(function(col){
85             if (col === column) {
86                 inLocked = true;
87                 return false;
88             }
89         });
90
91         return inLocked ? view : this.normalView;
92     },
93
94     onItemMouseEnter: function(view, record){
95         var me = this,
96             locked = me.lockedView,
97             other = me.normalView,
98             item;
99
100         if (view.trackOver) {
101             if (view !== locked) {
102                 other = locked;
103             }
104             item = other.getNode(record);
105             other.highlightItem(item);
106         }
107     },
108
109     onItemMouseLeave: function(view, record){
110         var me = this,
111             locked = me.lockedView,
112             other = me.normalView;
113
114         if (view.trackOver) {
115             if (view !== locked) {
116                 other = locked;
117             }
118             other.clearHighlight();
119         }
120     },
121
122     relayFn: function(name, args){
123         args = args || [];
124
125         var view = this.lockedView;
126         view[name].apply(view, args || []);
127         view = this.normalView;
128         view[name].apply(view, args || []);
129     },
130
131     getSelectionModel: function(){
132         return this.panel.getSelectionModel();
133     },
134
135     getStore: function(){
136         return this.panel.store;
137     },
138
139     getNode: function(nodeInfo){
140         // default to the normal view
141         return this.normalView.getNode(nodeInfo);
142     },
143
144     getCell: function(record, column){
145         var view = this.getViewForColumn(column),
146             row;
147
148         row = view.getNode(record);
149         return Ext.fly(row).down(column.getCellSelector());
150     },
151
152     getRecord: function(node){
153         var result = this.lockedView.getRecord(node);
154         if (!node) {
155             result = this.normalView.getRecord(node);
156         }
157         return result;
158     },
159
160     addElListener: function(eventName, fn, scope){
161         this.relayFn('addElListener', arguments);
162     },
163
164     refreshNode: function(){
165         this.relayFn('refreshNode', arguments);
166     },
167
168     refresh: function(){
169         this.relayFn('refresh', arguments);
170     },
171
172     bindStore: function(){
173         this.relayFn('bindStore', arguments);
174     },
175
176     addRowCls: function(){
177         this.relayFn('addRowCls', arguments);
178     },
179
180     removeRowCls: function(){
181         this.relayFn('removeRowCls', arguments);
182     }
183
184 });