Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

First JSONpad git commit

  • Loading branch information...
commit 7c10821a4f0675f1ca354b989823982741aab657 0 parents
@Zerogiven authored
Showing with 91,765 additions and 0 deletions.
  1. +93 −0 JSONpad-air.html
  2. +166 −0 JSONpad-web.html
  3. +42 −0 application.xml
  4. +96 −0 css/icons.css
  5. +95 −0 css/style.css
  6. +30 −0 css/tab-scroller-menu.css
  7. +33 −0 css/ux.fieluploadfield.css
  8. +124 −0 css/ux.statusbar.css
  9. +30 −0 css/ux.tabscrollermenu.css
  10. +305 −0 extjs/ux/CodeMirror.js
  11. +45 −0 extjs/ux/FetchField.js
  12. +182 −0 extjs/ux/FileUploadField.js
  13. +24 −0 extjs/ux/NodeMouseout.js
  14. +24 −0 extjs/ux/NodeMouseover.js
  15. +430 −0 extjs/ux/StatusBar.js
  16. +150 −0 extjs/ux/TabCloseMenu.js
  17. +223 −0 extjs/ux/TabScrollerMenu.js
  18. +101 −0 extjs/ux/TabTitleEdit.js
  19. +123 −0 extjs/ux/_CodeMirror.js
  20. +2,886 −0 extjs/web/adapter/ext/ext-base-debug.js
  21. +7 −0 extjs/web/adapter/ext/ext-base.js
  22. +1,797 −0 extjs/web/adapter/jquery/ext-jquery-adapter-debug.js
  23. +7 −0 extjs/web/adapter/jquery/ext-jquery-adapter.js
  24. +1,826 −0 extjs/web/adapter/prototype/ext-prototype-adapter-debug.js
  25. +7 −0 extjs/web/adapter/prototype/ext-prototype-adapter.js
  26. +1,592 −0 extjs/web/adapter/yui/ext-yui-adapter-debug.js
  27. +7 −0 extjs/web/adapter/yui/ext-yui-adapter.js
  28. +51,142 −0 extjs/web/ext-all-debug.js
  29. +11 −0 extjs/web/ext-all.js
  30. BIN  extjs/web/resources/charts.swf
  31. +6 −0 extjs/web/resources/css/README.txt
  32. +43 −0 extjs/web/resources/css/debug.css
  33. +5,269 −0 extjs/web/resources/css/ext-all-notheme.css
  34. +6,934 −0 extjs/web/resources/css/ext-all.css
  35. +7 −0 extjs/web/resources/css/reset-min.css
  36. +54 −0 extjs/web/resources/css/structure/borders.css
  37. +80 −0 extjs/web/resources/css/structure/box.css
  38. +445 −0 extjs/web/resources/css/structure/button.css
  39. +45 −0 extjs/web/resources/css/structure/combo.css
  40. +341 −0 extjs/web/resources/css/structure/core.css
  41. +271 −0 extjs/web/resources/css/structure/date-picker.css
  42. +61 −0 extjs/web/resources/css/structure/dd.css
  43. +26 −0 extjs/web/resources/css/structure/debug.css
  44. +59 −0 extjs/web/resources/css/structure/dialog.css
  45. +92 −0 extjs/web/resources/css/structure/editor.css
  46. +577 −0 extjs/web/resources/css/structure/form.css
  47. +588 −0 extjs/web/resources/css/structure/grid.css
  48. +296 −0 extjs/web/resources/css/structure/layout.css
  49. +86 −0 extjs/web/resources/css/structure/list-view.css
  50. +245 −0 extjs/web/resources/css/structure/menu.css
  51. +130 −0 extjs/web/resources/css/structure/panel-reset.css
  52. +461 −0 extjs/web/resources/css/structure/panel.css
  53. +65 −0 extjs/web/resources/css/structure/pivotgrid.css
  54. +46 −0 extjs/web/resources/css/structure/progress.css
  55. +153 −0 extjs/web/resources/css/structure/qtips.css
  56. +13 −0 extjs/web/resources/css/structure/reset.css
  57. +149 −0 extjs/web/resources/css/structure/resizable.css
  58. +103 −0 extjs/web/resources/css/structure/slider.css
  59. +387 −0 extjs/web/resources/css/structure/tabs.css
  60. +246 −0 extjs/web/resources/css/structure/toolbar.css
  61. +218 −0 extjs/web/resources/css/structure/tree.css
  62. +222 −0 extjs/web/resources/css/structure/window.css
  63. +25 −0 extjs/web/resources/css/theme-access/borders.css
  64. +74 −0 extjs/web/resources/css/theme-access/box.css
  65. +136 −0 extjs/web/resources/css/theme-access/button.css
  66. +43 −0 extjs/web/resources/css/theme-access/combo.css
  67. +81 −0 extjs/web/resources/css/theme-access/core.css
  68. +145 −0 extjs/web/resources/css/theme-access/date-picker.css
  69. +29 −0 extjs/web/resources/css/theme-access/dd.css
  70. +24 −0 extjs/web/resources/css/theme-access/debug.css
  71. +34 −0 extjs/web/resources/css/theme-access/dialog.css
  72. +16 −0 extjs/web/resources/css/theme-access/editor.css
  73. +176 −0 extjs/web/resources/css/theme-access/form.css
  74. +288 −0 extjs/web/resources/css/theme-access/grid.css
  75. +56 −0 extjs/web/resources/css/theme-access/layout.css
  76. +43 −0 extjs/web/resources/css/theme-access/list-view.css
  77. +79 −0 extjs/web/resources/css/theme-access/menu.css
  78. +94 −0 extjs/web/resources/css/theme-access/panel.css
  79. +35 −0 extjs/web/resources/css/theme-access/progress.css
  80. +44 −0 extjs/web/resources/css/theme-access/qtips.css
  81. +44 −0 extjs/web/resources/css/theme-access/resizable.css
  82. +21 −0 extjs/web/resources/css/theme-access/slider.css
  83. +119 −0 extjs/web/resources/css/theme-access/tabs.css
  84. +120 −0 extjs/web/resources/css/theme-access/toolbar.css
  85. +165 −0 extjs/web/resources/css/theme-access/tree.css
  86. +87 −0 extjs/web/resources/css/theme-access/window.css
  87. +29 −0 extjs/web/resources/css/theme-gray/borders.css
  88. +74 −0 extjs/web/resources/css/theme-gray/box.css
  89. +94 −0 extjs/web/resources/css/theme-gray/button.css
  90. +43 −0 extjs/web/resources/css/theme-gray/combo.css
  91. +83 −0 extjs/web/resources/css/theme-gray/core.css
  92. +143 −0 extjs/web/resources/css/theme-gray/date-picker.css
  93. +29 −0 extjs/web/resources/css/theme-gray/dd.css
  94. +24 −0 extjs/web/resources/css/theme-gray/debug.css
  95. +34 −0 extjs/web/resources/css/theme-gray/dialog.css
  96. +13 −0 extjs/web/resources/css/theme-gray/editor.css
  97. +117 −0 extjs/web/resources/css/theme-gray/form.css
  98. +272 −0 extjs/web/resources/css/theme-gray/grid.css
  99. +53 −0 extjs/web/resources/css/theme-gray/layout.css
  100. +37 −0 extjs/web/resources/css/theme-gray/list-view.css
  101. +82 −0 extjs/web/resources/css/theme-gray/menu.css
  102. +87 −0 extjs/web/resources/css/theme-gray/panel.css
  103. +32 −0 extjs/web/resources/css/theme-gray/progress.css
  104. +44 −0 extjs/web/resources/css/theme-gray/qtips.css
  105. +43 −0 extjs/web/resources/css/theme-gray/resizable.css
  106. +21 −0 extjs/web/resources/css/theme-gray/slider.css
  107. +127 −0 extjs/web/resources/css/theme-gray/tabs.css
  108. +95 −0 extjs/web/resources/css/theme-gray/toolbar.css
  109. +157 −0 extjs/web/resources/css/theme-gray/tree.css
  110. +86 −0 extjs/web/resources/css/theme-gray/window.css
  111. +25 −0 extjs/web/resources/css/visual/borders.css
  112. +74 −0 extjs/web/resources/css/visual/box.css
  113. +94 −0 extjs/web/resources/css/visual/button.css
  114. +43 −0 extjs/web/resources/css/visual/combo.css
  115. +82 −0 extjs/web/resources/css/visual/core.css
  116. +143 −0 extjs/web/resources/css/visual/date-picker.css
  117. +29 −0 extjs/web/resources/css/visual/dd.css
  118. +24 −0 extjs/web/resources/css/visual/debug.css
  119. +34 −0 extjs/web/resources/css/visual/dialog.css
  120. +13 −0 extjs/web/resources/css/visual/editor.css
  121. +123 −0 extjs/web/resources/css/visual/form.css
  122. +277 −0 extjs/web/resources/css/visual/grid.css
  123. +53 −0 extjs/web/resources/css/visual/layout.css
  124. +37 −0 extjs/web/resources/css/visual/list-view.css
  125. +87 −0 extjs/web/resources/css/visual/menu.css
  126. +87 −0 extjs/web/resources/css/visual/panel.css
  127. +27 −0 extjs/web/resources/css/visual/pivotgrid.css
  128. +32 −0 extjs/web/resources/css/visual/progress.css
  129. +44 −0 extjs/web/resources/css/visual/qtips.css
  130. +43 −0 extjs/web/resources/css/visual/resizable.css
  131. +21 −0 extjs/web/resources/css/visual/slider.css
  132. +127 −0 extjs/web/resources/css/visual/tabs.css
  133. +95 −0 extjs/web/resources/css/visual/toolbar.css
  134. +152 −0 extjs/web/resources/css/visual/tree.css
  135. +86 −0 extjs/web/resources/css/visual/window.css
  136. +1,820 −0 extjs/web/resources/css/xtheme-access.css
  137. +1,672 −0 extjs/web/resources/css/xtheme-blue.css
  138. +1,656 −0 extjs/web/resources/css/xtheme-gray.css
  139. +1,652 −0 extjs/web/resources/css/yourtheme.css
  140. BIN  extjs/web/resources/expressinstall.swf
  141. BIN  extjs/web/resources/images/access/box/corners-blue.gif
  142. BIN  extjs/web/resources/images/access/box/corners.gif
  143. BIN  extjs/web/resources/images/access/box/l-blue.gif
  144. BIN  extjs/web/resources/images/access/box/l.gif
  145. BIN  extjs/web/resources/images/access/box/r-blue.gif
  146. BIN  extjs/web/resources/images/access/box/r.gif
  147. BIN  extjs/web/resources/images/access/box/tb-blue.gif
  148. BIN  extjs/web/resources/images/access/box/tb.gif
  149. BIN  extjs/web/resources/images/access/button/arrow.gif
  150. BIN  extjs/web/resources/images/access/button/btn.gif
  151. BIN  extjs/web/resources/images/access/button/group-cs.gif
  152. BIN  extjs/web/resources/images/access/button/group-lr.gif
  153. BIN  extjs/web/resources/images/access/button/group-tb.gif
  154. BIN  extjs/web/resources/images/access/button/s-arrow-b-noline.gif
  155. BIN  extjs/web/resources/images/access/button/s-arrow-b.gif
  156. BIN  extjs/web/resources/images/access/button/s-arrow-bo.gif
  157. BIN  extjs/web/resources/images/access/button/s-arrow-noline.gif
  158. BIN  extjs/web/resources/images/access/button/s-arrow-o.gif
  159. BIN  extjs/web/resources/images/access/button/s-arrow.gif
  160. BIN  extjs/web/resources/images/access/editor/tb-sprite.gif
  161. BIN  extjs/web/resources/images/access/form/checkbox.gif
  162. BIN  extjs/web/resources/images/access/form/clear-trigger.gif
  163. BIN  extjs/web/resources/images/access/form/clear-trigger.psd
  164. BIN  extjs/web/resources/images/access/form/date-trigger.gif
  165. BIN  extjs/web/resources/images/access/form/date-trigger.psd
  166. BIN  extjs/web/resources/images/access/form/error-tip-corners.gif
  167. BIN  extjs/web/resources/images/access/form/exclamation.gif
  168. BIN  extjs/web/resources/images/access/form/radio.gif
  169. BIN  extjs/web/resources/images/access/form/search-trigger.gif
  170. BIN  extjs/web/resources/images/access/form/search-trigger.psd
  171. BIN  extjs/web/resources/images/access/form/text-bg.gif
  172. BIN  extjs/web/resources/images/access/form/trigger-tpl.gif
  173. BIN  extjs/web/resources/images/access/form/trigger.gif
  174. BIN  extjs/web/resources/images/access/form/trigger.psd
  175. BIN  extjs/web/resources/images/access/grid/arrow-left-white.gif
  176. BIN  extjs/web/resources/images/access/grid/arrow-right-white.gif
  177. BIN  extjs/web/resources/images/access/grid/col-move-bottom.gif
  178. BIN  extjs/web/resources/images/access/grid/col-move-top.gif
  179. BIN  extjs/web/resources/images/access/grid/columns.gif
  180. BIN  extjs/web/resources/images/access/grid/dirty.gif
  181. BIN  extjs/web/resources/images/access/grid/done.gif
  182. BIN  extjs/web/resources/images/access/grid/drop-no.gif
  183. BIN  extjs/web/resources/images/access/grid/drop-yes.gif
  184. BIN  extjs/web/resources/images/access/grid/footer-bg.gif
  185. BIN  extjs/web/resources/images/access/grid/grid-blue-hd.gif
  186. BIN  extjs/web/resources/images/access/grid/grid-blue-split.gif
  187. BIN  extjs/web/resources/images/access/grid/grid-hrow.gif
  188. BIN  extjs/web/resources/images/access/grid/grid-loading.gif
  189. BIN  extjs/web/resources/images/access/grid/grid-split.gif
  190. BIN  extjs/web/resources/images/access/grid/grid-vista-hd.gif
  191. BIN  extjs/web/resources/images/access/grid/grid3-hd-btn.gif
  192. BIN  extjs/web/resources/images/access/grid/grid3-hrow-over.gif
  193. BIN  extjs/web/resources/images/access/grid/grid3-hrow.gif
  194. BIN  extjs/web/resources/images/access/grid/grid3-special-col-bg.gif
  195. BIN  extjs/web/resources/images/access/grid/grid3-special-col-sel-bg.gif
  196. BIN  extjs/web/resources/images/access/grid/group-by.gif
  197. BIN  extjs/web/resources/images/access/grid/group-collapse.gif
  198. BIN  extjs/web/resources/images/access/grid/group-expand-sprite.gif
  199. BIN  extjs/web/resources/images/access/grid/group-expand.gif
  200. BIN  extjs/web/resources/images/access/grid/hd-pop.gif
  201. BIN  extjs/web/resources/images/access/grid/hmenu-asc.gif
  202. BIN  extjs/web/resources/images/access/grid/hmenu-desc.gif
  203. BIN  extjs/web/resources/images/access/grid/hmenu-lock.gif
  204. BIN  extjs/web/resources/images/access/grid/hmenu-lock.png
  205. BIN  extjs/web/resources/images/access/grid/hmenu-unlock.gif
  206. BIN  extjs/web/resources/images/access/grid/hmenu-unlock.png
  207. BIN  extjs/web/resources/images/access/grid/invalid_line.gif
  208. BIN  extjs/web/resources/images/access/grid/loading.gif
  209. BIN  extjs/web/resources/images/access/grid/mso-hd.gif
  210. BIN  extjs/web/resources/images/access/grid/nowait.gif
  211. BIN  extjs/web/resources/images/access/grid/page-first-disabled.gif
  212. BIN  extjs/web/resources/images/access/grid/page-first.gif
  213. BIN  extjs/web/resources/images/access/grid/page-last-disabled.gif
  214. BIN  extjs/web/resources/images/access/grid/page-last.gif
  215. BIN  extjs/web/resources/images/access/grid/page-next-disabled.gif
  216. BIN  extjs/web/resources/images/access/grid/page-next.gif
  217. BIN  extjs/web/resources/images/access/grid/page-prev-disabled.gif
  218. BIN  extjs/web/resources/images/access/grid/page-prev.gif
  219. BIN  extjs/web/resources/images/access/grid/pick-button.gif
  220. BIN  extjs/web/resources/images/access/grid/refresh.gif
  221. BIN  extjs/web/resources/images/access/grid/row-check-sprite.gif
  222. BIN  extjs/web/resources/images/access/grid/row-expand-sprite.gif
  223. BIN  extjs/web/resources/images/access/grid/row-over.gif
  224. BIN  extjs/web/resources/images/access/grid/row-sel.gif
  225. BIN  extjs/web/resources/images/access/grid/sort-hd.gif
  226. BIN  extjs/web/resources/images/access/grid/sort_asc.gif
  227. BIN  extjs/web/resources/images/access/grid/sort_desc.gif
  228. BIN  extjs/web/resources/images/access/grid/wait.gif
  229. BIN  extjs/web/resources/images/access/menu/checked.gif
  230. BIN  extjs/web/resources/images/access/menu/group-checked.gif
  231. BIN  extjs/web/resources/images/access/menu/item-over.gif
  232. BIN  extjs/web/resources/images/access/menu/menu-parent.gif
  233. BIN  extjs/web/resources/images/access/menu/menu.gif
  234. BIN  extjs/web/resources/images/access/menu/unchecked.gif
  235. BIN  extjs/web/resources/images/access/panel/corners-sprite.gif
  236. BIN  extjs/web/resources/images/access/panel/left-right.gif
  237. BIN  extjs/web/resources/images/access/panel/light-hd.gif
  238. BIN  extjs/web/resources/images/access/panel/tool-sprite-tpl.gif
  239. BIN  extjs/web/resources/images/access/panel/tool-sprites.gif
  240. BIN  extjs/web/resources/images/access/panel/tools-sprites-trans.gif
  241. BIN  extjs/web/resources/images/access/panel/top-bottom.gif
  242. BIN  extjs/web/resources/images/access/panel/white-corners-sprite.gif
  243. BIN  extjs/web/resources/images/access/panel/white-left-right.gif
  244. BIN  extjs/web/resources/images/access/panel/white-top-bottom.gif
  245. BIN  extjs/web/resources/images/access/progress/progress-bg.gif
  246. BIN  extjs/web/resources/images/access/qtip/close.gif
  247. BIN  extjs/web/resources/images/access/qtip/tip-anchor-sprite.gif
  248. BIN  extjs/web/resources/images/access/qtip/tip-sprite.gif
  249. BIN  extjs/web/resources/images/access/shared/glass-bg.gif
  250. BIN  extjs/web/resources/images/access/shared/hd-sprite.gif
  251. BIN  extjs/web/resources/images/access/shared/left-btn.gif
  252. BIN  extjs/web/resources/images/access/shared/right-btn.gif
  253. BIN  extjs/web/resources/images/access/sizer/e-handle-dark.gif
  254. BIN  extjs/web/resources/images/access/sizer/e-handle.gif
  255. BIN  extjs/web/resources/images/access/sizer/ne-handle-dark.gif
  256. BIN  extjs/web/resources/images/access/sizer/ne-handle.gif
  257. BIN  extjs/web/resources/images/access/sizer/nw-handle-dark.gif
  258. BIN  extjs/web/resources/images/access/sizer/nw-handle.gif
  259. BIN  extjs/web/resources/images/access/sizer/s-handle-dark.gif
  260. BIN  extjs/web/resources/images/access/sizer/s-handle.gif
  261. BIN  extjs/web/resources/images/access/sizer/se-handle-dark.gif
  262. BIN  extjs/web/resources/images/access/sizer/se-handle.gif
  263. BIN  extjs/web/resources/images/access/sizer/square.gif
  264. BIN  extjs/web/resources/images/access/sizer/sw-handle-dark.gif
  265. BIN  extjs/web/resources/images/access/sizer/sw-handle.gif
  266. BIN  extjs/web/resources/images/access/slider/slider-bg.png
  267. BIN  extjs/web/resources/images/access/slider/slider-thumb.png
  268. BIN  extjs/web/resources/images/access/slider/slider-v-bg.png
  269. BIN  extjs/web/resources/images/access/slider/slider-v-thumb.png
  270. BIN  extjs/web/resources/images/access/tabs/scroll-left.gif
  271. BIN  extjs/web/resources/images/access/tabs/scroll-right.gif
  272. BIN  extjs/web/resources/images/access/tabs/tab-btm-inactive-left-bg.gif
  273. BIN  extjs/web/resources/images/access/tabs/tab-btm-inactive-right-bg.gif
  274. BIN  extjs/web/resources/images/access/tabs/tab-btm-left-bg.gif
  275. BIN  extjs/web/resources/images/access/tabs/tab-btm-right-bg.gif
  276. BIN  extjs/web/resources/images/access/tabs/tab-close.gif
  277. BIN  extjs/web/resources/images/access/tabs/tab-strip-bg.gif
  278. BIN  extjs/web/resources/images/access/tabs/tab-strip-btm-bg.gif
  279. BIN  extjs/web/resources/images/access/tabs/tabs-sprite.gif
  280. BIN  extjs/web/resources/images/access/toolbar/bg.gif
  281. BIN  extjs/web/resources/images/access/toolbar/btn-arrow-light.gif
  282. BIN  extjs/web/resources/images/access/toolbar/btn-arrow.gif
  283. BIN  extjs/web/resources/images/access/toolbar/btn-over-bg.gif
  284. BIN  extjs/web/resources/images/access/toolbar/gray-bg.gif
  285. BIN  extjs/web/resources/images/access/toolbar/more.gif
  286. BIN  extjs/web/resources/images/access/toolbar/s-arrow-bo.gif
  287. BIN  extjs/web/resources/images/access/toolbar/tb-btn-sprite.gif
  288. BIN  extjs/web/resources/images/access/toolbar/tb-xl-btn-sprite.gif
  289. BIN  extjs/web/resources/images/access/toolbar/tb-xl-sep.gif
  290. BIN  extjs/web/resources/images/access/tree/arrows.gif
  291. BIN  extjs/web/resources/images/access/tree/drop-add.gif
  292. BIN  extjs/web/resources/images/access/tree/drop-between.gif
  293. BIN  extjs/web/resources/images/access/tree/drop-no.gif
  294. BIN  extjs/web/resources/images/access/tree/drop-over.gif
  295. BIN  extjs/web/resources/images/access/tree/drop-under.gif
  296. BIN  extjs/web/resources/images/access/tree/drop-yes.gif
  297. BIN  extjs/web/resources/images/access/tree/elbow-end-minus-nl.gif
  298. BIN  extjs/web/resources/images/access/tree/elbow-end-minus.gif
  299. BIN  extjs/web/resources/images/access/tree/elbow-end-plus-nl.gif
  300. BIN  extjs/web/resources/images/access/tree/elbow-end-plus.gif
