IDE.js 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788
  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 function ($rec) {$rec._updateBodyMargin();return $rec._updatePosition();}(self);});return $rec._onWindowResize_(function () {return self._updatePosition();});}(self));
  15. return self;
  16. },
  17. 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%3B%20updatePosition%5D%3B%0A%09onWindowResize%3A%20%5Bself%20updatePosition%5D%0A')}),
  18. smalltalk.TabManager);
  19. smalltalk.addMethod(
  20. '_tabs',
  21. smalltalk.method({
  22. selector: 'tabs',
  23. category: 'accessing',
  24. fn: function () {
  25. var self = this;
  26. return self['@tabs']._ifNil_(function () {return self['@tabs'] = smalltalk.Array._new();});
  27. return self;
  28. },
  29. source: unescape('tabs%0A%20%20%20%20%5Etabs%20ifNil%3A%20%5Btabs%20%3A%3D%20Array%20new%5D%0A')}),
  30. smalltalk.TabManager);
  31. smalltalk.addMethod(
  32. '_addTab_',
  33. smalltalk.method({
  34. selector: 'addTab:',
  35. category: 'adding/Removing',
  36. fn: function (aWidget) {
  37. var self = this;
  38. self._tabs()._add_(aWidget);
  39. unescape("%23jtalk")._asJQuery()._append_(aWidget);
  40. aWidget._root()._asJQuery()._hide();
  41. return self;
  42. },
  43. 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')}),
  44. smalltalk.TabManager);
  45. smalltalk.addMethod(
  46. '_removeTab_',
  47. smalltalk.method({
  48. selector: 'removeTab:',
  49. category: 'adding/Removing',
  50. fn: function (aWidget) {
  51. var self = this;
  52. self._tabs()._remove_(aWidget);
  53. self._update();
  54. return self;
  55. },
  56. source: unescape('removeTab%3A%20aWidget%0A%20%20%20%20self%20tabs%20remove%3A%20aWidget.%0A%20%20%20%20self%20update%0A')}),
  57. smalltalk.TabManager);
  58. smalltalk.addMethod(
  59. '_updateBodyMargin',
  60. smalltalk.method({
  61. selector: 'updateBodyMargin',
  62. category: 'actions',
  63. fn: function () {
  64. var self = this;
  65. self._setBodyMargin_(unescape("%23jtalk")._asJQuery()._height().__plus(27));
  66. return self;
  67. },
  68. source: unescape('updateBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%20%27%23jtalk%27%20asJQuery%20height%20+%2027%0A')}),
  69. smalltalk.TabManager);
  70. smalltalk.addMethod(
  71. '_updatePosition',
  72. smalltalk.method({
  73. selector: 'updatePosition',
  74. category: 'actions',
  75. fn: function () {
  76. var self = this;
  77. (function () {jQuery("#jtalk").css("top", "").css("bottom", "27px");}());
  78. return self;
  79. },
  80. source: unescape('updatePosition%0A%20%20%20%20%7B%27jQuery%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%3B%27%7D%0A')}),
  81. smalltalk.TabManager);
  82. smalltalk.addMethod(
  83. '_removeBodyMargin',
  84. smalltalk.method({
  85. selector: 'removeBodyMargin',
  86. category: 'actions',
  87. fn: function () {
  88. var self = this;
  89. self._setBodyMargin_(0);
  90. return self;
  91. },
  92. source: unescape('removeBodyMargin%0A%20%20%20%20self%20setBodyMargin%3A%200%0A')}),
  93. smalltalk.TabManager);
  94. smalltalk.addMethod(
  95. '_setBodyMargin_',
  96. smalltalk.method({
  97. selector: 'setBodyMargin:',
  98. category: 'actions',
  99. fn: function (anInteger) {
  100. var self = this;
  101. ".jtalkBody"._asJQuery()._cssAt_put_(unescape("margin-bottom"), anInteger._asString().__comma("px"));
  102. return self;
  103. },
  104. 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')}),
  105. smalltalk.TabManager);
  106. smalltalk.addMethod(
  107. '_onResize_',
  108. smalltalk.method({
  109. selector: 'onResize:',
  110. category: 'actions',
  111. fn: function (aBlock) {
  112. var self = this;
  113. (function () {jQuery("#jtalk").resizable({handles: "n", resize: aBlock, minHeight: 230});}());
  114. return self;
  115. },
  116. source: unescape('onResize%3A%20aBlock%0A%20%20%20%20%7B%27jQuery%28%27%27%23jtalk%27%27%29.resizable%28%7B%0A%09handles%3A%20%27%27n%27%27%2C%20%0A%09resize%3A%20aBlock%2C%0A%09minHeight%3A%20230%0A%7D%29%3B%27%7D%0A')}),
  117. smalltalk.TabManager);
  118. smalltalk.addMethod(
  119. '_onWindowResize_',
  120. smalltalk.method({
  121. selector: 'onWindowResize:',
  122. category: 'actions',
  123. fn: function (aBlock) {
  124. var self = this;
  125. (function () {jQuery(window).resize(aBlock);}());
  126. return self;
  127. },
  128. source: unescape('onWindowResize%3A%20aBlock%0A%20%20%20%20%7B%27jQuery%28window%29.resize%28aBlock%29%27%7D%0A')}),
  129. smalltalk.TabManager);
  130. smalltalk.addMethod(
  131. '_open',
  132. smalltalk.method({
  133. selector: 'open',
  134. category: 'actions',
  135. fn: function () {
  136. var self = this;
  137. 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;});
  138. return self;
  139. },
  140. 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')}),
  141. smalltalk.TabManager);
  142. smalltalk.addMethod(
  143. '_close',
  144. smalltalk.method({
  145. selector: 'close',
  146. category: 'actions',
  147. fn: function () {
  148. var self = this;
  149. self['@opened']._ifTrue_(function () {self._root()._asJQuery()._hide();unescape("%23jtalk")._asJQuery()._hide();self._removeBodyMargin();"body"._asJQuery()._removeClass_("jtalkBody");return self['@opened'] = false;});
  150. return self;
  151. },
  152. 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')}),
  153. smalltalk.TabManager);
  154. smalltalk.addMethod(
  155. '_newBrowserTab',
  156. smalltalk.method({
  157. selector: 'newBrowserTab',
  158. category: 'actions',
  159. fn: function () {
  160. var self = this;
  161. smalltalk.Browser._open();
  162. return self;
  163. },
  164. source: unescape('newBrowserTab%0A%20%20%20%20Browser%20open%0A')}),
  165. smalltalk.TabManager);
  166. smalltalk.addMethod(
  167. '_selectTab_',
  168. smalltalk.method({
  169. selector: 'selectTab:',
  170. category: 'actions',
  171. fn: function (aWidget) {
  172. var self = this;
  173. self._open();
  174. self['@selectedTab'] = aWidget;
  175. self._tabs()._do_(function (each) {return each._root()._asJQuery()._hide();});
  176. aWidget._root()._asJQuery()._show();
  177. self._update();
  178. return self;
  179. },
  180. 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')}),
  181. smalltalk.TabManager);
  182. smalltalk.addMethod(
  183. '_closeTab_',
  184. smalltalk.method({
  185. selector: 'closeTab:',
  186. category: 'actions',
  187. fn: function (aWidget) {
  188. var self = this;
  189. self._removeTab_(aWidget);
  190. self._selectTab_(self._tabs()._last());
  191. aWidget._root()._asJQuery()._remove();
  192. self._update();
  193. return self;
  194. },
  195. 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')}),
  196. smalltalk.TabManager);
  197. smalltalk.addMethod(
  198. '_renderOn_',
  199. smalltalk.method({
  200. selector: 'renderOn:',
  201. category: 'rendering',
  202. fn: function (html) {
  203. var self = this;
  204. (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()));
  205. return self;
  206. },
  207. 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')}),
  208. smalltalk.TabManager);
  209. smalltalk.addMethod(
  210. '_renderTabFor_on_',
  211. smalltalk.method({
  212. selector: 'renderTabFor:on:',
  213. category: 'rendering',
  214. fn: function (aWidget, html) {
  215. var self = this;
  216. var li = nil;
  217. li = html._li();
  218. self['@selectedTab'].__eq(aWidget)._ifTrue_(function () {return li._class_("selected");});
  219. 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());});});
  220. return self;
  221. },
  222. 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')}),
  223. smalltalk.TabManager);
  224. smalltalk.TabManager.klass.iVarNames = ['current'];
  225. smalltalk.addMethod(
  226. '_current',
  227. smalltalk.method({
  228. selector: 'current',
  229. category: 'instance creation',
  230. fn: function () {
  231. var self = this;
  232. return self['@current']._ifNil_(function () {return self['@current'] = self.klass.superclass.fn.prototype._new.apply(self, []);});
  233. return self;
  234. },
  235. source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D%0A')}),
  236. smalltalk.TabManager.klass);
  237. smalltalk.addMethod(
  238. '_new',
  239. smalltalk.method({
  240. selector: 'new',
  241. category: 'instance creation',
  242. fn: function () {
  243. var self = this;
  244. self._shouldNotImplement();
  245. return self;
  246. },
  247. source: unescape('new%0A%20%20%20%20self%20shouldNotImplement%0A')}),
  248. smalltalk.TabManager.klass);
  249. smalltalk.addClass('TabWidget', smalltalk.Widget, [], 'IDE');
  250. smalltalk.addMethod(
  251. '_label',
  252. smalltalk.method({
  253. selector: 'label',
  254. category: 'accessing',
  255. fn: function () {
  256. var self = this;
  257. self._subclassResponsibility();
  258. return self;
  259. },
  260. source: unescape('label%0A%20%20%20%20self%20subclassResponsibility%0A')}),
  261. smalltalk.TabWidget);
  262. smalltalk.addMethod(
  263. '_open',
  264. smalltalk.method({
  265. selector: 'open',
  266. category: 'actions',
  267. fn: function () {
  268. var self = this;
  269. (function ($rec) {$rec._addTab_(self);return $rec._selectTab_(self);}(smalltalk.TabManager._current()));
  270. return self;
  271. },
  272. source: unescape('open%0A%20%20%20%20TabManager%20current%0A%09addTab%3A%20self%3B%0A%09selectTab%3A%20self%0A')}),
  273. smalltalk.TabWidget);
  274. smalltalk.addMethod(
  275. '_canBeClosed',
  276. smalltalk.method({
  277. selector: 'canBeClosed',
  278. category: 'testing',
  279. fn: function () {
  280. var self = this;
  281. return false;
  282. return self;
  283. },
  284. source: unescape('canBeClosed%0A%20%20%20%20%5Efalse%0A')}),
  285. smalltalk.TabWidget);
  286. smalltalk.addMethod(
  287. '_renderOn_',
  288. smalltalk.method({
  289. selector: 'renderOn:',
  290. category: 'rendering',
  291. fn: function (html) {
  292. var self = this;
  293. (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()));
  294. return self;
  295. },
  296. 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')}),
  297. smalltalk.TabWidget);
  298. smalltalk.addMethod(
  299. '_renderBoxOn_',
  300. smalltalk.method({
  301. selector: 'renderBoxOn:',
  302. category: 'rendering',
  303. fn: function (html) {
  304. var self = this;
  305. return self;
  306. },
  307. source: unescape('renderBoxOn%3A%20html%0A')}),
  308. smalltalk.TabWidget);
  309. smalltalk.addMethod(
  310. '_renderButtonsOn_',
  311. smalltalk.method({
  312. selector: 'renderButtonsOn:',
  313. category: 'rendering',
  314. fn: function (html) {
  315. var self = this;
  316. return self;
  317. },
  318. source: unescape('renderButtonsOn%3A%20html%0A')}),
  319. smalltalk.TabWidget);
  320. smalltalk.addMethod(
  321. '_open',
  322. smalltalk.method({
  323. selector: 'open',
  324. category: 'instance creation',
  325. fn: function () {
  326. var self = this;
  327. return self._new()._open();
  328. return self;
  329. },
  330. source: unescape('open%0A%20%20%20%20%5Eself%20new%20open%0A')}),
  331. smalltalk.TabWidget.klass);
  332. smalltalk.addClass('Workspace', smalltalk.TabWidget, ['textarea'], 'IDE');
  333. smalltalk.addMethod(
  334. '_label',
  335. smalltalk.method({
  336. selector: 'label',
  337. category: 'accessing',
  338. fn: function () {
  339. var self = this;
  340. return unescape("%5BWorkspace%5D");
  341. return self;
  342. },
  343. source: unescape('label%0A%20%20%20%20%5E%27%5BWorkspace%5D%27%0A')}),
  344. smalltalk.Workspace);
  345. smalltalk.addMethod(
  346. '_selection',
  347. smalltalk.method({
  348. selector: 'selection',
  349. category: 'accessing',
  350. fn: function () {
  351. var self = this;
  352. return function () {return document.selection;}();
  353. return self;
  354. },
  355. source: unescape('selection%0A%20%20%20%20%5E%7B%27return%20document.selection%27%7D%0A')}),
  356. smalltalk.Workspace);
  357. smalltalk.addMethod(
  358. '_selectionStart',
  359. smalltalk.method({
  360. selector: 'selectionStart',
  361. category: 'accessing',
  362. fn: function () {
  363. var self = this;
  364. return function () {return jQuery(".jt_workspace")[0].selectionStart;}();
  365. return self;
  366. },
  367. 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')}),
  368. smalltalk.Workspace);
  369. smalltalk.addMethod(
  370. '_selectionEnd',
  371. smalltalk.method({
  372. selector: 'selectionEnd',
  373. category: 'accessing',
  374. fn: function () {
  375. var self = this;
  376. return function () {return jQuery(".jt_workspace")[0].selectionEnd;}();
  377. return self;
  378. },
  379. 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')}),
  380. smalltalk.Workspace);
  381. smalltalk.addMethod(
  382. '_selectionStart_',
  383. smalltalk.method({
  384. selector: 'selectionStart:',
  385. category: 'accessing',
  386. fn: function (anInteger) {
  387. var self = this;
  388. (function () {jQuery(".jt_workspace")[0].selectionStart = anInteger;}());
  389. return self;
  390. },
  391. 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')}),
  392. smalltalk.Workspace);
  393. smalltalk.addMethod(
  394. '_selectionEnd_',
  395. smalltalk.method({
  396. selector: 'selectionEnd:',
  397. category: 'accessing',
  398. fn: function (anInteger) {
  399. var self = this;
  400. (function () {jQuery(".jt_workspace")[0].selectionEnd = anInteger;}());
  401. return self;
  402. },
  403. 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')}),
  404. smalltalk.Workspace);
  405. smalltalk.addMethod(
  406. '_currentLine',
  407. smalltalk.method({
  408. selector: 'currentLine',
  409. category: 'accessing',
  410. fn: function () {
  411. var self = this;
  412. try {
  413. var lines = nil;
  414. var startLine = nil;
  415. var endLine = nil;
  416. lines = self['@textarea']._asJQuery()._val()._tokenize_(smalltalk.String._cr());
  417. startLine = endLine = 0;
  418. 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;}};}();});});
  419. return self;
  420. } catch (e) {
  421. if (e.name === "stReturn" && e.selector === "_currentLine") {
  422. return e.fn();
  423. }
  424. throw e;
  425. }
  426. },
  427. 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')}),
  428. smalltalk.Workspace);
  429. smalltalk.addMethod(
  430. '_handleKeyDown_',
  431. smalltalk.method({
  432. selector: 'handleKeyDown:',
  433. category: 'actions',
  434. fn: function (anEvent) {
  435. var self = this;
  436. return function () {if (anEvent.ctrlKey) {if (anEvent.keyCode === 80) {self._printIt();anEvent.preventDefault();return false;}if (anEvent.keyCode === 68) {self._doIt();anEvent.preventDefault();return false;}if (anEvent.keyCode === 73) {self._inspectIt();anEvent.preventDefault();return false;}}}();
  437. return self;
  438. },
  439. 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%2080%29%20%7B%20//ctrl+p%0A%09%09%09self._printIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2068%29%20%7B%20//ctrl+d%0A%09%09%09self._doIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%09if%28anEvent.keyCode%20%3D%3D%3D%2073%29%20%7B%20//ctrl+i%0A%09%09%09self._inspectIt%28%29%3B%0A%09%09%09anEvent.preventDefault%28%29%3B%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%7D%27%7D%0A')}),
  440. smalltalk.Workspace);
  441. smalltalk.addMethod(
  442. '_clearWorkspace',
  443. smalltalk.method({
  444. selector: 'clearWorkspace',
  445. category: 'actions',
  446. fn: function () {
  447. var self = this;
  448. self['@textarea']._asJQuery()._val_("");
  449. return self;
  450. },
  451. source: unescape('clearWorkspace%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27%0A')}),
  452. smalltalk.Workspace);
  453. smalltalk.addMethod(
  454. '_doIt',
  455. smalltalk.method({
  456. selector: 'doIt',
  457. category: 'actions',
  458. fn: function () {
  459. var self = this;
  460. var selection = nil;
  461. self['@textarea']._asJQuery()._focus();
  462. 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));});
  463. return self._eval_(selection);
  464. return self;
  465. },
  466. source: unescape('doIt%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%20%5Eself%20eval%3A%20selection')}),
  467. smalltalk.Workspace);
  468. smalltalk.addMethod(
  469. '_printIt',
  470. smalltalk.method({
  471. selector: 'printIt',
  472. category: 'actions',
  473. fn: function () {
  474. var self = this;
  475. self._print_(self._doIt()._printString());
  476. return self;
  477. },
  478. source: unescape('printIt%0A%20%20%20%20self%20print%3A%20self%20doIt%20printString%0A')}),
  479. smalltalk.Workspace);
  480. smalltalk.addMethod(
  481. '_print_',
  482. smalltalk.method({
  483. selector: 'print:',
  484. category: 'actions',
  485. fn: function (aString) {
  486. var self = this;
  487. var start = nil;
  488. start = self._selectionEnd();
  489. 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())));
  490. self._selectionStart_(start);
  491. self._selectionEnd_(start.__plus(aString._size()).__plus(2));
  492. return self;
  493. },
  494. 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')}),
  495. smalltalk.Workspace);
  496. smalltalk.addMethod(
  497. '_eval_',
  498. smalltalk.method({
  499. selector: 'eval:',
  500. category: 'actions',
  501. fn: function (aString) {
  502. var self = this;
  503. try {
  504. var compiler = nil;
  505. var node = nil;
  506. compiler = smalltalk.Compiler._new();
  507. node = compiler._parseExpression_(aString);
  508. 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()));}};}();});
  509. (function () {throw {name: "stReturn", selector: "_eval_", fn: function () {return compiler._loadExpression_(aString);}};}());
  510. return self;
  511. } catch (e) {
  512. if (e.name === "stReturn" && e.selector === "_eval_") {
  513. return e.fn();
  514. }
  515. throw e;
  516. }
  517. },
  518. 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')}),
  519. smalltalk.Workspace);
  520. smalltalk.addMethod(
  521. '_renderBoxOn_',
  522. smalltalk.method({
  523. selector: 'renderBoxOn:',
  524. category: 'rendering',
  525. fn: function (html) {
  526. var self = this;
  527. self['@textarea'] = html._textarea();
  528. self['@textarea']._asJQuery()._call_("tabby");
  529. self['@textarea']._onKeyDown_(function (e) {return self._handleKeyDown_(e);});
  530. (function ($rec) {$rec._class_("jt_workspace");return $rec._at_put_("spellcheck", "false");}(self['@textarea']));
  531. return self;
  532. },
  533. 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')}),
  534. smalltalk.Workspace);
  535. smalltalk.addMethod(
  536. '_renderButtonsOn_',
  537. smalltalk.method({
  538. selector: 'renderButtonsOn:',
  539. category: 'rendering',
  540. fn: function (html) {
  541. var self = this;
  542. (function ($rec) {$rec._with_("DoIt");$rec._title_(unescape("ctrl+d"));return $rec._onClick_(function () {return self._doIt();});}(html._button()));
  543. (function ($rec) {$rec._with_("PrintIt");$rec._title_(unescape("ctrl+p"));return $rec._onClick_(function () {return self._printIt();});}(html._button()));
  544. (function ($rec) {$rec._with_("InspectIt");$rec._title_(unescape("ctrl+i"));return $rec._onClick_(function () {return self._inspectIt();});}(html._button()));
  545. (function ($rec) {$rec._with_("Clear workspace");return $rec._onClick_(function () {return self._clearWorkspace();});}(html._button()));
  546. return self;
  547. },
  548. 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%27InspectIt%27%3B%0A%09title%3A%20%27ctrl+i%27%3B%0A%09onClick%3A%20%5Bself%20inspectIt%5D.%0A%20%20%20%20html%20button%0A%09with%3A%20%27Clear%20workspace%27%3B%0A%09onClick%3A%20%5Bself%20clearWorkspace%5D%0A')}),
  549. smalltalk.Workspace);
  550. smalltalk.addMethod(
  551. '_inspectIt',
  552. smalltalk.method({
  553. selector: 'inspectIt',
  554. category: 'actions',
  555. fn: function () {
  556. var self = this;
  557. self._doIt()._inspect();
  558. return self;
  559. },
  560. source: unescape('inspectIt%0A%20%20%20%20self%20doIt%20inspect%0A')}),
  561. smalltalk.Workspace);
  562. smalltalk.addClass('Transcript', smalltalk.TabWidget, ['textarea'], 'IDE');
  563. smalltalk.addMethod(
  564. '_label',
  565. smalltalk.method({
  566. selector: 'label',
  567. category: 'accessing',
  568. fn: function () {
  569. var self = this;
  570. return unescape("%5BTranscript%5D");
  571. return self;
  572. },
  573. source: unescape('label%0A%20%20%20%20%5E%27%5BTranscript%5D%27%0A')}),
  574. smalltalk.Transcript);
  575. smalltalk.addMethod(
  576. '_show_',
  577. smalltalk.method({
  578. selector: 'show:',
  579. category: 'actions',
  580. fn: function (anObject) {
  581. var self = this;
  582. self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val().__comma(anObject._asString()));
  583. return self;
  584. },
  585. source: unescape('show%3A%20anObject%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20anObject%20asString.%0A%0A')}),
  586. smalltalk.Transcript);
  587. smalltalk.addMethod(
  588. '_cr',
  589. smalltalk.method({
  590. selector: 'cr',
  591. category: 'actions',
  592. fn: function () {
  593. var self = this;
  594. self['@textarea']._asJQuery()._val_(self['@textarea']._asJQuery()._val().__comma(smalltalk.String._cr()));
  595. return self;
  596. },
  597. source: unescape('cr%0A%20%20%20%20textarea%20asJQuery%20val%3A%20textarea%20asJQuery%20val%2C%20String%20cr.%0A')}),
  598. smalltalk.Transcript);
  599. smalltalk.addMethod(
  600. '_clear',
  601. smalltalk.method({
  602. selector: 'clear',
  603. category: 'actions',
  604. fn: function () {
  605. var self = this;
  606. self['@textarea']._asJQuery()._val_("");
  607. return self;
  608. },
  609. source: unescape('clear%0A%20%20%20%20textarea%20asJQuery%20val%3A%20%27%27%0A')}),
  610. smalltalk.Transcript);
  611. smalltalk.addMethod(
  612. '_renderBoxOn_',
  613. smalltalk.method({
  614. selector: 'renderBoxOn:',
  615. category: 'rendering',
  616. fn: function (html) {
  617. var self = this;
  618. self['@textarea'] = html._textarea();
  619. self['@textarea']._asJQuery()._call_("tabby");
  620. (function ($rec) {$rec._class_("jt_transcript");return $rec._at_put_("spellcheck", "false");}(self['@textarea']));
  621. return self;
  622. },
  623. 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')}),
  624. smalltalk.Transcript);
  625. smalltalk.addMethod(
  626. '_renderButtonsOn_',
  627. smalltalk.method({
  628. selector: 'renderButtonsOn:',
  629. category: 'rendering',
  630. fn: function (html) {
  631. var self = this;
  632. (function ($rec) {$rec._with_("Clear transcript");return $rec._onClick_(function () {return self._clear();});}(html._button()));
  633. return self;
  634. },
  635. 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')}),
  636. smalltalk.Transcript);
  637. smalltalk.Transcript.klass.iVarNames = ['current'];
  638. smalltalk.addMethod(
  639. '_open',
  640. smalltalk.method({
  641. selector: 'open',
  642. category: 'instance creation',
  643. fn: function () {
  644. var self = this;
  645. self._current()._open();
  646. return self;
  647. },
  648. source: unescape('open%0A%20%20%20%20self%20current%20open%0A')}),
  649. smalltalk.Transcript.klass);
  650. smalltalk.addMethod(
  651. '_new',
  652. smalltalk.method({
  653. selector: 'new',
  654. category: 'instance creation',
  655. fn: function () {
  656. var self = this;
  657. self._shouldNotImplement();
  658. return self;
  659. },
  660. source: unescape('new%0A%20%20%20%20self%20shouldNotImplement%0A')}),
  661. smalltalk.Transcript.klass);
  662. smalltalk.addMethod(
  663. '_current',
  664. smalltalk.method({
  665. selector: 'current',
  666. category: 'instance creation',
  667. fn: function () {
  668. var self = this;
  669. return self['@current']._ifNil_(function () {return self['@current'] = self.klass.superclass.fn.prototype._new.apply(self, []);});
  670. return self;
  671. },
  672. source: unescape('current%0A%20%20%20%20%5Ecurrent%20ifNil%3A%20%5Bcurrent%20%3A%3D%20super%20new%5D%0A')}),
  673. smalltalk.Transcript.klass);
  674. smalltalk.addMethod(
  675. '_show_',
  676. smalltalk.method({
  677. selector: 'show:',
  678. category: 'printing',
  679. fn: function (anObject) {
  680. var self = this;
  681. self._current()._show_(anObject);
  682. return self;
  683. },
  684. source: unescape('show%3A%20anObject%0A%20%20%20%20self%20current%20show%3A%20anObject%0A')}),
  685. smalltalk.Transcript.klass);
  686. smalltalk.addMethod(
  687. '_cr',
  688. smalltalk.method({
  689. selector: 'cr',
  690. category: 'printing',
  691. fn: function () {
  692. var self = this;
  693. self._current()._show_(smalltalk.String._cr());
  694. return self;
  695. },
  696. source: unescape('cr%0A%20%20%20%20self%20current%20show%3A%20String%20cr%0A')}),
  697. smalltalk.Transcript.klass);
  698. smalltalk.addMethod(
  699. '_clear',
  700. smalltalk.method({
  701. selector: 'clear',
  702. category: 'printing',
  703. fn: function () {
  704. var self = this;
  705. self._current()._clear();
  706. return self;
  707. },
  708. source: unescape('clear%0A%20%20%20%20self%20current%20clear%0A')}),
  709. smalltalk.Transcript.klass);
  710. smalltalk.addClass('Browser', smalltalk.TabWidget, ['selectedCategory', 'selectedClass', 'selectedProtocol', 'selectedMethod', 'commitButton', 'categoriesList', 'classesList', 'protocolsList', 'methodsList', 'sourceTextarea', 'tabsList', 'selectedTab', 'saveButton', 'classButtons', 'methodButtons', 'unsavedChanges'], 'IDE');
  711. smalltalk.addMethod(
  712. '_initialize',
  713. smalltalk.method({
  714. selector: 'initialize',
  715. category: 'initialization',
  716. fn: function () {
  717. var self = this;
  718. self.klass.superclass.fn.prototype._initialize.apply(self, []);
  719. self['@selectedTab'] = "instance";
  720. self['@unsavedChanges'] = false;
  721. return self;
  722. },
  723. 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')}),
  724. smalltalk.Browser);
  725. smalltalk.addMethod(
  726. '_label',
  727. smalltalk.method({
  728. selector: 'label',
  729. category: 'accessing',
  730. fn: function () {
  731. var self = this;
  732. return self['@selectedClass']._ifNil_ifNotNil_(function () {return unescape("Browser%20%28nil%29");}, function () {return self['@selectedClass']._name();});
  733. return self;
  734. },
  735. 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')}),
  736. smalltalk.Browser);
  737. smalltalk.addMethod(
  738. '_categories',
  739. smalltalk.method({
  740. selector: 'categories',
  741. category: 'accessing',
  742. fn: function () {
  743. var self = this;
  744. var categories = nil;
  745. categories = smalltalk.Array._new();
  746. smalltalk.Smalltalk._current()._classes()._do_(function (each) {return categories._includes_(each._category())._ifFalse_(function () {return categories._add_(each._category());});});
  747. return categories._sort();
  748. return self;
  749. },
  750. 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')}),
  751. smalltalk.Browser);
  752. smalltalk.addMethod(
  753. '_classes',
  754. smalltalk.method({
  755. selector: 'classes',
  756. category: 'accessing',
  757. fn: function () {
  758. var self = this;
  759. return smalltalk.Smalltalk._current()._classes()._select_(function (each) {return each._category().__eq(self['@selectedCategory']);})._sort_(function (a, b) {return a._name().__gt(b._name());});
  760. return self;
  761. },
  762. 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')}),
  763. smalltalk.Browser);
  764. smalltalk.addMethod(
  765. '_protocols',
  766. smalltalk.method({
  767. selector: 'protocols',
  768. category: 'accessing',
  769. fn: function () {
  770. var self = this;
  771. try {
  772. var klass = nil;
  773. var protocols = nil;
  774. protocols = smalltalk.Array._new();
  775. 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());});});});
  776. (function () {throw {name: "stReturn", selector: "_protocols", fn: function () {return protocols._sort();}};}());
  777. return self;
  778. } catch (e) {
  779. if (e.name === "stReturn" && e.selector === "_protocols") {
  780. return e.fn();
  781. }
  782. throw e;
  783. }
  784. },
  785. 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')}),
  786. smalltalk.Browser);
  787. smalltalk.addMethod(
  788. '_methods',
  789. smalltalk.method({
  790. selector: 'methods',
  791. category: 'accessing',
  792. fn: function () {
  793. var self = this;
  794. try {
  795. var klass = nil;
  796. self['@selectedTab'].__eq("comment")._ifTrue_(function () {return function () {throw {name: "stReturn", selector: "_methods", fn: function () {return [];}};}();});
  797. self['@selectedClass']._ifNotNil_(function () {return klass = self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_(function () {return self['@selectedClass'];}, function () {return self['@selectedClass']._class();});});
  798. (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());});}};}());
  799. return self;
  800. } catch (e) {
  801. if (e.name === "stReturn" && e.selector === "_methods") {
  802. return e.fn();
  803. }
  804. throw e;
  805. }
  806. },
  807. 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')}),
  808. smalltalk.Browser);
  809. smalltalk.addMethod(
  810. '_source',
  811. smalltalk.method({
  812. selector: 'source',
  813. category: 'accessing',
  814. fn: function () {
  815. var self = this;
  816. try {
  817. 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();});}};}();});
  818. (function () {throw {name: "stReturn", selector: "_source", fn: function () {return self['@selectedClass']._ifNil_ifNotNil_(function () {return "";}, function () {return self._classCommentSource();});}};}());
  819. return self;
  820. } catch (e) {
  821. if (e.name === "stReturn" && e.selector === "_source") {
  822. return e.fn();
  823. }
  824. throw e;
  825. }
  826. },
  827. 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')}),
  828. smalltalk.Browser);
  829. smalltalk.addMethod(
  830. '_methodSource',
  831. smalltalk.method({
  832. selector: 'methodSource',
  833. category: 'accessing',
  834. fn: function () {
  835. var self = this;
  836. return self['@selectedMethod']._ifNil_ifNotNil_(function () {return self._dummyMethodSource();}, function () {return self['@selectedMethod']._source();});
  837. return self;
  838. },
  839. source: unescape('methodSource%0A%20%20%20%20%5EselectedMethod%0A%09ifNil%3A%20%5Bself%20dummyMethodSource%5D%0A%09ifNotNil%3A%20%5BselectedMethod%20source%5D%0A')}),
  840. smalltalk.Browser);
  841. smalltalk.addMethod(
  842. '_dummyMethodSource',
  843. smalltalk.method({
  844. selector: 'dummyMethodSource',
  845. category: 'accessing',
  846. fn: function () {
  847. var self = this;
  848. return unescape("messageSelectorAndArgumentNames%0A%09%22comment%20stating%20purpose%20of%20message%22%0A%0A%09%7C%20temporary%20variable%20names%20%7C%0A%09statements");
  849. return self;
  850. },
  851. 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')}),
  852. smalltalk.Browser);
  853. smalltalk.addMethod(
  854. '_declarationSource',
  855. smalltalk.method({
  856. selector: 'declarationSource',
  857. category: 'accessing',
  858. fn: function () {
  859. var self = this;
  860. return self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_(function () {return self._classDeclarationSource();}, function () {return self._metaclassDeclarationSource();});
  861. return self;
  862. },
  863. 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')}),
  864. smalltalk.Browser);
  865. smalltalk.addMethod(
  866. '_classDeclarationSource',
  867. smalltalk.method({
  868. selector: 'classDeclarationSource',
  869. category: 'accessing',
  870. fn: function () {
  871. var self = this;
  872. var stream = nil;
  873. stream = ""._writeStream();
  874. 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);});
  875. return stream._contents();
  876. return self;
  877. },
  878. 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')}),
  879. smalltalk.Browser);
  880. smalltalk.addMethod(
  881. '_metaclassDeclarationSource',
  882. smalltalk.method({
  883. selector: 'metaclassDeclarationSource',
  884. category: 'accessing',
  885. fn: function () {
  886. var self = this;
  887. var stream = nil;
  888. stream = ""._writeStream();
  889. 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"));});
  890. return stream._contents();
  891. return self;
  892. },
  893. 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')}),
  894. smalltalk.Browser);
  895. smalltalk.addMethod(
  896. '_classCommentSource',
  897. smalltalk.method({
  898. selector: 'classCommentSource',
  899. category: 'accessing',
  900. fn: function () {
  901. var self = this;
  902. return self['@selectedClass']._comment();
  903. return self;
  904. },
  905. source: unescape('classCommentSource%0A%20%20%20%20%5EselectedClass%20comment%0A')}),
  906. smalltalk.Browser);
  907. smalltalk.addMethod(
  908. '_enableSaveButton',
  909. smalltalk.method({
  910. selector: 'enableSaveButton',
  911. category: 'actions',
  912. fn: function () {
  913. var self = this;
  914. self['@saveButton']._removeAt_("disabled");
  915. self['@unsavedChanges'] = true;
  916. return self;
  917. },
  918. source: unescape('enableSaveButton%0A%20%20%20%20saveButton%20removeAt%3A%20%27disabled%27.%0A%20%20%20%20unsavedChanges%20%3A%3D%20true%0A')}),
  919. smalltalk.Browser);
  920. smalltalk.addMethod(
  921. '_disableSaveButton',
  922. smalltalk.method({
  923. selector: 'disableSaveButton',
  924. category: 'actions',
  925. fn: function () {
  926. var self = this;
  927. self['@saveButton']._ifNotNil_(function () {return self['@saveButton']._at_put_("disabled", true);});
  928. self['@unsavedChanges'] = false;
  929. return self;
  930. },
  931. 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')}),
  932. smalltalk.Browser);
  933. smalltalk.addMethod(
  934. '_hideClassButtons',
  935. smalltalk.method({
  936. selector: 'hideClassButtons',
  937. category: 'actions',
  938. fn: function () {
  939. var self = this;
  940. self['@classButtons']._asJQuery()._hide();
  941. return self;
  942. },
  943. source: unescape('hideClassButtons%0A%20%20%20%20classButtons%20asJQuery%20hide%0A')}),
  944. smalltalk.Browser);
  945. smalltalk.addMethod(
  946. '_showClassButtons',
  947. smalltalk.method({
  948. selector: 'showClassButtons',
  949. category: 'actions',
  950. fn: function () {
  951. var self = this;
  952. self['@classButtons']._asJQuery()._show();
  953. return self;
  954. },
  955. source: unescape('showClassButtons%0A%20%20%20%20classButtons%20asJQuery%20show%0A')}),
  956. smalltalk.Browser);
  957. smalltalk.addMethod(
  958. '_hideMethodButtons',
  959. smalltalk.method({
  960. selector: 'hideMethodButtons',
  961. category: 'actions',
  962. fn: function () {
  963. var self = this;
  964. self['@methodButtons']._asJQuery()._hide();
  965. return self;
  966. },
  967. source: unescape('hideMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20hide%0A')}),
  968. smalltalk.Browser);
  969. smalltalk.addMethod(
  970. '_showMethodButtons',
  971. smalltalk.method({
  972. selector: 'showMethodButtons',
  973. category: 'actions',
  974. fn: function () {
  975. var self = this;
  976. self['@methodButtons']._asJQuery()._show();
  977. return self;
  978. },
  979. source: unescape('showMethodButtons%0A%20%20%20%20methodButtons%20asJQuery%20show%0A')}),
  980. smalltalk.Browser);
  981. smalltalk.addMethod(
  982. '_compile',
  983. smalltalk.method({
  984. selector: 'compile',
  985. category: 'actions',
  986. fn: function () {
  987. var self = this;
  988. self._disableSaveButton();
  989. self['@selectedTab'].__eq("comment")._ifTrue_(function () {return self['@selectedClass']._ifNotNil_(function () {return self._compileClassComment();});});
  990. self['@selectedProtocol']._notNil()._or_(function () {return self['@selectedMethod']._notNil();})._ifFalse_ifTrue_(function () {return self._compileDefinition();}, function () {return self._compileMethodDefinition();});
  991. return self;
  992. },
  993. 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')}),
  994. smalltalk.Browser);
  995. smalltalk.addMethod(
  996. '_compileClassComment',
  997. smalltalk.method({
  998. selector: 'compileClassComment',
  999. category: 'actions',
  1000. fn: function () {
  1001. var self = this;
  1002. self['@selectedClass']._comment_(self['@sourceTextarea']._asJQuery()._val());
  1003. return self;
  1004. },
  1005. source: unescape('compileClassComment%0A%20%20%20%20selectedClass%20comment%3A%20sourceTextarea%20asJQuery%20val%0A')}),
  1006. smalltalk.Browser);
  1007. smalltalk.addMethod(
  1008. '_compileMethodDefinition',
  1009. smalltalk.method({
  1010. selector: 'compileMethodDefinition',
  1011. category: 'actions',
  1012. fn: function () {
  1013. var self = this;
  1014. self['@selectedTab'].__eq("instance")._ifTrue_ifFalse_(function () {return self._compileMethodDefinitionFor_(self['@selectedClass']);}, function () {return self._compileMethodDefinitionFor_(self['@selectedClass']._class());});
  1015. return self;
  1016. },
  1017. 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')}),
  1018. smalltalk.Browser);
  1019. smalltalk.addMethod(
  1020. '_compileMethodDefinitionFor_',
  1021. smalltalk.method({
  1022. selector: 'compileMethodDefinitionFor:',
  1023. category: 'actions',
  1024. fn: function (aClass) {
  1025. var self = this;
  1026. try {
  1027. var compiler = nil;
  1028. var method = nil;
  1029. var source = nil;
  1030. var node = nil;
  1031. source = self['@sourceTextarea']._asJQuery()._val();
  1032. self['@selectedProtocol']._ifNil_(function () {return self['@selectedProtocol'] = self['@selectedMethod']._category();});
  1033. compiler = smalltalk.Compiler._new();
  1034. node = compiler._parse_(source);
  1035. 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()));}};}();});
  1036. compiler._currentClass_(self['@selectedClass']);
  1037. method = compiler._eval_(compiler._compileNode_(node));
  1038. method._category_(self['@selectedProtocol']);
  1039. compiler._unknownVariables()._do_(function (each) {return self._confirm_(unescape("Declare%20%27").__comma(each).__comma(unescape("%27%20as%20instance%20variable%3F")))._ifTrue_(function () {self._addInstanceVariableNamed_toClass_(each, aClass);return function () {throw {name: "stReturn", selector: "_compileMethodDefinitionFor_", fn: function () {return self._compileMethodDefinitionFor_(aClass);}};}();});});
  1040. aClass._addCompiledMethod_(method);
  1041. self._updateMethodsList();
  1042. self._selectMethod_(method);
  1043. return self;
  1044. } catch (e) {
  1045. if (e.name === "stReturn" &&
  1046. e.selector === "_compileMethodDefinitionFor_") {
  1047. return e.fn();
  1048. }
  1049. throw e;
  1050. }
  1051. },
  1052. 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%20selectedProtocol%20ifNil%3A%20%5BselectedProtocol%20%3A%3D%20selectedMethod%20category%5D.%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%20compiler%20unknownVariables%20do%3A%20%5B%3Aeach%20%7C%0A%09%28self%20confirm%3A%20%27Declare%20%27%27%27%2C%20each%2C%20%27%27%27%20as%20instance%20variable%3F%27%29%20ifTrue%3A%20%5B%0A%09%09self%20addInstanceVariableNamed%3A%20each%20toClass%3A%20aClass.%0A%09%09%5Eself%20compileMethodDefinitionFor%3A%20aClass%5D%5D.%0A%20%20%20%20aClass%20addCompiledMethod%3A%20method.%0A%20%20%20%20self%20updateMethodsList.%0A%20%20%20%20self%20selectMethod%3A%20method%0A')}),
  1053. smalltalk.Browser);
  1054. smalltalk.addMethod(
  1055. '_compileDefinition',
  1056. smalltalk.method({
  1057. selector: 'compileDefinition',
  1058. category: 'actions',
  1059. fn: function () {
  1060. var self = this;
  1061. var newClass = nil;
  1062. newClass = smalltalk.Compiler._new()._loadExpression_(self['@sourceTextarea']._asJQuery()._val());
  1063. (function ($rec) {$rec._updateCategoriesList();return $rec._updateClassesList();}(self));
  1064. return self;
  1065. },
  1066. 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')}),
  1067. smalltalk.Browser);
  1068. smalltalk.addMethod(
  1069. '_commitCategory',
  1070. smalltalk.method({
  1071. selector: 'commitCategory',
  1072. category: 'actions',
  1073. fn: function () {
  1074. var self = this;
  1075. self['@selectedCategory']._ifNotNil_(function () {return function ($rec) {$rec._at_put_("type", "PUT");$rec._at_put_("data", smalltalk.Exporter._new()._exportCategory_(self['@selectedCategory']));$rec._at_put_("error", function () {return self._alert_(unescape("Commit%20failed%21"));});return $rec._send();}(smalltalk.Ajax._url_(self._class()._commitPath().__comma(unescape("/")).__comma(self['@selectedCategory']).__comma(".js")));});
  1076. return self;
  1077. },
  1078. source: unescape('commitCategory%0A%20%20%20%20selectedCategory%20ifNotNil%3A%20%5B%0A%09%28Ajax%20url%3A%20self%20class%20commitPath%2C%20%27/%27%2C%20selectedCategory%2C%20%27.js%27%29%0A%09%20%20%20%20at%3A%20%27type%27%20put%3A%20%27PUT%27%3B%0A%09%20%20%20%20at%3A%20%27data%27%20put%3A%20%28Exporter%20new%20exportCategory%3A%20selectedCategory%29%3B%0A%09%20%20%20%20at%3A%20%27error%27%20put%3A%20%5Bself%20alert%3A%20%27Commit%20failed%21%27%5D%3B%0A%09%20%20%20%20send%5D%0A')}),
  1079. smalltalk.Browser);
  1080. smalltalk.addMethod(
  1081. '_cancelChanges',
  1082. smalltalk.method({
  1083. selector: 'cancelChanges',
  1084. category: 'actions',
  1085. fn: function () {
  1086. var self = this;
  1087. return self['@unsavedChanges']._ifTrue_ifFalse_(function () {return self._confirm_(unescape("Cancel%20changes%3F"));}, function () {return true;});
  1088. return self;
  1089. },
  1090. 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')}),
  1091. smalltalk.Browser);
  1092. smalltalk.addMethod(
  1093. '_removeClass',
  1094. smalltalk.method({
  1095. selector: 'removeClass',
  1096. category: 'actions',
  1097. fn: function () {
  1098. var self = this;
  1099. 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);});
  1100. return self;
  1101. },
  1102. 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')}),
  1103. smalltalk.Browser);
  1104. smalltalk.addMethod(
  1105. '_removeMethod',
  1106. smalltalk.method({
  1107. selector: 'removeMethod',
  1108. category: 'actions',
  1109. fn: function () {
  1110. var self = this;
  1111. 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['@selectedTab'].__eq("instance")._ifTrue_ifFalse_(function () {return self['@selectedClass']._removeCompiledMethod_(self['@selectedMethod']);}, function () {return self['@selectedClass']._class()._removeCompiledMethod_(self['@selectedMethod']);});return self._selectMethod_(nil);});});
  1112. return self;
  1113. },
  1114. 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%09selectedTab%20%3D%20%23instance%20%0A%09%09%09ifTrue%3A%20%5BselectedClass%20removeCompiledMethod%3A%20selectedMethod%5D%0A%09%09%09ifFalse%3A%20%5BselectedClass%20class%20removeCompiledMethod%3A%20selectedMethod%5D.%0A%09%09self%20selectMethod%3A%20nil%5D%5D%0A')}),
  1115. smalltalk.Browser);
  1116. smalltalk.addMethod(
  1117. '_setMethodProtocol_',
  1118. smalltalk.method({
  1119. selector: 'setMethodProtocol:',
  1120. category: 'actions',
  1121. fn: function (aString) {
  1122. var self = this;
  1123. self._cancelChanges()._ifTrue_(function () {return self._protocols()._includes_(aString)._ifFalse_ifTrue_(function () {return self._addNewProtocol();}, function () {self['@selectedMethod']._category_(aString);self['@selectedProtocol'] = aString;self['@selectedMethod'] = self['@selectedMethod'];return function ($rec) {$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();}(self);});});
  1124. return self;
  1125. },
  1126. source: unescape('setMethodProtocol%3A%20aString%0A%20%20%20%20self%20cancelChanges%20ifTrue%3A%20%5B%0A%09%28self%20protocols%20includes%3A%20aString%29%0A%09%20%20%20%20ifFalse%3A%20%5Bself%20addNewProtocol%5D%0A%09%20%20%20%20ifTrue%3A%20%5B%0A%09%09selectedMethod%20category%3A%20aString.%0A%09%09selectedProtocol%20%3A%3D%20aString.%0A%09%09selectedMethod%20%3A%3D%20selectedMethod.%0A%09%09self%20%0A%09%09%20%20%20%20updateProtocolsList%3B%0A%09%09%20%20%20%20updateMethodsList%3B%0A%09%09%20%20%20%20updateSourceAndButtons%5D%5D%0A')}),
  1127. smalltalk.Browser);
  1128. smalltalk.addMethod(
  1129. '_addNewProtocol',
  1130. smalltalk.method({
  1131. selector: 'addNewProtocol',
  1132. category: 'actions',
  1133. fn: function () {
  1134. var self = this;
  1135. var newProtocol = nil;
  1136. newProtocol = self._prompt_("New method protocol");
  1137. newProtocol._notEmpty()._ifTrue_(function () {self['@selectedMethod']._category_(newProtocol);return self._setMethodProtocol_(newProtocol);});
  1138. return self;
  1139. },
  1140. 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%09selectedMethod%20category%3A%20newProtocol.%0A%09self%20setMethodProtocol%3A%20newProtocol%5D%0A')}),
  1141. smalltalk.Browser);
  1142. smalltalk.addMethod(
  1143. '_selectCategory_',
  1144. smalltalk.method({
  1145. selector: 'selectCategory:',
  1146. category: 'actions',
  1147. fn: function (aCategory) {
  1148. var self = this;
  1149. 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);});
  1150. return self;
  1151. },
  1152. 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')}),
  1153. smalltalk.Browser);
  1154. smalltalk.addMethod(
  1155. '_selectClass_',
  1156. smalltalk.method({
  1157. selector: 'selectClass:',
  1158. category: 'actions',
  1159. fn: function (aClass) {
  1160. var self = this;
  1161. 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);});
  1162. return self;
  1163. },
  1164. 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')}),
  1165. smalltalk.Browser);
  1166. smalltalk.addMethod(
  1167. '_selectProtocol_',
  1168. smalltalk.method({
  1169. selector: 'selectProtocol:',
  1170. category: 'actions',
  1171. fn: function (aString) {
  1172. var self = this;
  1173. self._cancelChanges()._ifTrue_(function () {self['@selectedProtocol'] = aString;self['@selectedMethod'] = nil;return function ($rec) {$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();}(self);});
  1174. return self;
  1175. },
  1176. 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')}),
  1177. smalltalk.Browser);
  1178. smalltalk.addMethod(
  1179. '_selectMethod_',
  1180. smalltalk.method({
  1181. selector: 'selectMethod:',
  1182. category: 'actions',
  1183. fn: function (aMethod) {
  1184. var self = this;
  1185. self._cancelChanges()._ifTrue_(function () {self['@selectedMethod'] = aMethod;return function ($rec) {$rec._updateProtocolsList();$rec._updateMethodsList();return $rec._updateSourceAndButtons();}(self);});
  1186. return self;
  1187. },
  1188. 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')}),
  1189. smalltalk.Browser);
  1190. smalltalk.addMethod(
  1191. '_selectTab_',
  1192. smalltalk.method({
  1193. selector: 'selectTab:',
  1194. category: 'actions',
  1195. fn: function (aString) {
  1196. var self = this;
  1197. self._cancelChanges()._ifTrue_(function () {self['@selectedTab'] = aString;self._selectProtocol_(nil);return self._updateTabsList();});
  1198. return self;
  1199. },
  1200. 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')}),
  1201. smalltalk.Browser);
  1202. smalltalk.addMethod(
  1203. '_renderBoxOn_',
  1204. smalltalk.method({
  1205. selector: 'renderBoxOn:',
  1206. category: 'rendering',
  1207. fn: function (html) {
  1208. var self = this;
  1209. (function ($rec) {$rec._renderTopPanelOn_(html);$rec._renderTabsOn_(html);return $rec._renderBottomPanelOn_(html);}(self));
  1210. return self;
  1211. },
  1212. 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')}),
  1213. smalltalk.Browser);
  1214. smalltalk.addMethod(
  1215. '_renderTopPanelOn_',
  1216. smalltalk.method({
  1217. selector: 'renderTopPanelOn:',
  1218. category: 'rendering',
  1219. fn: function (html) {
  1220. var self = this;
  1221. (function ($rec) {$rec._class_("top");return $rec._with_(function () {self['@categoriesList'] = html._ul()._class_("jt_column categories");self['@commitButton'] = function ($rec) {$rec._class_("jt_commit");$rec._title_("Commit classes in this category to disk");$rec._onClick_(function () {return self._commitCategory();});return $rec._with_("Commit category");}(html._button());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()));
  1222. return self;
  1223. },
  1224. 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%20commitButton%20%3A%3D%20html%20button%20%0A%09%09class%3A%20%27jt_commit%27%3B%0A%09%09title%3A%20%27Commit%20classes%20in%20this%20category%20to%20disk%27%3B%0A%09%09onClick%3A%20%5Bself%20commitCategory%5D%3B%0A%09%09with%3A%20%27Commit%20category%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')}),
  1225. smalltalk.Browser);
  1226. smalltalk.addMethod(
  1227. '_renderTabsOn_',
  1228. smalltalk.method({
  1229. selector: 'renderTabsOn:',
  1230. category: 'rendering',
  1231. fn: function (html) {
  1232. var self = this;
  1233. self['@tabsList'] = html._ul()._class_("jt_tabs");
  1234. self._updateTabsList();
  1235. return self;
  1236. },
  1237. 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')}),
  1238. smalltalk.Browser);
  1239. smalltalk.addMethod(
  1240. '_renderBottomPanelOn_',
  1241. smalltalk.method({
  1242. selector: 'renderBottomPanelOn:',
  1243. category: 'rendering',
  1244. fn: function (html) {
  1245. var self = this;
  1246. (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()));
  1247. return self;
  1248. },
  1249. 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')}),
  1250. smalltalk.Browser);
  1251. smalltalk.addMethod(
  1252. '_renderButtonsOn_',
  1253. smalltalk.method({
  1254. selector: 'renderButtonsOn:',
  1255. category: 'rendering',
  1256. fn: function (html) {
  1257. var self = this;
  1258. self['@saveButton'] = html._button();
  1259. (function ($rec) {$rec._with_("Save");return $rec._onClick_(function () {return self._compile();});}(self['@saveButton']));
  1260. self['@methodButtons'] = html._span();
  1261. self['@classButtons'] = html._span();
  1262. self._updateSourceAndButtons();
  1263. return self;
  1264. },
  1265. 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')}),
  1266. smalltalk.Browser);
  1267. smalltalk.addMethod(
  1268. '_updateCategoriesList',
  1269. smalltalk.method({
  1270. selector: 'updateCategoriesList',
  1271. category: 'updating',
  1272. fn: function () {
  1273. var self = this;
  1274. self['@categoriesList']._contents_(function (html) {return self._categories()._do_(function (each) {var li = nil;var label = nil;each._isEmpty()._ifTrue_ifFalse_(function () {return label = "Unclassified";}, function () {return label = each;});li = html._li();self['@selectedCategory'].__eq(each)._ifTrue_(function () {return li._class_("selected");});return function ($rec) {$rec._with_(label);return $rec._onClick_(function () {return self._selectCategory_(each);});}(li);});});
  1275. return self;
  1276. },
  1277. 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%20label%20%7C%0A%09%20%20%20%20each%20isEmpty%20%0A%09%09ifTrue%3A%20%5Blabel%20%3A%3D%20%27Unclassified%27%5D%0A%09%09ifFalse%3A%20%5Blabel%20%3A%3D%20each%5D.%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%20label%3B%0A%09%09onClick%3A%20%5Bself%20selectCategory%3A%20each%5D%5D%5D%0A')}),
  1278. smalltalk.Browser);
  1279. smalltalk.addMethod(
  1280. '_updateClassesList',
  1281. smalltalk.method({
  1282. selector: 'updateClassesList',
  1283. category: 'updating',
  1284. fn: function () {
  1285. var self = this;
  1286. smalltalk.TabManager._current()._update();
  1287. self['@classesList']._contents_(function (html) {return self._classes()._do_(function (each) {var li = nil;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);});});
  1288. return self;
  1289. },
  1290. 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')}),
  1291. smalltalk.Browser);
  1292. smalltalk.addMethod(
  1293. '_updateProtocolsList',
  1294. smalltalk.method({
  1295. selector: 'updateProtocolsList',
  1296. category: 'updating',
  1297. fn: function () {
  1298. var self = this;
  1299. self['@protocolsList']._contents_(function (html) {return self._protocols()._do_(function (each) {var li = nil;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);});});
  1300. return self;
  1301. },
  1302. 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')}),
  1303. smalltalk.Browser);
  1304. smalltalk.addMethod(
  1305. '_updateMethodsList',
  1306. smalltalk.method({
  1307. selector: 'updateMethodsList',
  1308. category: 'updating',
  1309. fn: function () {
  1310. var self = this;
  1311. self['@methodsList']._contents_(function (html) {return self._methods()._do_(function (each) {var li = nil;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);});});
  1312. return self;
  1313. },
  1314. 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')}),
  1315. smalltalk.Browser);
  1316. smalltalk.addMethod(
  1317. '_updateTabsList',
  1318. smalltalk.method({
  1319. selector: 'updateTabsList',
  1320. category: 'updating',
  1321. fn: function () {
  1322. var self = this;
  1323. self['@tabsList']._contents_(function (html) {var li = nil;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);});
  1324. return self;
  1325. },
  1326. 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')}),
  1327. smalltalk.Browser);
  1328. smalltalk.addMethod(
  1329. '_updateSourceAndButtons',
  1330. smalltalk.method({
  1331. selector: 'updateSourceAndButtons',
  1332. category: 'updating',
  1333. fn: function () {
  1334. var self = this;
  1335. self._disableSaveButton();
  1336. self['@classButtons']._contents_(function (html) {(function ($rec) {$rec._with_("Rename class");return $rec._onClick_(function () {return self._renameClass();});}(html._button()));return function ($rec) {$rec._with_("Remove class");return $rec._onClick_(function () {return self._removeClass();});}(html._button());});
  1337. self['@methodButtons']._contents_(function (html) {(function ($rec) {$rec._with_("Remove method");return $rec._onClick_(function () {return self._removeMethod();});}(html._button()));return function ($rec) {$rec._onChange_(function (e, select) {return self._setMethodProtocol_(select._val());});return $rec._with_(function () {(function ($rec) {$rec._with_("Method protocol");return $rec._at_put_("disabled", "disabled");}(html._option()));(function ($rec) {$rec._class_("important");return $rec._with_("New...");}(html._option()));return self._protocols()._do_(function (each) {return html._option()._with_(each);});});}(html._select());});
  1338. 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();});
  1339. self['@sourceTextarea']._asJQuery()._val_(self._source());
  1340. return self;
  1341. },
  1342. source: unescape('updateSourceAndButtons%0A%09self%20disableSaveButton.%0A%09classButtons%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09html%20button%0A%09%09%09with%3A%20%27Rename%20class%27%3B%0A%09%09%09onClick%3A%20%5Bself%20renameClass%5D.%0A%09%09html%20button%0A%09%09with%3A%20%27Remove%20class%27%3B%0A%09%09onClick%3A%20%5Bself%20removeClass%5D%5D.%0A%09methodButtons%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09html%20button%0A%09%09%09with%3A%20%27Remove%20method%27%3B%0A%09%09%09onClick%3A%20%5Bself%20removeMethod%5D.%0A%09%09html%20select%20%0A%09%20%20%20%20%09%09onChange%3A%20%5B%3Ae%20%3Aselect%20%7C%20self%20setMethodProtocol%3A%20select%20val%5D%3B%0A%09%20%20%20%20%09%09with%3A%20%5B%0A%09%09%09%09html%20option%0A%09%09%20%20%20%20%09%09%09with%3A%20%27Method%20protocol%27%3B%0A%09%09%20%20%20%20%09%09%09at%3A%20%27disabled%27%20put%3A%20%27disabled%27.%0A%09%09%09%09html%20option%0A%09%09%20%20%20%20%09%09%09class%3A%20%27important%27%3B%0A%09%09%20%20%20%20%09%09%09with%3A%20%27New...%27.%0A%09%09%09%09self%20protocols%20do%3A%20%5B%3Aeach%20%7C%0A%09%09%20%20%20%20%09%09%09html%20option%20with%3A%20each%5D%5D%5D.%0A%20%20%20%20%09selectedMethod%20%0A%09%09ifNil%3A%20%5B%0A%09%20%20%20%20%09%09self%20hideMethodButtons.%0A%09%20%20%20%20%09%09%09selectedClass%20%0A%09%09%09%09%09ifNil%3A%20%5Bself%20hideClassButtons%5D%0A%09%20%20%20%20%09%09%09%09ifNotNil%3A%20%5Bself%20showClassButtons%5D%5D%0A%09%09ifNotNil%3A%20%5B%0A%09%20%20%20%20%09%09self%20hideClassButtons.%0A%09%20%20%20%20%09%09self%20showMethodButtons%5D.%0A%20%20%20%20%09sourceTextarea%20asJQuery%20val%3A%20self%20source%0A')}),
  1343. smalltalk.Browser);
  1344. smalltalk.addMethod(
  1345. '_canBeClosed',
  1346. smalltalk.method({
  1347. selector: 'canBeClosed',
  1348. category: 'testing',
  1349. fn: function () {
  1350. var self = this;
  1351. return true;
  1352. return self;
  1353. },
  1354. source: unescape('canBeClosed%0A%20%20%20%20%5Etrue%0A')}),
  1355. smalltalk.Browser);
  1356. smalltalk.addMethod(
  1357. '_renameClass',
  1358. smalltalk.method({
  1359. selector: 'renameClass',
  1360. category: 'actions',
  1361. fn: function () {
  1362. var self = this;
  1363. var newName = nil;
  1364. newName = self._prompt_("Rename class ".__comma(self['@selectedClass']._name()));
  1365. newName._notEmpty()._ifTrue_(function () {self['@selectedClass']._rename_(newName);return function ($rec) {$rec._updateClassesList();return $rec._updateSourceAndButtons();}(self);});
  1366. return self;
  1367. },
  1368. source: unescape('renameClass%0A%20%20%20%20%7C%20newName%20%7C%0A%20%20%20%20newName%20%3A%3D%20self%20prompt%3A%20%27Rename%20class%20%27%2C%20selectedClass%20name.%0A%20%20%20%20newName%20notEmpty%20ifTrue%3A%20%5B%0A%09selectedClass%20rename%3A%20newName.%0A%09self%20%0A%09%09updateClassesList%3B%0A%09%09updateSourceAndButtons%5D%0A')}),
  1369. smalltalk.Browser);
  1370. smalltalk.addMethod(
  1371. '_addInstanceVariableNamed_toClass_',
  1372. smalltalk.method({
  1373. selector: 'addInstanceVariableNamed:toClass:',
  1374. category: 'actions',
  1375. fn: function (aString, aClass) {
  1376. var self = this;
  1377. smalltalk.ClassBuilder._new()._addSubclassOf_named_instanceVariableNames_(aClass._superclass(), aClass._name(), function ($rec) {$rec._add_(aString);return $rec._yourself();}(aClass._instanceVariableNames()._copy()));
  1378. return self;
  1379. },
  1380. source: unescape('addInstanceVariableNamed%3A%20aString%20toClass%3A%20aClass%0A%09ClassBuilder%20new%0A%09%09addSubclassOf%3A%20aClass%20superclass%20named%3A%20aClass%20name%20instanceVariableNames%3A%20%28aClass%20instanceVariableNames%20copy%20add%3A%20aString%3B%20yourself%29')}),
  1381. smalltalk.Browser);
  1382. smalltalk.addMethod(
  1383. '_openOn_',
  1384. smalltalk.method({
  1385. selector: 'openOn:',
  1386. category: 'convenience',
  1387. fn: function (aClass) {
  1388. var self = this;
  1389. (function ($rec) {$rec._open();$rec._selectCategory_(aClass._category());return $rec._selectClass_(aClass);}(self._new()));
  1390. return self;
  1391. },
  1392. 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')}),
  1393. smalltalk.Browser.klass);
  1394. smalltalk.addMethod(
  1395. '_open',
  1396. smalltalk.method({
  1397. selector: 'open',
  1398. category: 'convenience',
  1399. fn: function () {
  1400. var self = this;
  1401. self._new()._open();
  1402. return self;
  1403. },
  1404. source: unescape('open%0A%20%20%20%20self%20new%20open%0A')}),
  1405. smalltalk.Browser.klass);
  1406. smalltalk.addMethod(
  1407. '_commitPath',
  1408. smalltalk.method({
  1409. selector: 'commitPath',
  1410. category: 'accessing',
  1411. fn: function () {
  1412. var self = this;
  1413. return "js";
  1414. return self;
  1415. },
  1416. source: unescape('commitPath%0A%09%5E%27js%27')}),
  1417. smalltalk.Browser.klass);
  1418. smalltalk.addClass('Inspector', smalltalk.TabWidget, ['label', 'variables', 'object', 'selectedVariable', 'variablesList', 'valueTextarea', 'workspaceTextarea', 'diveButton'], 'IDE');
  1419. smalltalk.addMethod(
  1420. '_label',
  1421. smalltalk.method({
  1422. selector: 'label',
  1423. category: 'accessing',
  1424. fn: function () {
  1425. var self = this;
  1426. return self['@label']._ifNil_(function () {return unescape("Inspector%20%28nil%29");});
  1427. return self;
  1428. },
  1429. source: unescape('label%0A%09%5Elabel%20ifNil%3A%20%5B%27Inspector%20%28nil%29%27%5D')}),
  1430. smalltalk.Inspector);
  1431. smalltalk.addMethod(
  1432. '_canBeClosed',
  1433. smalltalk.method({
  1434. selector: 'canBeClosed',
  1435. category: 'testing',
  1436. fn: function () {
  1437. var self = this;
  1438. return true;
  1439. return self;
  1440. },
  1441. source: unescape('canBeClosed%0A%09%5Etrue')}),
  1442. smalltalk.Inspector);
  1443. smalltalk.addMethod(
  1444. '_inspect_',
  1445. smalltalk.method({
  1446. selector: 'inspect:',
  1447. category: 'actions',
  1448. fn: function (anObject) {
  1449. var self = this;
  1450. self['@object'] = anObject;
  1451. self['@variables'] = [];
  1452. self['@object']._inspectOn_(self);
  1453. return self;
  1454. },
  1455. source: unescape('inspect%3A%20anObject%0A%09object%20%3A%3D%20anObject.%0A%09variables%20%3A%3D%20%23%28%29.%0A%09object%20inspectOn%3A%20self')}),
  1456. smalltalk.Inspector);
  1457. smalltalk.addMethod(
  1458. '_variables',
  1459. smalltalk.method({
  1460. selector: 'variables',
  1461. category: 'accessing',
  1462. fn: function () {
  1463. var self = this;
  1464. return self['@variables'];
  1465. return self;
  1466. },
  1467. source: unescape('variables%0A%09%5Evariables')}),
  1468. smalltalk.Inspector);
  1469. smalltalk.addMethod(
  1470. '_setVariables_',
  1471. smalltalk.method({
  1472. selector: 'setVariables:',
  1473. category: 'accessing',
  1474. fn: function (aCollection) {
  1475. var self = this;
  1476. self['@variables'] = aCollection;
  1477. return self;
  1478. },
  1479. source: unescape('setVariables%3A%20aCollection%0A%09variables%20%3A%3D%20aCollection')}),
  1480. smalltalk.Inspector);
  1481. smalltalk.addMethod(
  1482. '_setLabel_',
  1483. smalltalk.method({
  1484. selector: 'setLabel:',
  1485. category: 'accessing',
  1486. fn: function (aString) {
  1487. var self = this;
  1488. self['@label'] = aString;
  1489. return self;
  1490. },
  1491. source: unescape('setLabel%3A%20aString%0A%09label%20%3A%3D%20aString')}),
  1492. smalltalk.Inspector);
  1493. smalltalk.addMethod(
  1494. '_renderBoxOn_',
  1495. smalltalk.method({
  1496. selector: 'renderBoxOn:',
  1497. category: 'rendering',
  1498. fn: function (html) {
  1499. var self = this;
  1500. (function ($rec) {$rec._renderTopPanelOn_(html);return $rec._renderBottomPanelOn_(html);}(self));
  1501. return self;
  1502. },
  1503. source: unescape('renderBoxOn%3A%20html%0A%09self%20%0A%09%09renderTopPanelOn%3A%20html%3B%0A%09%09renderBottomPanelOn%3A%20html')}),
  1504. smalltalk.Inspector);
  1505. smalltalk.addMethod(
  1506. '_renderTopPanelOn_',
  1507. smalltalk.method({
  1508. selector: 'renderTopPanelOn:',
  1509. category: 'rendering',
  1510. fn: function (html) {
  1511. var self = this;
  1512. (function ($rec) {$rec._class_("top");return $rec._with_(function () {self['@variablesList'] = html._ul()._class_("jt_column variables");self['@valueTextarea'] = function ($rec) {$rec._class_("jt_column value");return $rec._at_put_("readonly", "readonly");}(html._textarea());(function ($rec) {$rec._updateVariablesList();return $rec._updateValueTextarea();}(self));return html._div()._class_("jt_clear");});}(html._div()));
  1513. return self;
  1514. },
  1515. 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%20variablesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20variables%27.%0A%09%20%20%20%20valueTextarea%20%3A%3D%20html%20textarea%20class%3A%20%27jt_column%20value%27%3B%20at%3A%20%27readonly%27%20put%3A%20%27readonly%27.%0A%09%20%20%20%20self%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea.%0A%09%20%20%20%20html%20div%20class%3A%20%27jt_clear%27%5D%0A')}),
  1516. smalltalk.Inspector);
  1517. smalltalk.addMethod(
  1518. '_renderBottomPanelOn_',
  1519. smalltalk.method({
  1520. selector: 'renderBottomPanelOn:',
  1521. category: 'rendering',
  1522. fn: function (html) {
  1523. var self = this;
  1524. (function ($rec) {$rec._class_("jt_sourceCode");return $rec._with_(function () {self['@workspaceTextarea'] = function ($rec) {$rec._class_("source");return $rec._at_put_("spellcheck", "false");}(html._textarea());return self['@workspaceTextarea']._asJQuery()._call_("tabby");});}(html._div()));
  1525. return self;
  1526. },
  1527. 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%20workspaceTextarea%20%3A%3D%20html%20textarea%20%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%20workspaceTextarea%20asJQuery%20call%3A%20%27tabby%27%5D%0A')}),
  1528. smalltalk.Inspector);
  1529. smalltalk.addMethod(
  1530. '_updateVariablesList',
  1531. smalltalk.method({
  1532. selector: 'updateVariablesList',
  1533. category: 'updating',
  1534. fn: function () {
  1535. var self = this;
  1536. self['@variablesList']._contents_(function (html) {return self._variables()._keys()._do_(function (each) {var li = nil;li = html._li();(function ($rec) {$rec._with_(each);return $rec._onClick_(function () {return self._selectVariable_(each);});}(li));return self._selectedVariable().__eq(each)._ifTrue_(function () {return li._class_("selected");});});});
  1537. return self;
  1538. },
  1539. source: unescape('updateVariablesList%0A%09variablesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09%09self%20variables%20keys%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%09%09li%20%3A%3D%20html%20li.%0A%09%09%09li%0A%09%09%09%09with%3A%20each%3B%0A%09%09%09%09onClick%3A%20%5Bself%20selectVariable%3A%20each%5D.%0A%09%09%09self%20selectedVariable%20%3D%20each%20ifTrue%3A%20%5B%0A%09%09%09%09li%20class%3A%20%27selected%27%5D%5D%5D')}),
  1540. smalltalk.Inspector);
  1541. smalltalk.addMethod(
  1542. '_selectedVariable',
  1543. smalltalk.method({
  1544. selector: 'selectedVariable',
  1545. category: 'accessing',
  1546. fn: function () {
  1547. var self = this;
  1548. return self['@selectedVariable'];
  1549. return self;
  1550. },
  1551. source: unescape('selectedVariable%0A%09%5EselectedVariable')}),
  1552. smalltalk.Inspector);
  1553. smalltalk.addMethod(
  1554. '_selectedVariable_',
  1555. smalltalk.method({
  1556. selector: 'selectedVariable:',
  1557. category: 'accessing',
  1558. fn: function (aString) {
  1559. var self = this;
  1560. self['@selectedVariable'] = aString;
  1561. return self;
  1562. },
  1563. source: unescape('selectedVariable%3A%20aString%0A%09selectedVariable%20%3A%3D%20aString')}),
  1564. smalltalk.Inspector);
  1565. smalltalk.addMethod(
  1566. '_selectVariable_',
  1567. smalltalk.method({
  1568. selector: 'selectVariable:',
  1569. category: 'updating',
  1570. fn: function (aString) {
  1571. var self = this;
  1572. self._selectedVariable_(aString);
  1573. (function ($rec) {$rec._updateVariablesList();$rec._updateValueTextarea();return $rec._updateButtons();}(self));
  1574. return self;
  1575. },
  1576. source: unescape('selectVariable%3A%20aString%0A%09self%20selectedVariable%3A%20aString.%0A%09self%20%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea%3B%0A%09%09updateButtons')}),
  1577. smalltalk.Inspector);
  1578. smalltalk.addMethod(
  1579. '_updateValueTextarea',
  1580. smalltalk.method({
  1581. selector: 'updateValueTextarea',
  1582. category: 'updating',
  1583. fn: function () {
  1584. var self = this;
  1585. self['@valueTextarea']._asJQuery()._val_(self._selectedVariable()._isNil()._ifTrue_ifFalse_(function () {return "";}, function () {return self._variables()._at_(self._selectedVariable())._printString();}));
  1586. return self;
  1587. },
  1588. source: unescape('updateValueTextarea%0A%09valueTextarea%20asJQuery%20val%3A%20%28self%20selectedVariable%20isNil%0A%09%09ifTrue%3A%20%5B%27%27%5D%0A%09%09ifFalse%3A%20%5B%28self%20variables%20at%3A%20self%20selectedVariable%29%20printString%5D%29')}),
  1589. smalltalk.Inspector);
  1590. smalltalk.addMethod(
  1591. '_renderButtonsOn_',
  1592. smalltalk.method({
  1593. selector: 'renderButtonsOn:',
  1594. category: 'rendering',
  1595. fn: function (html) {
  1596. var self = this;
  1597. (function ($rec) {$rec._with_("Refresh");return $rec._onClick_(function () {return self._refresh();});}(html._button()));
  1598. self['@diveButton'] = function ($rec) {$rec._with_("Dive");return $rec._onClick_(function () {return self._dive();});}(html._button());
  1599. self._updateButtons();
  1600. return self;
  1601. },
  1602. source: unescape('renderButtonsOn%3A%20html%0A%09html%20button%0A%09%09with%3A%20%27Refresh%27%3B%0A%09%09onClick%3A%20%5Bself%20refresh%5D.%0A%09diveButton%20%3A%3D%20html%20button%20%0A%09%09with%3A%20%27Dive%27%3B%20%0A%09%09onClick%3A%20%5Bself%20dive%5D.%0A%09self%20updateButtons%0A%09')}),
  1603. smalltalk.Inspector);
  1604. smalltalk.addMethod(
  1605. '_dive',
  1606. smalltalk.method({
  1607. selector: 'dive',
  1608. category: 'actions',
  1609. fn: function () {
  1610. var self = this;
  1611. self._variables()._at_(self._selectedVariable())._inspect();
  1612. return self;
  1613. },
  1614. source: unescape('dive%0A%09%28self%20variables%20at%3A%20self%20selectedVariable%29%20inspect')}),
  1615. smalltalk.Inspector);
  1616. smalltalk.addMethod(
  1617. '_updateButtons',
  1618. smalltalk.method({
  1619. selector: 'updateButtons',
  1620. category: 'updating',
  1621. fn: function () {
  1622. var self = this;
  1623. self._selectedVariable()._notNil()._and_(function () {return self._variables()._at_(self._selectedVariable())._notNil();})._ifFalse_ifTrue_(function () {return self['@diveButton']._at_put_("disabled", true);}, function () {return self['@diveButton']._removeAt_("disabled");});
  1624. return self;
  1625. },
  1626. source: unescape('updateButtons%0A%09%28self%20selectedVariable%20notNil%20and%3A%20%5B%28self%20variables%20at%3A%20self%20selectedVariable%29%20notNil%5D%29%0A%09%09ifFalse%3A%20%5BdiveButton%20at%3A%20%27disabled%27%20put%3A%20true%5D%20%0A%09%09ifTrue%3A%20%5BdiveButton%20removeAt%3A%20%27disabled%27%5D%0A%09%09')}),
  1627. smalltalk.Inspector);
  1628. smalltalk.addMethod(
  1629. '_refresh',
  1630. smalltalk.method({
  1631. selector: 'refresh',
  1632. category: 'actions',
  1633. fn: function () {
  1634. var self = this;
  1635. (function ($rec) {$rec._inspect_(self['@object']);$rec._updateVariablesList();return $rec._updateValueTextarea();}(self));
  1636. return self;
  1637. },
  1638. source: unescape('refresh%0A%09self%20%0A%09%09inspect%3A%20object%3B%20%0A%09%09updateVariablesList%3B%0A%09%09updateValueTextarea')}),
  1639. smalltalk.Inspector);
  1640. smalltalk.addMethod(
  1641. '_on_',
  1642. smalltalk.method({
  1643. selector: 'on:',
  1644. category: 'instance creation',
  1645. fn: function (anObject) {
  1646. var self = this;
  1647. return function ($rec) {$rec._inspect_(anObject);return $rec._yourself();}(self._new());
  1648. return self;
  1649. },
  1650. source: unescape('on%3A%20anObject%0A%09%5Eself%20new%0A%09%09inspect%3A%20anObject%3B%0A%09%09yourself')}),
  1651. smalltalk.Inspector.klass);