extjs-rails 4.1.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (517) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +36 -0
  4. data/README.md +29 -0
  5. data/Rakefile +2 -0
  6. data/app/assets/javascripts/extjs-rails/extjs-rails.js +1 -0
  7. data/app/assets/javascripts/extjs-rails/index.js.erb +9 -0
  8. data/app/assets/javascripts/extjs-rails/sdk.jsb3 +2017 -0
  9. data/app/assets/javascripts/extjs-rails/src/AbstractComponent.js +3290 -0
  10. data/app/assets/javascripts/extjs-rails/src/AbstractManager.js +144 -0
  11. data/app/assets/javascripts/extjs-rails/src/AbstractPlugin.js +72 -0
  12. data/app/assets/javascripts/extjs-rails/src/Action.js +276 -0
  13. data/app/assets/javascripts/extjs-rails/src/Ajax.js +99 -0
  14. data/app/assets/javascripts/extjs-rails/src/Component.js +1344 -0
  15. data/app/assets/javascripts/extjs-rails/src/ComponentLoader.js +202 -0
  16. data/app/assets/javascripts/extjs-rails/src/ComponentManager.js +47 -0
  17. data/app/assets/javascripts/extjs-rails/src/ComponentQuery.js +521 -0
  18. data/app/assets/javascripts/extjs-rails/src/Editor.js +494 -0
  19. data/app/assets/javascripts/extjs-rails/src/ElementLoader.js +404 -0
  20. data/app/assets/javascripts/extjs-rails/src/FocusManager.js +712 -0
  21. data/app/assets/javascripts/extjs-rails/src/Img.js +111 -0
  22. data/app/assets/javascripts/extjs-rails/src/Layer.js +543 -0
  23. data/app/assets/javascripts/extjs-rails/src/LoadMask.js +432 -0
  24. data/app/assets/javascripts/extjs-rails/src/ModelManager.js +186 -0
  25. data/app/assets/javascripts/extjs-rails/src/PluginManager.js +110 -0
  26. data/app/assets/javascripts/extjs-rails/src/ProgressBar.js +336 -0
  27. data/app/assets/javascripts/extjs-rails/src/Shadow.js +233 -0
  28. data/app/assets/javascripts/extjs-rails/src/ShadowPool.js +43 -0
  29. data/app/assets/javascripts/extjs-rails/src/Template.js +331 -0
  30. data/app/assets/javascripts/extjs-rails/src/XTemplate.js +365 -0
  31. data/app/assets/javascripts/extjs-rails/src/XTemplateCompiler.js +450 -0
  32. data/app/assets/javascripts/extjs-rails/src/XTemplateParser.js +249 -0
  33. data/app/assets/javascripts/extjs-rails/src/ZIndexManager.js +519 -0
  34. data/app/assets/javascripts/extjs-rails/src/app/Application.js +271 -0
  35. data/app/assets/javascripts/extjs-rails/src/app/Controller.js +458 -0
  36. data/app/assets/javascripts/extjs-rails/src/app/EventBus.js +112 -0
  37. data/app/assets/javascripts/extjs-rails/src/button/Button.js +1483 -0
  38. data/app/assets/javascripts/extjs-rails/src/button/Cycle.js +215 -0
  39. data/app/assets/javascripts/extjs-rails/src/button/Split.js +99 -0
  40. data/app/assets/javascripts/extjs-rails/src/chart/Callout.js +140 -0
  41. data/app/assets/javascripts/extjs-rails/src/chart/Chart.js +966 -0
  42. data/app/assets/javascripts/extjs-rails/src/chart/Highlight.js +172 -0
  43. data/app/assets/javascripts/extjs-rails/src/chart/Label.js +241 -0
  44. data/app/assets/javascripts/extjs-rails/src/chart/Legend.js +474 -0
  45. data/app/assets/javascripts/extjs-rails/src/chart/LegendItem.js +217 -0
  46. data/app/assets/javascripts/extjs-rails/src/chart/Mask.js +230 -0
  47. data/app/assets/javascripts/extjs-rails/src/chart/MaskLayer.js +48 -0
  48. data/app/assets/javascripts/extjs-rails/src/chart/Navigation.js +79 -0
  49. data/app/assets/javascripts/extjs-rails/src/chart/Shape.js +106 -0
  50. data/app/assets/javascripts/extjs-rails/src/chart/Tip.js +98 -0
  51. data/app/assets/javascripts/extjs-rails/src/chart/TipSurface.js +42 -0
  52. data/app/assets/javascripts/extjs-rails/src/chart/axis/Abstract.js +73 -0
  53. data/app/assets/javascripts/extjs-rails/src/chart/axis/Axis.js +961 -0
  54. data/app/assets/javascripts/extjs-rails/src/chart/axis/Category.js +130 -0
  55. data/app/assets/javascripts/extjs-rails/src/chart/axis/Gauge.js +203 -0
  56. data/app/assets/javascripts/extjs-rails/src/chart/axis/Numeric.js +235 -0
  57. data/app/assets/javascripts/extjs-rails/src/chart/axis/Radial.js +204 -0
  58. data/app/assets/javascripts/extjs-rails/src/chart/axis/Time.js +135 -0
  59. data/app/assets/javascripts/extjs-rails/src/chart/series/Area.js +803 -0
  60. data/app/assets/javascripts/extjs-rails/src/chart/series/Bar.js +853 -0
  61. data/app/assets/javascripts/extjs-rails/src/chart/series/Cartesian.js +328 -0
  62. data/app/assets/javascripts/extjs-rails/src/chart/series/Column.js +104 -0
  63. data/app/assets/javascripts/extjs-rails/src/chart/series/Gauge.js +490 -0
  64. data/app/assets/javascripts/extjs-rails/src/chart/series/Line.js +1104 -0
  65. data/app/assets/javascripts/extjs-rails/src/chart/series/Pie.js +1072 -0
  66. data/app/assets/javascripts/extjs-rails/src/chart/series/Radar.js +440 -0
  67. data/app/assets/javascripts/extjs-rails/src/chart/series/Scatter.js +668 -0
  68. data/app/assets/javascripts/extjs-rails/src/chart/series/Series.js +443 -0
  69. data/app/assets/javascripts/extjs-rails/src/chart/theme/Base.js +175 -0
  70. data/app/assets/javascripts/extjs-rails/src/chart/theme/Theme.js +253 -0
  71. data/app/assets/javascripts/extjs-rails/src/container/AbstractContainer.js +1062 -0
  72. data/app/assets/javascripts/extjs-rails/src/container/ButtonGroup.js +143 -0
  73. data/app/assets/javascripts/extjs-rails/src/container/Container.js +212 -0
  74. data/app/assets/javascripts/extjs-rails/src/container/DockingContainer.js +265 -0
  75. data/app/assets/javascripts/extjs-rails/src/container/Viewport.js +184 -0
  76. data/app/assets/javascripts/extjs-rails/src/core/dom/Element.form.js +50 -0
  77. data/app/assets/javascripts/extjs-rails/src/core/dom/Element.static-more.js +159 -0
  78. data/app/assets/javascripts/extjs-rails/src/core/examples/index.html +321 -0
  79. data/app/assets/javascripts/extjs-rails/src/core/examples/index.js +6 -0
  80. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CTO.js +25 -0
  81. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/CoolGuy.js +20 -0
  82. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Developer.js +43 -0
  83. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Gun.js +3 -0
  84. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/HumanResource.js +23 -0
  85. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Musician.js +20 -0
  86. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/Person.js +50 -0
  87. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanComposeSongs.js +9 -0
  88. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanPlayGuitar.js +9 -0
  89. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/ability/CanSing.js +18 -0
  90. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/A.js +3 -0
  91. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/B.js +3 -0
  92. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/C.js +3 -0
  93. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/D.js +3 -0
  94. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/deadlock/E.js +3 -0
  95. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/A.js +3 -0
  96. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/B.js +4 -0
  97. data/app/assets/javascripts/extjs-rails/src/core/examples/src/Sample/notdeadlock/C.js +3 -0
  98. data/app/assets/javascripts/extjs-rails/src/core/src/EventManager.js +1167 -0
  99. data/app/assets/javascripts/extjs-rails/src/core/src/EventObject.js +883 -0
  100. data/app/assets/javascripts/extjs-rails/src/core/src/Ext-more.js +1283 -0
  101. data/app/assets/javascripts/extjs-rails/src/core/src/Ext.js +736 -0
  102. data/app/assets/javascripts/extjs-rails/src/core/src/Support.js +662 -0
  103. data/app/assets/javascripts/extjs-rails/src/core/src/class/Base.js +1085 -0
  104. data/app/assets/javascripts/extjs-rails/src/core/src/class/Class.js +676 -0
  105. data/app/assets/javascripts/extjs-rails/src/core/src/class/ClassManager.js +1591 -0
  106. data/app/assets/javascripts/extjs-rails/src/core/src/class/Loader.js +1423 -0
  107. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.alignment.js +173 -0
  108. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.insertion.js +193 -0
  109. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.js +681 -0
  110. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.position.js +356 -0
  111. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.static.js +474 -0
  112. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.style.js +851 -0
  113. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractElement.traversal.js +180 -0
  114. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractHelper.js +291 -0
  115. data/app/assets/javascripts/extjs-rails/src/core/src/dom/AbstractQuery.js +72 -0
  116. data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElement.js +75 -0
  117. data/app/assets/javascripts/extjs-rails/src/core/src/dom/CompositeElementLite.js +436 -0
  118. data/app/assets/javascripts/extjs-rails/src/core/src/dom/DomQuery-aria.js +1049 -0
  119. data/app/assets/javascripts/extjs-rails/src/core/src/env/Browser.js +186 -0
  120. data/app/assets/javascripts/extjs-rails/src/core/src/env/FeatureDetector.js +274 -0
  121. data/app/assets/javascripts/extjs-rails/src/core/src/env/OS.js +141 -0
  122. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Array.js +1205 -0
  123. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Date.js +1463 -0
  124. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Error.js +326 -0
  125. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Function.js +485 -0
  126. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Number.js +175 -0
  127. data/app/assets/javascripts/extjs-rails/src/core/src/lang/Object.js +606 -0
  128. data/app/assets/javascripts/extjs-rails/src/core/src/lang/String.js +333 -0
  129. data/app/assets/javascripts/extjs-rails/src/core/src/misc/JSON.js +236 -0
  130. data/app/assets/javascripts/extjs-rails/src/core/src/perf/Accumulator.js +244 -0
  131. data/app/assets/javascripts/extjs-rails/src/core/src/perf/Monitor.js +197 -0
  132. data/app/assets/javascripts/extjs-rails/src/core/src/util/DelayedTask.js +71 -0
  133. data/app/assets/javascripts/extjs-rails/src/core/src/util/Event.js +215 -0
  134. data/app/assets/javascripts/extjs-rails/src/core/src/util/Format.js +551 -0
  135. data/app/assets/javascripts/extjs-rails/src/core/src/util/TaskManager.js +417 -0
  136. data/app/assets/javascripts/extjs-rails/src/core/src/version/Version.js +364 -0
  137. data/app/assets/javascripts/extjs-rails/src/core/test/unit/README.MD +91 -0
  138. data/app/assets/javascripts/extjs-rails/src/core/test/unit/bootstrap.js +39 -0
  139. data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build-data.js +34 -0
  140. data/app/assets/javascripts/extjs-rails/src/core/test/unit/build/build.sh +2 -0
  141. data/app/assets/javascripts/extjs-rails/src/core/test/unit/data.js +27 -0
  142. data/app/assets/javascripts/extjs-rails/src/core/test/unit/index.html +15 -0
  143. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom.html +40 -0
  144. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/extjs-api.js +12 -0
  145. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/platform-api.js +134 -0
  146. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/sanity.js +4 -0
  147. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api-out.js +128 -0
  148. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/dom/touch-api.js +89 -0
  149. data/app/assets/javascripts/extjs-rails/src/core/test/unit/other_specs/env/Environment.js +357 -0
  150. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/APITest.js +37 -0
  151. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/jsb3.js +14 -0
  152. data/app/assets/javascripts/extjs-rails/src/core/test/unit/resources/test-setup.js +137 -0
  153. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/EventManager.js +629 -0
  154. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-mess.backup +198 -0
  155. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext-more.js +520 -0
  156. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Ext.js +1550 -0
  157. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/Support.js +250 -0
  158. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Base.js +47 -0
  159. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/Class.js +561 -0
  160. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/class/ClassManager.js +555 -0
  161. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/CompositeElementLite.js +409 -0
  162. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/DomHelper.js +444 -0
  163. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.insertion.js +342 -0
  164. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.js +731 -0
  165. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.static.js +201 -0
  166. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.style.js +118 -0
  167. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/dom/Element.traversal.js +336 -0
  168. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Array.js +1229 -0
  169. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Date.js +697 -0
  170. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Error.js +277 -0
  171. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Function.js +536 -0
  172. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Number.js +323 -0
  173. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/Object.js +591 -0
  174. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/lang/String.js +451 -0
  175. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/misc/JSON.js +252 -0
  176. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/util/Format.js +521 -0
  177. data/app/assets/javascripts/extjs-rails/src/core/test/unit/spec/version/Version.js +148 -0
  178. data/app/assets/javascripts/extjs-rails/src/core/test/unit/specs.html +19 -0
  179. data/app/assets/javascripts/extjs-rails/src/data/AbstractStore.js +887 -0
  180. data/app/assets/javascripts/extjs-rails/src/data/ArrayStore.js +74 -0
  181. data/app/assets/javascripts/extjs-rails/src/data/Batch.js +236 -0
  182. data/app/assets/javascripts/extjs-rails/src/data/BufferStore.js +13 -0
  183. data/app/assets/javascripts/extjs-rails/src/data/Connection.js +969 -0
  184. data/app/assets/javascripts/extjs-rails/src/data/DirectStore.js +50 -0
  185. data/app/assets/javascripts/extjs-rails/src/data/Errors.js +52 -0
  186. data/app/assets/javascripts/extjs-rails/src/data/Field.js +341 -0
  187. data/app/assets/javascripts/extjs-rails/src/data/IdGenerator.js +198 -0
  188. data/app/assets/javascripts/extjs-rails/src/data/JsonP.js +253 -0
  189. data/app/assets/javascripts/extjs-rails/src/data/JsonPStore.js +51 -0
  190. data/app/assets/javascripts/extjs-rails/src/data/JsonStore.js +60 -0
  191. data/app/assets/javascripts/extjs-rails/src/data/Model.js +1673 -0
  192. data/app/assets/javascripts/extjs-rails/src/data/NodeInterface.js +1294 -0
  193. data/app/assets/javascripts/extjs-rails/src/data/NodeStore.js +254 -0
  194. data/app/assets/javascripts/extjs-rails/src/data/Operation.js +331 -0
  195. data/app/assets/javascripts/extjs-rails/src/data/Request.js +40 -0
  196. data/app/assets/javascripts/extjs-rails/src/data/ResultSet.js +56 -0
  197. data/app/assets/javascripts/extjs-rails/src/data/SequentialIdGenerator.js +61 -0
  198. data/app/assets/javascripts/extjs-rails/src/data/SortTypes.js +125 -0
  199. data/app/assets/javascripts/extjs-rails/src/data/Store.js +2609 -0
  200. data/app/assets/javascripts/extjs-rails/src/data/StoreManager.js +156 -0
  201. data/app/assets/javascripts/extjs-rails/src/data/Tree.js +290 -0
  202. data/app/assets/javascripts/extjs-rails/src/data/TreeStore.js +655 -0
  203. data/app/assets/javascripts/extjs-rails/src/data/Types.js +190 -0
  204. data/app/assets/javascripts/extjs-rails/src/data/UuidGenerator.js +215 -0
  205. data/app/assets/javascripts/extjs-rails/src/data/XmlStore.js +76 -0
  206. data/app/assets/javascripts/extjs-rails/src/data/association/Association.js +243 -0
  207. data/app/assets/javascripts/extjs-rails/src/data/association/BelongsTo.js +291 -0
  208. data/app/assets/javascripts/extjs-rails/src/data/association/HasMany.js +289 -0
  209. data/app/assets/javascripts/extjs-rails/src/data/association/HasOne.js +304 -0
  210. data/app/assets/javascripts/extjs-rails/src/data/proxy/Ajax.js +282 -0
  211. data/app/assets/javascripts/extjs-rails/src/data/proxy/Client.js +21 -0
  212. data/app/assets/javascripts/extjs-rails/src/data/proxy/Direct.js +181 -0
  213. data/app/assets/javascripts/extjs-rails/src/data/proxy/JsonP.js +313 -0
  214. data/app/assets/javascripts/extjs-rails/src/data/proxy/LocalStorage.js +69 -0
  215. data/app/assets/javascripts/extjs-rails/src/data/proxy/Memory.js +156 -0
  216. data/app/assets/javascripts/extjs-rails/src/data/proxy/Proxy.js +433 -0
  217. data/app/assets/javascripts/extjs-rails/src/data/proxy/Rest.js +173 -0
  218. data/app/assets/javascripts/extjs-rails/src/data/proxy/Server.js +460 -0
  219. data/app/assets/javascripts/extjs-rails/src/data/proxy/SessionStorage.js +39 -0
  220. data/app/assets/javascripts/extjs-rails/src/data/proxy/WebStorage.js +546 -0
  221. data/app/assets/javascripts/extjs-rails/src/data/reader/Array.js +68 -0
  222. data/app/assets/javascripts/extjs-rails/src/data/reader/Json.js +383 -0
  223. data/app/assets/javascripts/extjs-rails/src/data/reader/Reader.js +735 -0
  224. data/app/assets/javascripts/extjs-rails/src/data/reader/Xml.js +292 -0
  225. data/app/assets/javascripts/extjs-rails/src/data/validations.js +149 -0
  226. data/app/assets/javascripts/extjs-rails/src/data/writer/Json.js +81 -0
  227. data/app/assets/javascripts/extjs-rails/src/data/writer/Writer.js +147 -0
  228. data/app/assets/javascripts/extjs-rails/src/data/writer/Xml.js +88 -0
  229. data/app/assets/javascripts/extjs-rails/src/dd/DD.js +300 -0
  230. data/app/assets/javascripts/extjs-rails/src/dd/DDProxy.js +204 -0
  231. data/app/assets/javascripts/extjs-rails/src/dd/DDTarget.js +171 -0
  232. data/app/assets/javascripts/extjs-rails/src/dd/DragDrop.js +1101 -0
  233. data/app/assets/javascripts/extjs-rails/src/dd/DragDropManager.js +1264 -0
  234. data/app/assets/javascripts/extjs-rails/src/dd/DragSource.js +392 -0
  235. data/app/assets/javascripts/extjs-rails/src/dd/DragTracker.js +562 -0
  236. data/app/assets/javascripts/extjs-rails/src/dd/DragZone.js +137 -0
  237. data/app/assets/javascripts/extjs-rails/src/dd/DropTarget.js +118 -0
  238. data/app/assets/javascripts/extjs-rails/src/dd/DropZone.js +254 -0
  239. data/app/assets/javascripts/extjs-rails/src/dd/Registry.js +117 -0
  240. data/app/assets/javascripts/extjs-rails/src/dd/ScrollManager.js +218 -0
  241. data/app/assets/javascripts/extjs-rails/src/dd/StatusProxy.js +179 -0
  242. data/app/assets/javascripts/extjs-rails/src/diag/layout/Context.js +523 -0
  243. data/app/assets/javascripts/extjs-rails/src/diag/layout/ContextItem.js +179 -0
  244. data/app/assets/javascripts/extjs-rails/src/direct/Event.js +35 -0
  245. data/app/assets/javascripts/extjs-rails/src/direct/ExceptionEvent.js +16 -0
  246. data/app/assets/javascripts/extjs-rails/src/direct/JsonProvider.js +82 -0
  247. data/app/assets/javascripts/extjs-rails/src/direct/Manager.js +263 -0
  248. data/app/assets/javascripts/extjs-rails/src/direct/PollingProvider.js +156 -0
  249. data/app/assets/javascripts/extjs-rails/src/direct/Provider.js +96 -0
  250. data/app/assets/javascripts/extjs-rails/src/direct/RemotingEvent.js +24 -0
  251. data/app/assets/javascripts/extjs-rails/src/direct/RemotingMethod.js +100 -0
  252. data/app/assets/javascripts/extjs-rails/src/direct/RemotingProvider.js +510 -0
  253. data/app/assets/javascripts/extjs-rails/src/direct/Transaction.js +41 -0
  254. data/app/assets/javascripts/extjs-rails/src/dom/Element.alignment.js +378 -0
  255. data/app/assets/javascripts/extjs-rails/src/dom/Element.anim.js +962 -0
  256. data/app/assets/javascripts/extjs-rails/src/dom/Element.dd.js +40 -0
  257. data/app/assets/javascripts/extjs-rails/src/dom/Element.fx.js +194 -0
  258. data/app/assets/javascripts/extjs-rails/src/dom/Element.js +1407 -0
  259. data/app/assets/javascripts/extjs-rails/src/dom/Element.position.js +501 -0
  260. data/app/assets/javascripts/extjs-rails/src/dom/Element.scroll.js +214 -0
  261. data/app/assets/javascripts/extjs-rails/src/dom/Element.style.js +792 -0
  262. data/app/assets/javascripts/extjs-rails/src/dom/Element.traversal.js +8 -0
  263. data/app/assets/javascripts/extjs-rails/src/dom/Helper.js +466 -0
  264. data/app/assets/javascripts/extjs-rails/src/dom/Query.js +1067 -0
  265. data/app/assets/javascripts/extjs-rails/src/draw/Color.js +303 -0
  266. data/app/assets/javascripts/extjs-rails/src/draw/Component.js +245 -0
  267. data/app/assets/javascripts/extjs-rails/src/draw/CompositeSprite.js +299 -0
  268. data/app/assets/javascripts/extjs-rails/src/draw/Draw.js +1217 -0
  269. data/app/assets/javascripts/extjs-rails/src/draw/Matrix.js +183 -0
  270. data/app/assets/javascripts/extjs-rails/src/draw/Sprite.js +554 -0
  271. data/app/assets/javascripts/extjs-rails/src/draw/SpriteDD.js +87 -0
  272. data/app/assets/javascripts/extjs-rails/src/draw/Surface.js +1001 -0
  273. data/app/assets/javascripts/extjs-rails/src/draw/Text.js +175 -0
  274. data/app/assets/javascripts/extjs-rails/src/draw/engine/ImageExporter.js +106 -0
  275. data/app/assets/javascripts/extjs-rails/src/draw/engine/Svg.js +734 -0
  276. data/app/assets/javascripts/extjs-rails/src/draw/engine/SvgExporter.js +280 -0
  277. data/app/assets/javascripts/extjs-rails/src/draw/engine/Vml.js +916 -0
  278. data/app/assets/javascripts/extjs-rails/src/flash/Component.js +248 -0
  279. data/app/assets/javascripts/extjs-rails/src/form/Basic.js +1018 -0
  280. data/app/assets/javascripts/extjs-rails/src/form/CheckboxGroup.js +441 -0
  281. data/app/assets/javascripts/extjs-rails/src/form/CheckboxManager.js +26 -0
  282. data/app/assets/javascripts/extjs-rails/src/form/FieldAncestor.js +210 -0
  283. data/app/assets/javascripts/extjs-rails/src/form/FieldContainer.js +290 -0
  284. data/app/assets/javascripts/extjs-rails/src/form/FieldSet.js +506 -0
  285. data/app/assets/javascripts/extjs-rails/src/form/Label.js +110 -0
  286. data/app/assets/javascripts/extjs-rails/src/form/Labelable.js +764 -0
  287. data/app/assets/javascripts/extjs-rails/src/form/Panel.js +335 -0
  288. data/app/assets/javascripts/extjs-rails/src/form/RadioGroup.js +124 -0
  289. data/app/assets/javascripts/extjs-rails/src/form/RadioManager.js +26 -0
  290. data/app/assets/javascripts/extjs-rails/src/form/action/Action.js +307 -0
  291. data/app/assets/javascripts/extjs-rails/src/form/action/DirectLoad.js +107 -0
  292. data/app/assets/javascripts/extjs-rails/src/form/action/DirectSubmit.js +119 -0
  293. data/app/assets/javascripts/extjs-rails/src/form/action/Load.js +120 -0
  294. data/app/assets/javascripts/extjs-rails/src/form/action/StandardSubmit.js +34 -0
  295. data/app/assets/javascripts/extjs-rails/src/form/action/Submit.js +257 -0
  296. data/app/assets/javascripts/extjs-rails/src/form/field/Base.js +813 -0
  297. data/app/assets/javascripts/extjs-rails/src/form/field/Checkbox.js +505 -0
  298. data/app/assets/javascripts/extjs-rails/src/form/field/ComboBox.js +1427 -0
  299. data/app/assets/javascripts/extjs-rails/src/form/field/Date.js +578 -0
  300. data/app/assets/javascripts/extjs-rails/src/form/field/Display.js +155 -0
  301. data/app/assets/javascripts/extjs-rails/src/form/field/Field.js +430 -0
  302. data/app/assets/javascripts/extjs-rails/src/form/field/File.js +265 -0
  303. data/app/assets/javascripts/extjs-rails/src/form/field/Hidden.js +75 -0
  304. data/app/assets/javascripts/extjs-rails/src/form/field/HtmlEditor.js +1439 -0
  305. data/app/assets/javascripts/extjs-rails/src/form/field/Number.js +380 -0
  306. data/app/assets/javascripts/extjs-rails/src/form/field/Picker.js +321 -0
  307. data/app/assets/javascripts/extjs-rails/src/form/field/Radio.js +279 -0
  308. data/app/assets/javascripts/extjs-rails/src/form/field/Spinner.js +321 -0
  309. data/app/assets/javascripts/extjs-rails/src/form/field/Text.js +727 -0
  310. data/app/assets/javascripts/extjs-rails/src/form/field/TextArea.js +228 -0
  311. data/app/assets/javascripts/extjs-rails/src/form/field/Time.js +459 -0
  312. data/app/assets/javascripts/extjs-rails/src/form/field/Trigger.js +469 -0
  313. data/app/assets/javascripts/extjs-rails/src/form/field/VTypes.js +172 -0
  314. data/app/assets/javascripts/extjs-rails/src/fx/Anim.js +472 -0
  315. data/app/assets/javascripts/extjs-rails/src/fx/Animator.js +410 -0
  316. data/app/assets/javascripts/extjs-rails/src/fx/CubicBezier.js +77 -0
  317. data/app/assets/javascripts/extjs-rails/src/fx/Easing.js +136 -0
  318. data/app/assets/javascripts/extjs-rails/src/fx/Manager.js +353 -0
  319. data/app/assets/javascripts/extjs-rails/src/fx/PropertyHandler.js +381 -0
  320. data/app/assets/javascripts/extjs-rails/src/fx/Queue.js +123 -0
  321. data/app/assets/javascripts/extjs-rails/src/fx/target/Component.js +118 -0
  322. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElement.js +46 -0
  323. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeElementCSS.js +22 -0
  324. data/app/assets/javascripts/extjs-rails/src/fx/target/CompositeSprite.js +34 -0
  325. data/app/assets/javascripts/extjs-rails/src/fx/target/Element.js +83 -0
  326. data/app/assets/javascripts/extjs-rails/src/fx/target/ElementCSS.js +77 -0
  327. data/app/assets/javascripts/extjs-rails/src/fx/target/Sprite.js +128 -0
  328. data/app/assets/javascripts/extjs-rails/src/fx/target/Target.js +36 -0
  329. data/app/assets/javascripts/extjs-rails/src/grid/CellEditor.js +172 -0
  330. data/app/assets/javascripts/extjs-rails/src/grid/ColumnComponentLayout.js +34 -0
  331. data/app/assets/javascripts/extjs-rails/src/grid/ColumnLayout.js +201 -0
  332. data/app/assets/javascripts/extjs-rails/src/grid/Lockable.js +863 -0
  333. data/app/assets/javascripts/extjs-rails/src/grid/LockingView.js +169 -0
  334. data/app/assets/javascripts/extjs-rails/src/grid/PagingScroller.js +539 -0
  335. data/app/assets/javascripts/extjs-rails/src/grid/Panel.js +393 -0
  336. data/app/assets/javascripts/extjs-rails/src/grid/RowEditor.js +731 -0
  337. data/app/assets/javascripts/extjs-rails/src/grid/RowNumberer.js +76 -0
  338. data/app/assets/javascripts/extjs-rails/src/grid/Scroller.js +5 -0
  339. data/app/assets/javascripts/extjs-rails/src/grid/View.js +44 -0
  340. data/app/assets/javascripts/extjs-rails/src/grid/ViewDropZone.js +41 -0
  341. data/app/assets/javascripts/extjs-rails/src/grid/column/Action.js +318 -0
  342. data/app/assets/javascripts/extjs-rails/src/grid/column/Boolean.js +82 -0
  343. data/app/assets/javascripts/extjs-rails/src/grid/column/Column.js +835 -0
  344. data/app/assets/javascripts/extjs-rails/src/grid/column/Date.js +63 -0
  345. data/app/assets/javascripts/extjs-rails/src/grid/column/Number.js +52 -0
  346. data/app/assets/javascripts/extjs-rails/src/grid/column/Template.js +58 -0
  347. data/app/assets/javascripts/extjs-rails/src/grid/feature/AbstractSummary.js +154 -0
  348. data/app/assets/javascripts/extjs-rails/src/grid/feature/Chunking.js +77 -0
  349. data/app/assets/javascripts/extjs-rails/src/grid/feature/Feature.js +158 -0
  350. data/app/assets/javascripts/extjs-rails/src/grid/feature/Grouping.js +822 -0
  351. data/app/assets/javascripts/extjs-rails/src/grid/feature/GroupingSummary.js +243 -0
  352. data/app/assets/javascripts/extjs-rails/src/grid/feature/RowBody.js +116 -0
  353. data/app/assets/javascripts/extjs-rails/src/grid/feature/RowWrap.js +120 -0
  354. data/app/assets/javascripts/extjs-rails/src/grid/feature/Summary.js +167 -0
  355. data/app/assets/javascripts/extjs-rails/src/grid/header/Container.js +965 -0
  356. data/app/assets/javascripts/extjs-rails/src/grid/header/DragZone.js +69 -0
  357. data/app/assets/javascripts/extjs-rails/src/grid/header/DropZone.js +265 -0
  358. data/app/assets/javascripts/extjs-rails/src/grid/plugin/CellEditing.js +453 -0
  359. data/app/assets/javascripts/extjs-rails/src/grid/plugin/DragDrop.js +254 -0
  360. data/app/assets/javascripts/extjs-rails/src/grid/plugin/Editing.js +561 -0
  361. data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderReorderer.js +49 -0
  362. data/app/assets/javascripts/extjs-rails/src/grid/plugin/HeaderResizer.js +292 -0
  363. data/app/assets/javascripts/extjs-rails/src/grid/plugin/RowEditing.js +339 -0
  364. data/app/assets/javascripts/extjs-rails/src/grid/property/Grid.js +351 -0
  365. data/app/assets/javascripts/extjs-rails/src/grid/property/HeaderContainer.js +109 -0
  366. data/app/assets/javascripts/extjs-rails/src/grid/property/Property.js +36 -0
  367. data/app/assets/javascripts/extjs-rails/src/grid/property/Store.js +141 -0
  368. data/app/assets/javascripts/extjs-rails/src/layout/ClassList.js +90 -0
  369. data/app/assets/javascripts/extjs-rails/src/layout/Context.js +1232 -0
  370. data/app/assets/javascripts/extjs-rails/src/layout/ContextItem.js +1470 -0
  371. data/app/assets/javascripts/extjs-rails/src/layout/Layout.js +761 -0
  372. data/app/assets/javascripts/extjs-rails/src/layout/component/Auto.js +220 -0
  373. data/app/assets/javascripts/extjs-rails/src/layout/component/Body.js +80 -0
  374. data/app/assets/javascripts/extjs-rails/src/layout/component/BoundList.js +95 -0
  375. data/app/assets/javascripts/extjs-rails/src/layout/component/Button.js +261 -0
  376. data/app/assets/javascripts/extjs-rails/src/layout/component/Component.js +427 -0
  377. data/app/assets/javascripts/extjs-rails/src/layout/component/Dock.js +1132 -0
  378. data/app/assets/javascripts/extjs-rails/src/layout/component/Draw.js +79 -0
  379. data/app/assets/javascripts/extjs-rails/src/layout/component/FieldSet.js +62 -0
  380. data/app/assets/javascripts/extjs-rails/src/layout/component/ProgressBar.js +54 -0
  381. data/app/assets/javascripts/extjs-rails/src/layout/component/Tab.js +23 -0
  382. data/app/assets/javascripts/extjs-rails/src/layout/component/field/ComboBox.js +52 -0
  383. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Field.js +372 -0
  384. data/app/assets/javascripts/extjs-rails/src/layout/component/field/FieldContainer.js +48 -0
  385. data/app/assets/javascripts/extjs-rails/src/layout/component/field/HtmlEditor.js +54 -0
  386. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Slider.js +58 -0
  387. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Text.js +75 -0
  388. data/app/assets/javascripts/extjs-rails/src/layout/component/field/TextArea.js +51 -0
  389. data/app/assets/javascripts/extjs-rails/src/layout/component/field/Trigger.js +132 -0
  390. data/app/assets/javascripts/extjs-rails/src/layout/container/Absolute.js +121 -0
  391. data/app/assets/javascripts/extjs-rails/src/layout/container/Accordion.js +308 -0
  392. data/app/assets/javascripts/extjs-rails/src/layout/container/Anchor.js +403 -0
  393. data/app/assets/javascripts/extjs-rails/src/layout/container/Auto.js +70 -0
  394. data/app/assets/javascripts/extjs-rails/src/layout/container/Border-old-js +1079 -0
  395. data/app/assets/javascripts/extjs-rails/src/layout/container/Border.js +816 -0
  396. data/app/assets/javascripts/extjs-rails/src/layout/container/Box.js +929 -0
  397. data/app/assets/javascripts/extjs-rails/src/layout/container/Card.js +361 -0
  398. data/app/assets/javascripts/extjs-rails/src/layout/container/CheckboxGroup.js +376 -0
  399. data/app/assets/javascripts/extjs-rails/src/layout/container/Column.js +234 -0
  400. data/app/assets/javascripts/extjs-rails/src/layout/container/Container.js +961 -0
  401. data/app/assets/javascripts/extjs-rails/src/layout/container/Editor.js +74 -0
  402. data/app/assets/javascripts/extjs-rails/src/layout/container/Fit.js +287 -0
  403. data/app/assets/javascripts/extjs-rails/src/layout/container/Form.js +157 -0
  404. data/app/assets/javascripts/extjs-rails/src/layout/container/HBox.js +134 -0
  405. data/app/assets/javascripts/extjs-rails/src/layout/container/Table.js +412 -0
  406. data/app/assets/javascripts/extjs-rails/src/layout/container/VBox.js +139 -0
  407. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Menu.js +365 -0
  408. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/None.js +83 -0
  409. data/app/assets/javascripts/extjs-rails/src/layout/container/boxOverflow/Scroller.js +475 -0
  410. data/app/assets/javascripts/extjs-rails/src/menu/CheckItem.js +169 -0
  411. data/app/assets/javascripts/extjs-rails/src/menu/ColorPicker.js +110 -0
  412. data/app/assets/javascripts/extjs-rails/src/menu/DatePicker.js +100 -0
  413. data/app/assets/javascripts/extjs-rails/src/menu/Item.js +553 -0
  414. data/app/assets/javascripts/extjs-rails/src/menu/KeyNav.js +134 -0
  415. data/app/assets/javascripts/extjs-rails/src/menu/Manager.js +219 -0
  416. data/app/assets/javascripts/extjs-rails/src/menu/Menu.js +579 -0
  417. data/app/assets/javascripts/extjs-rails/src/menu/Separator.js +126 -0
  418. data/app/assets/javascripts/extjs-rails/src/panel/AbstractPanel.js +323 -0
  419. data/app/assets/javascripts/extjs-rails/src/panel/DD.js +99 -0
  420. data/app/assets/javascripts/extjs-rails/src/panel/Header.js +518 -0
  421. data/app/assets/javascripts/extjs-rails/src/panel/Panel.js +2150 -0
  422. data/app/assets/javascripts/extjs-rails/src/panel/Proxy.js +131 -0
  423. data/app/assets/javascripts/extjs-rails/src/panel/Table.js +1018 -0
  424. data/app/assets/javascripts/extjs-rails/src/panel/Tool.js +304 -0
  425. data/app/assets/javascripts/extjs-rails/src/picker/Color.js +219 -0
  426. data/app/assets/javascripts/extjs-rails/src/picker/Date.js +1140 -0
  427. data/app/assets/javascripts/extjs-rails/src/picker/Month.js +490 -0
  428. data/app/assets/javascripts/extjs-rails/src/picker/Time.js +165 -0
  429. data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitter.js +22 -0
  430. data/app/assets/javascripts/extjs-rails/src/resizer/BorderSplitterTracker.js +210 -0
  431. data/app/assets/javascripts/extjs-rails/src/resizer/Handle.js +29 -0
  432. data/app/assets/javascripts/extjs-rails/src/resizer/ResizeTracker.js +346 -0
  433. data/app/assets/javascripts/extjs-rails/src/resizer/Resizer.js +477 -0
  434. data/app/assets/javascripts/extjs-rails/src/resizer/Splitter.js +242 -0
  435. data/app/assets/javascripts/extjs-rails/src/resizer/SplitterTracker.js +230 -0
  436. data/app/assets/javascripts/extjs-rails/src/selection/CellModel.js +395 -0
  437. data/app/assets/javascripts/extjs-rails/src/selection/CheckboxModel.js +234 -0
  438. data/app/assets/javascripts/extjs-rails/src/selection/DataViewModel.js +160 -0
  439. data/app/assets/javascripts/extjs-rails/src/selection/Model.js +646 -0
  440. data/app/assets/javascripts/extjs-rails/src/selection/RowModel.js +499 -0
  441. data/app/assets/javascripts/extjs-rails/src/selection/TreeModel.js +78 -0
  442. data/app/assets/javascripts/extjs-rails/src/slider/Multi.js +835 -0
  443. data/app/assets/javascripts/extjs-rails/src/slider/Single.js +56 -0
  444. data/app/assets/javascripts/extjs-rails/src/slider/Thumb.js +259 -0
  445. data/app/assets/javascripts/extjs-rails/src/slider/Tip.js +130 -0
  446. data/app/assets/javascripts/extjs-rails/src/state/CookieProvider.js +120 -0
  447. data/app/assets/javascripts/extjs-rails/src/state/LocalStorageProvider.js +72 -0
  448. data/app/assets/javascripts/extjs-rails/src/state/Manager.js +70 -0
  449. data/app/assets/javascripts/extjs-rails/src/state/Provider.js +182 -0
  450. data/app/assets/javascripts/extjs-rails/src/state/Stateful.js +364 -0
  451. data/app/assets/javascripts/extjs-rails/src/tab/Bar.js +258 -0
  452. data/app/assets/javascripts/extjs-rails/src/tab/Panel.js +654 -0
  453. data/app/assets/javascripts/extjs-rails/src/tab/Tab.js +358 -0
  454. data/app/assets/javascripts/extjs-rails/src/tail.js +10 -0
  455. data/app/assets/javascripts/extjs-rails/src/tip/QuickTip.js +335 -0
  456. data/app/assets/javascripts/extjs-rails/src/tip/QuickTipManager.js +239 -0
  457. data/app/assets/javascripts/extjs-rails/src/tip/Tip.js +160 -0
  458. data/app/assets/javascripts/extjs-rails/src/tip/ToolTip.js +691 -0
  459. data/app/assets/javascripts/extjs-rails/src/toolbar/Fill.js +28 -0
  460. data/app/assets/javascripts/extjs-rails/src/toolbar/Item.js +16 -0
  461. data/app/assets/javascripts/extjs-rails/src/toolbar/Paging.js +600 -0
  462. data/app/assets/javascripts/extjs-rails/src/toolbar/Separator.js +23 -0
  463. data/app/assets/javascripts/extjs-rails/src/toolbar/Spacer.js +33 -0
  464. data/app/assets/javascripts/extjs-rails/src/toolbar/TextItem.js +57 -0
  465. data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar-legacy.js +123 -0
  466. data/app/assets/javascripts/extjs-rails/src/toolbar/Toolbar.js +447 -0
  467. data/app/assets/javascripts/extjs-rails/src/tree/Column.js +90 -0
  468. data/app/assets/javascripts/extjs-rails/src/tree/Panel.js +505 -0
  469. data/app/assets/javascripts/extjs-rails/src/tree/View.js +658 -0
  470. data/app/assets/javascripts/extjs-rails/src/tree/ViewDragZone.js +49 -0
  471. data/app/assets/javascripts/extjs-rails/src/tree/ViewDropZone.js +287 -0
  472. data/app/assets/javascripts/extjs-rails/src/tree/plugin/TreeViewDragDrop.js +244 -0
  473. data/app/assets/javascripts/extjs-rails/src/util/AbstractMixedCollection.js +772 -0
  474. data/app/assets/javascripts/extjs-rails/src/util/Animate.js +426 -0
  475. data/app/assets/javascripts/extjs-rails/src/util/Bindable.js +102 -0
  476. data/app/assets/javascripts/extjs-rails/src/util/CSS.js +185 -0
  477. data/app/assets/javascripts/extjs-rails/src/util/ClickRepeater.js +238 -0
  478. data/app/assets/javascripts/extjs-rails/src/util/ComponentDragger.js +126 -0
  479. data/app/assets/javascripts/extjs-rails/src/util/Cookies.js +91 -0
  480. data/app/assets/javascripts/extjs-rails/src/util/ElementContainer.js +293 -0
  481. data/app/assets/javascripts/extjs-rails/src/util/Filter.js +159 -0
  482. data/app/assets/javascripts/extjs-rails/src/util/Floating.js +321 -0
  483. data/app/assets/javascripts/extjs-rails/src/util/Grouper.js +26 -0
  484. data/app/assets/javascripts/extjs-rails/src/util/HashMap.js +356 -0
  485. data/app/assets/javascripts/extjs-rails/src/util/History.js +285 -0
  486. data/app/assets/javascripts/extjs-rails/src/util/Inflector.js +297 -0
  487. data/app/assets/javascripts/extjs-rails/src/util/KeyMap.js +427 -0
  488. data/app/assets/javascripts/extjs-rails/src/util/KeyNav.js +239 -0
  489. data/app/assets/javascripts/extjs-rails/src/util/LruCache.js +257 -0
  490. data/app/assets/javascripts/extjs-rails/src/util/Memento.js +131 -0
  491. data/app/assets/javascripts/extjs-rails/src/util/MixedCollection.js +239 -0
  492. data/app/assets/javascripts/extjs-rails/src/util/Observable.js +1003 -0
  493. data/app/assets/javascripts/extjs-rails/src/util/Offset.js +60 -0
  494. data/app/assets/javascripts/extjs-rails/src/util/Point.js +93 -0
  495. data/app/assets/javascripts/extjs-rails/src/util/ProtoElement.js +205 -0
  496. data/app/assets/javascripts/extjs-rails/src/util/Queue.js +76 -0
  497. data/app/assets/javascripts/extjs-rails/src/util/Region.js +388 -0
  498. data/app/assets/javascripts/extjs-rails/src/util/Renderable.js +1079 -0
  499. data/app/assets/javascripts/extjs-rails/src/util/Sortable.js +248 -0
  500. data/app/assets/javascripts/extjs-rails/src/util/Sorter.js +179 -0
  501. data/app/assets/javascripts/extjs-rails/src/util/TextMetrics.js +148 -0
  502. data/app/assets/javascripts/extjs-rails/src/view/AbstractView.js +1103 -0
  503. data/app/assets/javascripts/extjs-rails/src/view/BoundList.js +207 -0
  504. data/app/assets/javascripts/extjs-rails/src/view/BoundListKeyNav.js +92 -0
  505. data/app/assets/javascripts/extjs-rails/src/view/DragZone.js +106 -0
  506. data/app/assets/javascripts/extjs-rails/src/view/DropZone.js +240 -0
  507. data/app/assets/javascripts/extjs-rails/src/view/Table.js +1229 -0
  508. data/app/assets/javascripts/extjs-rails/src/view/TableChunker.js +139 -0
  509. data/app/assets/javascripts/extjs-rails/src/view/View.js +636 -0
  510. data/app/assets/javascripts/extjs-rails/src/window/MessageBox.js +880 -0
  511. data/app/assets/javascripts/extjs-rails/src/window/Window-legacy.js +56 -0
  512. data/app/assets/javascripts/extjs-rails/src/window/Window.js +793 -0
  513. data/extjs-rails.gemspec +24 -0
  514. data/lib/extjs-rails.rb +7 -0
  515. data/lib/extjs-rails/engine.rb +7 -0
  516. data/lib/extjs-rails/version.rb +5 -0
  517. metadata +660 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @class Ext.fx.target.Target