Sorry, we could not display the entire diff because too many files (1,086) changed.
93 JSONpad-air.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>JSONpad</title>
+
+ <link rel="stylesheet" type="text/css" href="core/extjs/resources/css/ext-all.css" />
+ <link rel="stylesheet" type="text/css" href="core/extjs/air/css/ext-air.css" />
+
+ <link rel="stylesheet" type="text/css" href="css/ux.statusbar.css" />
+
+ <link rel="stylesheet" type="text/css" href="css/style.css" />
+ <link rel="stylesheet" type="text/css" href="css/icons.css" />
+ <link rel="stylesheet" type="text/css" href="css/window.css" />
+
+ <script type="text/javascript" src="core/air/AIRAliases.js"></script>
+ <script type="text/javascript" src="core/air/AIRIntrospector.js"></script>
+
+ <script type="text/javascript" src="core/extern/jquery-1.4.2.js"></script>
+
+ <script type="application/x-shockwave-flash" src="core/air/swf/applicationupdater_ui.swf"></script>
+
+ <script type="text/javascript" src="core/extjs/adapter/ext/ext-base-debug.js"></script>
+ <script type="text/javascript" src="core/extjs/ext-all-debug.js"></script>
+ <script type="text/javascript" src="core/extjs/ext-air-debug.js"></script>
+
+ <script type="text/javascript" src="core/const.js"></script>
+ <script type="text/javascript" src="core/util.js"></script>
+
+ <script type="text/javascript" src="core/JPAir.js"></script>
+
+ <script type="text/javascript" src="core/extern/jslint.js"></script>
+ <script type="text/javascript" src="core/extern/jsmin.js"></script>
+ <script type="text/javascript" src="core/extern/json2.js"></script>
+ <script type="text/javascript" src="core/extern/jsonXml.js"></script>
+
+ <script type="text/javascript" src="core/extern/CodeMirror-0.7/js/codemirror.js"></script>
+
+ <script type="text/javascript" src="core/extjs/ux/StatusBar.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/CodeMirror.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/NodeMouseover.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/NodeMouseout.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/FetchField.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.js"></script>
+
+ <script type="text/javascript" src="js/JP.util.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.MainTop.js"></script>
+ <script type="text/javascript" src="js/JP.MainTop.Actions.js"></script>
+ <script type="text/javascript" src="js/JP.MainTop.mainBar.js"></script>
+ <script type="text/javascript" src="js/JP.MainTop.iconBar.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.MainCenter.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.Actions.js"></script>
+
+ <script type="text/javascript" src="js/JP.MainCenter.stringForm.js"></script>
+
+ <script type="text/javascript" src="js/JP.MainCenter.jsonTree.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.jsonTree.nodeToolbar.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.jsonTree.contextMenu.js"></script>
+
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.edit.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.edit.key.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.edit.object.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.MainBottom.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.XmlWindow.js"></script>
+ <script type="text/javascript" src="js/JP.XmlWindow.Actions.js"></script>
+ <script type="text/javascript" src="js/JP.XmlWindow.xmlForm.js"></script>
+
+ <script type="text/javascript" src="js/JP.SettingsWindow.js"></script>
+ <script type="text/javascript" src="js/JP.SettingsWindow.Actions.js"></script>
+ <script type="text/javascript" src="js/JP.SettingsWindow.settingsForm.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.AboutWindow.js"></script>
+ <script type="text/javascript" src="js/JP.AboutWindow.Actions.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.ErrorWindow.js"></script>
+ <script type="text/javascript" src="js/JP.ErrorWindow.Actions.js"></script>
+ </head>
+ <body onload="init();">
+ </body>
+</html>
166 JSONpad-web.html
@@ -0,0 +1,166 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+
+ <title>JSONpad</title>
+
+ <link rel="stylesheet" type="text/css" href="extjs/web/resources/css/ext-all.css">
+ <link rel="stylesheet" type="text/css" href="css/style.css">
+ <link rel="stylesheet" type="text/css" href="css/icons.css">
+ <link rel="stylesheet" type="text/css" href="css/ux.tabscrollermenu.css">
+ <link rel="stylesheet" type="text/css" href="css/ux.statusbar.css">
+ <link rel="stylesheet" type="text/css" href="css/ux.fieluploadfield.css">
+
+ <script type="text/javascript" src="lib/jquery-1.4.4.min.js"></script>
+
+ <script type="text/javascript" src="extjs/web/adapter/ext/ext-base-debug.js"></script>
+ <script type="text/javascript" src="extjs/web/ext-all-debug.js"></script>
+
+ <script type="text/javascript" src="js/jp.util.js"></script>
+
+ <script type="text/javascript" src="lib/json2.js"></script>
+ <script type="text/javascript" src="lib/jsmin.js"></script>
+ <script type="text/javascript" src="lib/jslint.js"></script>
+ <script type="text/javascript" src="lib/jsonXml.js"></script>
+ <script type="text/javascript" src="lib/CodeMirror/web/js/codemirror.js"></script>
+
+ <script type="text/javascript" src="extjs/ux/StatusBar.js"></script>
+
+ <script type="text/javascript" src="extjs/ux/CodeMirror.js"></script>
+
+ <script type="text/javascript" src="extjs/ux/FetchField.js"></script>
+ <script type="text/javascript" src="extjs/ux/FileUploadField.js"></script>
+
+ <script type="text/javascript" src="extjs/ux/TabScrollerMenu.js"></script>
+ <script type="text/javascript" src="extjs/ux/TabCloseMenu.js"></script>
+ <script type="text/javascript" src="extjs/ux/TabTitleEdit.js"></script>
+
+ <script type="text/javascript" src="extjs/ux/NodeMouseover.js"></script>
+ <script type="text/javascript" src="extjs/ux/NodeMouseout.js"></script>
+
+ <script type="text/javascript" src="js/jp.js"></script>
+
+ <script type="text/javascript" src="js/jp.Editor.js"></script>
+
+ <script type="text/javascript" src="js/jp.Window.About.js"></script>
+
+ <script type="text/javascript" src="js/jp.Window.Settings.js"></script>
+ <script type="text/javascript" src="js/jp.Window.Settings.form.js"></script>
+
+ <script type="text/javascript" src="js/jp.Window.ImportJson.js"></script>
+ <script type="text/javascript" src="js/jp.Window.ImportJson.form.js"></script>
+
+ <script type="text/javascript" src="js/jp.Window.XmlConvert.js"></script>
+ <script type="text/javascript" src="js/jp.Window.XmlConvert.form.js"></script>
+ <script type="text/javascript" src="js/jp.Window.XmlConvert.form.TabConvertText.js"></script>
+ <script type="text/javascript" src="js/jp.Window.XmlConvert.form.TabConvertOther.js"></script>
+
+ <script type="text/javascript" src="js/jp.ActionPanel.js"></script>
+ <script type="text/javascript" src="js/jp.ActionPanel.MainBar.js"></script>
+ <script type="text/javascript" src="js/jp.ActionPanel.IconBar.js"></script>
+
+
+ <script type="text/javascript" src="js/jp.TabPanel.js"></script>
+ <script type="text/javascript" src="js/jp.TabPanel.Tab.js"></script>
+ <script type="text/javascript" src="js/jp.TabPanel.Tab.CodeMirror.js"></script>
+
+ <script type="text/javascript" src="js/jp.TabPanel.Tab.TreePanel.js"></script>
+ <script type="text/javascript" src="js/jp.TabPanel.Tab.TreePanel.tbar.js"></script>
+ <script type="text/javascript" src="js/jp.TabPanel.Tab.TreePanel.contextMenu.js"></script>
+
+ <script type="text/javascript" src="js/jp.TabPanel.Tab.TreeEditPanel.js"></script>
+ <script type="text/javascript" src="js/jp.TabPanel.Tab.TreeEditPanel.form.js"></script>
+
+ <script type="text/javascript" src="js/jp.StatusbarPanel.js"></script>
+
+
+
+ <!--script type="text/javascript" src="core/const.js"></script>
+ <script type="text/javascript" src="core/util.js"></script>
+
+ <script type="text/javascript" src="core/JPAir.js"></script>
+
+
+ <script type="text/javascript" src="core/extern/jsonXml.js"></script>
+
+ <script type="text/javascript" src="core/extern/CodeMirror-0.7/js/codemirror.js"></script>
+
+ <script type="text/javascript" src="core/extjs/ux/StatusBar.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/CodeMirror.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/NodeMouseover.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/NodeMouseout.js"></script>
+ <script type="text/javascript" src="core/extjs/ux/FetchField.js"></script>
+
+
+
+
+ <script type="text/javascript" src="js/JP.util.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.MainTop.js"></script>
+ <script type="text/javascript" src="js/JP.MainTop.Actions.js"></script>
+ <script type="text/javascript" src="js/JP.MainTop.mainBar.js"></script>
+ <script type="text/javascript" src="js/JP.MainTop.iconBar.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.MainCenter.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.Actions.js"></script>
+
+ <script type="text/javascript" src="js/JP.MainCenter.stringForm.js"></script>
+
+ <script type="text/javascript" src="js/JP.MainCenter.jsonTree.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.jsonTree.nodeToolbar.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.jsonTree.contextMenu.js"></script>
+
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.edit.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.edit.key.js"></script>
+ <script type="text/javascript" src="js/JP.MainCenter.editTreeForm.tabs.edit.object.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.MainBottom.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.XmlWindow.js"></script>
+ <script type="text/javascript" src="js/JP.XmlWindow.Actions.js"></script>
+ <script type="text/javascript" src="js/JP.XmlWindow.xmlForm.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.AboutWindow.js"></script>
+ <script type="text/javascript" src="js/JP.AboutWindow.Actions.js"></script>
+
+
+ <script type="text/javascript" src="js/JP.ErrorWindow.js"></script>
+ <script type="text/javascript" src="js/JP.ErrorWindow.Actions.js"></script-->
+ </head>
+ <body>
+ <div id="loading-mask"></div>
+ <div id="loading">
+ <span id="loading-message">Starting JSONpad...</span>
+ </div>
+
+ <script type="text/javascript">
+ Ext.onReady(function(){
+ setTimeout(function(){
+ var loadingMask = Ext.get('loading-mask');
+ var loading = Ext.get('loading');
+ // Hide loading message
+ loading.fadeOut({ duration: 0.2, remove: true });
+ // Hide loading mask
+ loadingMask.setOpacity(0.9);
+ loadingMask.shift({
+ xy: loading.getXY(),
+ width: loading.getWidth(),
+ height: loading.getHeight(),
+ remove: true,
+ duration: 1,
+ opacity: 0.1,
+ easing: 'bounceOut'
+ });
+ }, 250);
+ });
+ </script>
+ </body>
+</html>
42 application.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<application xmlns="http://ns.adobe.com/air/application/2.0">
+ <id>com.JSONpad</id>
+ <name>JSONpad</name>
+ <version>2.0.0</version>
+ <filename>JSONpad</filename>
+ <description>
+ A simple JSON editor with many features. Syntax highlighting, XML2json conversion, tree view and many more.
+ </description>
+ <copyright>New BSD License</copyright>
+ <customUpdateUI>false</customUpdateUI>
+ <allowBrowserInvocation>false</allowBrowserInvocation>
+ <initialWindow>
+ <content>JSONpad-air.html</content>
+ <transparent>false</transparent>
+ <systemChrome>standard</systemChrome>
+ <height>700</height>
+ <width>900</width>
+ <minSize>250 250</minSize>
+ <visible>true</visible>
+ </initialWindow>
+ <icon>
+ <image16x16>img/ico/JSONpad_16x16.png</image16x16>
+ <image32x32>img/ico/JSONpad_32x32.png</image32x32>
+ <image48x48>img/ico/JSONpad_48x48.png</image48x48>
+ <image128x128>img/ico/JSONpad_128x128.png</image128x128>
+ </icon>
+ <fileTypes>
+ <fileType>
+ <name>SampleFile</name>
+ <extension>json</extension>
+ <description>JSON string files</description>
+ <contentType>text/plain</contentType>
+ <icon>
+ <image16x16>img/ico/JSON_16x16.png</image16x16>
+ <image32x32>img/ico/JSON_32x32.png</image32x32>
+ <image48x48>img/ico/JSON_48x48.png</image48x48>
+ <image128x128>img/ico/JSON_128x128.png</image128x128>
+ </icon>
+ </fileType>
+ </fileTypes>
+</application>
96 css/icons.css
@@ -0,0 +1,96 @@
+.icon_loadToTree { background-image:url(../img/ico_loadToTree.png) !important; }
+.icon_loadFromTree { background-image:url(../img/ico_loadFromTree.png) !important; }
+.icon_loadFromTreeCompressed { background-image:url(../img/ico_loadFromTreeCompressed.png) !important; }
+.icon_compress { background-image:url(../img/ico_compress.png) !important; }
+.icon_format { background-image:url(../img/ico_format.png) !important; }
+.icon_copyJson { background-image:url(../img/ico_copy_json.png) !important; }
+.icon_pasteJson { background-image:url(../img/ico_paste_json.png) !important; }
+.icon_copy { background-image:url(../img/ico_copy.png) !important; }
+.icon_paste { background-image:url(../img/ico_paste.png) !important; }
+.icon_convertXml { background-image:url(../img/ico_convert_xml.png) !important; }
+.icon_loadFromUrl { background-image:url(../img/ico_loadFromUrl.png) !important; }
+.icon_validate { background-image:url(../img/ico_validate.png) !important; }
+.icon_highlight { background-image:url(../img/ico_highlight.png) !important; }
+.icon_force_string { background-image:url(../img/ico_force_string.png) !important; }
+
+.icon_small_save {
+ background-image:url(../img/ico_save_small.png) !important;
+ background-repeat: no-repeat;
+}
+
+.icon_tree_addKey {
+ background-image:url(../img/ico_add_small.png) !important;
+ background-repeat: no-repeat;
+}
+
+.icon_tree_addKey_disabled {
+ background-image:url(../img/ico_add_small_disabled.png) !important;
+ background-repeat: no-repeat;
+}
+
+.icon_tree_delete {
+ background-image:url(../img/ico_delete_small.png) !important;
+ background-repeat: no-repeat;
+}
+
+.icon_tree_delete_disabled {
+ background-image:url(../img/ico_delete_small_disabled.png) !important;
+ background-repeat: no-repeat;
+}
+
+.icon_tree_duplicate {
+ background-image:url(../img/ico_duplicate_small.png) !important;
+ background-repeat: no-repeat;
+}
+
+.icon_tree_duplicate_disabled {
+ background-image:url(../img/ico_duplicate_small_disabled.png) !important;
+ background-repeat: no-repeat;
+}
+
+.btn_drive_upload {
+ background-image:url(../img/btn_drive-upload.png) !important;
+ background-repeat: no-repeat;
+}
+
+
+.x-tree-node-collapsed > img.ico_array {
+ background-image:url(../img/folder-array.png) !important;
+}
+.x-tree-node-expanded > img.ico_array {
+ background-image:url(../img/folder-open-array.png) !important;
+}
+
+.x-tree-node-collapsed > img.ico_object {
+ background-image:url(../img/folder-object.png) !important;
+}
+.x-tree-node-expanded > img.ico_object {
+ background-image:url(../img/folder-open-object.png) !important;
+}
+
+.x-form-field-wrap .x-form-fetch-trigger {
+ background-image: url(../img/btn_fetch_url.png);
+ background-position: 0 0 !important;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+
+.x-form-field-wrap .x-form-fetch-trigger .x-form-trigger-over {
+ background-image: url(../img/btn_fetch_url_hl.png);
+ background-position: 0 0 !important;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+
+.x-form-field-wrap .x-form-fetch-clear-trigger {
+ background-image: url(../img/btn_clear_url.png);
+ background-position: 0 0 !important;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+.x-form-field-wrap .x-form-fetch-clear-trigger .x-form-trigger-over {
+ background-image: url(../img/btn_clear_url_hl.png) !important;
+ background-position: 0 0 !important;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
95 css/style.css
@@ -0,0 +1,95 @@
+HTML, BODY { height: 100%; }
+
+#loading-mask {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #FFFFFF;
+ z-index: 9;
+}
+#loading {
+ position: absolute;
+ top: 40%;
+ left: 45%;
+ z-index: 10;
+}
+#loading SPAN {
+ background: url('../img/loader.gif') no-repeat left center;
+ padding: 10px 40px;
+ display: block;
+ font: 14px Arial;
+ font-weight: bold;
+}
+
+
+.CodeMirror-line-numbers {
+ width: 2.3em;
+ color: #aaa;
+ background-color: #eee;
+ text-align: right;
+ padding: .4em;
+ margin: 0;
+ font-family: monospace;
+ font-size: 10pt;
+ line-height: 1.15em;
+}
+
+.codemirror-iframe {
+ background: white;
+ color: black;
+}
+
+.parentToolbar {
+ padding: 0px !important;
+ border: none !important;
+}
+
+.x-splitbar-v {
+ cursor: pointer;
+}
+
+.x-splitbar-h {
+ cursor: pointer;
+}
+
+.tree-qtip-cell-caption {
+ float: left;
+ width: 50px;
+}
+
+#jsonStringInputFrame {
+ width: 200px;
+ height: 200px;
+ border: none;
+ padding: 2px;
+ overflow-y: scroll;
+ font: 12px Arial;
+}
+
+.x-status-error {
+ /*cursor: default !important;*/
+ font-weight: bold !important;
+ padding-top: 4px;
+}
+
+.x-window-dlg {
+ z-index: 20010 !important;
+}
+
+div.main-bottom-panel div.x-panel-body {
+ background-color: #DFE8F6;
+ font: 10px Arial;
+ padding: 0 2px;
+}
+
+.x-status-error-detail-link {
+ cursor: pointer !important;
+}
+
+.x-item-disabled {
+ opacity: .5 !important;
+ -moz-opacity: .5 !important;
+ filter: alpha(opacity=50) !important;
+}
30 css/tab-scroller-menu.css
@@ -0,0 +1,30 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+.x-tab-scroller-right-over {
+ background-position: -18px 0;
+}
+
+.x-tab-tabmenu-right {
+ background: transparent url(../img/ux/tab-scroller-menu.gif) no-repeat 0 0;
+ border-bottom: 1px solid #8db2e3;
+ width:18px;
+ position:absolute;
+ right:0;
+ top:0;
+ z-index:10;
+ cursor:pointer;
+}
+.x-tab-tabmenu-over {
+ background-position: -18px 0;
+}
+.x-tab-tabmenu-disabled {
+ background-position: 0 0;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+ cursor:default;
+}
33 css/ux.fieluploadfield.css
@@ -0,0 +1,33 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+*/
+/*
+ * FileUploadField component styles
+*/
+.x-form-file-wrap {
+ position: relative;
+ height: 22px;
+}
+.x-form-file-wrap .x-form-file {
+ position: absolute;
+ right: 0;
+ -moz-opacity: 0;
+ filter:alpha(opacity:0);
+ opacity: 0;
+ z-index: 2;
+ height: 22px;
+}
+.x-form-file-wrap .x-form-file-btn {
+ position: absolute;
+ right: 0;
+ z-index: 1;
+}
+.x-form-file-wrap .x-form-file-text {
+ position: absolute;
+ left: 0;
+ z-index: 3;
+ color: #777;
+}
124 css/ux.statusbar.css
@@ -0,0 +1,124 @@
+/*!
+ * Ext JS Library 3.1.0
+ * Copyright(c) 2006-2009 Ext JS, LLC
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/* StatusBar - structure */
+.x-statusbar .x-status-text {
+ cursor: default;
+
+ height: 15px;
+/* line-height: 21px;*/
+ padding: 0 4px;
+
+}
+
+
+
+.x-statusbar .x-status-busy {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+
+.x-toolbar div.xtb-text
+
+.x-statusbar .x-status-text-panel {
+ border-top: 1px solid;
+ border-right: 1px solid;
+ border-bottom: 1px solid;
+ border-left: 1px solid;
+ padding: 2px 8px 2px 5px;
+}
+
+/* StatusBar word processor example styles */
+
+#word-status .x-status-text-panel .spacer {
+ width: 60px;
+ font-size:0;
+ line-height:0;
+}
+#word-status .x-status-busy {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+#word-status .x-status-saved {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+
+/* StatusBar form validation example styles */
+
+.x-statusbar .x-status-error {
+ cursor: pointer;
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+.x-statusbar .x-status-valid {
+ padding-left: 25px !important;
+ background: transparent no-repeat 3px 2px;
+}
+.x-status-error-list {
+ font: 11px tahoma,arial,verdana,sans-serif;
+ position: absolute;
+ z-index: 9999;
+ border-top: 1px solid;
+ border-right: 1px solid;
+ border-bottom: 1px solid;
+ border-left: 1px solid;
+ padding: 5px 10px;
+}
+.x-status-error-list li {
+ cursor: pointer;
+ list-style: disc;
+ margin-left: 10px;
+}
+.x-status-error-list li a {
+ text-decoration: none;
+}
+.x-status-error-list li a:hover {
+ text-decoration: underline;
+}
+
+
+/* *********************************************************** */
+/* *********************************************************** */
+/* *********************************************************** */
+
+
+/* StatusBar - visual */
+
+.x-statusbar .x-status-busy {
+ background-image: url(../img/ux/loading.gif);
+}
+.x-statusbar .x-status-text-panel {
+ border-color: #99bbe8 #fff #fff #99bbe8;
+}
+
+/* StatusBar word processor example styles */
+
+#word-status .x-status-text {
+ color: #777;
+}
+#word-status .x-status-busy {
+ background-image: url(../img/ux/saving.gif);
+}
+#word-status .x-status-saved {
+ background-image: url(../img/ux/saved.png);
+}
+
+/* StatusBar form validation example styles */
+
+.x-statusbar .x-status-error {
+ color: #C33;
+ background-image: url(../img/ux/exclamation.gif);
+}
+.x-statusbar .x-status-valid {
+ background-image: url(../img/ux/accept.png);
+}
+.x-status-error-list {
+ border-color: #C33;
+}
+.x-status-error-list li a {
+ color: #15428B;
+}
30 css/ux.tabscrollermenu.css
@@ -0,0 +1,30 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+.x-tab-scroller-right-over {
+ background-position: -18px 0;
+}
+
+.x-tab-tabmenu-right {
+ background: transparent url(../img/ux/tab-scroller-menu.gif) no-repeat 0 0;
+ border-bottom: 1px solid #8db2e3;
+ width:18px;
+ position:absolute;
+ right:0;
+ top:0;
+ z-index:10;
+ cursor:pointer;
+}
+.x-tab-tabmenu-over {
+ background-position: -18px 0;
+}
+.x-tab-tabmenu-disabled {
+ background-position: 0 0;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+ cursor:default;
+}
305 extjs/ux/CodeMirror.js
@@ -0,0 +1,305 @@
+/*global Ext, JSLINT, CodeMirror */
+
+/**
+ * @class Ext.ux.panel.CodeMirror
+ * @extends Ext.Panel
+ * Converts a panel into a code mirror editor with toolbar
+ * @constructor
+ *
+ * @author Dan Ungureanu - ungureanu.web@gmail.com / http://www.devweb.ro
+ * @version 0.1
+ */
+
+// Define a set of code type configurations
+Ext.ns('Ext.ux.panel.CodeMirrorConfig');
+Ext.apply(Ext.ux.panel.CodeMirrorConfig, {
+ cssPath: "lib/CodeMirror/web/css/",
+ jsPath: "lib/CodeMirror/web/js/"
+});
+Ext.apply(Ext.ux.panel.CodeMirrorConfig, {
+ parser: {
+ defo: { // js code
+ parserfile: ["tokenizejavascript.js", "parsejavascript.js"],
+ stylesheet: Ext.ux.panel.CodeMirrorConfig.cssPath + "jscolors.css"
+ },
+ css: {
+ parserfile: ["parsecss.js"],
+ stylesheet: Ext.ux.panel.CodeMirrorConfig.cssPath + "csscolors.css"
+ },
+ js: {
+ parserfile: ["tokenizejavascript.js", "parsejavascript.js"],
+ stylesheet: Ext.ux.panel.CodeMirrorConfig.cssPath + "jscolors.css"
+ },
+ xml: {
+ parserfile: ["parsexml.js"],
+ stylesheet: [Ext.ux.panel.CodeMirrorConfig.cssPath + "xmlcolors.css"]
+ },
+ php: {
+ parserfile: ["tokenizephp.js", "parsephp.js"],
+ stylesheet: Ext.ux.panel.CodeMirrorConfig.cssPath + "phpcolors.css"
+ },
+ html: {
+ parserfile: ["parsexml.js", "parsecss.js", "tokenizejavascript.js", "parsejavascript.js", "tokenizephp.js", "parsephp.js", "parsephphtmlmixed.js"],
+ stylesheet: [Ext.ux.panel.CodeMirrorConfig.cssPath + "xmlcolors.css", Ext.ux.panel.CodeMirrorConfig.cssPath + "jscolors.css", Ext.ux.panel.CodeMirrorConfig.cssPath + "csscolors.css", Ext.ux.panel.CodeMirrorConfig.cssPath + "phpcolors.css"]
+
+ },
+ mixed: {
+ parserfile: ["parsexml.js", "parsecss.js", "tokenizejavascript.js", "parsejavascript.js", "tokenizephp.js", "parsephp.js", "parsephphtmlmixed.js"],
+ stylesheet: [Ext.ux.panel.CodeMirrorConfig.cssPath + "xmlcolors.css", Ext.ux.panel.CodeMirrorConfig.cssPath + "jscolors.css", Ext.ux.panel.CodeMirrorConfig.cssPath + "csscolors.css", Ext.ux.panel.CodeMirrorConfig.cssPath + "phpcolors.css"]
+
+ }
+ }
+});
+
+Ext.ns('Ext.ux.panel.CodeMirror');
+Ext.ux.panel.CodeMirror = Ext.extend(Ext.Panel, {
+
+ codeMirrorHidden: false,
+ sourceCode: '/* Default code */',
+ codeMirrorInitCallback: null,
+ initComponent: function() {
+ // this property is used to determine if the source content changes
+ this.contentChanged = false;
+ var oThis = this;
+ /*this.debugWindow = new Ext.Window({
+ title: 'Debug',
+ width: 500,
+ layout: 'border',
+ closeAction: 'hide',
+ height: 160,
+ items: [new Ext.grid.GridPanel({
+ layout: 'fit',
+ region: 'center',
+ border: false,
+ listeners: {
+ rowclick: function(grid) {
+ var oData = grid.getSelectionModel().getSelected().data;
+ oThis.codeMirrorEditor.jumpToLine(oData.line);
+ }
+ },
+ store: new Ext.data.ArrayStore({
+ fields: [{
+ name: 'line'
+ }, {
+ name: 'character'
+ }, {
+ name: 'reason'
+ }]
+ }),
+ columns: [{
+ id: 'line',
+ header: 'Line',
+ width: 60,
+ sortable: true,
+ dataIndex: 'line'
+ }, {
+ id: 'character',
+ header: 'Character',
+ width: 60,
+ sortable: true,
+ dataIndex: 'character'
+ }, {
+ header: 'Description',
+ width: 240,
+ sortable: true,
+ dataIndex: 'reason'
+ }],
+ stripeRows: true
+ })]
+ });*/
+
+ Ext.apply(this, {
+ items: [{
+ xtype: 'textarea',
+ readOnly: false,
+ hidden: true,
+ value: this.sourceCode,
+ //grow: 'true'
+ }]
+ /*tbar: [{
+ text: 'Undo',
+ handler: function() {
+ this.codeMirrorEditor.undo();
+ },
+ scope: this
+ }, {
+ text: 'Redo',
+ handler: function() {
+ this.codeMirrorEditor.redo();
+ },
+ scope: this
+ }, '-', {
+ text: 'Indent',
+ handler: function() {
+ this.codeMirrorEditor.reindent();
+ },
+ scope: this
+ }, {
+ itemId: 'spellChecker',
+ disabled: true,
+ text: 'JS Lint',
+ handler: function() {
+ try {
+ var bValidates = JSLINT(this.findByType('textarea')[0].getValue());
+
+ var oStore = this.debugWindow.findByType('grid')[0].getStore();
+ if (!bValidates) {
+ var aErrorData = [];
+
+ for (var err in JSLINT.errors) {
+ if (JSLINT.errors.hasOwnProperty(err) && (JSLINT.errors[err] !== null)) {
+ aErrorData.push([JSLINT.errors[err].line, JSLINT.errors[err].character, JSLINT.errors[err].reason]);
+ }
+ }
+
+ oStore.loadData(aErrorData, false);
+ this.debugWindow.show();
+
+ }
+ else {
+
+ oStore.loadData([[1, 1, 'Congratulation! No errors found.']], false);
+ this.debugWindow.show();
+ }
+ }catch(e){}
+
+ },
+ scope: this
+ }]*/
+ });
+
+ Ext.ux.panel.CodeMirror.superclass.initComponent.apply(this, arguments);
+ },
+
+ /*triggerOnSave: function(){
+ this.setTitleClass(true);
+ var sNewCode = this.codeMirrorEditor.getCode();
+
+ Ext.state.Manager.set("edcmr_"+this.itemId+'_lnmbr', this.codeMirrorEditor.currentLine());
+
+ this.oldSourceCode = sNewCode;
+ this.onSave(arguments[0] || false);
+ },*/
+
+ onRender: function() {
+ this.oldSourceCode = this.sourceCode;
+ Ext.ux.panel.CodeMirror.superclass.onRender.apply(this, arguments);
+ // trigger editor on afterlayout
+ this.on('afterlayout', this.triggerCodeEditor, this, {
+ single: true
+ });
+
+ },
+
+ /** @private */
+ triggerCodeEditor: function() {
+ //this.codeMirrorEditor;
+ var oThis = this;
+ var oCmp = this.findByType('textarea')[0];
+ var editorConfig = Ext.applyIf(this.codeMirror || {}, {
+ /*height: "100%",
+ width: "100%",*/
+ lineNumbers: false,
+ textWrapping: false,
+ content: oCmp.getValue(),
+ indentUnit: 4,
+ tabMode: 'shift',
+ readOnly: oCmp.readOnly,
+ path: Ext.ux.panel.CodeMirrorConfig.jsPath,
+ autoMatchParens: true,
+ iframeClass: 'codemirror-iframe',
+ initCallback: function(editor) {
+ editor.win.document.body.lastChild.scrollIntoView();
+ try {
+ var iLineNmbr = ((Ext.state.Manager.get("edcmr_" + oThis.itemId + '_lnmbr') !== undefined) ? Ext.state.Manager.get("edcmr_" + oThis.itemId + '_lnmbr') : 1);
+ //console.log(iLineNmbr);
+ editor.jumpToLine(iLineNmbr);
+
+ if (oThis.codeMirrorInitCallback != null) oThis.codeMirrorInitCallback(oThis);
+ }catch(e){
+ //console.error(e);
+ }
+ },
+ onChange: function() {
+ var sCode = oThis.codeMirrorEditor.getCode();
+ oCmp.setValue(sCode);
+
+ if(oThis.oldSourceCode == sCode){
+ oThis.setTitleClass(true);
+ }else{
+ oThis.setTitleClass();
+ }
+
+ }
+ });
+
+ var sParserType = oThis.parser || 'defo';
+ editorConfig = Ext.applyIf(editorConfig, Ext.ux.panel.CodeMirrorConfig.parser[sParserType]);
+
+ this.codeMirrorEditor = new CodeMirror.fromTextArea( Ext.getDom(oCmp.id).id, editorConfig);
+
+ var iframeEl = Ext.select('div#'+this.id + ' > div > div > .CodeMirror-wrapping', true);
+ var textareaEl = Ext.select('div#'+this.id + ' > div > div > textarea', true);
+
+ textareaEl.setVisibilityMode(Ext.Element.DISPLAY);
+ iframeEl.setVisibilityMode(Ext.Element.DISPLAY);
+
+ if (this.codeMirrorHidden) this.hideCodeMirror();
+ },
+
+ setTitleClass: function(){
+ //var tabEl = Ext.get(this.ownerCt.getTabEl( this ));
+ if(arguments[0] === true){// remove class
+ //tabEl.removeClass( "tab-changes" );
+ this.contentChanged = false;
+ }else{//add class
+ //tabEl.addClass( "tab-changes" );
+ this.contentChanged = true;
+ }
+ },
+
+ hideCodeMirror: function () {
+ var iframeEl = Ext.select('div#'+this.id + ' > div > div > .CodeMirror-wrapping', true);
+ var textareaEl = Ext.select('div#'+this.id + ' > div > div > textarea', true);
+
+ this.items.itemAt(0).setValue( this.getValue() );
+
+ iframeEl.setVisible(false);
+ textareaEl.setVisible(true);
+ textareaEl.removeClass('x-hide-display');
+
+ this.items.itemAt(0).setWidth("100%");
+ this.items.itemAt(0).setHeight("100%");
+
+ this.codeMirrorHidden = true;
+ },
+ showCodeMirror: function () {
+ var iframeEl = Ext.select('div#'+this.id + ' > div > div > .CodeMirror-wrapping', true);
+ var textareaEl = Ext.select('div#'+this.id + ' > div > div >textarea', true);
+
+ this.setValue( this.items.itemAt(0).getValue() );
+
+ textareaEl.addClass('x-hide-display');
+ textareaEl.setVisible(false);
+ iframeEl.setVisible(true);
+
+ this.codeMirrorHidden = false;
+ },
+
+ getValue: function() {
+ return this.codeMirrorEditor.getCode();
+ },
+
+ setValue: function(text) {
+ this.codeMirrorEditor.setCode(text);
+ },
+
+ setValueAtCursor: function(text) {
+ var cursorPosition = this.codeMirrorEditor.cursorPosition();
+ var handleForCursorLine = this.codeMirrorEditor.cursorLine();
+ this.codeMirrorEditor.insertIntoLine(handleForCursorLine, cursorPosition.character, text);
+ }
+});
+
+
+Ext.reg('uxCodeMirrorPanel', Ext.ux.panel.CodeMirror);
45 extjs/ux/FetchField.js
@@ -0,0 +1,45 @@
+/*
+ * Ext JS Library 3.2.1
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+Ext.ns('Ext.ux.form');
+
+Ext.ux.form.FetchField = Ext.extend(Ext.form.TwinTriggerField, {
+ initComponent : function(){
+ Ext.ux.form.FetchField.superclass.initComponent.call(this);
+ this.on('specialkey', function(f, e){
+ if(e.getKey() == e.ENTER){
+ this.onTrigger1Click();
+ }
+ }, this);
+
+ this.on('blur', this.onBlur);
+
+ this.addEvents('fetch');
+ },
+
+ validationEvent:false,
+ validateOnBlur:false,
+ trigger1Class:'x-form-fetch-clear-trigger',
+ trigger2Class:'x-form-fetch-trigger',
+ width:180,
+
+ onTrigger1Click : function(){
+ this.setValue('');
+ /*if(this.hasFetch){
+ this.el.dom.value = '';
+ this.triggers[0].hide();
+ this.triggers[1].show();
+ this.hasSearch = false;
+ }*/
+ },
+
+ onTrigger2Click : function(){
+ var v = this.getRawValue();
+
+ this.fireEvent('fetch', this, v);
+ }
+});
+Ext.reg('ux-fetchfield', Ext.ux.form.FetchField);
182 extjs/ux/FileUploadField.js
@@ -0,0 +1,182 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+Ext.ns('Ext.ux.form');
+
+/**
+ * @class Ext.ux.form.FileUploadField
+ * @extends Ext.form.TextField
+ * Creates a file upload field.
+ * @xtype fileuploadfield
+ */
+Ext.ux.form.FileUploadField = Ext.extend(Ext.form.TextField, {
+ /**
+ * @cfg {String} buttonText The button text to display on the upload button (defaults to
+ * 'Browse...'). Note that if you supply a value for {@link #buttonCfg}, the buttonCfg.text
+ * value will be used instead if available.
+ */
+ buttonText: 'Browse...',
+ /**
+ * @cfg {Boolean} buttonOnly True to display the file upload field as a button with no visible
+ * text field (defaults to false). If true, all inherited TextField members will still be available.
+ */
+ buttonOnly: false,
+ /**
+ * @cfg {Number} buttonOffset The number of pixels of space reserved between the button and the text field
+ * (defaults to 3). Note that this only applies if {@link #buttonOnly} = false.
+ */
+ buttonOffset: 3,
+ /**
+ * @cfg {Object} buttonCfg A standard {@link Ext.Button} config object.
+ */
+
+ // private
+ readOnly: true,
+
+ /**
+ * @hide
+ * @method autoSize
+ */
+ autoSize: Ext.emptyFn,
+
+ // private
+ initComponent: function(){
+ Ext.ux.form.FileUploadField.superclass.initComponent.call(this);
+
+ this.addEvents(
+ /**
+ * @event fileselected
+ * Fires when the underlying file input field's value has changed from the user
+ * selecting a new file from the system file selection dialog.
+ * @param {Ext.ux.form.FileUploadField} this
+ * @param {String} value The file value returned by the underlying file input field
+ */
+ 'fileselected'
+ );
+ },
+
+ // private
+ onRender : function(ct, position){
+ Ext.ux.form.FileUploadField.superclass.onRender.call(this, ct, position);
+
+ this.wrap = this.el.wrap({cls:'x-form-field-wrap x-form-file-wrap'});
+ this.el.addClass('x-form-file-text');
+ this.el.dom.removeAttribute('name');
+ this.createFileInput();
+
+ var btnCfg = Ext.applyIf(this.buttonCfg || {}, {
+ text: this.buttonText
+ });
+ this.button = new Ext.Button(Ext.apply(btnCfg, {
+ renderTo: this.wrap,
+ cls: 'x-form-file-btn' + (btnCfg.iconCls ? ' x-btn-icon' : '')
+ }));
+
+ if(this.buttonOnly){
+ this.el.hide();
+ this.wrap.setWidth(this.button.getEl().getWidth());
+ }
+
+ this.bindListeners();
+ this.resizeEl = this.positionEl = this.wrap;
+ },
+
+ bindListeners: function(){
+ this.fileInput.on({
+ scope: this,
+ mouseenter: function() {
+ this.button.addClass(['x-btn-over','x-btn-focus'])
+ },
+ mouseleave: function(){
+ this.button.removeClass(['x-btn-over','x-btn-focus','x-btn-click'])
+ },
+ mousedown: function(){
+ this.button.addClass('x-btn-click')
+ },
+ mouseup: function(){
+ this.button.removeClass(['x-btn-over','x-btn-focus','x-btn-click'])
+ },
+ change: function(){
+ var v = this.fileInput.dom.value;
+ this.setValue(v);
+ this.fireEvent('fileselected', this, v);
+ }
+ });
+ },
+
+ createFileInput : function() {
+ this.fileInput = this.wrap.createChild({
+ id: this.getFileInputId(),
+ name: this.name||this.getId(),
+ cls: 'x-form-file',
+ tag: 'input',
+ type: 'file',
+ size: 1
+ });
+ },
+
+ reset : function(){
+ this.fileInput.remove();
+ this.createFileInput();
+ this.bindListeners();
+ Ext.ux.form.FileUploadField.superclass.reset.call(this);
+ },
+
+ // private
+ getFileInputId: function(){
+ return this.id + '-file';
+ },
+
+ // private
+ onResize : function(w, h){
+ Ext.ux.form.FileUploadField.superclass.onResize.call(this, w, h);
+
+ this.wrap.setWidth(w);
+
+ if(!this.buttonOnly){
+ var w = this.wrap.getWidth() - this.button.getEl().getWidth() - this.buttonOffset;
+ this.el.setWidth(w);
+ }
+ },
+
+ // private
+ onDestroy: function(){
+ Ext.ux.form.FileUploadField.superclass.onDestroy.call(this);
+ Ext.destroy(this.fileInput, this.button, this.wrap);
+ },
+
+ onDisable: function(){
+ Ext.ux.form.FileUploadField.superclass.onDisable.call(this);
+ this.doDisable(true);
+ },
+
+ onEnable: function(){
+ Ext.ux.form.FileUploadField.superclass.onEnable.call(this);
+ this.doDisable(false);
+
+ },
+
+ // private
+ doDisable: function(disabled){
+ this.fileInput.dom.disabled = disabled;
+ this.button.setDisabled(disabled);
+ },
+
+
+ // private
+ preFocus : Ext.emptyFn,
+
+ // private
+ alignErrorIcon : function(){
+ this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+ }
+
+});
+
+Ext.reg('fileuploadfield', Ext.ux.form.FileUploadField);
+
+// backwards compat
+Ext.form.FileUploadField = Ext.ux.form.FileUploadField;
24 extjs/ux/NodeMouseout.js
@@ -0,0 +1,24 @@
+NodeMouseoutPlugin = Ext.extend(Object, {
+ init: function(tree) {
+ if (!tree.rendered) {
+ tree.on('render', function() {
+ this.init(tree)
+ }, this);
+ return;
+ }
+ this.tree = tree;
+ tree.body.on('mouseout', this.onTreeMousout, this, {
+ delegate: 'div.x-tree-node-el'
+ });
+ },
+
+ onTreeMousout: function(e, t) {
+ var nodeEl = Ext.get(t);
+ if (nodeEl) {
+ var nodeId = nodeEl.getAttributeNS('ext', 'tree-node-id');
+ if (nodeId) {
+ this.tree.fireEvent('mouseout', this.tree.getNodeById(nodeId), e);
+ }
+ }
+ }
+});
24 extjs/ux/NodeMouseover.js
@@ -0,0 +1,24 @@
+NodeMouseoverPlugin = Ext.extend(Object, {
+ init: function(tree) {
+ if (!tree.rendered) {
+ tree.on('render', function() {
+ this.init(tree)
+ }, this);
+ return;
+ }
+ this.tree = tree;
+ tree.body.on('mouseover', this.onTreeMouseover, this, {
+ delegate: 'div.x-tree-node-el'
+ });
+ },
+
+ onTreeMouseover: function(e, t) {
+ var nodeEl = Ext.get(t);
+ if (nodeEl) {
+ var nodeId = nodeEl.getAttributeNS('ext', 'tree-node-id');
+ if (nodeId) {
+ this.tree.fireEvent('mouseover', this.tree.getNodeById(nodeId), e);
+ }
+ }
+ }
+});
430 extjs/ux/StatusBar.js
@@ -0,0 +1,430 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/**
+ * @class Ext.ux.StatusBar
+ * <p>Basic status bar component that can be used as the bottom toolbar of any {@link Ext.Panel}. In addition to
+ * supporting the standard {@link Ext.Toolbar} interface for adding buttons, menus and other items, the StatusBar
+ * provides a greedy status element that can be aligned to either side and has convenient methods for setting the
+ * status text and icon. You can also indicate that something is processing using the {@link #showBusy} method.</p>
+ * <pre><code>
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ id: 'my-status',
+
+ // defaults to use when the status is cleared:
+ defaultText: 'Default status text',
+ defaultIconCls: 'default-icon',
+
+ // values to set initially:
+ text: 'Ready',
+ iconCls: 'ready-icon',
+
+ // any standard Toolbar items:
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+
+// Update the status bar later in code:
+var sb = Ext.getCmp('my-status');
+sb.setStatus({
+ text: 'OK',
+ iconCls: 'ok-icon',
+ clear: true // auto-clear after a set interval
+});
+
+// Set the status bar to show that something is processing:
+sb.showBusy();
+
+// processing....
+
+sb.clearStatus(); // once completeed
+</code></pre>
+ * @extends Ext.Toolbar
+ * @constructor
+ * Creates a new StatusBar
+ * @param {Object/Array} config A config object
+ */
+Ext.ux.StatusBar = Ext.extend(Ext.Toolbar, {
+ /**
+ * @cfg {String} statusAlign
+ * The alignment of the status element within the overall StatusBar layout. When the StatusBar is rendered,
+ * it creates an internal div containing the status text and icon. Any additional Toolbar items added in the
+ * StatusBar's {@link #items} config, or added via {@link #add} or any of the supported add* methods, will be
+ * rendered, in added order, to the opposite side. The status element is greedy, so it will automatically
+ * expand to take up all sapce left over by any other items. Example usage:
+ * <pre><code>
+// Create a left-aligned status bar containing a button,
+// separator and text item that will be right-aligned (default):
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ defaultText: 'Default status text',
+ id: 'status-id',
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+
+// By adding the statusAlign config, this will create the
+// exact same toolbar, except the status and toolbar item
+// layout will be reversed from the previous example:
+new Ext.Panel({
+ title: 'StatusBar',
+ // etc.
+ bbar: new Ext.ux.StatusBar({
+ defaultText: 'Default status text',
+ id: 'status-id',
+ statusAlign: 'right',
+ items: [{
+ text: 'A Button'
+ }, '-', 'Plain Text']
+ })
+});
+</code></pre>
+ */
+ /**
+ * @cfg {String} defaultText
+ * The default {@link #text} value. This will be used anytime the status bar is cleared with the
+ * <tt>useDefaults:true</tt> option (defaults to '').
+ */
+ /**
+ * @cfg {String} defaultIconCls
+ * The default {@link #iconCls} value (see the iconCls docs for additional details about customizing the icon).
+ * This will be used anytime the status bar is cleared with the <tt>useDefaults:true</tt> option (defaults to '').
+ */
+ /**
+ * @cfg {String} text
+ * A string that will be <b>initially</b> set as the status message. This string
+ * will be set as innerHTML (html tags are accepted) for the toolbar item.
+ * If not specified, the value set for <code>{@link #defaultText}</code>
+ * will be used.
+ */
+ /**
+ * @cfg {String} iconCls
+ * A CSS class that will be <b>initially</b> set as the status bar icon and is
+ * expected to provide a background image (defaults to '').
+ * Example usage:<pre><code>
+// Example CSS rule:
+.x-statusbar .x-status-custom {
+ padding-left: 25px;
+ background: transparent url(images/custom-icon.gif) no-repeat 3px 2px;
+}
+
+// Setting a default icon:
+var sb = new Ext.ux.StatusBar({
+ defaultIconCls: 'x-status-custom'
+});
+
+// Changing the icon:
+sb.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom'
+});
+</code></pre>
+ */
+
+ /**
+ * @cfg {String} cls
+ * The base class applied to the containing element for this component on render (defaults to 'x-statusbar')
+ */
+ cls : 'x-statusbar',
+ /**
+ * @cfg {String} busyIconCls
+ * The default <code>{@link #iconCls}</code> applied when calling
+ * <code>{@link #showBusy}</code> (defaults to <tt>'x-status-busy'</tt>).
+ * It can be overridden at any time by passing the <code>iconCls</code>
+ * argument into <code>{@link #showBusy}</code>.
+ */
+ busyIconCls : 'x-status-busy',
+ /**
+ * @cfg {String} busyText
+ * The default <code>{@link #text}</code> applied when calling
+ * <code>{@link #showBusy}</code> (defaults to <tt>'Loading...'</tt>).
+ * It can be overridden at any time by passing the <code>text</code>
+ * argument into <code>{@link #showBusy}</code>.
+ */
+ busyText : 'Loading...',
+ /**
+ * @cfg {Number} autoClear
+ * The number of milliseconds to wait after setting the status via
+ * <code>{@link #setStatus}</code> before automatically clearing the status
+ * text and icon (defaults to <tt>5000</tt>). Note that this only applies
+ * when passing the <tt>clear</tt> argument to <code>{@link #setStatus}</code>
+ * since that is the only way to defer clearing the status. This can
+ * be overridden by specifying a different <tt>wait</tt> value in
+ * <code>{@link #setStatus}</code>. Calls to <code>{@link #clearStatus}</code>
+ * always clear the status bar immediately and ignore this value.
+ */
+ autoClear : 5000,
+
+ /**
+ * @cfg {String} emptyText
+ * The text string to use if no text has been set. Defaults to
+ * <tt>'&nbsp;'</tt>). If there are no other items in the toolbar using
+ * an empty string (<tt>''</tt>) for this value would end up in the toolbar
+ * height collapsing since the empty string will not maintain the toolbar
+ * height. Use <tt>''</tt> if the toolbar should collapse in height
+ * vertically when no text is specified and there are no other items in
+ * the toolbar.
+ */
+ emptyText : '&nbsp;',
+
+ // private
+ activeThreadId : 0,
+
+ // private
+ initComponent : function(){
+ if(this.statusAlign=='right'){
+ this.cls += ' x-status-right';
+ }
+ Ext.ux.StatusBar.superclass.initComponent.call(this);
+ },
+
+ // private
+ afterRender : function(){
+ Ext.ux.StatusBar.superclass.afterRender.call(this);
+
+ var right = this.statusAlign == 'right';
+
+ this.currIconCls = this.iconCls || this.defaultIconCls;
+ this.statusEl = new Ext.Toolbar.TextItem({
+ cls: 'x-status-text ' + (this.currIconCls || ''),
+ text: this.text || this.defaultText || ''
+ });
+
+ if(right){
+ this.add('->');
+ this.add(this.statusEl);
+ }else{
+ this.insert(0, this.statusEl);
+ this.insert(1, '->');
+ }
+ this.doLayout();
+ },
+
+ /**
+ * Sets the status {@link #text} and/or {@link #iconCls}. Also supports automatically clearing the
+ * status that was set after a specified interval.
+ * @param {Object/String} config A config object specifying what status to set, or a string assumed
+ * to be the status text (and all other options are defaulted as explained below). A config
+ * object containing any or all of the following properties can be passed:<ul>
+ * <li><tt>text</tt> {String} : (optional) The status text to display. If not specified, any current
+ * status text will remain unchanged.</li>
+ * <li><tt>iconCls</tt> {String} : (optional) The CSS class used to customize the status icon (see
+ * {@link #iconCls} for details). If not specified, any current iconCls will remain unchanged.</li>
+ * <li><tt>clear</tt> {Boolean/Number/Object} : (optional) Allows you to set an internal callback that will
+ * automatically clear the status text and iconCls after a specified amount of time has passed. If clear is not
+ * specified, the new status will not be auto-cleared and will stay until updated again or cleared using
+ * {@link #clearStatus}. If <tt>true</tt> is passed, the status will be cleared using {@link #autoClear},
+ * {@link #defaultText} and {@link #defaultIconCls} via a fade out animation. If a numeric value is passed,
+ * it will be used as the callback interval (in milliseconds), overriding the {@link #autoClear} value.
+ * All other options will be defaulted as with the boolean option. To customize any other options,
+ * you can pass an object in the format:<ul>
+ * <li><tt>wait</tt> {Number} : (optional) The number of milliseconds to wait before clearing
+ * (defaults to {@link #autoClear}).</li>
+ * <li><tt>anim</tt> {Number} : (optional) False to clear the status immediately once the callback
+ * executes (defaults to true which fades the status out).</li>
+ * <li><tt>useDefaults</tt> {Number} : (optional) False to completely clear the status text and iconCls
+ * (defaults to true which uses {@link #defaultText} and {@link #defaultIconCls}).</li>
+ * </ul></li></ul>
+ * Example usage:<pre><code>
+// Simple call to update the text
+statusBar.setStatus('New status');
+
+// Set the status and icon, auto-clearing with default options:
+statusBar.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom',
+ clear: true
+});
+
+// Auto-clear with custom options:
+statusBar.setStatus({
+ text: 'New status',
+ iconCls: 'x-status-custom',
+ clear: {
+ wait: 8000,
+ anim: false,
+ useDefaults: false
+ }
+});
+</code></pre>
+ * @return {Ext.ux.StatusBar} this
+ */
+ setStatus : function(o){
+ o = o || {};
+
+ if(typeof o == 'string'){
+ o = {
+ text:o
+ };
+ }
+ if(o.text !== undefined){
+ this.setText(o.text);
+ }
+ if(o.iconCls !== undefined){
+ this.setIcon(o.iconCls);
+ }
+
+ if(o.clear){
+ var c = o.clear,
+ wait = this.autoClear,
+ defaults = {
+ useDefaults: true,
+ anim: true
+ };
+
+ if(typeof c == 'object'){
+ c = Ext.applyIf(c, defaults);
+ if(c.wait){
+ wait = c.wait;
+ }
+ }else if(typeof c == 'number'){
+ wait = c;
+ c = defaults;
+ }else if(typeof c == 'boolean'){
+ c = defaults;
+ }
+
+ c.threadId = this.activeThreadId;
+ this.clearStatus.defer(wait, this, [c]);
+ }
+ return this;
+ },
+
+ /**
+ * Clears the status {@link #text} and {@link #iconCls}. Also supports clearing via an optional fade out animation.
+ * @param {Object} config (optional) A config object containing any or all of the following properties. If this
+ * object is not specified the status will be cleared using the defaults below:<ul>
+ * <li><tt>anim</tt> {Boolean} : (optional) True to clear the status by fading out the status element (defaults
+ * to false which clears immediately).</li>
+ * <li><tt>useDefaults</tt> {Boolean} : (optional) True to reset the text and icon using {@link #defaultText} and
+ * {@link #defaultIconCls} (defaults to false which sets the text to '' and removes any existing icon class).</li>
+ * </ul>
+ * @return {Ext.ux.StatusBar} this
+ */
+ clearStatus : function(o){
+ o = o || {};
+
+ if(o.threadId && o.threadId !== this.activeThreadId){
+ // this means the current call was made internally, but a newer
+ // thread has set a message since this call was deferred. Since
+ // we don't want to overwrite a newer message just ignore.
+ return this;
+ }
+
+ var text = o.useDefaults ? this.defaultText : this.emptyText,
+ iconCls = o.useDefaults ? (this.defaultIconCls ? this.defaultIconCls : '') : '';
+
+ if(o.anim){
+ // animate the statusEl Ext.Element
+ this.statusEl.el.fadeOut({
+ remove: false,
+ useDisplay: true,
+ scope: this,
+ callback: function(){
+ this.setStatus({
+ text: text,
+ iconCls: iconCls
+ });
+
+
+ //this.statusEl.removeClass(['x-status-error','x-status-error-detail-link']);
+ this.statusEl.el.show();
+ }
+ });
+ }else{
+ // hide/show the el to avoid jumpy text or icon
+ this.statusEl.hide();
+ this.setStatus({
+ text: text,
+ iconCls: iconCls
+ });
+ this.statusEl.removeClass(['x-status-error','x-status-error-detail-link']);
+ this.statusEl.show();
+ }
+ //
+ return this;
+ },
+
+ /**
+ * Convenience method for setting the status text directly. For more flexible options see {@link #setStatus}.
+ * @param {String} text (optional) The text to set (defaults to '')
+ * @return {Ext.ux.StatusBar} this
+ */
+ setText : function(text){
+ this.activeThreadId++;
+ this.text = text || '';
+ if(this.rendered){
+ this.statusEl.setText(this.text);
+ }
+ return this;
+ },
+
+ /**
+ * Returns the current status text.
+ * @return {String} The status text
+ */
+ getText : function(){
+ return this.text;
+ },
+
+ /**
+ * Convenience method for setting the status icon directly. For more flexible options see {@link #setStatus}.
+ * See {@link #iconCls} for complete details about customizing the icon.
+ * @param {String} iconCls (optional) The icon class to set (defaults to '', and any current icon class is removed)
+ * @return {Ext.ux.StatusBar} this
+ */
+ setIcon : function(cls){
+ this.activeThreadId++;
+ cls = cls || '';
+
+ if(this.rendered){
+ if(this.currIconCls){
+ this.statusEl.removeClass(this.currIconCls);
+ this.currIconCls = null;
+ }
+ if(cls.length > 0){
+ this.statusEl.addClass(cls);
+ this.currIconCls = cls;
+ }
+ }else{
+ this.currIconCls = cls;
+ }
+ return this;
+ },
+
+ /**
+ * Convenience method for setting the status text and icon to special values that are pre-configured to indicate
+ * a "busy" state, usually for loading or processing activities.
+ * @param {Object/String} config (optional) A config object in the same format supported by {@link #setStatus}, or a
+ * string to use as the status text (in which case all other options for setStatus will be defaulted). Use the
+ * <tt>text</tt> and/or <tt>iconCls</tt> properties on the config to override the default {@link #busyText}
+ * and {@link #busyIconCls} settings. If the config argument is not specified, {@link #busyText} and
+ * {@link #busyIconCls} will be used in conjunction with all of the default options for {@link #setStatus}.
+ * @return {Ext.ux.StatusBar} this
+ */
+ showBusy : function(o){
+ if(typeof o == 'string'){
+ o = {
+ text:o
+ };
+ }
+ o = Ext.applyIf(o || {}, {
+ text: this.busyText,
+ iconCls: this.busyIconCls
+ });
+ return this.setStatus(o);
+ }
+});
+Ext.reg('statusbar', Ext.ux.StatusBar);
150 extjs/ux/TabCloseMenu.js
@@ -0,0 +1,150 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/**
+ * @class Ext.ux.TabCloseMenu
+ * @extends Object
+ * Plugin (ptype = 'tabclosemenu') for adding a close context menu to tabs. Note that the menu respects
+ * the closable configuration on the tab. As such, commands like remove others and remove all will not
+ * remove items that are not closable.
+ *
+ * @constructor
+ * @param {Object} config The configuration options
+ * @ptype tabclosemenu
+ */
+Ext.ux.TabCloseMenu = Ext.extend(Object, {
+ /**
+ * @cfg {String} closeTabText
+ * The text for closing the current tab. Defaults to <tt>'Close Tab'</tt>.
+ */
+ closeTabText: 'Close Tab',
+
+ /**
+ * @cfg {String} closeOtherTabsText
+ * The text for closing all tabs except the current one. Defaults to <tt>'Close Other Tabs'</tt>.
+ */
+ closeOtherTabsText: 'Close Other Tabs',
+
+ /**
+ * @cfg {Boolean} showCloseAll
+ * Indicates whether to show the 'Close All' option. Defaults to <tt>true</tt>.
+ */
+ showCloseAll: true,
+
+ /**
+ * @cfg {String} closeAllTabsText
+ * <p>The text for closing all tabs. Defaults to <tt>'Close All Tabs'</tt>.
+ */
+ closeAllTabsText: 'Close All Tabs',
+
+ constructor : function(config){
+ Ext.apply(this, config || {});
+ },
+
+ //public
+ init : function(tabs){
+ this.tabs = tabs;
+ tabs.on({
+ scope: this,
+ contextmenu: this.onContextMenu,
+ destroy: this.destroy
+ });
+ },
+
+ destroy : function(){
+ Ext.destroy(this.menu);
+ delete this.menu;
+ delete this.tabs;
+ delete this.active;
+ },
+
+ // private
+ onContextMenu : function(tabs, item, e){
+ this.active = item;
+ var m = this.createMenu(),
+ disableAll = true,
+ disableOthers = true,
+ closeAll = m.getComponent('closeall');
+
+ m.getComponent('close').setDisabled(!item.closable);
+ tabs.items.each(function(){
+ if(this.closable){
+ disableAll = false;
+ if(this != item){
+ disableOthers = false;
+ return false;
+ }
+ }
+ });
+ m.getComponent('closeothers').setDisabled(disableOthers);
+ if(closeAll){
+ closeAll.setDisabled(disableAll);
+ }
+
+ e.stopEvent();
+ m.showAt(e.getPoint());
+ },
+
+ createMenu : function(){
+ if(!this.menu){
+ var items = [{
+ itemId: 'close',
+ text: this.closeTabText,
+ scope: this,
+ handler: this.onClose
+ }];
+ if(this.showCloseAll){
+ items.push('-');
+ }
+ items.push({
+ itemId: 'closeothers',
+ text: this.closeOtherTabsText,
+ scope: this,
+ handler: this.onCloseOthers
+ });
+ if(this.showCloseAll){
+ items.push({
+ itemId: 'closeall',
+ text: this.closeAllTabsText,
+ scope: this,
+ handler: this.onCloseAll
+ });
+ }
+ this.menu = new Ext.menu.Menu({
+ items: items
+ });
+ }
+ return this.menu;
+ },
+
+ onClose : function(){
+ this.tabs.remove(this.active);
+ },
+
+ onCloseOthers : function(){
+ this.doClose(true);
+ },
+
+ onCloseAll : function(){
+ this.doClose(false);
+ },
+
+ doClose : function(excludeActive){
+ var items = [];
+ this.tabs.items.each(function(item){
+ if(item.closable){
+ if(!excludeActive || item != this.active){
+ items.push(item);
+ }
+ }
+ }, this);
+ Ext.each(items, function(item){
+ this.tabs.remove(item);
+ }, this);
+ }
+});
+
+Ext.preg('tabclosemenu', Ext.ux.TabCloseMenu);
223 extjs/ux/TabScrollerMenu.js
@@ -0,0 +1,223 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+Ext.ns('Ext.ux');
+/**
+ * @class Ext.ux.TabScrollerMenu
+ * @extends Object
+ * Plugin (ptype = 'tabscrollermenu') for adding a tab scroller menu to tabs.
+ * @constructor
+ * @param {Object} config Configuration options
+ * @ptype tabscrollermenu
+ */
+Ext.ux.TabScrollerMenu = Ext.extend(Object, {
+ /**
+ * @cfg {Number} pageSize How many items to allow per submenu.
+ */
+ pageSize : 10,
+ /**
+ * @cfg {Number} maxText How long should the title of each {@link Ext.menu.Item} be.
+ */
+ maxText : 15,
+ /**
+ * @cfg {String} menuPrefixText Text to prefix the submenus.
+ */
+ menuPrefixText : 'Items',
+ constructor : function(config) {
+ config = config || {};
+ Ext.apply(this, config);
+ },
+ //private
+ init : function(tabPanel) {
+ Ext.apply(tabPanel, this.parentOverrides);
+
+ tabPanel.tabScrollerMenu = this;
+ var thisRef = this;
+
+ tabPanel.on({
+ render : {
+ scope : tabPanel,
+ single : true,
+ fn : function() {
+ var newFn = tabPanel.createScrollers.createSequence(thisRef.createPanelsMenu, this);