Trapped-Frontend.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. smalltalk.addPackage('Trapped-Frontend', {});
  2. smalltalk.addClass('TrappedDumbView', smalltalk.Widget, [], 'Trapped-Frontend');
  3. smalltalk.TrappedDumbView.comment="I just read and show an actual path."
  4. smalltalk.addMethod(
  5. "_renderOn_",
  6. smalltalk.method({
  7. selector: "renderOn:",
  8. category: 'rendering',
  9. fn: function (html){
  10. var self=this;
  11. smalltalk.send(smalltalk.send(html,"_root",[]),"_trapShow_",[[]]);
  12. return self},
  13. args: ["html"],
  14. source: "renderOn: html\x0a\x09html root trapShow: #()",
  15. messageSends: ["trapShow:", "root"],
  16. referencedClasses: []
  17. }),
  18. smalltalk.TrappedDumbView);
  19. smalltalk.addClass('TrappedModelWrapper', smalltalk.Object, ['dispatcher', 'payload'], 'Trapped-Frontend');
  20. smalltalk.TrappedModelWrapper.comment="I am base class for model wrappers.\x0aI wrap a model which can be any object.\x0a\x0aMy subclasses need to provide implementation for:\x0a\x09read:do:\x0a modify:do:\x0a\x09(optionally) name\x0a\x0aand must initialize:\x0a\x09payload\x0a\x09dispatcher\x0a"
  21. smalltalk.addMethod(
  22. "_dispatcher",
  23. smalltalk.method({
  24. selector: "dispatcher",
  25. category: 'accessing',
  26. fn: function (){
  27. var self=this;
  28. return self["@dispatcher"];
  29. },
  30. args: [],
  31. source: "dispatcher\x0a\x09^dispatcher",
  32. messageSends: [],
  33. referencedClasses: []
  34. }),
  35. smalltalk.TrappedModelWrapper);
  36. smalltalk.addMethod(
  37. "_dispatcher_",
  38. smalltalk.method({
  39. selector: "dispatcher:",
  40. category: 'accessing',
  41. fn: function (aDispatcher){
  42. var self=this;
  43. self["@dispatcher"]=aDispatcher;
  44. return self},
  45. args: ["aDispatcher"],
  46. source: "dispatcher: aDispatcher\x0a\x09dispatcher := aDispatcher",
  47. messageSends: [],
  48. referencedClasses: []
  49. }),
  50. smalltalk.TrappedModelWrapper);
  51. smalltalk.addMethod(
  52. "_name",
  53. smalltalk.method({
  54. selector: "name",
  55. category: 'accessing',
  56. fn: function (){
  57. var self=this;
  58. var $1;
  59. $1=smalltalk.send(smalltalk.send(self,"_class",[]),"_name",[]);
  60. return $1;
  61. },
  62. args: [],
  63. source: "name\x0a\x09^ self class name",
  64. messageSends: ["name", "class"],
  65. referencedClasses: []
  66. }),
  67. smalltalk.TrappedModelWrapper);
  68. smalltalk.addMethod(
  69. "_payload",
  70. smalltalk.method({
  71. selector: "payload",
  72. category: 'accessing',
  73. fn: function (){
  74. var self=this;
  75. return self["@payload"];
  76. },
  77. args: [],
  78. source: "payload\x0a\x09^payload",
  79. messageSends: [],
  80. referencedClasses: []
  81. }),
  82. smalltalk.TrappedModelWrapper);
  83. smalltalk.addMethod(
  84. "_payload_",
  85. smalltalk.method({
  86. selector: "payload:",
  87. category: 'accessing',
  88. fn: function (anObject){
  89. var self=this;
  90. self["@payload"]=anObject;
  91. return self},
  92. args: ["anObject"],
  93. source: "payload: anObject\x0a\x09payload := anObject",
  94. messageSends: [],
  95. referencedClasses: []
  96. }),
  97. smalltalk.TrappedModelWrapper);
  98. smalltalk.addMethod(
  99. "_start",
  100. smalltalk.method({
  101. selector: "start",
  102. category: 'action',
  103. fn: function (){
  104. var self=this;
  105. smalltalk.send(smalltalk.send((smalltalk.Trapped || Trapped),"_current",[]),"_register_name_",[self,smalltalk.send(self,"_name",[])]);
  106. return self},
  107. args: [],
  108. source: "start\x0a\x09Trapped current register: self name: self name",
  109. messageSends: ["register:name:", "name", "current"],
  110. referencedClasses: ["Trapped"]
  111. }),
  112. smalltalk.TrappedModelWrapper);
  113. smalltalk.addMethod(
  114. "_watch_do_",
  115. smalltalk.method({
  116. selector: "watch:do:",
  117. category: 'action',
  118. fn: function (path,aBlock){
  119. var self=this;
  120. smalltalk.send(smalltalk.send(self,"_dispatcher",[]),"_add_",[[true,path,(function(){
  121. return smalltalk.send(self,"_read_do_",[path,aBlock]);
  122. })]]);
  123. smalltalk.send(smalltalk.send(self,"_dispatcher",[]),"_dirty_",[true]);
  124. return self},
  125. args: ["path", "aBlock"],
  126. source: "watch: path do: aBlock\x0a\x09self dispatcher add: { true. path. [ self read: path do: aBlock ] }.\x0a self dispatcher dirty: true",
  127. messageSends: ["add:", "read:do:", "dispatcher", "dirty:"],
  128. referencedClasses: []
  129. }),
  130. smalltalk.TrappedModelWrapper);
  131. smalltalk.addMethod(
  132. "_start",
  133. smalltalk.method({
  134. selector: "start",
  135. category: 'action',
  136. fn: function (){
  137. var self=this;
  138. smalltalk.send(smalltalk.send(self,"_new",[]),"_start",[]);
  139. return self},
  140. args: [],
  141. source: "start\x0a\x09self new start",
  142. messageSends: ["start", "new"],
  143. referencedClasses: []
  144. }),
  145. smalltalk.TrappedModelWrapper.klass);
  146. smalltalk.addClass('TrappedSingleton', smalltalk.Object, [], 'Trapped-Frontend');
  147. smalltalk.addMethod(
  148. "_start",
  149. smalltalk.method({
  150. selector: "start",
  151. category: 'action',
  152. fn: function (){
  153. var self=this;
  154. var $1;
  155. $1=smalltalk.send(self,"_subclassResponsibility",[]);
  156. return $1;
  157. },
  158. args: [],
  159. source: "start\x0a\x09^ self subclassResponsibility",
  160. messageSends: ["subclassResponsibility"],
  161. referencedClasses: []
  162. }),
  163. smalltalk.TrappedSingleton);
  164. smalltalk.TrappedSingleton.klass.iVarNames = ['current'];
  165. smalltalk.addMethod(
  166. "_current",
  167. smalltalk.method({
  168. selector: "current",
  169. category: 'accessing',
  170. fn: function (){
  171. var self=this;
  172. var $1;
  173. if(($receiver = self["@current"]) == nil || $receiver == undefined){
  174. self["@current"]=smalltalk.send(self,"_new",[]);
  175. $1=self["@current"];
  176. } else {
  177. $1=self["@current"];
  178. };
  179. return $1;
  180. },
  181. args: [],
  182. source: "current\x0a\x09^ current ifNil: [ current := self new ]",
  183. messageSends: ["ifNil:", "new"],
  184. referencedClasses: []
  185. }),
  186. smalltalk.TrappedSingleton.klass);
  187. smalltalk.addMethod(
  188. "_start",
  189. smalltalk.method({
  190. selector: "start",
  191. category: 'action',
  192. fn: function (){
  193. var self=this;
  194. smalltalk.send(smalltalk.send(self,"_current",[]),"_start",[]);
  195. return self},
  196. args: [],
  197. source: "start\x0a\x09self current start",
  198. messageSends: ["start", "current"],
  199. referencedClasses: []
  200. }),
  201. smalltalk.TrappedSingleton.klass);
  202. smalltalk.addClass('Trapped', smalltalk.TrappedSingleton, ['registry'], 'Trapped-Frontend');
  203. smalltalk.addMethod(
  204. "_byName_",
  205. smalltalk.method({
  206. selector: "byName:",
  207. category: 'accessing',
  208. fn: function (aString){
  209. var self=this;
  210. var $1;
  211. $1=smalltalk.send(self["@registry"],"_at_",[aString]);
  212. return $1;
  213. },
  214. args: ["aString"],
  215. source: "byName: aString\x0a\x09^ registry at: aString",
  216. messageSends: ["at:"],
  217. referencedClasses: []
  218. }),
  219. smalltalk.Trapped);
  220. smalltalk.addMethod(
  221. "_initialize",
  222. smalltalk.method({
  223. selector: "initialize",
  224. category: 'initialization',
  225. fn: function (){
  226. var self=this;
  227. smalltalk.send(self,"_initialize",[],smalltalk.TrappedSingleton);
  228. self["@registry"]=smalltalk.HashedCollection._fromPairs_([]);
  229. return self},
  230. args: [],
  231. source: "initialize\x0a\x09super initialize.\x0a\x09registry := #{}.",
  232. messageSends: ["initialize"],
  233. referencedClasses: []
  234. }),
  235. smalltalk.Trapped);
  236. smalltalk.addMethod(
  237. "_register_name_",
  238. smalltalk.method({
  239. selector: "register:name:",
  240. category: 'accessing',
  241. fn: function (aFly,aString){
  242. var self=this;
  243. smalltalk.send(self["@registry"],"_at_put_",[aString,aFly]);
  244. return self},
  245. args: ["aFly", "aString"],
  246. source: "register: aFly name: aString\x0a\x09registry at: aString put: aFly",
  247. messageSends: ["at:put:"],
  248. referencedClasses: []
  249. }),
  250. smalltalk.Trapped);
  251. smalltalk.addMethod(
  252. "_start",
  253. smalltalk.method({
  254. selector: "start",
  255. category: 'action',
  256. fn: function (){
  257. var self=this;
  258. var $1;
  259. smalltalk.send(smalltalk.send("[data-trap]","_asJQuery",[]),"_each_",[(function(index,elem){
  260. var trap;
  261. var jq;
  262. var viewName;
  263. var modelName;
  264. var tokens;
  265. var path;
  266. jq=smalltalk.send(elem,"_asJQuery",[]);
  267. jq;
  268. trap=smalltalk.send(jq,"_attr_",["data-trap"]);
  269. trap;
  270. tokens=smalltalk.send(trap,"_tokenize_",[":"]);
  271. tokens;
  272. $1=smalltalk.send(smalltalk.send(tokens,"_size",[]),"__eq",[(1)]);
  273. if(smalltalk.assert($1)){
  274. tokens=smalltalk.send(["TrappedDumbView"],"__comma",[tokens]);
  275. tokens;
  276. };
  277. viewName=smalltalk.send(tokens,"_first",[]);
  278. viewName;
  279. tokens=smalltalk.send(smalltalk.send(smalltalk.send(tokens,"_second",[]),"_tokenize_",[" "]),"_select_",[(function(each){
  280. return smalltalk.send(each,"_notEmpty",[]);
  281. })]);
  282. tokens;
  283. modelName=smalltalk.send(tokens,"_first",[]);
  284. modelName;
  285. path=smalltalk.send((smalltalk.Trapped || Trapped),"_parse_",[smalltalk.send(tokens,"_allButFirst",[])]);
  286. path;
  287. return smalltalk.send(smalltalk.send([modelName],"__comma",[path]),"_trapDescend_",[(function(){
  288. return smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk),"_current",[]),"_at_",[viewName]),"_new",[]),"_appendToJQuery_",[jq]);
  289. })]);
  290. })]);
  291. return self},
  292. args: [],
  293. source: "start\x0a\x09'[data-trap]' asJQuery each: [ :index :elem |\x0a \x09| trap jq viewName modelName tokens path |\x0a jq := elem asJQuery.\x0a trap := jq attr: 'data-trap'.\x0a tokens := trap tokenize: ':'.\x0a tokens size = 1 ifTrue: [ tokens := { 'TrappedDumbView' }, tokens ].\x0a viewName := tokens first.\x0a tokens := (tokens second tokenize: ' ') select: [ :each | each notEmpty ].\x0a modelName := tokens first.\x0a path := Trapped parse: tokens allButFirst.\x0a { modelName }, path trapDescend: [(Smalltalk current at: viewName) new appendToJQuery: jq].\x0a ]",
  294. messageSends: ["each:", "asJQuery", "attr:", "tokenize:", "ifTrue:", ",", "=", "size", "first", "select:", "notEmpty", "second", "parse:", "allButFirst", "trapDescend:", "appendToJQuery:", "new", "at:", "current"],
  295. referencedClasses: ["Trapped", "Smalltalk"]
  296. }),
  297. smalltalk.Trapped);
  298. smalltalk.addMethod(
  299. "_parse_",
  300. smalltalk.method({
  301. selector: "parse:",
  302. category: 'accessing',
  303. fn: function (anArray){
  304. var self=this;
  305. var $2,$3,$1;
  306. $1=smalltalk.send(anArray,"_collect_",[(function(each){
  307. var asNum;
  308. asNum = parseInt(each);
  309. ;
  310. $2=smalltalk.send(asNum,"__eq",[asNum]);
  311. if(smalltalk.assert($2)){
  312. return asNum;
  313. } else {
  314. $3=smalltalk.send(smalltalk.send(each,"_first",[]),"__eq",["#"]);
  315. if(smalltalk.assert($3)){
  316. return smalltalk.send(smalltalk.send(each,"_allButFirst",[]),"_asSymbol",[]);
  317. } else {
  318. return each;
  319. };
  320. };
  321. })]);
  322. return $1;
  323. },
  324. args: ["anArray"],
  325. source: "parse: anArray\x0a\x09^anArray collect: [ :each |\x0a \x09| asNum |\x0a \x09<asNum = parseInt(each)>.\x0a asNum = asNum ifTrue: [ asNum ] ifFalse: [\x0a\x09\x09\x09each first = '#' ifTrue: [ each allButFirst asSymbol ] ifFalse: [ each ]]]",
  326. messageSends: ["collect:", "ifTrue:ifFalse:", "asSymbol", "allButFirst", "=", "first"],
  327. referencedClasses: []
  328. }),
  329. smalltalk.Trapped.klass);
  330. smalltalk.addMethod(
  331. "_path",
  332. smalltalk.method({
  333. selector: "path",
  334. category: 'accessing',
  335. fn: function (){
  336. var self=this;
  337. var $1;
  338. $1=smalltalk.send(smalltalk.send((smalltalk.TrappedPathStack || TrappedPathStack),"_current",[]),"_elements",[]);
  339. return $1;
  340. },
  341. args: [],
  342. source: "path\x0a\x09^TrappedPathStack current elements",
  343. messageSends: ["elements", "current"],
  344. referencedClasses: ["TrappedPathStack"]
  345. }),
  346. smalltalk.Trapped.klass);
  347. smalltalk.addClass('TrappedPathStack', smalltalk.TrappedSingleton, ['elements'], 'Trapped-Frontend');
  348. smalltalk.addMethod(
  349. "_append_",
  350. smalltalk.method({
  351. selector: "append:",
  352. category: 'descending',
  353. fn: function (anArray){
  354. var self=this;
  355. self["@elements"]=smalltalk.send(self["@elements"],"__comma",[anArray]);
  356. return self},
  357. args: ["anArray"],
  358. source: "append: anArray\x0a elements := elements, anArray",
  359. messageSends: [","],
  360. referencedClasses: []
  361. }),
  362. smalltalk.TrappedPathStack);
  363. smalltalk.addMethod(
  364. "_elements",
  365. smalltalk.method({
  366. selector: "elements",
  367. category: 'accessing',
  368. fn: function (){
  369. var self=this;
  370. return self["@elements"];
  371. },
  372. args: [],
  373. source: "elements\x0a\x09^elements",
  374. messageSends: [],
  375. referencedClasses: []
  376. }),
  377. smalltalk.TrappedPathStack);
  378. smalltalk.addMethod(
  379. "_initialize",
  380. smalltalk.method({
  381. selector: "initialize",
  382. category: 'initialization',
  383. fn: function (){
  384. var self=this;
  385. self["@elements"]=[];
  386. return self},
  387. args: [],
  388. source: "initialize\x0a\x09elements := #().",
  389. messageSends: [],
  390. referencedClasses: []
  391. }),
  392. smalltalk.TrappedPathStack);
  393. smalltalk.addMethod(
  394. "_with_do_",
  395. smalltalk.method({
  396. selector: "with:do:",
  397. category: 'descending',
  398. fn: function (anArray,aBlock){
  399. var self=this;
  400. var old;
  401. old=self["@elements"];
  402. smalltalk.send((function(){
  403. smalltalk.send(self,"_append_",[anArray]);
  404. return smalltalk.send(aBlock,"_value",[]);
  405. }),"_ensure_",[(function(){
  406. self["@elements"]=old;
  407. return self["@elements"];
  408. })]);
  409. return self},
  410. args: ["anArray", "aBlock"],
  411. source: "with: anArray do: aBlock\x0a\x09| old |\x0a old := elements.\x0a [ self append: anArray.\x0a\x09aBlock value ] ensure: [ elements := old ]",
  412. messageSends: ["ensure:", "append:", "value"],
  413. referencedClasses: []
  414. }),
  415. smalltalk.TrappedPathStack);
  416. smalltalk.addMethod(
  417. "_trapDescend_",
  418. smalltalk.method({
  419. selector: "trapDescend:",
  420. category: '*Trapped-Frontend',
  421. fn: function (aBlock){
  422. var self=this;
  423. smalltalk.send(smalltalk.send((smalltalk.TrappedPathStack || TrappedPathStack),"_current",[]),"_with_do_",[self,aBlock]);
  424. return self},
  425. args: ["aBlock"],
  426. source: "trapDescend: aBlock\x0a\x09TrappedPathStack current with: self do: aBlock",
  427. messageSends: ["with:do:", "current"],
  428. referencedClasses: ["TrappedPathStack"]
  429. }),
  430. smalltalk.Array);
  431. smalltalk.addMethod(
  432. "_trapDescend_",
  433. smalltalk.method({
  434. selector: "trapDescend:",
  435. category: '*Trapped-Frontend',
  436. fn: function (aBlock){
  437. var self=this;
  438. smalltalk.send(smalltalk.send((smalltalk.TrappedPathStack || TrappedPathStack),"_current",[]),"_with_do_",[self,aBlock]);
  439. return self},
  440. args: ["aBlock"],
  441. source: "trapDescend: aBlock\x0a\x09TrappedPathStack current with: self do: aBlock",
  442. messageSends: ["with:do:", "current"],
  443. referencedClasses: ["TrappedPathStack"]
  444. }),
  445. smalltalk.Array);
  446. smalltalk.addMethod(
  447. "_trap_read_",
  448. smalltalk.method({
  449. selector: "trap:read:",
  450. category: '*Trapped-Frontend',
  451. fn: function (path,aBlock){
  452. var self=this;
  453. smalltalk.send(path,"_trapDescend_",[(function(){
  454. var actual;
  455. var model;
  456. actual=smalltalk.send((smalltalk.Trapped || Trapped),"_path",[]);
  457. actual;
  458. model=smalltalk.send(smalltalk.send((smalltalk.Trapped || Trapped),"_current",[]),"_byName_",[smalltalk.send(actual,"_first",[])]);
  459. model;
  460. return smalltalk.send(model,"_watch_do_",[smalltalk.send(actual,"_allButFirst",[]),(function(data){
  461. return smalltalk.send(aBlock,"_value_value_",[self,data]);
  462. })]);
  463. })]);
  464. return self},
  465. args: ["path", "aBlock"],
  466. source: "trap: path read: aBlock\x0a\x09path trapDescend: [ | actual model |\x0a \x09actual := Trapped path.\x0a model := Trapped current byName: actual first.\x0a model watch: actual allButFirst do: [ :data |\x0a \x09aBlock value: self value: data\x0a \x09]\x0a ]",
  467. messageSends: ["trapDescend:", "path", "byName:", "first", "current", "watch:do:", "allButFirst", "value:value:"],
  468. referencedClasses: ["Trapped"]
  469. }),
  470. smalltalk.TagBrush);
  471. smalltalk.addMethod(
  472. "_trapShow_",
  473. smalltalk.method({
  474. selector: "trapShow:",
  475. category: '*Trapped-Frontend',
  476. fn: function (path){
  477. var self=this;
  478. var $1;
  479. smalltalk.send(self,"_trap_read_",[path,(function(brush,model){
  480. smalltalk.send(brush,"_empty",[]);
  481. $1=smalltalk.send(brush,"_with_",[model]);
  482. return $1;
  483. })]);
  484. return self},
  485. args: ["path"],
  486. source: "trapShow: path\x0a\x09self trap: path read: [ :brush :model | brush empty; with: model ]",
  487. messageSends: ["trap:read:", "empty", "with:"],
  488. referencedClasses: []
  489. }),
  490. smalltalk.TagBrush);