Helios-Widgets.st 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. Smalltalk current createPackage: 'Helios-Widgets' properties: #{}!
  2. Object subclass: #HLTab
  3. instanceVariableNames: 'widget label'
  4. package: 'Helios-Widgets'!
  5. !HLTab methodsFor: 'accessing'!
  6. activate
  7. self manager activate: self
  8. !
  9. add
  10. self manager addTab: self
  11. !
  12. label
  13. ^ label ifNil: [ '' ]
  14. !
  15. label: aString
  16. label := aString
  17. !
  18. manager
  19. ^ HLTabManager current
  20. !
  21. widget
  22. ^ widget
  23. !
  24. widget: aWidget
  25. widget := aWidget
  26. ! !
  27. !HLTab methodsFor: 'testing'!
  28. isActive
  29. ^ self manager activeTab = self
  30. ! !
  31. !HLTab class methodsFor: 'instance creation'!
  32. on: aWidget labelled: aString
  33. ^ self new
  34. widget: aWidget;
  35. label: aString;
  36. yourself
  37. ! !
  38. Widget subclass: #HLWidget
  39. instanceVariableNames: 'rootDiv'
  40. package: 'Helios-Widgets'!
  41. !HLWidget methodsFor: 'accessing'!
  42. announcer
  43. ^ self manager announcer
  44. !
  45. manager
  46. ^ HLTabManager current
  47. ! !
  48. !HLWidget methodsFor: 'announces'!
  49. announce: anObject
  50. self announcer announce: anObject
  51. !
  52. on: anAnnouncement do: aBlock
  53. self announcer on: anAnnouncement do: aBlock
  54. ! !
  55. !HLWidget methodsFor: 'initialization'!
  56. initialize
  57. super initialize.
  58. self subscribe
  59. !
  60. subscribe
  61. ! !
  62. !HLWidget methodsFor: 'rendering'!
  63. renderContentOn: html
  64. !
  65. renderOn: html
  66. rootDiv := html div with: [
  67. self renderContentOn: html ]
  68. ! !
  69. !HLWidget methodsFor: 'updating'!
  70. refresh
  71. rootDiv ifNil: [ ^ self ].
  72. rootDiv asJQuery empty.
  73. [ :html | self renderContentOn: html ] appendToJQuery: rootDiv asJQuery
  74. ! !
  75. !HLWidget class methodsFor: 'accessing'!
  76. openAsTab
  77. HLTabManager current addTab: (HLTab on: self new labelled: self tabLabel)
  78. !
  79. tabLabel
  80. ^ 'Tab'
  81. !
  82. tabPriority
  83. ^ 500
  84. ! !
  85. !HLWidget class methodsFor: 'testing'!
  86. canBeOpenAsTab
  87. ^ false
  88. ! !
  89. HLWidget subclass: #HLBrowser
  90. instanceVariableNames: 'environment selectedPackage selectedClass packagesListWidget classesListWidget'
  91. package: 'Helios-Widgets'!
  92. !HLBrowser methodsFor: 'accessing'!
  93. classesListWidget
  94. ^ classesListWidget ifNil: [
  95. classesListWidget := HLClassesListWidget on: self ]
  96. !
  97. environment
  98. ^ environment ifNil: [ environment := Smalltalk current ]
  99. !
  100. environment: anEnvironment
  101. environment := anEnvironment
  102. !
  103. packagesListWidget
  104. ^ packagesListWidget ifNil: [
  105. packagesListWidget := HLPackagesListWidget on: self ]
  106. !
  107. selectPackage: aPackage
  108. selectedPackage := aPackage.
  109. selectedClass := nil.
  110. self classesListWidget package: aPackage.
  111. !
  112. selectedPackage
  113. ^ selectedPackage
  114. ! !
  115. !HLBrowser methodsFor: 'rendering'!
  116. renderContentOn: html
  117. html with: (HLContainer with: (HLHorizontalSplitter
  118. with: (HLVerticalSplitter
  119. with: (HLVerticalSplitter
  120. with: self packagesListWidget
  121. with: self classesListWidget)
  122. with: (HLVerticalSplitter
  123. with: 'Protocols'
  124. with: 'Methods'))
  125. with: 'Source Code'))
  126. !
  127. renderTopPanesOn: html
  128. html div class: 'pane'; with: self packagesListWidget.
  129. html div class: 'pane'; with: self classesListWidget.
  130. html div class: 'pane'; with: 'hello'.
  131. html div class: 'pane'; with: 'world'
  132. ! !
  133. HLBrowser class instanceVariableNames: 'nextId'!
  134. !HLBrowser class methodsFor: 'accessing'!
  135. nextId
  136. nextId ifNil: [ nextId := 0 ].
  137. ^ 'browser_', (nextId + 1) asString
  138. !
  139. tabLabel
  140. ^ 'Browser'
  141. !
  142. tabPriority
  143. ^ 0
  144. ! !
  145. !HLBrowser class methodsFor: 'testing'!
  146. canBeOpenAsTab
  147. ^ true
  148. ! !
  149. HLWidget subclass: #HLDebugger
  150. instanceVariableNames: ''
  151. package: 'Helios-Widgets'!
  152. HLWidget subclass: #HLFocusableWidget
  153. instanceVariableNames: 'hiddenInput'
  154. package: 'Helios-Widgets'!
  155. !HLFocusableWidget methodsFor: 'accessing'!
  156. focusClass
  157. ^ 'focused'
  158. ! !
  159. !HLFocusableWidget methodsFor: 'events'!
  160. blur
  161. rootDiv asJQuery removeClass: self focusClass.
  162. !
  163. focus
  164. rootDiv asJQuery addClass: self focusClass
  165. !
  166. hasFocus
  167. ^ rootDiv notNil and: [ rootDiv asJQuery hasClass: self focusClass ]
  168. ! !
  169. !HLFocusableWidget methodsFor: 'rendering'!
  170. renderContentOn: html
  171. !
  172. renderHiddenInputOn: html
  173. hiddenInput := html input
  174. style: 'position: absolute; left: -100000px;';
  175. onBlur: [ self blur ];
  176. onFocus: [ self focus ]
  177. !
  178. renderOn: html
  179. self renderHiddenInputOn: html.
  180. rootDiv := html div
  181. class: 'hl_widget';
  182. onClick: [ hiddenInput asJQuery focus ];
  183. with: [
  184. self renderContentOn: html ]
  185. ! !
  186. HLFocusableWidget subclass: #HLListWidget
  187. instanceVariableNames: 'items selectedItem'
  188. package: 'Helios-Widgets'!
  189. !HLListWidget methodsFor: 'accessing'!
  190. cssClassForItem: anObject
  191. ^ self selectedItem = anObject
  192. ifTrue: [ 'active' ]
  193. ifFalse: [ 'inactive' ]
  194. !
  195. items
  196. ^ self subclassResponsibility
  197. !
  198. selectedItem
  199. ^ selectedItem ifNil: [
  200. self items ifNotEmpty: [ self items first ] ]
  201. !
  202. selectedItem: anObject
  203. selectedItem := anObject
  204. ! !
  205. !HLListWidget methodsFor: 'actions'!
  206. activateListItem: aListItem
  207. aListItem asJQuery parent children removeClass: 'active'.
  208. aListItem asJQuery addClass: 'active'
  209. !
  210. selectItem: anObject
  211. self selectedItem: anObject
  212. ! !
  213. !HLListWidget methodsFor: 'rendering'!
  214. renderContentOn: html
  215. html ul
  216. class: 'nav nav-pills nav-stacked';
  217. with: [
  218. self items do: [ :each |
  219. self renderItem: each on: html ] ]
  220. !
  221. renderItem: anObject on: html
  222. | li |
  223. li := html li.
  224. li
  225. class: (self cssClassForItem: anObject);
  226. with: [
  227. html a
  228. with: [
  229. (html tag: 'i') class: anObject heliosListIcon.
  230. self renderItemLabel: anObject on: html ];
  231. onClick: [
  232. self activateListItem: li.
  233. self selectItem: anObject ] ]
  234. !
  235. renderItemLabel: anObject on: html
  236. html with: anObject asString
  237. ! !
  238. HLListWidget subclass: #HLBrowserListWidget
  239. instanceVariableNames: 'browser'
  240. package: 'Helios-Widgets'!
  241. !HLBrowserListWidget methodsFor: 'accessing'!
  242. browser
  243. ^ browser
  244. !
  245. browser: aBrowser
  246. browser := aBrowser
  247. ! !
  248. !HLBrowserListWidget class methodsFor: 'instance creation'!
  249. on: aBrowser
  250. ^ self new
  251. browser: aBrowser;
  252. yourself
  253. ! !
  254. HLBrowserListWidget subclass: #HLClassesListWidget
  255. instanceVariableNames: 'package'
  256. package: 'Helios-Widgets'!
  257. !HLClassesListWidget methodsFor: 'accessing'!
  258. items
  259. ^ self package
  260. ifNil: [ #() ]
  261. ifNotNil: [ self package classes ]
  262. !
  263. package
  264. ^ package
  265. !
  266. package: aPackage
  267. package := aPackage.
  268. self refresh
  269. ! !
  270. HLBrowserListWidget subclass: #HLPackagesListWidget
  271. instanceVariableNames: ''
  272. package: 'Helios-Widgets'!
  273. !HLPackagesListWidget methodsFor: 'accessing'!
  274. browser
  275. ^ browser
  276. !
  277. browser: aBrowser
  278. browser := aBrowser
  279. !
  280. environment
  281. ^ self browser environment
  282. !
  283. items
  284. ^ self environment packages
  285. ! !
  286. !HLPackagesListWidget methodsFor: 'actions'!
  287. selectItem: aPackage
  288. super selectItem: aPackage.
  289. self browser selectPackage: aPackage
  290. ! !
  291. HLWidget subclass: #HLInspector
  292. instanceVariableNames: ''
  293. package: 'Helios-Widgets'!
  294. HLWidget subclass: #HLSUnit
  295. instanceVariableNames: ''
  296. package: 'Helios-Widgets'!
  297. !HLSUnit class methodsFor: 'accessing'!
  298. tabLabel
  299. ^ 'SUnit'
  300. !
  301. tabPriority
  302. ^ 1000
  303. ! !
  304. !HLSUnit class methodsFor: 'testing'!
  305. canBeOpenAsTab
  306. ^ true
  307. ! !
  308. HLWidget subclass: #HLTabManager
  309. instanceVariableNames: 'tabs activeTab announcer'
  310. package: 'Helios-Widgets'!
  311. !HLTabManager methodsFor: 'accessing'!
  312. activate: aTab
  313. activeTab := aTab.
  314. self
  315. refresh;
  316. show: aTab
  317. !
  318. activeTab
  319. ^ activeTab
  320. !
  321. addTab: aTab
  322. self tabs add: aTab.
  323. self activate: aTab
  324. !
  325. announcer
  326. ^ announcer ifNil: [ announcer := Announcer new ]
  327. !
  328. removeTab: aTab
  329. "Todo: activate the previously activated tab. Keep a history of tabs selection"
  330. (self tabs includes: aTab) ifFalse: [ ^ self ].
  331. self tabs remove: aTab.
  332. self refresh
  333. !
  334. tabs
  335. ^ tabs ifNil: [ tabs := OrderedCollection new ]
  336. ! !
  337. !HLTabManager methodsFor: 'rendering'!
  338. refresh
  339. (window jQuery: '.navbar') remove.
  340. (window jQuery: '#container') remove.
  341. self appendToJQuery: 'body' asJQuery
  342. !
  343. renderAddOn: html
  344. html li
  345. class: 'dropdown';
  346. with: [
  347. html a
  348. class: 'dropdown-toggle';
  349. at: 'data-toggle' put: 'dropdown';
  350. with: [
  351. html with: 'Open...'.
  352. (html tag: 'b') class: 'caret' ].
  353. html ul
  354. class: 'dropdown-menu';
  355. with: [
  356. ((HLWidget withAllSubclasses
  357. select: [ :each | each canBeOpenAsTab ])
  358. sorted: [ :a :b | a tabPriority < b tabPriority ])
  359. do: [ :each |
  360. html li with: [
  361. html a
  362. with: each tabLabel;
  363. onClick: [ each openAsTab ] ] ] ] ]
  364. !
  365. renderContentOn: html
  366. html div
  367. class: 'navbar navbar-fixed-top';
  368. with: [ html div
  369. class: 'navbar-inner';
  370. with: [ self renderTabsOn: html ] ].
  371. html div id: 'container'
  372. !
  373. renderTabsOn: html
  374. html ul
  375. class: 'nav';
  376. with: [
  377. self tabs do: [ :each |
  378. html li
  379. class: (each isActive ifTrue: [ 'active' ] ifFalse: [ 'inactive' ]);
  380. with: [
  381. html a
  382. with: [
  383. ((html tag: 'i') class: 'icon-remove-circle')
  384. onClick: [ self removeTab: each ].
  385. html with: each label ];
  386. onClick: [ each activate ] ] ].
  387. self renderAddOn: html ]
  388. !
  389. show: aTab
  390. (window jQuery: '#container') empty.
  391. aTab widget appendToJQuery: '#container' asJQuery
  392. ! !
  393. HLTabManager class instanceVariableNames: 'current'!
  394. !HLTabManager class methodsFor: 'accessing'!
  395. current
  396. ^ current ifNil: [ current := self basicNew initialize ]
  397. ! !
  398. !HLTabManager class methodsFor: 'initialization'!
  399. initialize
  400. self current appendToJQuery: 'body' asJQuery
  401. ! !
  402. !HLTabManager class methodsFor: 'instance creation'!
  403. new
  404. "Use current instead"
  405. self shouldNotImplement
  406. ! !
  407. HLWidget subclass: #HLTranscript
  408. instanceVariableNames: ''
  409. package: 'Helios-Widgets'!
  410. !HLTranscript class methodsFor: 'accessing'!
  411. tabLabel
  412. ^ 'Transcript'
  413. !
  414. tabPriority
  415. ^ 600
  416. ! !
  417. !HLTranscript class methodsFor: 'testing'!
  418. canBeOpenAsTab
  419. ^ true
  420. ! !
  421. HLWidget subclass: #HLWorkspace
  422. instanceVariableNames: ''
  423. package: 'Helios-Widgets'!
  424. !HLWorkspace class methodsFor: 'accessing'!
  425. tabLabel
  426. ^ 'Workspace'
  427. !
  428. tabPriority
  429. ^ 10
  430. ! !
  431. !HLWorkspace class methodsFor: 'testing'!
  432. canBeOpenAsTab
  433. ^ true
  434. ! !
  435. !Object methodsFor: '*Helios-Widgets'!
  436. heliosListIcon
  437. ^ ''
  438. ! !