ide.js 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330
  1. smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened'], 'IDE');
  2. smalltalk.addMethod(
  3. '_initialize',
  4. smalltalk.method({
  5. selector: 'initialize',
  6. category: 'initialization',
  7. fn: function (){
  8. var self=this;
  9. self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
  10. self['@opened']=true;
  11. (function($rec){$rec._append_(self);$rec._append_((function(html){return html._div()._id_("jtalk");}));return $rec._addClass_("jtalkBody");})("body"._asJQuery());
  12. (function($rec){$rec._addTab_(smalltalk.Transcript._current());return $rec._addTab_(smalltalk.Workspace._new());})(self);
  13. self._selectTab_(self._tabs()._last());
  14. (function($rec){$rec._onResize_((function(){return self._updateBodyMargin();}));return $rec._updatePositionOnWindowResize();})(self);
  15. return self;},
  16. source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20opened%20%3A%3D%20true.%0A%20%20%20%20%27body%27%20asJQuery%20%0A%09append%3A%20self%3B%0A%09append%3A%20%5B%3Ahtml%20%7C%20html%20div%20id%3A%20%27jtalk%27%5D%3B%0A%09addClass%3A%20%27jtalkBody%27.%0A%20%20%20%20self%20%0A%09addTab%3A%20Transcript%20current%3B%0A%09addTab%3A%20Workspace%20new.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20self%20%0A%09onResize%3A%20%5Bself%20updateBodyMargin%5D%3B%0A%09updatePositionOnWindowResize%0A')}),
  17. smalltalk.TabManager);
  18. smalltalk.addMethod(
  19. '_tabs',
  20. smalltalk.method({
  21. selector: 'tabs',
  22. category: 'accessing',
  23. fn: function (){
  24. var self=this;
  25. return self['@tabs']._ifNil_((function(){return self['@tabs']=smalltalk.Array._new();}));
  26. return self;},
  27. source: unescape('tabs%0A%20%20%20%20%5Etabs%20ifNil%3A%20%5Btabs%20%3A%3D%20Array%20new%5D%0A')}),
  28. smalltalk.TabManager);
  29. smalltalk.addMethod(
  30. '_addTab_',
  31. smalltalk.method({
  32. selector: 'addTab:',
  33. category: 'adding/Removing',
  34. fn: function (aWidget){
  35. var self=this;
  36. self._tabs()._add_(aWidget);
  37. unescape("%23jtalk")._asJQuery()._append_(aWidget);
  38. aWidget._root()._asJQuery()._hide();
  39. return self;},
  40. source: unescape('addTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20add%3A%20aWidget.%0A%20%20%20%20%27%23jtalk%27%20asJQuery%20append%3A%20aWidget.%0A%20%20%20%20aWidget%20root%20asJQuery%20hide%0A')}),
  41. smalltalk.TabManager);
  42. smalltalk.addMethod(
  43. '_removeTab_',
  44. smalltalk.method({
  45. selector: 'removeTab:',
  46. category: 'adding/Removing',
  47. fn: function (aWidget){
  48. var self=this;
  49. self._tabs()._remove_(aWidget);
  50. self._update();
  51. return self;},
  52. source: unescape('removeTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20remove%3A%20aWidget.%0A%20%20%20%20self%20update%0A')}),
  53. smalltalk.TabManager);
  54. smalltalk.addMethod(
  55. '_updateBodyMargin',
  56. smalltalk.method({
  57. selector: 'updateBodyMargin',
  58. category: 'actions',
  59. fn: function (){
  60. var self=this;
  61. self._setBodyMargin_(unescape("%23jtalk")._asJQuery()._height().__plus((27)));
  62. return self;},
  63. source: unescape('updateBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%20%27%23jtalk%27%20asJQuery%20height%20+%2027%0A')}),
  64. smalltalk.TabManager);
  65. smalltalk.addMethod(
  66. '_removeBodyMargin',
  67. smalltalk.method({
  68. selector: 'removeBodyMargin',
  69. category: 'actions',
  70. fn: function (){
  71. var self=this;
  72. self._setBodyMargin_((0));
  73. return self;},
  74. source: unescape('removeBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%200%0A')}),
  75. smalltalk.TabManager);
  76. smalltalk.addMethod(
  77. '_setBodyMargin_',
  78. smalltalk.method({
  79. selector: 'setBodyMargin:',
  80. category: 'actions',
  81. fn: function (anInteger){
  82. var self=this;
  83. ".jtalkBody"._asJQuery()._cssAt_put_(unescape("margin-bottom"),anInteger._asString().__comma("px"));
  84. return self;},
  85. source: unescape('setBodyMargin%3A%20anInteger%0A%20%20%20%20%27.jtalkBody%27%20asJQuery%20cssAt%3A%20%27margin-bottom%27%20put%3A%20anInteger%20asString%2C%20%27px%27%0A')}),
  86. smalltalk.TabManager);
  87. smalltalk.addMethod(
  88. '_onResize_',
  89. smalltalk.method({
  90. selector: 'onResize:',
  91. category: 'actions',
  92. fn: function (aBlock){
  93. var self=this;
  94. (function(){jQuery('#jtalk').resizable({handles: 'n', stop: aBlock, minHeight: 230});})();
  95. return self;},
  96. source: unescape('onResize%3A%20aBlock%0A%20%20%20%20%7B%27jQuery%28%27%27%23jtalk%27%27%29.resizable%28%7Bhandles%3A%20%27%27n%27%27%2C%20stop%3A%20aBlock%2C%20minHeight%3A%20230%7D%29%3B%27%7D%0A')}),
  97. smalltalk.TabManager);
  98. smalltalk.addMethod(
  99. '_updatePositionOnWindowResize',
  100. smalltalk.method({
  101. selector: 'updatePositionOnWindowResize',
  102. category: 'actions',
  103. fn: function (){
  104. var self=this;
  105. (function(){jQuery(window).resize(function(e){jQuery('#jtalk').css('top', '').css('bottom', '27px')});})();
  106. return self;},
  107. source: unescape('updatePositionOnWindowResize%0A%20%20%20%20%7B%27jQuery%28window%29.resize%28function%28e%29%7BjQuery%28%27%27%23jtalk%27%27%29.css%28%27%27top%27%27%2C%20%27%27%27%27%27%27%29.css%28%27%27bottom%27%27%2C%20%27%2727px%27%27%29%7D%29%3B%27%7D%0A')}),
  108. smalltalk.TabManager);
  109. smalltalk.addMethod(
  110. '_open',
  111. smalltalk.method({
  112. selector: 'open',
  113. category: 'actions',
  114. fn: function (){
  115. var self=this;
  116. self['@opened']._ifFalse_((function(){self._root()._asJQuery()._show();"body"._asJQuery()._addClass_("jtalkBody");unescape("%23jtalk")._asJQuery()._show();self._updateBodyMargin();self['@selectedTab']._root()._asJQuery()._show();return self['@opened']=true;}));
  117. return self;},
  118. source: unescape('open%0A%20%20%20%20opened%20ifFalse%3A%20%5B%0A%09self%20root%20asJQuery%20show.%0A%09%27body%27%20asJQuery%20addClass%3A%20%27jtalkBody%27.%0A%09%27%23jtalk%27%20asJQuery%20show.%0A%09self%20updateBodyMargin.%0A%09selectedTab%20root%20asJQuery%20show.%0A%09opened%20%3A%3D%20true%5D%0A')}),
  119. smalltalk.TabManager);
  120. smalltalk.addMethod(
  121. '_close',
  122. smalltalk.method({
  123. selector: 'close',
  124. category: 'actions',
  125. fn: function (){
  126. var self=this;
  127. self['@opened']._ifTrue_((function(){self._root()._asJQuery()._hide();unescape("%23jtalk")._asJQuery()._hide();self._removeBodyMargin();"body"._asJQuery()._removeClass_("jtalkBody");return self['@opened']=false;}));
  128. return self;},
  129. source: unescape('close%0A%20%20%20%20opened%20ifTrue%3A%20%5B%0A%09self%20root%20asJQuery%20hide.%0A%09%27%23jtalk%27%20asJQuery%20hide.%0A%09self%20removeBodyMargin.%0A%09%27body%27%20asJQuery%20removeClass%3A%20%27jtalkBody%27.%0A%09opened%20%3A%3D%20false%5D%0A')}),
  130. smalltalk.TabManager);
  131. smalltalk.addMethod(
  132. '_newBrowserTab',
  133. smalltalk.method({
  134. selector: 'newBrowserTab',
  135. category: 'actions',
  136. fn: function (){
  137. var self=this;
  138. smalltalk.Browser._open();
  139. return self;},
  140. source: unescape('newBrowserTab%0A%20%20%20%20Browser%20open%0A')}),
  141. smalltalk.TabManager);
  142. smalltalk.addMethod(
  143. '_selectTab_',
  144. smalltalk.method({
  145. selector: 'selectTab:',
  146. category: 'actions',
  147. fn: function (aWidget){
  148. var self=this;
  149. self._open();
  150. self['@selectedTab']=aWidget;
  151. self._tabs()._do_((function(each){return each._root()._asJQuery()._hide();}));
  152. aWidget._root()._asJQuery()._show();
  153. self._update();
  154. return self;},
  155. source: unescape('selectTab%3A%20aWidget%0A%20%20%20%20self%20open.%0A%20%20%20%20selectedTab%20%3A%3D%20aWidget.%0A%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09each%20root%20asJQuery%20hide%5D.%0A%20%20%20%20aWidget%20root%20asJQuery%20show.%0A%20%20%20%20self%20update%0A')}),
  156. smalltalk.TabManager);
  157. smalltalk.addMethod(
  158. '_closeTab_',
  159. smalltalk.method({
  160. selector: 'closeTab:',
  161. category: 'actions',
  162. fn: function (aWidget){
  163. var self=this;
  164. self._removeTab_(aWidget);
  165. self._selectTab_(self._tabs()._last());
  166. aWidget._root()._asJQuery()._remove();
  167. self._update();
  168. return self;},
  169. source: unescape('closeTab%3A%20aWidget%0A%20%20%20%20self%20removeTab%3A%20aWidget.%0A%20%20%20%20self%20selectTab%3A%20self%20tabs%20last.%0A%20%20%20%20aWidget%20root%20asJQuery%20remove.%0A%20%20%20%20self%20update%0A')}),
  170. smalltalk.TabManager);
  171. smalltalk.addMethod(
  172. '_renderOn_',
  173. smalltalk.method({
  174. selector: 'renderOn:',
  175. category: 'rendering',
  176. fn: function (html){
  177. var self=this;
  178. (function($rec){$rec._id_("jtalkTabs");return $rec._with_((function(){(function($rec){$rec._class_("closeAll");$rec._with_("x");return $rec._onClick_((function(){return self._close();}));})(html._li());self._tabs()._do_((function(each){return self._renderTabFor_on_(each,html);}));return (function($rec){$rec._class_("newtab");$rec._with_(unescape("%20+%20"));return $rec._onClick_((function(){return self._newBrowserTab();}));})(html._li());}));})(html._ul());
  179. return self;},
  180. source: unescape('renderOn%3A%20html%0A%20%20%20%20html%20ul%0A%09id%3A%20%27jtalkTabs%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20html%20li%20%0A%09%09class%3A%20%27closeAll%27%3B%0A%09%09with%3A%20%27x%27%3B%0A%09%09onClick%3A%20%5Bself%20close%5D.%0A%09%20%20%20%20self%20tabs%20do%3A%20%5B%3Aeach%20%7C%0A%09%09self%20renderTabFor%3A%20each%20on%3A%20html%5D.%0A%09%20%20%20%20html%20li%0A%09%09class%3A%20%27newtab%27%3B%0A%09%09with%3A%20%27%20+%20%27%3B%0A%09%09onClick%3A%20%5Bself%20newBrowserTab%5D%5D%0A')}),
  181. smalltalk.TabManager);
  182. smalltalk.addMethod(
  183. '_renderTabFor_on_',
  184. smalltalk.method({
  185. selector: 'renderTabFor:on:',
  186. category: 'rendering',
  187. fn: function (aWidget, html){
  188. var self=this;
  189. var li=nil;
  190. li=html._li();
  191. self['@selectedTab'].__eq(aWidget)._ifTrue_((function(){return li._class_("selected");}));
  192. li._with_((function(){(function($rec){$rec._with_(aWidget._label());return $rec._onClick_((function(){return self._selectTab_(aWidget);}));})(html._span());return aWidget._canBeClosed()._ifTrue_((function(){return (function($rec){$rec._class_("close");$rec._with_("x");return $rec._onClick_((function(){return self._closeTab_(aWidget);}));})(html._span());}));}));
  193. return self;},
  194. source: unescape('renderTabFor%3A%20aWidget%20on%3A%20html%0A%20%20%20%20%7C%20li%20%7C%0A%20%20%20%20li%20%3A%3D%20html%20li.%0A%20%20%20%20selectedTab%20%3D%20aWidget%20ifTrue%3A%20%5B%0A%09li%20class%3A%20%27selected%27%5D.%0A%20%20%20%20li%20with%3A%20%5B%0A%09html%20span%0A%09%20%20%20%20with%3A%20aWidget%20label%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20aWidget%5D.%0A%09aWidget%20canBeClosed%20ifTrue%3A%20%5B%0A%09%20%20%20%20html%20span%20%0A%09%09class%3A%20%27close%27%3B%0A%09%09with%3A%20%27x%27%3B%0A%09%09onClick%3A%20%5Bself%20closeTab%3A%20aWidget%5D%5D%5D%0A')}),
  195. smalltalk.TabManager);
  196. smalltalk.TabManager.klass.iVarNames = ['current'];
  197. smalltalk.addMethod(
  198. '_current',
  199. smalltalk.method({
  200. selector: 'current',
  201. category: 'instance creation',
  202. fn: function (){
  203. var self=this;
  204. return self['@current']._ifNil_((function(){return self['@current']=self.klass.superclass.fn.prototype['_new'].apply(self, []);}));
  205. return self;},
  206. source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D%0A')}),
  207. smalltalk.TabManager.klass);
  208. smalltalk.addMethod(
  209. '_new',
  210. smalltalk.method({
  211. selector: 'new',
  212. category: 'instance creation',
  213. fn: function (){
  214. var self=this;
  215. self._shouldNotImplement();
  216. return self;},
  217. source: unescape('new%0A%20%20%20%20self%20shouldNotImplement%0A')}),
  218. smalltalk.TabManager.klass);
  219. smalltalk.addClass('TabWidget', smalltalk.Widget, [], 'IDE');
  220. smalltalk.addMethod(
  221. '_label',
  222. smalltalk.method({
  223. selector: 'label',
  224. category: 'accessing',
  225. fn: function (){
  226. var self=this;
  227. self._subclassResponsibility();
  228. return self;},
  229. source: unescape('label%0A%20%20%20%20self%20subclassResponsibility%0A')}),
  230. smalltalk.TabWidget);
  231. smalltalk.addMethod(
  232. '_open',
  233. smalltalk.method({
  234. selector: 'open',
  235. category: 'actions',
  236. fn: function (){
  237. var self=this;
  238. (function($rec){$rec._addTab_(self);return $rec._selectTab_(self);})(smalltalk.TabManager._current());
  239. return self;},
  240. source: unescape('open%0A%20%20%20%20TabManager%20current%0A%09addTab%3A%20self%3B%0A%09selectTab%3A%20self%0A')}),
  241. smalltalk.TabWidget);
  242. smalltalk.addMethod(
  243. '_canBeClosed',
  244. smalltalk.method({
  245. selector: 'canBeClosed',
  246. category: 'testing',
  247. fn: function (){
  248. var self=this;
  249. return false;
  250. return self;},
  251. source: unescape('canBeClosed%0A%20%20%20%20%5Efalse%0A')}),
  252. smalltalk.TabWidget);
  253. smalltalk.addMethod(
  254. '_renderOn_',
  255. smalltalk.method({
  256. selector: 'renderOn:',
  257. category: 'rendering',
  258. fn: function (html){
  259. var self=this;
  260. (function($rec){$rec._class_("jtalkTool");return $rec._with_((function(){(function($rec){$rec._class_("jt_box");return $rec._with_((function(){return self._renderBoxOn_(html);}));})(html._div());return (function($rec){$rec._class_("jt_buttons");return $rec._with_((function(){return self._renderButtonsOn_(html);}));})(html._div());}));})(html._root());
  261. return self;},
  262. source: unescape('renderOn%3A%20html%0A%20%20%20%20html%20root%0A%09class%3A%20%27jtalkTool%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_box%27%3B%0A%09%09with%3A%20%5Bself%20renderBoxOn%3A%20html%5D.%0A%09%20%20%20%20html%20div%0A%09%09class%3A%20%27jt_buttons%27%3B%0A%09%09with%3A%20%5Bself%20renderButtonsOn%3A%20html%5D%5D%0A')}),
  263. smalltalk.TabWidget);
  264. smalltalk.addMethod(
  265. '_renderBoxOn_',
  266. smalltalk.method({
  267. selector: 'renderBoxOn:',
  268. category: 'rendering',
  269. fn: function (html){
  270. var self=this;
  271. return self;},
  272. source: unescape('renderBoxOn%3A%20html%0A')}),
  273. smalltalk.TabWidget);
  274. smalltalk.addMethod(
  275. '_renderButtonsOn_',
  276. smalltalk.method({
  277. selector: 'renderButtonsOn:',
  278. category: 'rendering',
  279. fn: function (html){
  280. var self=this;
  281. return self;},
  282. source: unescape('renderButtonsOn%3A%20html%0A')}),
  283. smalltalk.TabWidget);
  284. smalltalk.addMethod(
  285. '_open',
  286. smalltalk.method({
  287. selector: 'open',
  288. category: 'instance creation',
  289. fn: function (){
  290. var self=this;
  291. return self._new()._open();
  292. return self;},
  293. source: unescape('open%0A%20%20%20%20%5Eself%20new%20open%0A')}),
  294. smalltalk.TabWidget.klass);
  295. smalltalk.addClass('Workspace', smalltalk.TabWidget, ['textarea'], 'IDE');
  296. smalltalk.addMethod(
  297. '_label',
  298. smalltalk.method({
  299. selector: 'label',
  300. category: 'accessing',
  301. fn: function (){
  302. var self=this;
  303. return unescape("%5BWorkspace%5D");
  304. return self;},
  305. source: unescape('label%0A%20%20%20%20%5E%27%5BWorkspace%5D%27%0A')}),
  306. smalltalk.Workspace);
  307. smalltalk.addMethod(
  308. '_selection',
  309. smalltalk.method({
  310. selector: 'selection',
  311. category: 'accessing',
  312. fn: function (){
  313. var self=this;
  314. return (function(){return document.selection})();
  315. return self;},
  316. source: unescape('selection%0A%20%20%20%20%5E%7B%27return%20document.selection%27%7D%0A')}),
  317. smalltalk.Workspace);
  318. smalltalk.addMethod(
  319. '_selectionStart',
  320. smalltalk.method({
  321. selector: 'selectionStart',
  322. category: 'accessing',
  323. fn: function (){
  324. var self=this;
  325. return (function(){return jQuery('.jt_workspace')[0].selectionStart})();
  326. return self;},
  327. source: unescape('selectionStart%0A%20%20%20%20%5E%7B%27return%20jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionStart%27%7D%0A')}),
  328. smalltalk.Workspace);
  329. smalltalk.addMethod(
  330. '_selectionEnd',
  331. smalltalk.method({
  332. selector: 'selectionEnd',
  333. category: 'accessing',
  334. fn: function (){
  335. var self=this;
  336. return (function(){return jQuery('.jt_workspace')[0].selectionEnd})();
  337. return self;},
  338. source: unescape('selectionEnd%0A%20%20%20%20%5E%7B%27return%20jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionEnd%27%7D%0A')}),
  339. smalltalk.Workspace);
  340. smalltalk.addMethod(
  341. '_selectionStart_',
  342. smalltalk.method({
  343. selector: 'selectionStart:',
  344. category: 'accessing',
  345. fn: function (anInteger){
  346. var self=this;
  347. (function(){jQuery('.jt_workspace')[0].selectionStart = anInteger})();
  348. return self;},
  349. source: unescape('selectionStart%3A%20anInteger%0A%20%20%20%20%7B%27jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionStart%20%3D%20anInteger%27%7D%0A')}),
  350. smalltalk.Workspace);
  351. smalltalk.addMethod(
  352. '_selectionEnd_',
  353. smalltalk.method({
  354. selector: 'selectionEnd:',
  355. category: 'accessing',
  356. fn: function (anInteger){
  357. var self=this;
  358. (function(){jQuery('.jt_workspace')[0].selectionEnd = anInteger})();
  359. return self;},
  360. source: unescape('selectionEnd%3A%20anInteger%0A%20%20%20%20%7B%27jQuery%28%27%27.jt_workspace%27%27%29%5B0%5D.selectionEnd%20%3D%20anInteger%27%7D%0A')}),
  361. smalltalk.Workspace);
  362. smalltalk.addMethod(
  363. '_currentLine',
  364. smalltalk.method({
  365. selector: 'currentLine',
  366. category: 'accessing',
  367. fn: function (){
  368. var self=this;
  369. try{var lines=nil;
  370. var startLine=nil;
  371. var endLine=nil;
  372. lines=self['@textarea']._asJQuery()._val()._tokenize_(smalltalk.String._cr());
  373. startLine=endLine=(0);
  374. lines._do_((function(each){endLine=startLine.__plus(each._size());startLine=endLine.__plus((1));return endLine.__gt_eq(self._selectionStart())._ifTrue_((function(){self._selectionEnd_(endLine);return (function(){throw({name: 'stReturn', selector: '_currentLine', fn: function(){return each}})})();}));}));
  375. return self;
  376. } catch(e) {if(e.name === 'stReturn' && e.selector === '_currentLine'){return e.fn()} throw(e)}},
  377. source: unescape('currentLine%0A%20%20%20%20%7C%20lines%20startLine%20endLine%7C%0A%20%20%20%20lines%20%3A%3D%20textarea%20asJQuery%20val%20tokenize%3A%20String%20cr.%0A%20%20%20%20startLine%20%3A%3D%20endLine%20%3A%3D%200.%0A%20%20%20%20lines%20do%3A%20%5B%3Aeach%20%7C%0A%09endLine%20%3A%3D%20startLine%20+%20each%20size.%0A%09startLine%20%3A%3D%20endLine%20+%201.%0A%09endLine%20%3E%3D%20self%20selectionStart%20ifTrue%3A%20%5B%0A%09%20%20%20%20self%20selectionEnd%3A%20endLine.%0A%09%20%20%20%20%5Eeach%5D%5D%0A')}),
  378. smalltalk.Workspace);
  379. smalltalk.addMethod(
  380. '_handleKeyDown_',
  381. smalltalk.method({
  382. selector: 'handleKeyDown:',
  383. category: 'actions',
  384. fn: function (anEvent){
  385. var self=this;
  386. return (function(){if(anEvent.ctrlKey) {
  387. if(anEvent.keyCode === 68) { //ctrl+p
  388. self._printIt();
  389. return false;
  390. }
  391. if(anEvent.keyCode === 80) { //ctrl+d
  392. self._doIt();
  393. return false;
  394. }
  395. }})();
  396. return self;},
  397. source: unescape('handleKeyDown%3A%20anEvent%0A%20%20%20%20%5E%7B%27if%28anEvent.ctrlKey%29%20%7B%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2068%29%20%7B%20//ctrl+p%0A%09%09%09self._printIt%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2080%29%20%7B%20//ctrl+d%0A%09%09%09self._doIt%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%27%7D%0A')}),
  398. smalltalk.Workspace);
  399. smalltalk.addMethod(
  400. '_clearWorkspace',
  401. smalltalk.method({
  402. selector: 'clearWorkspace',
  403. category: 'actions',
  404. fn: function (){
  405. var self=this;
  406. self['@textarea']._asJQuery()._val_("");
  407. return self;},
  408. source: unescape('clearWorkspace%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27%0A')}),
  409. smalltalk.Workspace);
  410. smalltalk.addMethod(
  411. '_doIt',
  412. smalltalk.method({
  413. selector: 'doIt',
  414. category: 'actions',
  415. fn: function (){
  416. var self=this;
  417. self._printIt();
  418. return self;},
  419. source: unescape('doIt%0A%20%20%20%20self%20printIt%0A')}),
  420. smalltalk.Workspace);
  421. smalltalk.addMethod(
  422. '_printIt',
  423. smalltalk.method({
  424. selector: 'printIt',
  425. category: 'actions',
  426. fn: function (){
  427. var self=this;
  428. var selection=nil;
  429. self['@textarea']._asJQuery()._focus();
  430. self._selectionStart().__eq(self._selectionEnd())._ifTrue_ifFalse_((function(){return selection=self._currentLine();}),(function(){return selection=self['@textarea']._asJQuery()._val()._copyFrom_to_(self._selectionStart().__plus((1)),self._selectionEnd().__plus((1)));}));
  431. self._print_(self._eval_(selection)._printString());
  432. return self;},
  433. source: unescape('printIt%0A%20%20%20%20%7C%20selection%20%7C%0A%20%20%20%20textarea%20asJQuery%20focus.%0A%20%20%20%20self%20selectionStart%20%3D%20self%20selectionEnd%0A%09ifTrue%3A%20%5Bselection%20%3A%3D%20self%20currentLine%5D%0A%09ifFalse%3A%20%5B%0A%09%20%20%20%20selection%20%3A%3D%20textarea%20asJQuery%20val%20copyFrom%3A%20self%20selectionStart%20+%201%20to%3A%20self%20selectionEnd%20+%201%5D.%0A%20%20%20%20self%20print%3A%20%28self%20eval%3A%20selection%29%20printString%0A')}),
  434. smalltalk.Workspace);
  435. smalltalk.addMethod(
  436. '_print_',
  437. smalltalk.method({
  438. selector: 'print:',
  439. category: 'actions',
  440. fn: function (aString){
  441. var self=this;
  442. var start=nil;
  443. start=self._selectionEnd();
  444. self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val()._copyFrom_to_((1),start).__comma(" ").__comma(aString).__comma(" ").__comma(self['@textarea']._asJQuery()._val()._copyFrom_to_(start.__plus((1)),self['@textarea']._asJQuery()._val()._size())));
  445. self._selectionStart_(start);
  446. self._selectionEnd_(start.__plus(aString._size()).__plus((2)));
  447. return self;},
  448. source: unescape('print%3A%20aString%0A%20%20%20%20%7C%20start%20%7C%0A%20%20%20%20start%20%3A%3D%20self%20selectionEnd.%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%28%0A%09%28textarea%20asJQuery%20val%20copyFrom%3A%201%20to%3A%20start%29%2C%0A%09%27%20%27%2C%20aString%2C%20%27%20%27%2C%0A%09%28textarea%20asJQuery%20val%20copyFrom%3A%20start%20+%201%20to%3A%20textarea%20asJQuery%20val%20size%29%29.%0A%20%20%20%20self%20selectionStart%3A%20start.%0A%20%20%20%20self%20selectionEnd%3A%20start%20+%20aString%20size%20+%202%0A')}),
  449. smalltalk.Workspace);
  450. smalltalk.addMethod(
  451. '_eval_',
  452. smalltalk.method({
  453. selector: 'eval:',
  454. category: 'actions',
  455. fn: function (aString){
  456. var self=this;
  457. try{var compiler=nil;
  458. var node=nil;
  459. compiler=smalltalk.Compiler._new();
  460. node=compiler._parseExpression_(aString);
  461. node._isParseFailure()._ifTrue_((function(){return (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return self._alert_(node._reason().__comma(unescape("%2C%20position%3A%20")).__comma(node._position()))}})})();}));
  462. (function(){throw({name: 'stReturn', selector: '_eval_', fn: function(){return compiler._loadExpression_(aString)}})})();
  463. return self;
  464. } catch(e) {if(e.name === 'stReturn' && e.selector === '_eval_'){return e.fn()} throw(e)}},
  465. source: unescape('eval%3A%20aString%0A%20%20%20%20%7C%20compiler%20node%20%7C%0A%20%20%20%20compiler%20%3A%3D%20Compiler%20new.%0A%20%20%20%20node%20%3A%3D%20compiler%20parseExpression%3A%20aString.%0A%20%20%20%20node%20isParseFailure%20ifTrue%3A%20%5B%0A%09%5Eself%20alert%3A%20node%20reason%2C%20%27%2C%20position%3A%20%27%2C%20node%20position%5D.%0A%20%20%20%20%5Ecompiler%20loadExpression%3A%20aString%0A')}),
  466. smalltalk.Workspace);
  467. smalltalk.addMethod(
  468. '_renderBoxOn_',
  469. smalltalk.method({
  470. selector: 'renderBoxOn:',
  471. category: 'rendering',
  472. fn: function (html){
  473. var self=this;
  474. self['@textarea']=html._textarea();
  475. self['@textarea']._asJQuery()._call_("tabby");
  476. self['@textarea']._onKeyDown_((function(e){return self._handleKeyDown_(e);}));
  477. (function($rec){$rec._class_("jt_workspace");return $rec._at_put_("spellcheck","false");})(self['@textarea']);
  478. return self;},
  479. source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20textarea%20%3A%3D%20html%20textarea.%0A%20%20%20%20textarea%20asJQuery%20call%3A%20%27tabby%27.%0A%20%20%20%20textarea%20onKeyDown%3A%20%5B%3Ae%20%7C%20self%20handleKeyDown%3A%20e%5D.%0A%20%20%20%20textarea%20%0A%09class%3A%20%27jt_workspace%27%3B%0A%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27%0A')}),
  480. smalltalk.Workspace);
  481. smalltalk.addMethod(
  482. '_renderButtonsOn_',
  483. smalltalk.method({
  484. selector: 'renderButtonsOn:',
  485. category: 'rendering',
  486. fn: function (html){
  487. var self=this;
  488. (function($rec){$rec._with_("DoIt");$rec._title_(unescape("ctrl+d"));return $rec._onClick_((function(){return self._doIt();}));})(html._button());
  489. (function($rec){$rec._with_("PrintIt");$rec._title_(unescape("ctrl+p"));return $rec._onClick_((function(){return self._printIt();}));})(html._button());
  490. (function($rec){$rec._with_("Clear workspace");return $rec._onClick_((function(){return self._clearWorkspace();}));})(html._button());
  491. return self;},
  492. source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27DoIt%27%3B%0A%09title%3A%20%27ctrl+d%27%3B%0A%09onClick%3A%20%5Bself%20doIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27PrintIt%27%3B%0A%09title%3A%20%27ctrl+p%27%3B%0A%09onClick%3A%20%5Bself%20printIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20workspace%27%3B%0A%09onClick%3A%20%5Bself%20clearWorkspace%5D%0A')}),
  493. smalltalk.Workspace);
  494. smalltalk.addClass('Transcript', smalltalk.TabWidget, ['textarea'], 'IDE');
  495. smalltalk.addMethod(
  496. '_label',
  497. smalltalk.method({
  498. selector: 'label',
  499. category: 'accessing',
  500. fn: function (){
  501. var self=this;
  502. return unescape("%5BTranscript%5D");
  503. return self;},
  504. source: unescape('label%0A%20%20%20%20%5E%27%5BTranscript%5D%27%0A')}),
  505. smalltalk.Transcript);
  506. smalltalk.addMethod(
  507. '_show_',
  508. smalltalk.method({
  509. selector: 'show:',
  510. category: 'actions',
  511. fn: function (anObject){
  512. var self=this;
  513. self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val().__comma(anObject._asString()));
  514. return self;},
  515. source: unescape('show%3A%20anObject%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20anObject%20asString.%0A%0A')}),
  516. smalltalk.Transcript);
  517. smalltalk.addMethod(
  518. '_cr',
  519. smalltalk.method({
  520. selector: 'cr',
  521. category: 'actions',
  522. fn: function (){
  523. var self=this;
  524. self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val().__comma(smalltalk.String._cr()));
  525. return self;},
  526. source: unescape('cr%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20String%20cr.%0A')}),
  527. smalltalk.Transcript);
  528. smalltalk.addMethod(
  529. '_clear',
  530. smalltalk.method({
  531. selector: 'clear',
  532. category: 'actions',
  533. fn: function (){
  534. var self=this;
  535. self['@textarea']._asJQuery()._val_("");
  536. return self;},
  537. source: unescape('clear%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27%0A')}),
  538. smalltalk.Transcript);
  539. smalltalk.addMethod(
  540. '_renderBoxOn_',
  541. smalltalk.method({
  542. selector: 'renderBoxOn:',
  543. category: 'rendering',
  544. fn: function (html){
  545. var self=this;
  546. self['@textarea']=html._textarea();
  547. self['@textarea']._asJQuery()._call_("tabby");
  548. (function($rec){$rec._class_("jt_transcript");return $rec._at_put_("spellcheck","false");})(self['@textarea']);
  549. return self;},
  550. source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20textarea%20%3A%3D%20html%20textarea.%0A%20%20%20%20textarea%20asJQuery%20call%3A%20%27tabby%27.%0A%20%20%20%20textarea%20%0A%09class%3A%20%27jt_transcript%27%3B%0A%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27%0A')}),
  551. smalltalk.Transcript);
  552. smalltalk.addMethod(
  553. '_renderButtonsOn_',
  554. smalltalk.method({
  555. selector: 'renderButtonsOn:',
  556. category: 'rendering',
  557. fn: function (html){
  558. var self=this;
  559. (function($rec){$rec._with_("Clear transcript");return $rec._onClick_((function(){return self._clear();}));})(html._button());
  560. return self;},
  561. source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20transcript%27%3B%0A%09onClick%3A%20%5Bself%20clear%5D%0A')}),
  562. smalltalk.Transcript);
  563. smalltalk.Transcript.klass.iVarNames = ['current'];
  564. smalltalk.addMethod(
  565. '_open',
  566. smalltalk.method({
  567. selector: 'open',
  568. category: 'instance creation',
  569. fn: function (){
  570. var self=this;
  571. self._current()._open();
  572. return self;},
  573. source: unescape('open%0A%20%20%20%20self%20current%20open%0A')}),
  574. smalltalk.Transcript.klass);
  575. smalltalk.addMethod(
  576. '_new',
  577. smalltalk.method({
  578. selector: 'new',
  579. category: 'instance creation',
  580. fn: function (){
  581. var self=this;
  582. self._shouldNotImplement();
  583. return self;},
  584. source: unescape('new%0A%20%20%20%20self%20shouldNotImplement%0A')}),
  585. smalltalk.Transcript.klass);
  586. smalltalk.addMethod(
  587. '_current',
  588. smalltalk.method({
  589. selector: 'current',
  590. category: 'instance creation',
  591. fn: function (){
  592. var self=this;
  593. return self['@current']._ifNil_((function(){return self['@current']=self.klass.superclass.fn.prototype['_new'].apply(self, []);}));
  594. return self;},
  595. source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D%0A')}),
  596. smalltalk.Transcript.klass);
  597. smalltalk.addMethod(
  598. '_show_',
  599. smalltalk.method({
  600. selector: 'show:',
  601. category: 'printing',
  602. fn: function (anObject){
  603. var self=this;
  604. self._current()._show_(anObject);
  605. return self;},
  606. source: unescape('show%3A%20anObject%0A%20%20%20%20self%20current%20show%3A%20anObject%0A')}),
  607. smalltalk.Transcript.klass);
  608. smalltalk.addMethod(
  609. '_cr',
  610. smalltalk.method({
  611. selector: 'cr',
  612. category: 'printing',
  613. fn: function (){
  614. var self=this;
  615. self._current()._show_(smalltalk.String._cr());
  616. return self;},
  617. source: unescape('cr%0A%20%20%20%20self%20current%20show%3A%20String%20cr%0A')}),
  618. smalltalk.Transcript.klass);
  619. smalltalk.addMethod(
  620. '_clear',
  621. smalltalk.method({
  622. selector: 'clear',
  623. category: 'printing',
  624. fn: function (){
  625. var self=this;
  626. self._current()._clear();
  627. return self;},
  628. source: unescape('clear%0A%20%20%20%20self%20current%20clear%0A')}),
  629. smalltalk.Transcript.klass);
  630. smalltalk.addClass('Browser', smalltalk.TabWidget, ['selectedCategory', 'selectedClass', 'selectedProtocol', 'selectedMethod', 'categoriesList', 'classesList', 'protocolsList', 'methodsList', 'sourceTextarea', 'tabsList', 'selectedTab', 'saveButton', 'classButtons', 'methodButtons', 'unsavedChanges'], 'IDE');
  631. smalltalk.addMethod(
  632. '_initialize',
  633. smalltalk.method({
  634. selector: 'initialize',
  635. category: 'initialization',
  636. fn: function (){
  637. var self=this;
  638. self.klass.superclass.fn.prototype['_initialize'].apply(self, []);
  639. self['@selectedTab']="instance";
  640. self['@unsavedChanges']=false;
  641. return self;},
  642. source: unescape('initialize%0A%20%20%20%20super%20initialize.%0A%20%20%20%20selectedTab%20%3A%3D%20%23instance.%0A%20%20%20%20unsavedChanges%20%3A%3D%20false%0A')}),
  643. smalltalk.Browser);
  644. smalltalk.addMethod(
  645. '_label',
  646. smalltalk.method({
  647. selector: 'label',
  648. category: 'accessing',
  649. fn: function (){
  650. var self=this;
  651. return self['@selectedClass']._ifNil_ifNotNil_((function(){return unescape("Browser%20%28nil%29");}),(function(){return self['@selectedClass']._name();}));
  652. return self;},
  653. source: unescape('label%0A%20%20%20%20%5EselectedClass%20%0A%09ifNil%3A%20%5B%27Browser%20%28nil%29%27%5D%0A%09ifNotNil%3A%20%5BselectedClass%20name%5D%0A')}),
  654. smalltalk.Browser);
  655. smalltalk.addMethod(
  656. '_categories',
  657. smalltalk.method({
  658. selector: 'categories',
  659. category: 'accessing',
  660. fn: function (){
  661. var self=this;
  662. var categories=nil;
  663. categories=smalltalk.Array._new();
  664. smalltalk.Smalltalk._current()._classes()._do_((function(each){return categories._includes_(each._category())._ifFalse_((function(){return categories._add_(each._category());}));}));
  665. return categories._sort();
  666. return self;},
  667. source: unescape('categories%0A%20%20%20%20%7C%20categories%20%7C%0A%20%20%20%20categories%20%3A%3D%20Array%20new.%0A%20%20%20%20Smalltalk%20current%20classes%20do%3A%20%5B%3Aeach%20%7C%0A%09%28categories%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%20%20%20%20categories%20add%3A%20each%20category%5D%5D.%0A%20%20%20%20%5Ecategories%20sort%0A')}),
  668. smalltalk.Browser);
  669. smalltalk.addMethod(
  670. '_classes',
  671. smalltalk.method({
  672. selector: 'classes',
  673. category: 'accessing',
  674. fn: function (){
  675. var self=this;
  676. return smalltalk.Smalltalk._current()._classes()._select_((function(each){return each._category().__eq(self['@selectedCategory']);}))._sort_((function(a, b){return a._name().__gt(b._name());}));
  677. return self;},
  678. source: unescape('classes%0A%20%20%20%20%5E%28Smalltalk%20current%20classes%20%0A%09select%3A%20%5B%3Aeach%20%7C%20each%20category%20%3D%20selectedCategory%5D%29%0A%09sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20name%20%3E%20b%20name%5D%0A')}),
  679. smalltalk.Browser);
  680. smalltalk.addMethod(
  681. '_protocols',
  682. smalltalk.method({
  683. selector: 'protocols',
  684. category: 'accessing',
  685. fn: function (){
  686. var self=this;
  687. try{var klass=nil;
  688. var protocols=nil;
  689. protocols=smalltalk.Array._new();
  690. self['@selectedClass']._ifNotNil_((function(){self['@selectedTab'].__eq("comment")._ifTrue_((function(){return (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return []}})})();}));klass=self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self['@selectedClass'];}),(function(){return self['@selectedClass']._class();}));klass._methodDictionary()._isEmpty()._ifTrue_((function(){return protocols._add_("not yet classified");}));return klass._methodDictionary()._do_((function(each){return protocols._includes_(each._category())._ifFalse_((function(){return protocols._add_(each._category());}));}));}));
  691. (function(){throw({name: 'stReturn', selector: '_protocols', fn: function(){return protocols._sort()}})})();
  692. return self;
  693. } catch(e) {if(e.name === 'stReturn' && e.selector === '_protocols'){return e.fn()} throw(e)}},
  694. source: unescape('protocols%0A%20%20%20%20%7C%20klass%20protocols%20%7C%0A%20%20%20%20protocols%20%3A%3D%20Array%20new.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%09klass%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D.%0A%09klass%20methodDictionary%20isEmpty%20ifTrue%3A%20%5B%0A%09%20%20%20%20protocols%20add%3A%20%27not%20yet%20classified%27%5D.%0A%09klass%20methodDictionary%20do%3A%20%5B%3Aeach%20%7C%0A%09%20%20%20%20%28protocols%20includes%3A%20each%20category%29%20ifFalse%3A%20%5B%0A%09%09protocols%20add%3A%20each%20category%5D%5D%5D.%0A%20%20%20%20%5Eprotocols%20sort%0A')}),
  695. smalltalk.Browser);
  696. smalltalk.addMethod(
  697. '_methods',
  698. smalltalk.method({
  699. selector: 'methods',
  700. category: 'accessing',
  701. fn: function (){
  702. var self=this;
  703. try{var klass=nil;
  704. self['@selectedTab'].__eq("comment")._ifTrue_((function(){return (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return []}})})();}));
  705. self['@selectedClass']._ifNotNil_((function(){return klass=self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self['@selectedClass'];}),(function(){return self['@selectedClass']._class();}));}));
  706. (function(){throw({name: 'stReturn', selector: '_methods', fn: function(){return self['@selectedProtocol']._ifNil_ifNotNil_((function(){return klass._ifNil_ifNotNil_((function(){return [];}),(function(){return klass._methodDictionary()._values();}));}),(function(){return klass._methodDictionary()._values()._select_((function(each){return each._category().__eq(self['@selectedProtocol']);}));}))._sort_((function(a, b){return a._selector().__gt(b._selector());}))}})})();
  707. return self;
  708. } catch(e) {if(e.name === 'stReturn' && e.selector === '_methods'){return e.fn()} throw(e)}},
  709. source: unescape('methods%0A%20%20%20%20%7C%20klass%20%7C%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%5E%23%28%29%5D.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09klass%20%3A%3D%20selectedTab%20%3D%20%23instance%0A%09%20%20%20%20ifTrue%3A%20%5BselectedClass%5D%0A%09%20%20%20%20ifFalse%3A%20%5BselectedClass%20class%5D%5D.%0A%20%20%20%20%5E%28selectedProtocol%20%0A%09ifNil%3A%20%5B%0A%09%20%20%20%20klass%20%0A%09%09ifNil%3A%20%5B%23%28%29%5D%20%0A%09%09ifNotNil%3A%20%5Bklass%20methodDictionary%20values%5D%5D%0A%09ifNotNil%3A%20%5B%0A%09%20%20%20%20klass%20methodDictionary%20values%20select%3A%20%5B%3Aeach%20%7C%0A%09%09each%20category%20%3D%20selectedProtocol%5D%5D%29%20sort%3A%20%5B%3Aa%20%3Ab%20%7C%20a%20selector%20%3E%20b%20selector%5D%0A')}),
  710. smalltalk.Browser);
  711. smalltalk.addMethod(
  712. '_source',
  713. smalltalk.method({
  714. selector: 'source',
  715. category: 'accessing',
  716. fn: function (){
  717. var self=this;
  718. try{self['@selectedTab'].__eq("comment")._ifFalse_((function(){return (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return self['@selectedProtocol']._notNil()._or_((function(){return self['@selectedMethod']._notNil();}))._ifFalse_ifTrue_((function(){return self._declarationSource();}),(function(){return self._methodSource();}))}})})();}));
  719. (function(){throw({name: 'stReturn', selector: '_source', fn: function(){return self['@selectedClass']._ifNil_ifNotNil_((function(){return "";}),(function(){return self._classCommentSource();}))}})})();
  720. return self;
  721. } catch(e) {if(e.name === 'stReturn' && e.selector === '_source'){return e.fn()} throw(e)}},
  722. source: unescape('source%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifFalse%3A%20%5B%0A%09%5E%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20declarationSource%5D%0A%09%20%20%20%20ifTrue%3A%20%5Bself%20methodSource%5D%5D.%0A%20%20%20%20%5EselectedClass%0A%09ifNil%3A%20%5B%27%27%5D%0A%09ifNotNil%3A%20%5Bself%20classCommentSource%5D%0A')}),
  723. smalltalk.Browser);
  724. smalltalk.addMethod(
  725. '_methodSource',
  726. smalltalk.method({
  727. selector: 'methodSource',
  728. category: 'accessing',
  729. fn: function (){
  730. var self=this;
  731. return self['@selectedMethod']._ifNil_ifNotNil_((function(){return self._dummyMethodSource();}),(function(){return self['@selectedMethod']._source();}));
  732. return self;},
  733. source: unescape('methodSource%0A%20%20%20%20%5EselectedMethod%0A%09ifNil%3A%20%5Bself%20dummyMethodSource%5D%0A%09ifNotNil%3A%20%5BselectedMethod%20source%5D%0A')}),
  734. smalltalk.Browser);
  735. smalltalk.addMethod(
  736. '_dummyMethodSource',
  737. smalltalk.method({
  738. selector: 'dummyMethodSource',
  739. category: 'accessing',
  740. fn: function (){
  741. var self=this;
  742. return unescape("messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements");
  743. return self;},
  744. source: unescape('dummyMethodSource%0A%20%20%20%20%5E%27messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements%27%0A')}),
  745. smalltalk.Browser);
  746. smalltalk.addMethod(
  747. '_declarationSource',
  748. smalltalk.method({
  749. selector: 'declarationSource',
  750. category: 'accessing',
  751. fn: function (){
  752. var self=this;
  753. return self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self._classDeclarationSource();}),(function(){return self._metaclassDeclarationSource();}));
  754. return self;},
  755. source: unescape('declarationSource%0A%20%20%20%20%5EselectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20classDeclarationSource%5D%0A%09ifFalse%3A%20%5Bself%20metaclassDeclarationSource%5D%0A')}),
  756. smalltalk.Browser);
  757. smalltalk.addMethod(
  758. '_classDeclarationSource',
  759. smalltalk.method({
  760. selector: 'classDeclarationSource',
  761. category: 'accessing',
  762. fn: function (){
  763. var self=this;
  764. var stream=nil;
  765. stream=""._writeStream();
  766. self['@selectedClass']._ifNotNil_((function(){(function($rec){$rec._nextPutAll_(self['@selectedClass']._superclass()._asString());$rec._nextPutAll_(unescape("%20subclass%3A%20%23"));$rec._nextPutAll_(self['@selectedClass']._name());$rec._nextPutAll_(smalltalk.String._cr().__comma(smalltalk.String._tab()));return $rec._nextPutAll_(unescape("instanceVariableNames%3A%20%27"));})(stream);self['@selectedClass']._instanceVariableNames()._do_separatedBy_((function(each){return stream._nextPutAll_(each);}),(function(){return stream._nextPutAll_(" ");}));return (function($rec){$rec._nextPutAll_(unescape("%27").__comma(smalltalk.String._cr()).__comma(smalltalk.String._tab()));$rec._nextPutAll_(unescape("category%3A%20%27"));$rec._nextPutAll_(self['@selectedClass']._category());return $rec._nextPutAll_(unescape("%27"));})(stream);}));
  767. return stream._contents();
  768. return self;},
  769. source: unescape('classDeclarationSource%0A%20%20%20%20%7C%20stream%20%7C%0A%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20superclass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20subclass%3A%20%23%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20name%3B%0A%09%20%20%20%20nextPutAll%3A%20String%20cr%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20instanceVariableNames%20%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%20%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%2C%20String%20cr%2C%20String%20tab%3B%0A%09%20%20%20%20nextPutAll%3A%20%27category%3A%20%27%27%27%3B%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20category%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%27%27%27%5D.%0A%20%20%20%20%5Estream%20contents%0A')}),
  770. smalltalk.Browser);
  771. smalltalk.addMethod(
  772. '_metaclassDeclarationSource',
  773. smalltalk.method({
  774. selector: 'metaclassDeclarationSource',
  775. category: 'accessing',
  776. fn: function (){
  777. var self=this;
  778. var stream=nil;
  779. stream=""._writeStream();
  780. self['@selectedClass']._ifNotNil_((function(){(function($rec){$rec._nextPutAll_(self['@selectedClass']._asString());$rec._nextPutAll_(" class ");return $rec._nextPutAll_(unescape("instanceVariableNames%3A%20%27"));})(stream);self['@selectedClass']._class()._instanceVariableNames()._do_separatedBy_((function(each){return stream._nextPutAll_(each);}),(function(){return stream._nextPutAll_(" ");}));return stream._nextPutAll_(unescape("%27"));}));
  781. return stream._contents();
  782. return self;},
  783. source: unescape('metaclassDeclarationSource%0A%20%20%20%20%7C%20stream%20%7C%0A%20%20%20%20stream%20%3A%3D%20%27%27%20writeStream.%0A%20%20%20%20selectedClass%20ifNotNil%3A%20%5B%0A%09stream%20%0A%09%20%20%20%20nextPutAll%3A%20selectedClass%20asString%3B%0A%09%20%20%20%20nextPutAll%3A%20%27%20class%20%27%3B%0A%09%20%20%20%20nextPutAll%3A%20%27instanceVariableNames%3A%20%27%27%27.%0A%09selectedClass%20class%20instanceVariableNames%0A%09%20%20%20%20do%3A%20%5B%3Aeach%20%7C%20stream%20nextPutAll%3A%20each%5D%0A%09%20%20%20%20separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%20%27%5D.%0A%09stream%20nextPutAll%3A%20%27%27%27%27%5D.%0A%20%20%20%20%5Estream%20contents%0A')}),
  784. smalltalk.Browser);
  785. smalltalk.addMethod(
  786. '_classCommentSource',
  787. smalltalk.method({
  788. selector: 'classCommentSource',
  789. category: 'accessing',
  790. fn: function (){
  791. var self=this;
  792. return self['@selectedClass']._comment();
  793. return self;},
  794. source: unescape('classCommentSource%0A%20%20%20%20%5EselectedClass%20comment%0A')}),
  795. smalltalk.Browser);
  796. smalltalk.addMethod(
  797. '_enableSaveButton',
  798. smalltalk.method({
  799. selector: 'enableSaveButton',
  800. category: 'actions',
  801. fn: function (){
  802. var self=this;
  803. self['@saveButton']._removeAt_("disabled");
  804. self['@unsavedChanges']=true;
  805. return self;},
  806. source: unescape('enableSaveButton%0A%20%20%20%20saveButton%20removeAt%3A%20%27disabled%27.%0A%20%20%20%20unsavedChanges%20%3A%3D%20true%0A')}),
  807. smalltalk.Browser);
  808. smalltalk.addMethod(
  809. '_disableSaveButton',
  810. smalltalk.method({
  811. selector: 'disableSaveButton',
  812. category: 'actions',
  813. fn: function (){
  814. var self=this;
  815. self['@saveButton']._ifNotNil_((function(){return self['@saveButton']._at_put_("disabled",true);}));
  816. self['@unsavedChanges']=false;
  817. return self;},
  818. source: unescape('disableSaveButton%0A%20%20%20%20saveButton%20ifNotNil%3A%20%5B%0A%09saveButton%20at%3A%20%27disabled%27%20put%3A%20true%5D.%0A%20%20%20%20unsavedChanges%20%3A%3D%20false%0A')}),
  819. smalltalk.Browser);
  820. smalltalk.addMethod(
  821. '_hideClassButtons',
  822. smalltalk.method({
  823. selector: 'hideClassButtons',
  824. category: 'actions',
  825. fn: function (){
  826. var self=this;
  827. self['@classButtons']._asJQuery()._hide();
  828. return self;},
  829. source: unescape('hideClassButtons%0A%20%20%20%20classButtons%20asJQuery%20hide%0A')}),
  830. smalltalk.Browser);
  831. smalltalk.addMethod(
  832. '_showClassButtons',
  833. smalltalk.method({
  834. selector: 'showClassButtons',
  835. category: 'actions',
  836. fn: function (){
  837. var self=this;
  838. self['@classButtons']._asJQuery()._show();
  839. return self;},
  840. source: unescape('showClassButtons%0A%20%20%20%20classButtons%20asJQuery%20show%0A')}),
  841. smalltalk.Browser);
  842. smalltalk.addMethod(
  843. '_hideMethodButtons',
  844. smalltalk.method({
  845. selector: 'hideMethodButtons',
  846. category: 'actions',
  847. fn: function (){
  848. var self=this;
  849. self['@methodButtons']._asJQuery()._hide();
  850. return self;},
  851. source: unescape('hideMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20hide%0A')}),
  852. smalltalk.Browser);
  853. smalltalk.addMethod(
  854. '_showMethodButtons',
  855. smalltalk.method({
  856. selector: 'showMethodButtons',
  857. category: 'actions',
  858. fn: function (){
  859. var self=this;
  860. self['@methodButtons']._asJQuery()._show();
  861. return self;},
  862. source: unescape('showMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20show%0A')}),
  863. smalltalk.Browser);
  864. smalltalk.addMethod(
  865. '_compile',
  866. smalltalk.method({
  867. selector: 'compile',
  868. category: 'actions',
  869. fn: function (){
  870. var self=this;
  871. self._disableSaveButton();
  872. self['@selectedTab'].__eq("comment")._ifTrue_((function(){return self['@selectedClass']._ifNotNil_((function(){return self._compileClassComment();}));}));
  873. self['@selectedProtocol']._notNil()._or_((function(){return self['@selectedMethod']._notNil();}))._ifFalse_ifTrue_((function(){return self._compileDefinition();}),(function(){return self._compileMethodDefinition();}));
  874. return self;},
  875. source: unescape('compile%0A%20%20%20%20self%20disableSaveButton.%0A%20%20%20%20selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5B%0A%09selectedClass%20ifNotNil%3A%20%5B%0A%09%20%20%20%20self%20compileClassComment%5D%5D.%0A%20%20%20%20%28selectedProtocol%20notNil%20or%3A%20%5BselectedMethod%20notNil%5D%29%0A%09ifFalse%3A%20%5Bself%20compileDefinition%5D%0A%09ifTrue%3A%20%5Bself%20compileMethodDefinition%5D%0A')}),
  876. smalltalk.Browser);
  877. smalltalk.addMethod(
  878. '_compileClassComment',
  879. smalltalk.method({
  880. selector: 'compileClassComment',
  881. category: 'actions',
  882. fn: function (){
  883. var self=this;
  884. self['@selectedClass']._comment_(self['@sourceTextarea']._asJQuery()._val());
  885. return self;},
  886. source: unescape('compileClassComment%0A%20%20%20%20selectedClass%20comment%3A%20sourceTextarea%20asJQuery%20val%0A')}),
  887. smalltalk.Browser);
  888. smalltalk.addMethod(
  889. '_compileMethodDefinition',
  890. smalltalk.method({
  891. selector: 'compileMethodDefinition',
  892. category: 'actions',
  893. fn: function (){
  894. var self=this;
  895. self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_((function(){return self._compileMethodDefinitionFor_(self['@selectedClass']);}),(function(){return self._compileMethodDefinitionFor_(self['@selectedClass']._class());}));
  896. return self;},
  897. source: unescape('compileMethodDefinition%0A%20%20%20%20selectedTab%20%3D%20%23instance%0A%09ifTrue%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%5D%0A%09ifFalse%3A%20%5Bself%20compileMethodDefinitionFor%3A%20selectedClass%20class%5D%0A')}),
  898. smalltalk.Browser);
  899. smalltalk.addMethod(
  900. '_compileMethodDefinitionFor_',
  901. smalltalk.method({
  902. selector: 'compileMethodDefinitionFor:',
  903. category: 'actions',
  904. fn: function (aClass){
  905. var self=this;
  906. try{var compiler=nil;
  907. var method=nil;
  908. var source=nil;
  909. var node=nil;
  910. source=self['@sourceTextarea']._asJQuery()._val();
  911. compiler=smalltalk.Compiler._new();
  912. node=compiler._parse_(source);
  913. node._isParseFailure()._ifTrue_((function(){return (function(){throw({name: 'stReturn', selector: '_compileMethodDefinitionFor_', fn: function(){return self._alert_("PARSE ERROR: ".__comma(node._reason()).__comma(unescape("%2C%20position%3A%20")).__comma(node._position()._asString()))}})})();}));
  914. compiler._currentClass_(self['@selectedClass']);
  915. method=compiler._eval_(compiler._compileNode_(node));
  916. method._category_(self['@selectedProtocol']);
  917. aClass._addCompiledMethod_(method);
  918. self._updateMethodsList();
  919. self._selectMethod_(method);
  920. return self;
  921. } catch(e) {if(e.name === 'stReturn' && e.selector === '_compileMethodDefinitionFor_'){return e.fn()} throw(e)}},
  922. source: unescape('compileMethodDefinitionFor%3A%20aClass%0A%20%20%20%20%7C%20compiler%20method%20source%20node%20%7C%0A%20%20%20%20source%20%3A%3D%20sourceTextarea%20asJQuery%20val.%0A%20%20%20%20compiler%20%3A%3D%20Compiler%20new.%0A%20%20%20%20node%20%3A%3D%20compiler%20parse%3A%20source.%0A%20%20%20%20node%20isParseFailure%20ifTrue%3A%20%5B%0A%09%5Eself%20alert%3A%20%27PARSE%20ERROR%3A%20%27%2C%20node%20reason%2C%20%27%2C%20position%3A%20%27%2C%20node%20position%20asString%5D.%0A%20%20%20%20compiler%20currentClass%3A%20selectedClass.%0A%20%20%20%20method%20%3A%3D%20compiler%20eval%3A%20%28compiler%20compileNode%3A%20node%29.%0A%20%20%20%20method%20category%3A%20selectedProtocol.%0A%20%20%20%20aClass%20addCompiledMethod%3A%20method.%0A%20%20%20%20self%20updateMethodsList.%0A%20%20%20%20self%20selectMethod%3A%20method%0A')}),
  923. smalltalk.Browser);
  924. smalltalk.addMethod(
  925. '_compileDefinition',
  926. smalltalk.method({
  927. selector: 'compileDefinition',
  928. category: 'actions',
  929. fn: function (){
  930. var self=this;
  931. var newClass=nil;
  932. newClass=smalltalk.Compiler._new()._loadExpression_(self['@sourceTextarea']._asJQuery()._val());
  933. (function($rec){$rec._updateCategoriesList();return $rec._updateClassesList();})(self);
  934. return self;},
  935. source: unescape('compileDefinition%0A%20%20%20%20%7C%20newClass%20%7C%0A%20%20%20%20newClass%20%3A%3D%20Compiler%20new%20loadExpression%3A%20sourceTextarea%20asJQuery%20val.%0A%20%20%20%20self%20%0A%09updateCategoriesList%3B%0A%09updateClassesList%0A')}),
  936. smalltalk.Browser);
  937. smalltalk.addMethod(
  938. '_cancelChanges',
  939. smalltalk.method({
  940. selector: 'cancelChanges',
  941. category: 'actions',
  942. fn: function (){
  943. var self=this;
  944. return self['@unsavedChanges']._ifTrue_ifFalse_((function(){return self._confirm_(unescape("Cancel%20changes%3F"));}),(function(){return true;}));
  945. return self;},
  946. source: unescape('cancelChanges%0A%20%20%20%20%5EunsavedChanges%20%0A%09ifTrue%3A%20%5Bself%20confirm%3A%20%27Cancel%20changes%3F%27%5D%0A%09ifFalse%3A%20%5Btrue%5D%0A')}),
  947. smalltalk.Browser);
  948. smalltalk.addMethod(
  949. '_removeClass',
  950. smalltalk.method({
  951. selector: 'removeClass',
  952. category: 'actions',
  953. fn: function (){
  954. var self=this;
  955. self._confirm_("Do you really want to remove ".__comma(self['@selectedClass']._name()).__comma(unescape("%3F")))._ifTrue_((function(){smalltalk.Smalltalk._current()._basicDelete_(self['@selectedClass']._name());return self._selectClass_(nil);}));
  956. return self;},
  957. source: unescape('removeClass%0A%20%20%20%20%28self%20confirm%3A%20%27Do%20you%20really%20want%20to%20remove%20%27%2C%20selectedClass%20name%2C%20%27%3F%27%29%0A%09ifTrue%3A%20%5B%0A%09%20%20%20%20Smalltalk%20current%20basicDelete%3A%20selectedClass%20name.%0A%09%20%20%20%20self%20selectClass%3A%20nil%5D%0A')}),
  958. smalltalk.Browser);
  959. smalltalk.addMethod(
  960. '_removeMethod',
  961. smalltalk.method({
  962. selector: 'removeMethod',
  963. category: 'actions',
  964. fn: function (){
  965. var self=this;
  966. self._cancelChanges()._ifTrue_((function(){return self._confirm_(unescape("Do%20you%20really%20want%20to%20remove%20%23").__comma(self['@selectedMethod']._selector()).__comma(unescape("%3F")))._ifTrue_((function(){self['@selectedClass']._removeCompiledMethod_(self['@selectedMethod']);return self._selectMethod_(nil);}));}));
  967. return self;},
  968. source: unescape('removeMethod%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09%28self%20confirm%3A%20%27Do%20you%20really%20want%20to%20remove%20%23%27%2C%20selectedMethod%20selector%2C%20%27%3F%27%29%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09selectedClass%20removeCompiledMethod%3A%20selectedMethod.%0A%09%09self%20selectMethod%3A%20nil%5D%5D%0A')}),
  969. smalltalk.Browser);
  970. smalltalk.addMethod(
  971. '_setMethodProtocol_',
  972. smalltalk.method({
  973. selector: 'setMethodProtocol:',
  974. category: 'actions',
  975. fn: function (aString){
  976. var self=this;
  977. self._cancelChanges()._ifTrue_((function(){self['@selectedMethod']._category_(aString);self['@selectedProtocol']=aString;self['@selectedMethod']=self['@selectedMethod'];return (function($rec){$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);}));
  978. return self;},
  979. source: unescape('setMethodProtocol%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedMethod%20category%3A%20aString.%0A%09selectedProtocol%20%3A%3D%20aString.%0A%09selectedMethod%20%3A%3D%20selectedMethod.%0A%09self%20%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D%0A')}),
  980. smalltalk.Browser);
  981. smalltalk.addMethod(
  982. '_addNewProtocol',
  983. smalltalk.method({
  984. selector: 'addNewProtocol',
  985. category: 'actions',
  986. fn: function (){
  987. var self=this;
  988. var newProtocol=nil;
  989. newProtocol=self._prompt_("New method protocol");
  990. newProtocol._notEmpty()._ifTrue_((function(){return self._setMethodProtocol_(newProtocol);}));
  991. return self;},
  992. source: unescape('addNewProtocol%0A%20%20%20%20%7C%20newProtocol%20%7C%0A%20%20%20%20newProtocol%20%3A%3D%20self%20prompt%3A%20%27New%20method%20protocol%27.%0A%20%20%20%20newProtocol%20notEmpty%20ifTrue%3A%20%5B%0A%09self%20setMethodProtocol%3A%20newProtocol%5D%0A')}),
  993. smalltalk.Browser);
  994. smalltalk.addMethod(
  995. '_selectCategory_',
  996. smalltalk.method({
  997. selector: 'selectCategory:',
  998. category: 'actions',
  999. fn: function (aCategory){
  1000. var self=this;
  1001. self._cancelChanges()._ifTrue_((function(){self['@selectedCategory']=aCategory;self['@selectedClass']=self['@selectedProtocol']=self['@selectedMethod']=nil;return (function($rec){$rec._updateCategoriesList();$rec._updateClassesList();$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);}));
  1002. return self;},
  1003. source: unescape('selectCategory%3A%20aCategory%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedCategory%20%3A%3D%20aCategory.%0A%09selectedClass%20%3A%3D%20selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20%20nil.%0A%09self%20%0A%09%20%20%20%20updateCategoriesList%3B%0A%09%20%20%20%20updateClassesList%3B%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D%0A')}),
  1004. smalltalk.Browser);
  1005. smalltalk.addMethod(
  1006. '_selectClass_',
  1007. smalltalk.method({
  1008. selector: 'selectClass:',
  1009. category: 'actions',
  1010. fn: function (aClass){
  1011. var self=this;
  1012. self._cancelChanges()._ifTrue_((function(){self['@selectedClass']=aClass;self['@selectedProtocol']=self['@selectedMethod']=nil;return (function($rec){$rec._updateClassesList();$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);}));
  1013. return self;},
  1014. source: unescape('selectClass%3A%20aClass%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedClass%20%3A%3D%20aClass.%0A%09selectedProtocol%20%3A%3D%20selectedMethod%20%3A%3D%20nil.%0A%09self%20%0A%09%20%20%20%20updateClassesList%3B%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D%0A')}),
  1015. smalltalk.Browser);
  1016. smalltalk.addMethod(
  1017. '_selectProtocol_',
  1018. smalltalk.method({
  1019. selector: 'selectProtocol:',
  1020. category: 'actions',
  1021. fn: function (aString){
  1022. var self=this;
  1023. self._cancelChanges()._ifTrue_((function(){self['@selectedProtocol']=aString;self['@selectedMethod']=nil;return (function($rec){$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);}));
  1024. return self;},
  1025. source: unescape('selectProtocol%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedProtocol%20%3A%3D%20aString.%0A%09selectedMethod%20%3A%3D%20nil.%0A%09self%20%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D%0A')}),
  1026. smalltalk.Browser);
  1027. smalltalk.addMethod(
  1028. '_selectMethod_',
  1029. smalltalk.method({
  1030. selector: 'selectMethod:',
  1031. category: 'actions',
  1032. fn: function (aMethod){
  1033. var self=this;
  1034. self._cancelChanges()._ifTrue_((function(){self['@selectedMethod']=aMethod;return (function($rec){$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();})(self);}));
  1035. return self;},
  1036. source: unescape('selectMethod%3A%20aMethod%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedMethod%20%3A%3D%20aMethod.%0A%09self%20%0A%09%20%20%20%20updateProtocolsList%3B%0A%09%20%20%20%20updateMethodsList%3B%0A%09%20%20%20%20updateSourceAndButtons%5D%0A')}),
  1037. smalltalk.Browser);
  1038. smalltalk.addMethod(
  1039. '_selectTab_',
  1040. smalltalk.method({
  1041. selector: 'selectTab:',
  1042. category: 'actions',
  1043. fn: function (aString){
  1044. var self=this;
  1045. self._cancelChanges()._ifTrue_((function(){self['@selectedTab']=aString;self._selectProtocol_(nil);return self._updateTabsList();}));
  1046. return self;},
  1047. source: unescape('selectTab%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09selectedTab%20%3A%3D%20aString.%0A%09self%20selectProtocol%3A%20nil.%0A%09self%20updateTabsList%5D%0A')}),
  1048. smalltalk.Browser);
  1049. smalltalk.addMethod(
  1050. '_renderBoxOn_',
  1051. smalltalk.method({
  1052. selector: 'renderBoxOn:',
  1053. category: 'rendering',
  1054. fn: function (html){
  1055. var self=this;
  1056. (function($rec){$rec._renderTopPanelOn_(html);$rec._renderTabsOn_(html);return $rec._renderBottomPanelOn_(html);})(self);
  1057. return self;},
  1058. source: unescape('renderBoxOn%3A%20html%0A%20%20%20%20self%20%0A%09renderTopPanelOn%3A%20html%3B%0A%09renderTabsOn%3A%20html%3B%0A%09renderBottomPanelOn%3A%20html%0A')}),
  1059. smalltalk.Browser);
  1060. smalltalk.addMethod(
  1061. '_renderTopPanelOn_',
  1062. smalltalk.method({
  1063. selector: 'renderTopPanelOn:',
  1064. category: 'rendering',
  1065. fn: function (html){
  1066. var self=this;
  1067. (function($rec){$rec._class_("top");return $rec._with_((function(){self['@categoriesList']=html._ul()._class_("jt_column categories");self['@classesList']=html._ul()._class_("jt_column classes");self['@protocolsList']=html._ul()._class_("jt_column protocols");self['@methodsList']=html._ul()._class_("jt_column methods");(function($rec){$rec._updateCategoriesList();$rec._updateClassesList();$rec._updateProtocolsList();return $rec._updateMethodsList();})(self);return html._div()._class_("jt_clear");}));})(html._div());
  1068. return self;},
  1069. source: unescape('renderTopPanelOn%3A%20html%0A%20%20%20%20html%20div%20%0A%09class%3A%20%27top%27%3B%20%0A%09with%3A%20%5B%0A%09%20%20%20%20categoriesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20categories%27.%0A%09%20%20%20%20classesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20classes%27.%0A%09%20%20%20%20protocolsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20protocols%27.%0A%09%20%20%20%20methodsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20methods%27.%0A%09%20%20%20%20self%0A%09%09updateCategoriesList%3B%0A%09%09updateClassesList%3B%0A%09%09updateProtocolsList%3B%0A%09%09updateMethodsList.%0A%09%20%20%20%20html%20div%20class%3A%20%27jt_clear%27%5D%0A')}),
  1070. smalltalk.Browser);
  1071. smalltalk.addMethod(
  1072. '_renderTabsOn_',
  1073. smalltalk.method({
  1074. selector: 'renderTabsOn:',
  1075. category: 'rendering',
  1076. fn: function (html){
  1077. var self=this;
  1078. self['@tabsList']=html._ul()._class_("jt_tabs");
  1079. self._updateTabsList();
  1080. return self;},
  1081. source: unescape('renderTabsOn%3A%20html%0A%20%20%20%20tabsList%20%3A%3D%20html%20ul%20class%3A%20%27jt_tabs%27.%0A%20%20%20%20self%20updateTabsList.%0A')}),
  1082. smalltalk.Browser);
  1083. smalltalk.addMethod(
  1084. '_renderBottomPanelOn_',
  1085. smalltalk.method({
  1086. selector: 'renderBottomPanelOn:',
  1087. category: 'rendering',
  1088. fn: function (html){
  1089. var self=this;
  1090. (function($rec){$rec._class_("jt_sourceCode");return $rec._with_((function(){self['@sourceTextarea']=(function($rec){$rec._onKeyPress_((function(){return self._enableSaveButton();}));$rec._class_("source");return $rec._at_put_("spellcheck","false");})(html._textarea());return self['@sourceTextarea']._asJQuery()._call_("tabby");}));})(html._div());
  1091. return self;},
  1092. source: unescape('renderBottomPanelOn%3A%20html%0A%20%20%20%20html%20div%0A%09class%3A%20%27jt_sourceCode%27%3B%0A%09with%3A%20%5B%0A%09%20%20%20%20sourceTextarea%20%3A%3D%20html%20textarea%20%0A%09%09onKeyPress%3A%20%5Bself%20enableSaveButton%5D%3B%0A%09%09class%3A%20%27source%27%3B%0A%09%09at%3A%20%27spellcheck%27%20put%3A%20%27false%27.%0A%09%20%20%20%20sourceTextarea%20asJQuery%20call%3A%20%27tabby%27%5D%0A')}),
  1093. smalltalk.Browser);
  1094. smalltalk.addMethod(
  1095. '_renderButtonsOn_',
  1096. smalltalk.method({
  1097. selector: 'renderButtonsOn:',
  1098. category: 'rendering',
  1099. fn: function (html){
  1100. var self=this;
  1101. self['@saveButton']=html._button();
  1102. (function($rec){$rec._with_("Save");return $rec._onClick_((function(){return self._compile();}));})(self['@saveButton']);
  1103. self['@methodButtons']=html._span();
  1104. self['@classButtons']=html._span();
  1105. self._updateSourceAndButtons();
  1106. return self;},
  1107. source: unescape('renderButtonsOn%3A%20html%0A%20%20%20%20saveButton%20%3A%3D%20html%20button.%0A%20%20%20%20saveButton%20%0A%09with%3A%20%27Save%27%3B%0A%09onClick%3A%20%5Bself%20compile%5D.%0A%20%20%20%20methodButtons%20%3A%3D%20html%20span.%0A%20%20%20%20classButtons%20%3A%3D%20html%20span.%0A%20%20%20%20self%20updateSourceAndButtons%0A')}),
  1108. smalltalk.Browser);
  1109. smalltalk.addMethod(
  1110. '_updateCategoriesList',
  1111. smalltalk.method({
  1112. selector: 'updateCategoriesList',
  1113. category: 'updating',
  1114. fn: function (){
  1115. var self=this;
  1116. self['@categoriesList']._contents_((function(html){return self._categories()._do_((function(each){var li=nil;
  1117. li=html._li();self['@selectedCategory'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each);return $rec._onClick_((function(){return self._selectCategory_(each);}));})(li);}));}));
  1118. return self;},
  1119. source: unescape('updateCategoriesList%0A%20%20%20%20categoriesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20categories%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedCategory%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20selectCategory%3A%20each%5D%5D%5D%0A')}),
  1120. smalltalk.Browser);
  1121. smalltalk.addMethod(
  1122. '_updateClassesList',
  1123. smalltalk.method({
  1124. selector: 'updateClassesList',
  1125. category: 'updating',
  1126. fn: function (){
  1127. var self=this;
  1128. smalltalk.TabManager._current()._update();
  1129. self['@classesList']._contents_((function(html){return self._classes()._do_((function(each){var li=nil;
  1130. li=html._li();self['@selectedClass'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each._name());return $rec._onClick_((function(){return self._selectClass_(each);}));})(li);}));}));
  1131. return self;},
  1132. source: unescape('updateClassesList%0A%20%20%20%20TabManager%20current%20update.%0A%20%20%20%20classesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20classes%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedClass%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%20name%3B%0A%09%09onClick%3A%20%5Bself%20selectClass%3A%20each%5D%5D%5D%0A')}),
  1133. smalltalk.Browser);
  1134. smalltalk.addMethod(
  1135. '_updateProtocolsList',
  1136. smalltalk.method({
  1137. selector: 'updateProtocolsList',
  1138. category: 'updating',
  1139. fn: function (){
  1140. var self=this;
  1141. self['@protocolsList']._contents_((function(html){return self._protocols()._do_((function(each){var li=nil;
  1142. li=html._li();self['@selectedProtocol'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each);return $rec._onClick_((function(){return self._selectProtocol_(each);}));})(li);}));}));
  1143. return self;},
  1144. source: unescape('updateProtocolsList%0A%20%20%20%20protocolsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20protocols%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedProtocol%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%20%0A%09%09with%3A%20each%3B%0A%09%09onClick%3A%20%5Bself%20selectProtocol%3A%20each%5D%5D%5D%0A')}),
  1145. smalltalk.Browser);
  1146. smalltalk.addMethod(
  1147. '_updateMethodsList',
  1148. smalltalk.method({
  1149. selector: 'updateMethodsList',
  1150. category: 'updating',
  1151. fn: function (){
  1152. var self=this;
  1153. self['@methodsList']._contents_((function(html){return self._methods()._do_((function(each){var li=nil;
  1154. li=html._li();self['@selectedMethod'].__eq(each)._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_(each._selector());return $rec._onClick_((function(){return self._selectMethod_(each);}));})(li);}));}));
  1155. return self;},
  1156. source: unescape('updateMethodsList%0A%20%20%20%20methodsList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09self%20methods%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20selectedMethod%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09li%20class%3A%20%27selected%27%5D.%0A%09%20%20%20%20li%0A%09%09with%3A%20each%20selector%3B%0A%09%09onClick%3A%20%5Bself%20selectMethod%3A%20each%5D%5D%5D%0A')}),
  1157. smalltalk.Browser);
  1158. smalltalk.addMethod(
  1159. '_updateTabsList',
  1160. smalltalk.method({
  1161. selector: 'updateTabsList',
  1162. category: 'updating',
  1163. fn: function (){
  1164. var self=this;
  1165. self['@tabsList']._contents_((function(html){var li=nil;
  1166. li=html._li();self['@selectedTab'].__eq("instance")._ifTrue_((function(){return li._class_("selected");}));(function($rec){$rec._with_("Instance");return $rec._onClick_((function(){return self._selectTab_("instance");}));})(li);li=html._li();self['@selectedTab'].__eq("class")._ifTrue_((function(){return li._class_("selected");}));(function($rec){$rec._with_("Class");return $rec._onClick_((function(){return self._selectTab_("class");}));})(li);li=html._li();self['@selectedTab'].__eq("comment")._ifTrue_((function(){return li._class_("selected");}));return (function($rec){$rec._with_("Comment");return $rec._onClick_((function(){return self._selectTab_("comment");}));})(li);}));
  1167. return self;},
  1168. source: unescape('updateTabsList%0A%20%20%20%20tabsList%20contents%3A%20%5B%3Ahtml%20%7C%7C%20li%20%7C%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23instance%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%27Instance%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23instance%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23class%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%27Class%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23class%5D.%0A%09li%20%3A%3D%20html%20li.%0A%09selectedTab%20%3D%20%23comment%20ifTrue%3A%20%5Bli%20class%3A%20%27selected%27%5D.%0A%09li%0A%09%20%20%20%20with%3A%20%27Comment%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20selectTab%3A%20%23comment%5D%5D%0A')}),
  1169. smalltalk.Browser);
  1170. smalltalk.addMethod(
  1171. '_updateSourceAndButtons',
  1172. smalltalk.method({
  1173. selector: 'updateSourceAndButtons',
  1174. category: 'updating',
  1175. fn: function (){
  1176. var self=this;
  1177. self._disableSaveButton();
  1178. self['@classButtons']._contents_((function(html){return (function($rec){$rec._with_("Remove class");return $rec._onClick_((function(){return self._removeClass();}));})(html._button());}));
  1179. self['@methodButtons']._contents_((function(html){(function($rec){$rec._with_("Remove method");return $rec._onClick_((function(){return self._removeMethod();}));})(html._button());return html._select()._with_((function(){(function($rec){$rec._with_("Method protocol");return $rec._at_put_("disabled","disabled");})(html._option());(function($rec){$rec._class_("important");$rec._with_("New...");return $rec._onClick_((function(){return self._addNewProtocol();}));})(html._option());return self._protocols()._do_((function(each){return (function($rec){$rec._with_(each);return $rec._onClick_((function(){return self._setMethodProtocol_(each);}));})(html._option());}));}));}));
  1180. self['@selectedMethod']._ifNil_ifNotNil_((function(){self._hideMethodButtons();return self['@selectedClass']._ifNil_ifNotNil_((function(){return self._hideClassButtons();}),(function(){return self._showClassButtons();}));}),(function(){self._hideClassButtons();return self._showMethodButtons();}));
  1181. self['@sourceTextarea']._asJQuery()._val_(self._source());
  1182. return self;},
  1183. source: unescape('updateSourceAndButtons%0A%20%20%20%20self%20disableSaveButton.%0A%20%20%20%20classButtons%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20button%0A%09%20%20%20%20with%3A%20%27Remove%20class%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20removeClass%5D%5D.%0A%20%20%20%20methodButtons%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20button%0A%09%20%20%20%20with%3A%20%27Remove%20method%27%3B%0A%09%20%20%20%20onClick%3A%20%5Bself%20removeMethod%5D.%0A%09html%20select%20with%3A%20%5B%0A%09%20%20%20%20html%20option%0A%09%09with%3A%20%27Method%20protocol%27%3B%0A%09%09at%3A%20%27disabled%27%20put%3A%20%27disabled%27.%0A%09%20%20%20%20html%20option%0A%09%09class%3A%20%27important%27%3B%0A%09%09with%3A%20%27New...%27%3B%0A%09%09onClick%3A%20%5Bself%20addNewProtocol%5D.%0A%09%20%20%20%20self%20protocols%20do%3A%20%5B%3Aeach%20%7C%0A%09%09html%20option%0A%09%09%20%20%20%20with%3A%20each%3B%0A%09%09%20%20%20%20onClick%3A%20%5Bself%20setMethodProtocol%3A%20each%5D%5D%5D%5D.%0A%20%20%20%20selectedMethod%20%0A%09ifNil%3A%20%5B%0A%09%20%20%20%20self%20hideMethodButtons.%0A%09%20%20%20%20selectedClass%20%0A%09%09ifNil%3A%20%5Bself%20hideClassButtons%5D%0A%09%20%20%20%20ifNotNil%3A%20%5Bself%20showClassButtons%5D%5D%0A%09ifNotNil%3A%20%5B%0A%09%20%20%20%20self%20hideClassButtons.%0A%09%20%20%20%20self%20showMethodButtons%5D.%0A%20%20%20%20sourceTextarea%20asJQuery%20val%3A%20self%20source%0A')}),
  1184. smalltalk.Browser);
  1185. smalltalk.addMethod(
  1186. '_canBeClosed',
  1187. smalltalk.method({
  1188. selector: 'canBeClosed',
  1189. category: 'testing',
  1190. fn: function (){
  1191. var self=this;
  1192. return true;
  1193. return self;},
  1194. source: unescape('canBeClosed%0A%20%20%20%20%5Etrue%0A')}),
  1195. smalltalk.Browser);
  1196. smalltalk.addMethod(
  1197. '_openOn_',
  1198. smalltalk.method({
  1199. selector: 'openOn:',
  1200. category: 'convenience',
  1201. fn: function (aClass){
  1202. var self=this;
  1203. (function($rec){$rec._open();$rec._selectCategory_(aClass._category());return $rec._selectClass_(aClass);})(self._new());
  1204. return self;},
  1205. source: unescape('openOn%3A%20aClass%0A%20%20%20%20self%20new%0A%09open%3B%0A%09selectCategory%3A%20aClass%20category%3B%0A%09selectClass%3A%20aClass%0A')}),
  1206. smalltalk.Browser.klass);
  1207. smalltalk.addMethod(
  1208. '_open',
  1209. smalltalk.method({
  1210. selector: 'open',
  1211. category: 'convenience',
  1212. fn: function (){
  1213. var self=this;
  1214. self._new()._open();
  1215. return self;},
  1216. source: unescape('open%0A%20%20%20%20self%20new%20open%0A')}),
  1217. smalltalk.Browser.klass);