]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * @class Ext.scroll.DomScroller\r | |
3 | * @private\r | |
4 | */\r | |
5 | Ext.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 |