extjs-rails 4.1.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ });