]> git.proxmox.com Git - extjs.git/blame - extjs/packages/core/src/scroll/DomScroller.js
add extjs 6.0.1 sources
[extjs.git] / extjs / packages / core / src / scroll / DomScroller.js
CommitLineData
6527f429
DM
1/**\r
2 * @class Ext.scroll.DomScroller\r
3 * @private\r
4 */\r
5Ext.define('Ext.scroll.DomScroller', {\r
6 extend: 'Ext.scroll.Scroller',\r
7 alias: 'scroller.dom',\r
8\r
9 isDomScroller: true,\r
10\r
11 getMaxPosition: function() {\r
12 var element = this.getElement(),\r
13 x = 0,\r
14 y = 0,\r
15 dom;\r
16\r
17 if (element && !element.destroyed) {\r
18 dom = element.dom;\r
19 x = dom.scrollWidth - dom.clientWidth;\r
20 y = dom.scrollHeight - dom.clientHeight;\r
21 }\r
22\r
23 return {\r
24 x: x,\r
25 y: y\r
26 };\r
27 },\r
28\r
29 getMaxUserPosition: function() {\r
30 var me = this,\r
31 element = me.getElement(),\r
32 x = 0,\r
33 y = 0,\r
34 dom;\r
35\r
36 if (element && !element.destroyed) {\r
37 dom = element.dom;\r
38 if (me.getX()) {\r
39 x = dom.scrollWidth - dom.clientWidth;\r
40 }\r
41 if (me.getY()) {\r
42 y = dom.scrollHeight - dom.clientHeight;\r
43 }\r
44 }\r
45\r
46 return {\r
47 x: x,\r
48 y: y\r
49 };\r
50 },\r
51\r
52 getPosition: function() {\r
53 var me = this;\r
54 if (me.positionDirty) {\r
55 me.updateDomScrollPosition();\r
56 }\r
57 return me.position;\r
58 },\r
59\r
60 getSize: function() {\r
61 var element = this.getElement(),\r
62 size, dom;\r
63\r
64 if (element && !element.destroyed) {\r
65 dom = element.dom;\r
66 size = {\r
67 x: dom.scrollWidth,\r
68 y: dom.scrollHeight\r
69 };\r
70 } else {\r
71 size = {\r
72 x: 0,\r
73 y: 0\r
74 };\r
75 }\r
76\r
77 return size;\r
78 },\r
79\r
80 updateElement: function(element, oldElement) {\r
81 this.initXStyle();\r
82 this.initYStyle();\r
83 },\r
84\r
85 updateX: function(x) {\r
86 this.initXStyle();\r
87 },\r
88\r
89 updateY: function(y) {\r
90 this.initYStyle();\r
91 },\r
92\r
93 privates: {\r
94 doScrollTo: function(x, y, animate) {\r
95 // There is an IE8 override of this method; when making changes here\r
96 // don't forget to update the override as well\r
97 var me = this,\r
98 element = me.getElement(),\r
99 maxPosition, dom, to, xInf, yInf,\r
100 i;\r
101\r
102 if (element && !element.destroyed) {\r
103 dom = element.dom;\r
104\r
105 xInf = (x === Infinity);\r
106 yInf = (y === Infinity);\r
107\r
108 if (xInf || yInf) {\r
109 maxPosition = me.getMaxPosition();\r
110 if (xInf) {\r
111 x = maxPosition.x;\r
112 }\r
113 if (yInf) {\r
114 y = maxPosition.y;\r
115 }\r
116 }\r
117\r
118 x = me.convertX(x);\r
119\r
120 if (animate) {\r
121 to = {};\r
122\r
123 if (y != null) {\r
124 to.scrollTop = y;\r
125 }\r
126\r
127 if (x != null) {\r
128 to.scrollLeft = x;\r
129 }\r
130\r
131 element.animate(Ext.mergeIf({\r
132 to: {\r
133 scrollTop: y,\r
134 scrollLeft: x\r
135 }\r
136 }, animate));\r
137 } else {\r
138 if (y != null) {\r
139 dom.scrollTop = y;\r
140 }\r
141 if (x != null) {\r
142 dom.scrollLeft = x;\r
143 // IE8 does not update immediately without this hack.\r
144 //<feature legacyBrowser>\r
145 if (Ext.isIE8) {\r
146 i = dom.scrollLeft;\r
147 dom.scrollLeft = x;\r
148 }\r
149 //</feature legacyBrowser>\r
150 }\r
151 }\r
152\r
153 // Our position object will need refreshing before returning.\r
154 me.positionDirty = true;\r
155 }\r
156 },\r
157\r
158 // rtl hook\r
159 getElementScroll: function(element) {\r
160 return element.getScroll();\r
161 },\r
162\r
163 stopAnimation: function() {\r
164 var anim = this.getElement().getActiveAnimation();\r
165 if (anim) {\r
166 anim.end();\r
167 }\r
168 }\r
169 }\r
170}, function(DomScroller) {\r
171 // Ensure the global Ext scroll event fires when the document scrolls.\r
172 // This is for when a non-viewport based app is used.\r
173 // DOM scroll events are used for document scrolls.\r
174 // The Viewport plugin destroys this Scroller at startup.\r
175 Ext.onDocumentReady(function() {\r
176 DomScroller.document = new DomScroller({\r
177 x: true,\r
178 y: true,\r
179 element: document.body\r
180 });\r
181 });\r
182});\r