Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / src / grid / LockingView.js
1 /**
2  * @class Ext.grid.LockingView
3  * This class is used internally to provide a single interface when using
4  * a locking grid. Internally, the locking grid creates 2 separate grids,
5  * so this class is used to map calls appropriately.
6  * @ignore
7  */
8 Ext.define('Ext.grid.LockingView', {
9     
10     mixins: {
11         observable: 'Ext.util.Observable'
12     },
13     
14     eventRelayRe: /^(beforeitem|beforecontainer|item|container|cell)/,
15     
16     constructor: function(config){
17         var me = this,
18             eventNames = [],
19             eventRe = me.eventRelayRe,
20             locked = config.locked.getView(),
21             normal = config.normal.getView(),
22             events,
23             event;
24         
25         Ext.apply(me, {
26             lockedView: locked,
27             normalView: normal,
28             lockedGrid: config.locked,
29             normalGrid: config.normal,
30             panel: config.panel
31         });
32         me.mixins.observable.constructor.call(me, config);
33         
34         // relay events
35         events = locked.events;
36         for (event in events) {
37             if (events.hasOwnProperty(event) && eventRe.test(event)) {
38                 eventNames.push(event);
39             }
40         }
41         me.relayEvents(locked, eventNames);
42         me.relayEvents(normal, eventNames);
43         
44         normal.on({
45             scope: me,
46             itemmouseleave: me.onItemMouseLeave,
47             itemmouseenter: me.onItemMouseEnter
48         });
49         
50         locked.on({
51             scope: me,
52             itemmouseleave: me.onItemMouseLeave,
53             itemmouseenter: me.onItemMouseEnter
54         });
55     },
56     
57     getGridColumns: function() {
58         var cols = this.lockedGrid.headerCt.getGridColumns();
59         return cols.concat(this.normalGrid.headerCt.getGridColumns());
60     },
61     
62     onItemMouseEnter: function(view, record){
63         var me = this,
64             locked = me.lockedView,
65             other = me.normalView,
66             item;
67             
68         if (view.trackOver) {
69             if (view !== locked) {
70                 other = locked;
71             }
72             item = other.getNode(record);
73             other.highlightItem(item);
74         }
75     },
76     
77     onItemMouseLeave: function(view, record){
78         var me = this,
79             locked = me.lockedView,
80             other = me.normalView;
81             
82         if (view.trackOver) {
83             if (view !== locked) {
84                 other = locked;
85             }
86             other.clearHighlight();
87         }
88     },
89     
90     relayFn: function(name, args){
91         args = args || [];
92         
93         var view = this.lockedView;
94         view[name].apply(view, args || []);    
95         view = this.normalView;
96         view[name].apply(view, args || []);   
97     },
98     
99     getSelectionModel: function(){
100         return this.panel.getSelectionModel();    
101     },
102     
103     getStore: function(){
104         return this.panel.store;
105     },
106     
107     getNode: function(nodeInfo){
108         // default to the normal view
109         return this.normalView.getNode(nodeInfo);
110     },
111     
112     getCell: function(record, column){
113         var view = this.lockedView,
114             row;
115         
116         
117         if (view.getHeaderAtIndex(column) === -1) {
118             view = this.normalView;
119         }
120         
121         row = view.getNode(record);
122         return Ext.fly(row).down(column.getCellSelector());
123     },
124     
125     getRecord: function(node){
126         var result = this.lockedView.getRecord(node);
127         if (!node) {
128             result = this.normalView.getRecord(node);
129         }
130         return result;
131     },
132     
133     refreshNode: function(){
134         this.relayFn('refreshNode', arguments);
135     },
136     
137     refresh: function(){
138         this.relayFn('refresh', arguments);
139     },
140     
141     bindStore: function(){
142         this.relayFn('bindStore', arguments);
143     },
144     
145     addRowCls: function(){
146         this.relayFn('addRowCls', arguments);
147     },
148     
149     removeRowCls: function(){
150         this.relayFn('removeRowCls', arguments);
151     }
152        
153 });