3
+
4
+ This class specifies a generic target for an animation. It provides a wrapper around a
5
+ series of different types of objects to allow for a generic animation API.
6
+ A target can be a single object or a Composite object containing other objects that are
7
+ to be animated. This class and it's subclasses are generally not created directly, the
8
+ underlying animation will create the appropriate Ext.fx.target.Target object by passing
9
+ the instance to be animated.
10
+
11
+ The following types of objects can be animated:
12
+
13
+ - {@link Ext.fx.target.Component Components}
14
+ - {@link Ext.fx.target.Element Elements}
15
+ - {@link Ext.fx.target.Sprite Sprites}
16
+
17
+ * @markdown
18
+ * @abstract
19
+ */
20
+ Ext.define('Ext.fx.target.Target', {
21
+
22
+ isAnimTarget: true,
23
+
24
+ /**
25
+ * Creates new Target.
26
+ * @param {Ext.Component/Ext.Element/Ext.draw.Sprite} target The object to be animated
27
+ */
28
+ constructor: function(target) {
29
+ this.target = target;
30
+ this.id = this.getId();
31
+ },
32
+
33
+ getId: function() {
34
+ return this.target.id;
35
+ }
36
+ });
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Internal utility class that provides default configuration for cell editing.
3
+ * @private
4
+ */
5
+ Ext.define('Ext.grid.CellEditor', {
6
+ extend: 'Ext.Editor',
7
+ constructor: function(config) {
8
+ config = Ext.apply({}, config);
9
+
10
+ if (config.field) {
11
+ config.field.monitorTab = false;
12
+ }
13
+ this.callParent([config]);
14
+ },
15
+
16
+ /**
17
+ * @private
18
+ * Hide the grid cell text when editor is shown.
19
+ *
20
+ * There are 2 reasons this needs to happen:
21
+ *
22
+ * 1. checkbox editor does not take up enough space to hide the underlying text.
23
+ *
24
+ * 2. When columnLines are turned off in browsers that don't support text-overflow:
25
+ * ellipsis (firefox 6 and below and IE quirks), the text extends to the last pixel
26
+ * in the cell, however the right border of the cell editor is always positioned 1px
27
+ * offset from the edge of the cell (to give it the appearance of being "inside" the
28
+ * cell. This results in 1px of the underlying cell text being visible to the right
29
+ * of the cell editor if the text is not hidden.
30
+ *
31
+ * We can't just hide the entire cell, because then treecolumn's icons would be hidden
32
+ * as well. We also can't just set "color: transparent" to hide the text because it is
33
+ * not supported by IE8 and below. The only remaining solution is to remove the text
34
+ * from the text node and then add it back when the editor is hidden.
35
+ */
36
+ onShow: function() {
37
+ var me = this,
38
+ innerCell = me.boundEl.first(),
39
+ lastChild,
40
+ textNode;
41
+
42
+ if (innerCell) {
43
+ lastChild = innerCell.dom.lastChild;
44
+ if(lastChild && lastChild.nodeType === 3) {
45
+ // if the cell has a text node, save a reference to it
46
+ textNode = me.cellTextNode = innerCell.dom.lastChild;
47
+ // save the cell text so we can add it back when we're done editing
48
+ me.cellTextValue = textNode.nodeValue;
49
+ // The text node has to have at least one character in it, or the cell borders
50
+ // in IE quirks mode will not show correctly, so let's use a non-breaking space.
51
+ textNode.nodeValue = '\u00a0';
52
+ }
53
+ }
54
+ me.callParent(arguments);
55
+ },
56
+
57
+ /**
58
+ * @private
59
+ * Show the grid cell text when the editor is hidden by adding the text back to the text node
60
+ */
61
+ onHide: function() {
62
+ var me = this,
63
+ innerCell = me.boundEl.first();
64
+
65
+ if (innerCell && me.cellTextNode) {
66
+ me.cellTextNode.nodeValue = me.cellTextValue;
67
+ delete me.cellTextNode;
68
+ delete me.cellTextValue;
69
+ }
70
+ me.callParent(arguments);
71
+ },
72
+
73
+ /**
74
+ * @private
75
+ * Fix checkbox blur when it is clicked.
76
+ */
77
+ afterRender: function() {
78
+ var me = this,
79
+ field = me.field;
80
+
81
+ me.callParent(arguments);
82
+ if (field.isXType('checkboxfield')) {
83
+ field.mon(field.inputEl, {
84
+ mousedown: me.onCheckBoxMouseDown,
85
+ click: me.onCheckBoxClick,
86
+ scope: me
87
+ });
88
+ }
89
+ },
90
+
91
+ /**
92
+ * @private
93
+ * Because when checkbox is clicked it loses focus completeEdit is bypassed.
94
+ */
95
+ onCheckBoxMouseDown: function() {
96
+ this.completeEdit = Ext.emptyFn;
97
+ },
98
+
99
+ /**
100
+ * @private
101
+ * Restore checkbox focus and completeEdit method.
102
+ */
103
+ onCheckBoxClick: function() {
104
+ delete this.completeEdit;
105
+ this.field.focus(false, 10);
106
+ },
107
+
108
+ /**
109
+ * @private
110
+ * Realigns the Editor to the grid cell, or to the text node in the grid inner cell
111
+ * if the inner cell contains multiple child nodes.
112
+ */
113
+ realign: function(autoSize) {
114
+ var me = this,
115
+ boundEl = me.boundEl,
116
+ innerCell = boundEl.first(),
117
+ children = innerCell.dom.childNodes,
118
+ childCount = children.length,
119
+ offsets = Ext.Array.clone(me.offsets),
120
+ inputEl = me.field.inputEl,
121
+ lastChild, leftBound, rightBound, width;
122
+
123
+ // If the inner cell has more than one child, or the first child node is not a text node,
124
+ // let's assume this cell contains additional elements before the text node.
125
+ // This is the case for tree cells, but could also be used to accomodate grid cells that
126
+ // have a custom renderer that render, say, an icon followed by some text for example
127
+ // For now however, this support will only be used for trees.
128
+ if(me.isForTree && (childCount > 1 || (childCount === 1 && children[0].nodeType !== 3))) {
129
+ // get the inner cell's last child
130
+ lastChild = innerCell.last();
131
+ // calculate the left bound of the text node
132
+ leftBound = lastChild.getOffsetsTo(innerCell)[0] + lastChild.getWidth();
133
+ // calculate the right bound of the text node (this is assumed to be the right edge of
134
+ // the inner cell, since we are assuming the text node is always the last node in the
135
+ // inner cell)
136
+ rightBound = innerCell.getWidth();
137
+ // difference between right and left bound is the text node's allowed "width",
138
+ // this will be used as the width for the editor.
139
+ width = rightBound - leftBound;
140
+ // adjust width for column lines - this ensures the editor will be the same width
141
+ // regardless of columLines config
142
+ if(!me.editingPlugin.grid.columnLines) {
143
+ width --;
144
+ }
145
+ // set the editor's x offset to the left bound position
146
+ offsets[0] += leftBound;
147
+
148
+ me.addCls(Ext.baseCSSPrefix + 'grid-editor-on-text-node');
149
+ } else {
150
+ width = boundEl.getWidth() - 1;
151
+ }
152
+
153
+ if (autoSize === true) {
154
+ me.field.setWidth(width);
155
+ }
156
+
157
+ me.alignTo(boundEl, me.alignment, offsets);
158
+ },
159
+
160
+ onEditorTab: function(e){
161
+ var field = this.field;
162
+ if (field.onEditorTab) {
163
+ field.onEditorTab(e);
164
+ }
165
+ },
166
+
167
+ alignment: "tl-tl",
168
+ hideEl : false,
169
+ cls: Ext.baseCSSPrefix + "small-editor " + Ext.baseCSSPrefix + "grid-editor",
170
+ shim: false,
171
+ shadow: false
172
+ });
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Component layout for grid column headers which have a title element at the top followed by content.
3
+ * @private
4
+ */
5
+ Ext.define('Ext.grid.ColumnComponentLayout', {
6
+ extend: 'Ext.layout.component.Auto',
7
+ alias: 'layout.columncomponent',
8
+
9
+ type: 'columncomponent',
10
+
11
+ setWidthInDom: true,
12
+
13
+ getContentHeight : function(ownerContext) {
14
+ // If we are a group header return container layout's contentHeight, else default to AutoComponent's answer
15
+ return this.owner.isGroupHeader ? ownerContext.getProp('contentHeight') : this.callParent(arguments);
16
+ },
17
+
18
+ calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
19
+ var result = this.callParent(arguments);
20
+ if (this.owner.isGroupHeader) {
21
+ result += this.owner.titleEl.dom.offsetHeight;
22
+ }
23
+ return result;
24
+ },
25
+
26
+ getContentWidth : function(ownerContext) {
27
+ // If we are a group header return container layout's contentHeight, else default to AutoComponent's answer
28
+ return this.owner.isGroupHeader ? ownerContext.getProp('contentWidth') : this.callParent(arguments);
29
+ },
30
+
31
+ calculateOwnerWidthFromContentWidth: function (ownerContext, contentWidth) {
32
+ return contentWidth + ownerContext.getPaddingInfo().width;
33
+ }
34
+ });
@@ -0,0 +1,201 @@
1
+ /**
2
+ * @private
3
+ *
4
+ * This class is used only by the grid's HeaderContainer docked child.
5
+ *
6
+ * It adds the ability to shrink the vertical size of the inner container element back if a grouped
7
+ * column header has all its child columns dragged out, and the whole HeaderContainer needs to shrink back down.
8
+ *
9
+ * Also, after every layout, after all headers have attained their 'stretchmax' height, it goes through and calls
10
+ * `setPadding` on the columns so that they lay out correctly.
11
+ */
12
+ Ext.define('Ext.grid.ColumnLayout', {
13
+ extend: 'Ext.layout.container.HBox',
14
+ alias: 'layout.gridcolumn',
15
+ type : 'gridcolumn',
16
+
17
+ reserveOffset: false,
18
+
19
+ firstHeaderCls: Ext.baseCSSPrefix + 'column-header-first',
20
+ lastHeaderCls: Ext.baseCSSPrefix + 'column-header-last',
21
+
22
+ // Collect the height of the table of data upon layout begin
23
+ beginLayout: function (ownerContext) {
24
+ var me = this,
25
+ owner = me.owner,
26
+ grid = owner.up('[scrollerOwner]'),
27
+ view = grid.view,
28
+ i = 0,
29
+ items = me.getVisibleItems(),
30
+ len = items.length,
31
+ item;
32
+
33
+ // If we are one side of a locking grid, then if we are on the "normal" side, we have to grab the normal view
34
+ // for use in determining whether to subtract scrollbar width from available width.
35
+ // The locked side does not have scrollbars, so it should not look at the view.
36
+ if (grid.lockable) {
37
+ if (me.owner.up('tablepanel') === view.normalGrid) {
38
+ view = view.normalGrid.getView();
39
+ } else {
40
+ view = null;
41
+ }
42
+ }
43
+
44
+ me.callParent(arguments);
45
+
46
+ // Unstretch child items before the layout which stretches them.
47
+ for (; i < len; i++) {
48
+ item = items[i];
49
+ item.removeCls([me.firstHeaderCls, me.lastHeaderCls]);
50
+ item.el.setStyle({
51
+ height: 'auto'
52
+ });
53
+ item.titleEl.setStyle({
54
+ height: 'auto',
55
+ paddingTop: '' // reset back to default padding of the style
56
+ });
57
+ }
58
+
59
+ // Add special first/last classes
60
+ if (len > 0) {
61
+ items[0].addCls(me.firstHeaderCls);
62
+ items[len - 1].addCls(me.lastHeaderCls);
63
+ }
64
+
65
+ // If the owner is the grid's HeaderContainer, and the UI displays old fashioned scrollbars and there is a rendered View with data in it,
66
+ // collect the View context to interrogate it for overflow, and possibly invalidate it if there is overflow
67
+ if (!me.owner.isHeader && Ext.getScrollbarSize().width && !grid.collapsed && view &&
68
+ view.rendered && (ownerContext.viewTable = view.el.child('table', true))) {
69
+ ownerContext.viewContext = ownerContext.context.getCmp(view);
70
+ }
71
+ },
72
+
73
+ roundFlex: function(width) {
74
+ return Math.floor(width);
75
+ },
76
+
77
+ /**
78
+ * @private
79
+ * Local getContainerSize implementation accounts for vertical scrollbar in the view.
80
+ */
81
+ getContainerSize: function(ownerContext) {
82
+ var me = this,
83
+ result = me.callParent(arguments),
84
+ viewContext = ownerContext.viewContext,
85
+ viewHeight;
86
+
87
+ // If we've collected a viewContext, we will also have the table height
88
+ // If there's overflow, the View must be narrower to accomodate the scrollbar
89
+ if (viewContext && !viewContext.heightModel.shrinkWrap &&
90
+ viewContext.target.componentLayout.ownerContext) { // if (its layout is running)
91
+ viewHeight = viewContext.getProp('height');
92
+ if (isNaN(viewHeight)) {
93
+ me.done = false;
94
+ } else if (ownerContext.state.tableHeight > viewHeight) {
95
+ result.width -= Ext.getScrollbarSize().width;
96
+ ownerContext.state.parallelDone = false;
97
+ viewContext.invalidate();
98
+ }
99
+ }
100
+
101
+ // TODO - flip the initial assumption to "we have a vscroll" to avoid the invalidate in most
102
+ // cases (and the expensive ones to boot)
103
+
104
+ return result;
105
+ },
106
+
107
+ calculate: function(ownerContext) {
108
+ var me = this,
109
+ viewContext = ownerContext.viewContext;
110
+
111
+ // Collect the height of the data table if we need it to determine overflow
112
+ if (viewContext && !ownerContext.state.tableHeight) {
113
+ ownerContext.state.tableHeight = ownerContext.viewTable.offsetHeight;
114
+ }
115
+ me.callParent(arguments);
116
+ },
117
+
118
+ completeLayout: function(ownerContext) {
119
+ var me = this,
120
+ owner = me.owner,
121
+ state = ownerContext.state,
122
+ needsInvalidate = false,
123
+ calculated = me.sizeModels.calculated,
124
+ childItems, len, i, childContext, item;
125
+
126
+ me.callParent(arguments);
127
+
128
+ // If we have not been through this already, and the owning Container is configured
129
+ // forceFit, is not a group column and and there is a valid width, then convert
130
+ // widths to flexes, and loop back.
131
+ if (!state.flexesCalculated && owner.forceFit && !owner.isHeader) {
132
+ childItems = ownerContext.childItems;
133
+ len = childItems.length;
134
+
135
+ for (i = 0; i < len; i++) {
136
+ childContext = childItems[i];
137
+ item = childContext.target;
138
+
139
+ // For forceFit, just use allocated width as the flex value, and the proportions
140
+ // will end up the same whatever HeaderContainer width they are being forced into.
141
+ if (item.width) {
142
+ item.flex = ownerContext.childItems[i].flex = item.width;
143
+ delete item.width;
144
+ childContext.widthModel = calculated;
145
+ needsInvalidate = true;
146
+ }
147
+ }
148
+
149
+ // Recalculate based upon all columns now being flexed instead of sized.
150
+ // Set flag, so that we do not do this infinitely
151
+ if (needsInvalidate) {
152
+ me.cacheFlexes(ownerContext);
153
+ ownerContext.invalidate({
154
+ state: {
155
+ flexesCalculated: true
156
+ }
157
+ });
158
+ }
159
+ }
160
+ },
161
+
162
+ finalizeLayout: function() {
163
+ var me = this,
164
+ i = 0,
165
+ items,
166
+ len,
167
+ itemsHeight,
168
+ owner = me.owner,
169
+ titleEl = owner.titleEl;
170
+
171
+ // Set up padding in items
172
+ items = me.getVisibleItems();
173
+ len = items.length;
174
+ // header container's items take up the whole height
175
+ itemsHeight = owner.el.getViewSize().height;
176
+ if (titleEl) {
177
+ // if owner is a grouped column with children, we need to subtract the titleEl's height
178
+ // to determine the remaining available height for the child items
179
+ itemsHeight -= titleEl.getHeight();
180
+ }
181
+ for (; i < len; i++) {
182
+ items[i].setPadding(itemsHeight);
183
+ }
184
+ },
185
+
186
+ // FIX: when flexing we actually don't have enough space as we would
187
+ // typically because of the scrollOffset on the GridView, must reserve this
188
+ publishInnerCtSize: function(ownerContext) {
189
+ var me = this,
190
+ plan = ownerContext.state.boxPlan,
191
+ size = plan.targetSize,
192
+ cw = ownerContext.peek('contentWidth');
193
+
194
+ // InnerCt MUST stretch to accommodate all columns so that left/right scrolling is enabled in the header container.
195
+ if ((cw != null) && !me.owner.isHeader) {
196
+ size.width = cw + Ext.getScrollbarSize().width;
197
+ }
198
+
199
+ return me.callParent(arguments);
200
+ }
201
+ });
@@ -0,0 +1,863 @@
1
+ /**
2
+ * @private
3
+ *
4
+ * Lockable is a private mixin which injects lockable behavior into any
5
+ * TablePanel subclass such as GridPanel or TreePanel. TablePanel will
6
+ * automatically inject the Ext.grid.Lockable mixin in when one of the
7
+ * these conditions are met:
8
+ *
9
+ * - The TablePanel has the lockable configuration set to true
10
+ * - One of the columns in the TablePanel has locked set to true/false
11
+ *
12
+ * Each TablePanel subclass must register an alias. It should have an array
13
+ * of configurations to copy to the 2 separate tablepanel's that will be generated
14
+ * to note what configurations should be copied. These are named normalCfgCopy and
15
+ * lockedCfgCopy respectively.
16
+ *
17
+ * Columns which are locked must specify a fixed width. They do NOT support a
18
+ * flex width.
19
+ *
20
+ * Configurations which are specified in this class will be available on any grid or
21
+ * tree which is using the lockable functionality.
22
+ */
23
+ Ext.define('Ext.grid.Lockable', {
24
+
25
+ requires: [
26
+ 'Ext.grid.LockingView',
27
+ 'Ext.view.Table'
28
+ ],
29
+
30
+ /**
31
+ * @cfg {Boolean} syncRowHeight Synchronize rowHeight between the normal and
32
+ * locked grid view. This is turned on by default. If your grid is guaranteed
33
+ * to have rows of all the same height, you should set this to false to
34
+ * optimize performance.
35
+ */
36
+ syncRowHeight: true,
37
+
38
+ /**
39
+ * @cfg {String} subGridXType The xtype of the subgrid to specify. If this is
40
+ * not specified lockable will determine the subgrid xtype to create by the
41
+ * following rule. Use the superclasses xtype if the superclass is NOT
42
+ * tablepanel, otherwise use the xtype itself.
43
+ */
44
+
45
+ /**
46
+ * @cfg {Object} lockedViewConfig A view configuration to be applied to the
47
+ * locked side of the grid. Any conflicting configurations between lockedViewConfig
48
+ * and viewConfig will be overwritten by the lockedViewConfig.
49
+ */
50
+
51
+ /**
52
+ * @cfg {Object} normalViewConfig A view configuration to be applied to the
53
+ * normal/unlocked side of the grid. Any conflicting configurations between normalViewConfig
54
+ * and viewConfig will be overwritten by the normalViewConfig.
55
+ */
56
+
57
+ headerCounter: 0,
58
+
59
+ /**
60
+ * @cfg {Number} scrollDelta
61
+ * Number of pixels to scroll when scrolling the locked section with mousewheel.
62
+ */
63
+ scrollDelta: 40,
64
+
65
+ /**
66
+ * @cfg {Object} lockedGridConfig
67
+ * Any special configuration options for the locked part of the grid
68
+ */
69
+
70
+ /**
71
+ * @cfg {Object} normalGridConfig
72
+ * Any special configuration options for the normal part of the grid
73
+ */
74
+
75
+ // i8n text
76
+ //<locale>
77
+ unlockText: 'Unlock',
78
+ //</locale>
79
+ //<locale>
80
+ lockText: 'Lock',
81
+ //</locale>
82
+
83
+ determineXTypeToCreate: function() {
84
+ var me = this,
85
+ typeToCreate,
86
+ xtypes, xtypesLn, xtype, superxtype;
87
+
88
+ if (me.subGridXType) {
89
+ typeToCreate = me.subGridXType;
90
+ } else {
91
+ xtypes = this.getXTypes().split('/');
92
+ xtypesLn = xtypes.length;
93
+ xtype = xtypes[xtypesLn - 1];
94
+ superxtype = xtypes[xtypesLn - 2];
95
+
96
+ if (superxtype !== 'tablepanel') {
97
+ typeToCreate = superxtype;
98
+ } else {
99
+ typeToCreate = xtype;
100
+ }
101
+ }
102
+
103
+ return typeToCreate;
104
+ },
105
+
106
+ // injectLockable will be invoked before initComponent's parent class implementation
107
+ // is called, so throughout this method this. are configurations
108
+ injectLockable: function() {
109
+ // ensure lockable is set to true in the TablePanel
110
+ this.lockable = true;
111
+ // Instruct the TablePanel it already has a view and not to create one.
112
+ // We are going to aggregate 2 copies of whatever TablePanel we are using
113
+ this.hasView = true;
114
+
115
+ var me = this,
116
+ // If the OS does not show a space-taking scrollbar, the locked view can be overflow:auto
117
+ scrollLocked = Ext.getScrollbarSize().width === 0,
118
+ store = me.store = Ext.StoreManager.lookup(me.store),
119
+ // xtype of this class, 'treepanel' or 'gridpanel'
120
+ // (Note: this makes it a requirement that any subclass that wants to use lockable functionality needs to register an
121
+ // alias.)
122
+ xtype = me.determineXTypeToCreate(),
123
+ // share the selection model
124
+ selModel = me.getSelectionModel(),
125
+ lockedFeatures = me.prepareFeatures(),
126
+ normalFeatures = me.prepareFeatures(),
127
+ lockedGrid,
128
+ normalGrid,
129
+ i = 0, len,
130
+ columns,
131
+ lockedHeaderCt,
132
+ normalHeaderCt,
133
+ lockedView,
134
+ normalView,
135
+ listeners;
136
+
137
+ // Each Feature must have a reference to its counterpart on the opposite side of the locking view
138
+ for (i = 0, len = (lockedFeatures ? lockedFeatures.length : 0); i < len; i++) {
139
+ lockedFeatures[i].lockingPartner = normalFeatures[i];
140
+ normalFeatures[i].lockingPartner = lockedFeatures[i];
141
+ }
142
+
143
+ lockedGrid = Ext.apply({
144
+ xtype: xtype,
145
+ store: store,
146
+ scrollerOwner: false,
147
+ // Lockable does NOT support animations for Tree
148
+ enableAnimations: false,
149
+ scroll: scrollLocked ? 'vertical' : false,
150
+ selModel: selModel,
151
+ border: false,
152
+ cls: Ext.baseCSSPrefix + 'grid-inner-locked',
153
+ isLayoutRoot: function() {
154
+ return false;
155
+ },
156
+ features: lockedFeatures
157
+ }, me.lockedGridConfig);
158
+
159
+ normalGrid = Ext.apply({
160
+ xtype: xtype,
161
+ store: store,
162
+ scrollerOwner: false,
163
+ enableAnimations: false,
164
+ selModel: selModel,
165
+ border: false,
166
+ isLayoutRoot: function() {
167
+ return false;
168
+ },
169
+ features: normalFeatures
170
+ }, me.normalGridConfig);
171
+
172
+ me.addCls(Ext.baseCSSPrefix + 'grid-locked');
173
+
174
+ // copy appropriate configurations to the respective
175
+ // aggregated tablepanel instances and then delete them
176
+ // from the master tablepanel.
177
+ Ext.copyTo(normalGrid, me, me.bothCfgCopy);
178
+ Ext.copyTo(lockedGrid, me, me.bothCfgCopy);
179
+ Ext.copyTo(normalGrid, me, me.normalCfgCopy);
180
+ Ext.copyTo(lockedGrid, me, me.lockedCfgCopy);
181
+ for (i = 0; i < me.normalCfgCopy.length; i++) {
182
+ delete me[me.normalCfgCopy[i]];
183
+ }
184
+ for (i = 0; i < me.lockedCfgCopy.length; i++) {
185
+ delete me[me.lockedCfgCopy[i]];
186
+ }
187
+
188
+ me.addEvents(
189
+ /**
190
+ * @event lockcolumn
191
+ * Fires when a column is locked.
192
+ * @param {Ext.grid.Panel} this The gridpanel.
193
+ * @param {Ext.grid.column.Column} column The column being locked.
194
+ */
195
+ 'lockcolumn',
196
+
197
+ /**
198
+ * @event unlockcolumn
199
+ * Fires when a column is unlocked.
200
+ * @param {Ext.grid.Panel} this The gridpanel.
201
+ * @param {Ext.grid.column.Column} column The column being unlocked.
202
+ */
203
+ 'unlockcolumn'
204
+ );
205
+
206
+ me.addStateEvents(['lockcolumn', 'unlockcolumn']);
207
+
208
+ me.lockedHeights = [];
209
+ me.normalHeights = [];
210
+
211
+ columns = me.processColumns(me.columns);
212
+
213
+ lockedGrid.width = columns.lockedWidth + Ext.num(selModel.headerWidth, 0);
214
+ lockedGrid.columns = columns.locked;
215
+ normalGrid.columns = columns.normal;
216
+
217
+ // normal grid should flex the rest of the width
218
+ normalGrid.flex = 1;
219
+ lockedGrid.viewConfig = me.lockedViewConfig || {};
220
+ lockedGrid.viewConfig.loadingUseMsg = false;
221
+ normalGrid.viewConfig = me.normalViewConfig || {};
222
+
223
+ Ext.applyIf(lockedGrid.viewConfig, me.viewConfig);
224
+ Ext.applyIf(normalGrid.viewConfig, me.viewConfig);
225
+
226
+ me.normalGrid = Ext.ComponentManager.create(normalGrid);
227
+ me.lockedGrid = Ext.ComponentManager.create(lockedGrid);
228
+
229
+ me.view = new Ext.grid.LockingView({
230
+ locked: me.lockedGrid,
231
+ normal: me.normalGrid,
232
+ panel: me
233
+ });
234
+
235
+ lockedView = me.lockedGrid.getView();
236
+ normalView = me.normalGrid.getView();
237
+
238
+ // Set up listeners for the locked view
239
+ // If the OS does not show a space-taking scrollbar, the locked view can be overflow:auto
240
+ // And therefore we can listen for the DOM scroll event on its element
241
+ if (scrollLocked) {
242
+ listeners = {
243
+ scroll: {
244
+ fn: me.onLockedViewScroll,
245
+ element: 'el',
246
+ scope: me
247
+ }
248
+ };
249
+ }
250
+ // If there are scrollbars, we have to monitor the mousewheel and fake a scroll
251
+ else {
252
+ listeners = {
253
+ mousewheel: {
254
+ fn: me.onLockedViewMouseWheel,
255
+ element: 'el',
256
+ scope: me
257
+ }
258
+ };
259
+ }
260
+ if (me.syncRowHeight) {
261
+ listeners.refresh = me.onLockedViewRefresh;
262
+ listeners.itemupdate = me.onLockedViewItemUpdate;
263
+ listeners.scope = me;
264
+ }
265
+ lockedView.on(listeners);
266
+
267
+ // Set up listeners for the normal view
268
+ listeners = {
269
+ scroll: {
270
+ fn: me.onNormalViewScroll,
271
+ element: 'el',
272
+ scope: me
273
+ },
274
+ refresh: me.syncRowHeight ? me.onNormalViewRefresh : me.updateSpacer,
275
+ scope: me
276
+ };
277
+ normalView.on(listeners);
278
+
279
+ lockedHeaderCt = me.lockedGrid.headerCt;
280
+ normalHeaderCt = me.normalGrid.headerCt;
281
+
282
+ lockedHeaderCt.lockedCt = true;
283
+ lockedHeaderCt.lockableInjected = true;
284
+ normalHeaderCt.lockableInjected = true;
285
+
286
+ lockedHeaderCt.on({
287
+ columnshow: me.onLockedHeaderShow,
288
+ columnhide: me.onLockedHeaderHide,
289
+ columnmove: me.onLockedHeaderMove,
290
+ sortchange: me.onLockedHeaderSortChange,
291
+ columnresize: me.onLockedHeaderResize,
292
+ scope: me
293
+ });
294
+
295
+ normalHeaderCt.on({
296
+ columnmove: me.onNormalHeaderMove,
297
+ sortchange: me.onNormalHeaderSortChange,
298
+ scope: me
299
+ });
300
+
301
+ me.modifyHeaderCt();
302
+ me.items = [me.lockedGrid, me.normalGrid];
303
+
304
+ me.relayHeaderCtEvents(lockedHeaderCt);
305
+ me.relayHeaderCtEvents(normalHeaderCt);
306
+
307
+ me.layout = {
308
+ type: 'hbox',
309
+ align: 'stretch'
310
+ };
311
+ },
312
+
313
+ processColumns: function(columns){
314
+ // split apart normal and lockedWidths
315
+ var i = 0,
316
+ len = columns.length,
317
+ lockedWidth = 0,
318
+ lockedHeaders = [],
319
+ normalHeaders = [],
320
+ column;
321
+
322
+ for (; i < len; ++i) {
323
+ column = columns[i];
324
+ // MUST clone the column config because we mutate it, and we must not mutate passed in config objects in case they are re-used
325
+ // eg, in an extend-to-configure scenario.
326
+ if (!column.isComponent) {
327
+ column = Ext.apply({}, columns[i]);
328
+ }
329
+
330
+ // mark the column as processed so that the locked attribute does not
331
+ // trigger trying to aggregate the columns again.
332
+ column.processed = true;
333
+ if (column.locked) {
334
+ // <debug>
335
+ if (column.flex) {
336
+ Ext.Error.raise("Columns which are locked do NOT support a flex width. You must set a width on the " + columns[i].text + "column.");
337
+ }
338
+ // </debug>
339
+ if (!column.hidden) {
340
+ lockedWidth += column.width || Ext.grid.header.Container.prototype.defaultWidth;
341
+ }
342
+ lockedHeaders.push(column);
343
+ } else {
344
+ normalHeaders.push(column);
345
+ }
346
+ if (!column.headerId) {
347
+ column.headerId = (column.initialConfig || column).id || ('L' + (++this.headerCounter));
348
+ }
349
+ }
350
+ return {
351
+ lockedWidth: lockedWidth,
352
+ locked: {
353
+ items: lockedHeaders,
354
+ itemId: 'lockedHeaderCt',
355
+ stretchMaxPartner: '^^>>#normalHeaderCt'
356
+ },
357
+ normal: {
358
+ items: normalHeaders,
359
+ itemId: 'normalHeaderCt',
360
+ stretchMaxPartner: '^^>>#lockedHeaderCt'
361
+ }
362
+ };
363
+ },
364
+
365
+ /**
366
+ * @private
367
+ * Listen for mousewheel events on the locked section which does not scroll.
368
+ * Scroll it in response, and the other section will automatically sync.
369
+ */
370
+ onLockedViewMouseWheel: function(e) {
371
+ var me = this,
372
+ scrollDelta = -me.scrollDelta,
373
+ deltaY = scrollDelta * e.getWheelDeltas().y,
374
+ vertScrollerEl = me.lockedGrid.getView().el.dom,
375
+ verticalCanScrollDown, verticalCanScrollUp;
376
+
377
+ if (vertScrollerEl) {
378
+ verticalCanScrollDown = vertScrollerEl.scrollTop !== vertScrollerEl.scrollHeight - vertScrollerEl.clientHeight;
379
+ verticalCanScrollUp = vertScrollerEl.scrollTop !== 0;
380
+ }
381
+
382
+ if ((deltaY < 0 && verticalCanScrollUp) || (deltaY > 0 && verticalCanScrollDown)) {
383
+ e.stopEvent();
384
+
385
+ // Inhibit processing of any scroll events we *may* cause here.
386
+ // Some OSs do not fire a scroll event when we set the scrollTop of an overflow:hidden element,
387
+ // so we invoke the scroll handler programatically below.
388
+ me.scrolling = true;
389
+ vertScrollerEl.scrollTop += deltaY;
390
+ me.normalGrid.getView().el.dom.scrollTop = vertScrollerEl.scrollTop;
391
+ me.scrolling = false;
392
+
393
+ // Invoke the scroll event handler programatically to sync everything.
394
+ me.onNormalViewScroll();
395
+ }
396
+ },
397
+
398
+ onLockedViewScroll: function() {
399
+ var me = this,
400
+ lockedView = me.lockedGrid.getView(),
401
+ normalView = me.normalGrid.getView(),
402
+ normalTable,
403
+ lockedTable;
404
+
405
+ // Set a flag so that the scroll even doesn't bounce back when we set the normal view's scroll position
406
+ if (!me.scrolling) {
407
+ me.scrolling = true;
408
+ normalView.el.dom.scrollTop = lockedView.el.dom.scrollTop;
409
+
410
+ // For buffered views, the absolute position is important as well as scrollTop
411
+ if (me.store.buffered) {
412
+ lockedTable = lockedView.el.child('table', true);
413
+ normalTable = normalView.el.child('table', true);
414
+ lockedTable.style.position = 'absolute';
415
+ }
416
+ me.scrolling = false;
417
+ }
418
+ },
419
+
420
+ onNormalViewScroll: function() {
421
+ var me = this,
422
+ lockedView = me.lockedGrid.getView(),
423
+ normalView = me.normalGrid.getView(),
424
+ normalTable,
425
+ lockedTable;
426
+
427
+ // Set a flag so that the scroll even doesn't bounce back when we set the locked view's scroll position
428
+ if (!me.scrolling) {
429
+ me.scrolling = true;
430
+ lockedView.el.dom.scrollTop = normalView.el.dom.scrollTop;
431
+
432
+ // For buffered views, the absolute position is important as well as scrollTop
433
+ if (me.store.buffered) {
434
+ lockedTable = lockedView.el.child('table', true);
435
+ normalTable = normalView.el.child('table', true);
436
+ lockedTable.style.position = 'absolute';
437
+ lockedTable.style.top = normalTable.style.top;
438
+ }
439
+ me.scrolling = false;
440
+ }
441
+ },
442
+
443
+ // trigger a pseudo refresh on the normal side
444
+ onLockedHeaderMove: function() {
445
+ if (this.syncRowHeight) {
446
+ this.onNormalViewRefresh();
447
+ }
448
+ },
449
+
450
+ // trigger a pseudo refresh on the locked side
451
+ onNormalHeaderMove: function() {
452
+ if (this.syncRowHeight) {
453
+ this.onLockedViewRefresh();
454
+ }
455
+ },
456
+
457
+ // Create a spacer in lockedsection and store a reference.
458
+ // This is to allow the locked section to scroll past the bottom to
459
+ // take the mormal section's horizontal scrollbar into account
460
+ // TODO: Should destroy before refreshing content
461
+ updateSpacer: function() {
462
+ var me = this,
463
+ // This affects scrolling all the way to the bottom of a locked grid
464
+ // additional test, sort a column and make sure it synchronizes
465
+ lockedViewEl = me.lockedGrid.getView().el,
466
+ normalViewEl = me.normalGrid.getView().el.dom,
467
+ spacerId = lockedViewEl.dom.id + '-spacer',
468
+ spacerHeight = (normalViewEl.offsetHeight - normalViewEl.clientHeight) + 'px';
469
+
470
+ me.spacerEl = Ext.getDom(spacerId);
471
+ if (me.spacerEl) {
472
+ me.spacerEl.style.height = spacerHeight;
473
+ } else {
474
+ Ext.core.DomHelper.append(lockedViewEl, {
475
+ id: spacerId,
476
+ style: 'height: ' + spacerHeight
477
+ });
478
+ }
479
+ },
480
+
481
+ // cache the heights of all locked rows and sync rowheights
482
+ onLockedViewRefresh: function() {
483
+
484
+ // Only bother if there are some columns in the normal grid to sync
485
+ if (this.normalGrid.headerCt.getGridColumns().length) {
486
+ var me = this,
487
+ view = me.lockedGrid.getView(),
488
+ el = view.el,
489
+ rowEls = el.query(view.getItemSelector()),
490
+ ln = rowEls.length,
491
+ i = 0;
492
+
493
+ // reset heights each time.
494
+ me.lockedHeights = [];
495
+
496
+ for (; i < ln; i++) {
497
+ me.lockedHeights[i] = rowEls[i].clientHeight;
498
+ }
499
+ me.syncRowHeights();
500
+ }
501
+ },
502
+
503
+ // cache the heights of all normal rows and sync rowheights
504
+ onNormalViewRefresh: function() {
505
+
506
+ // Only bother if there are some columns in the locked grid to sync
507
+ if (this.lockedGrid.headerCt.getGridColumns().length) {
508
+ var me = this,
509
+ view = me.normalGrid.getView(),
510
+ el = view.el,
511
+ rowEls = el.query(view.getItemSelector()),
512
+ ln = rowEls.length,
513
+ i = 0;
514
+
515
+ // reset heights each time.
516
+ me.normalHeights = [];
517
+
518
+ for (; i < ln; i++) {
519
+ me.normalHeights[i] = rowEls[i].clientHeight;
520
+ }
521
+ me.syncRowHeights();
522
+ me.updateSpacer();
523
+ }
524
+ },
525
+
526
+ // rows can get bigger/smaller
527
+ onLockedViewItemUpdate: function(record, index, node) {
528
+
529
+ // Only bother if there are some columns in the normal grid to sync
530
+ if (this.normalGrid.headerCt.getGridColumns().length) {
531
+ this.lockedHeights[index] = node.clientHeight;
532
+ this.syncRowHeights();
533
+ }
534
+ },
535
+
536
+ // rows can get bigger/smaller
537
+ onNormalViewItemUpdate: function(record, index, node) {
538
+
539
+ // Only bother if there are some columns in the locked grid to sync
540
+ if (this.lockedGrid.headerCt.getGridColumns().length) {
541
+ this.normalHeights[index] = node.clientHeight;
542
+ this.syncRowHeights();
543
+ }
544
+ },
545
+
546
+ /**
547
+ * Synchronizes the row heights between the locked and non locked portion of the grid for each
548
+ * row. If one row is smaller than the other, the height will be increased to match the larger one.
549
+ */
550
+ syncRowHeights: function() {
551
+ var me = this,
552
+ lockedHeights = me.lockedHeights,
553
+ normalHeights = me.normalHeights,
554
+ calcHeights = [],
555
+ ln = lockedHeights.length,
556
+ i = 0,
557
+ lockedView, normalView,
558
+ lockedRowEls, normalRowEls,
559
+ scrollTop;
560
+
561
+ // ensure there are an equal num of locked and normal
562
+ // rows before synchronization
563
+ if (lockedHeights.length && normalHeights.length) {
564
+ lockedView = me.lockedGrid.getView();
565
+ normalView = me.normalGrid.getView();
566
+ lockedRowEls = lockedView.el.query(lockedView.getItemSelector());
567
+ normalRowEls = normalView.el.query(normalView.getItemSelector());
568
+
569
+ // loop thru all of the heights and sync to the other side
570
+ for (; i < ln; i++) {
571
+ // ensure both are numbers
572
+ if (!isNaN(lockedHeights[i]) && !isNaN(normalHeights[i])) {
573
+ if (lockedHeights[i] > normalHeights[i]) {
574
+ Ext.fly(normalRowEls[i]).setHeight(lockedHeights[i]);
575
+ } else if (lockedHeights[i] < normalHeights[i]) {
576
+ Ext.fly(lockedRowEls[i]).setHeight(normalHeights[i]);
577
+ }
578
+ }
579
+ }
580
+
581
+ // Synchronize the scrollTop positions of the two views
582
+ // We don't use setScrollTop here because if the scrollTop is
583
+ // set to the exact same value some browsers won't fire the scroll
584
+ // event. Instead, we directly set the scrollTop.
585
+ scrollTop = normalView.el.dom.scrollTop;
586
+ normalView.el.dom.scrollTop = scrollTop;
587
+ lockedView.el.dom.scrollTop = scrollTop;
588
+
589
+ // reset the heights
590
+ me.lockedHeights = [];
591
+ me.normalHeights = [];
592
+ }
593
+ },
594
+
595
+ // inject Lock and Unlock text
596
+ modifyHeaderCt: function() {
597
+ var me = this;
598
+ me.lockedGrid.headerCt.getMenuItems = me.getMenuItems(true);
599
+ me.normalGrid.headerCt.getMenuItems = me.getMenuItems(false);
600
+ },
601
+
602
+ onUnlockMenuClick: function() {
603
+ this.unlock();
604
+ },
605
+
606
+ onLockMenuClick: function() {
607
+ this.lock();
608
+ },
609
+
610
+ getMenuItems: function(locked) {
611
+ var me = this,
612
+ unlockText = me.unlockText,
613
+ lockText = me.lockText,
614
+ unlockCls = Ext.baseCSSPrefix + 'hmenu-unlock',
615
+ lockCls = Ext.baseCSSPrefix + 'hmenu-lock',
616
+ unlockHandler = Ext.Function.bind(me.onUnlockMenuClick, me),
617
+ lockHandler = Ext.Function.bind(me.onLockMenuClick, me);
618
+
619
+ // runs in the scope of headerCt
620
+ return function() {
621
+ var o = Ext.grid.header.Container.prototype.getMenuItems.call(this);
622
+ o.push('-',{
623
+ cls: unlockCls,
624
+ text: unlockText,
625
+ handler: unlockHandler,
626
+ disabled: !locked
627
+ });
628
+ o.push({
629
+ cls: lockCls,
630
+ text: lockText,
631
+ handler: lockHandler,
632
+ disabled: locked
633
+ });
634
+ return o;
635
+ };
636
+ },
637
+
638
+ // going from unlocked section to locked
639
+ /**
640
+ * Locks the activeHeader as determined by which menu is open OR a header
641
+ * as specified.
642
+ * @param {Ext.grid.column.Column} [header] Header to unlock from the locked section.
643
+ * Defaults to the header which has the menu open currently.
644
+ * @param {Number} [toIdx] The index to move the unlocked header to.
645
+ * Defaults to appending as the last item.
646
+ * @private
647
+ */
648
+ lock: function(activeHd, toIdx) {
649
+ var me = this,
650
+ normalGrid = me.normalGrid,
651
+ lockedGrid = me.lockedGrid,
652
+ normalHCt = normalGrid.headerCt,
653
+ lockedHCt = lockedGrid.headerCt;
654
+
655
+ activeHd = activeHd || normalHCt.getMenu().activeHeader;
656
+
657
+ // if column was previously flexed, get/set current width
658
+ // and remove the flex
659
+ if (activeHd.flex) {
660
+ activeHd.width = activeHd.getWidth();
661
+ delete activeHd.flex;
662
+ }
663
+
664
+ Ext.suspendLayouts();
665
+ normalHCt.remove(activeHd, false);
666
+ activeHd.locked = true;
667
+ if (Ext.isDefined(toIdx)) {
668
+ lockedHCt.insert(toIdx, activeHd);
669
+ } else {
670
+ lockedHCt.add(activeHd);
671
+ }
672
+ me.syncLockedSection();
673
+ Ext.resumeLayouts(true);
674
+ me.updateSpacer();
675
+
676
+ me.fireEvent('lockcolumn', me, activeHd);
677
+ },
678
+
679
+ syncLockedSection: function() {
680
+ var me = this;
681
+ me.syncLockedWidth();
682
+ me.lockedGrid.getView().refresh();
683
+ me.normalGrid.getView().refresh();
684
+ },
685
+
686
+ // adjust the locked section to the width of its respective
687
+ // headerCt
688
+ syncLockedWidth: function() {
689
+ var me = this,
690
+ locked = me.lockedGrid,
691
+ width = locked.headerCt.getFullWidth(true);
692
+
693
+ Ext.suspendLayouts();
694
+ if (width > 0) {
695
+ locked.setWidth(width);
696
+ locked.show();
697
+ } else {
698
+ locked.hide();
699
+ }
700
+ Ext.resumeLayouts(true);
701
+
702
+ return width > 0;
703
+ },
704
+
705
+ onLockedHeaderResize: function() {
706
+ this.syncLockedWidth();
707
+ },
708
+
709
+ onLockedHeaderHide: function() {
710
+ this.syncLockedWidth();
711
+ },
712
+
713
+ onLockedHeaderShow: function() {
714
+ this.syncLockedWidth();
715
+ },
716
+
717
+ onLockedHeaderSortChange: function(headerCt, header, sortState) {
718
+ if (sortState) {
719
+ // no real header, and silence the event so we dont get into an
720
+ // infinite loop
721
+ this.normalGrid.headerCt.clearOtherSortStates(null, true);
722
+ }
723
+ },
724
+
725
+ onNormalHeaderSortChange: function(headerCt, header, sortState) {
726
+ if (sortState) {
727
+ // no real header, and silence the event so we dont get into an
728
+ // infinite loop
729
+ this.lockedGrid.headerCt.clearOtherSortStates(null, true);
730
+ }
731
+ },
732
+
733
+ // going from locked section to unlocked
734
+ /**
735
+ * Unlocks the activeHeader as determined by which menu is open OR a header
736
+ * as specified.
737
+ * @param {Ext.grid.column.Column} [header] Header to unlock from the locked section.
738
+ * Defaults to the header which has the menu open currently.
739
+ * @param {Number} [toIdx=0] The index to move the unlocked header to.
740
+ * @private
741
+ */
742
+ unlock: function(activeHd, toIdx) {
743
+ var me = this,
744
+ normalGrid = me.normalGrid,
745
+ lockedGrid = me.lockedGrid,
746
+ normalHCt = normalGrid.headerCt,
747
+ lockedHCt = lockedGrid.headerCt,
748
+ refreshLocked = false;
749
+
750
+ if (!Ext.isDefined(toIdx)) {
751
+ toIdx = 0;
752
+ }
753
+ activeHd = activeHd || lockedHCt.getMenu().activeHeader;
754
+
755
+ Ext.suspendLayouts();
756
+ lockedHCt.remove(activeHd, false);
757
+ if (me.syncLockedWidth()) {
758
+ refreshLocked = true;
759
+ }
760
+ activeHd.locked = false;
761
+
762
+ // Refresh the locked section first in case it was empty
763
+ normalHCt.insert(toIdx, activeHd);
764
+ me.normalGrid.getView().refresh();
765
+
766
+ if (refreshLocked) {
767
+ me.lockedGrid.getView().refresh();
768
+ }
769
+ Ext.resumeLayouts(true);
770
+
771
+ me.fireEvent('unlockcolumn', me, activeHd);
772
+ },
773
+
774
+ applyColumnsState: function (columns) {
775
+ var me = this,
776
+ lockedGrid = me.lockedGrid,
777
+ lockedHeaderCt = lockedGrid.headerCt,
778
+ normalHeaderCt = me.normalGrid.headerCt,
779
+ lockedCols = Ext.Array.toMap(lockedHeaderCt.items, 'headerId'),
780
+ normalCols = Ext.Array.toMap(normalHeaderCt.items, 'headerId'),
781
+ locked = [],
782
+ normal = [],
783
+ lockedWidth = 1,
784
+ length = columns.length,
785
+ i, existing,
786
+ lockedDefault,
787
+ col;
788
+
789
+ for (i = 0; i < length; i++) {
790
+ col = columns[i];
791
+
792
+ lockedDefault = lockedCols[col.id];
793
+ existing = lockedDefault || normalCols[col.id];
794
+
795
+ if (existing) {
796
+ if (existing.applyColumnState) {
797
+ existing.applyColumnState(col);
798
+ }
799
+ if (existing.locked === undefined) {
800
+ existing.locked = !!lockedDefault;
801
+ }
802
+ if (existing.locked) {
803
+ locked.push(existing);
804
+ if (!existing.hidden && typeof existing.width == 'number') {
805
+ lockedWidth += existing.width;
806
+ }
807
+ } else {
808
+ normal.push(existing);
809
+ }
810
+ }
811
+ }
812
+
813
+ // state and config must have the same columns (compare counts for now):
814
+ if (locked.length + normal.length == lockedHeaderCt.items.getCount() + normalHeaderCt.items.getCount()) {
815
+ lockedHeaderCt.removeAll(false);
816
+ normalHeaderCt.removeAll(false);
817
+
818
+ lockedHeaderCt.add(locked);
819
+ normalHeaderCt.add(normal);
820
+
821
+ lockedGrid.setWidth(lockedWidth);
822
+ }
823
+ },
824
+
825
+ getColumnsState: function () {
826
+ var me = this,
827
+ locked = me.lockedGrid.headerCt.getColumnsState(),
828
+ normal = me.normalGrid.headerCt.getColumnsState();
829
+
830
+ return locked.concat(normal);
831
+ },
832
+
833
+ // we want to totally override the reconfigure behaviour here, since we're creating 2 sub-grids
834
+ reconfigureLockable: function(store, columns) {
835
+ var me = this,
836
+ lockedGrid = me.lockedGrid,
837
+ normalGrid = me.normalGrid;
838
+
839
+ if (columns) {
840
+ Ext.suspendLayouts();
841
+ lockedGrid.headerCt.removeAll();
842
+ normalGrid.headerCt.removeAll();
843
+
844
+ columns = me.processColumns(columns);
845
+ lockedGrid.setWidth(columns.lockedWidth);
846
+ lockedGrid.headerCt.add(columns.locked.items);
847
+ normalGrid.headerCt.add(columns.normal.items);
848
+ Ext.resumeLayouts(true);
849
+ }
850
+
851
+ if (store) {
852
+ store = Ext.data.StoreManager.lookup(store);
853
+ me.store = store;
854
+ lockedGrid.bindStore(store);
855
+ normalGrid.bindStore(store);
856
+ } else {
857
+ lockedGrid.getView().refresh();
858
+ normalGrid.getView().refresh();
859
+ }
860
+ }
861
+ }, function() {
862
+ this.borrow(Ext.view.Table, ['prepareFeatures']);
863
+ });