1
0

Helios-References.st 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. Smalltalk createPackage: 'Helios-References'!
  2. HLWidget subclass: #HLReferences
  3. slots: {#model. #sendersListWidget. #implementorsListWidget. #classReferencesListWidget. #regexpListWidget. #sourceCodeWidget}
  4. package: 'Helios-References'!
  5. !HLReferences methodsFor: 'accessing'!
  6. classReferencesListWidget
  7. ^ classReferencesListWidget ifNil: [
  8. classReferencesListWidget := HLClassReferencesListWidget on: self model.
  9. classReferencesListWidget next: self regexpListWidget ]
  10. !
  11. implementorsListWidget
  12. ^ implementorsListWidget ifNil: [
  13. implementorsListWidget := HLImplementorsListWidget on: self model.
  14. implementorsListWidget next: self classReferencesListWidget ]
  15. !
  16. model
  17. ^ model ifNil: [
  18. model := (HLReferencesModel new
  19. environment: self manager environment;
  20. yourself) ]
  21. !
  22. model: aModel
  23. model := aModel
  24. !
  25. regexpListWidget
  26. ^ regexpListWidget ifNil: [
  27. regexpListWidget := HLRegexpListWidget on: self model.
  28. regexpListWidget next: self sourceCodeWidget ]
  29. !
  30. sendersListWidget
  31. ^ sendersListWidget ifNil: [
  32. sendersListWidget := HLSendersListWidget on: self model.
  33. sendersListWidget next: self implementorsListWidget ]
  34. !
  35. sourceCodeWidget
  36. ^ sourceCodeWidget ifNil: [
  37. sourceCodeWidget := HLBrowserCodeWidget new
  38. browserModel: self model;
  39. yourself ]
  40. ! !
  41. !HLReferences methodsFor: 'actions'!
  42. registerBindingsOn: aBindingGroup
  43. HLToolCommand
  44. registerConcreteClassesOn: aBindingGroup
  45. for: self model
  46. !
  47. search: aString
  48. self model search: aString.
  49. self setTabLabel: aString
  50. ! !
  51. !HLReferences methodsFor: 'rendering'!
  52. renderContentOn: html
  53. html with: (HLContainer with: (HLHorizontalSplitter
  54. with: (HLVerticalSplitter
  55. with: (HLVerticalSplitter
  56. with: self sendersListWidget
  57. with: self implementorsListWidget)
  58. with: (HLVerticalSplitter
  59. with: self classReferencesListWidget
  60. with: self regexpListWidget))
  61. with: self sourceCodeWidget)).
  62. self sendersListWidget focus
  63. ! !
  64. !HLReferences class methodsFor: 'accessing'!
  65. tabClass
  66. ^ 'references'
  67. !
  68. tabLabel
  69. ^ 'References'
  70. !
  71. tabPriority
  72. ^ 100
  73. ! !
  74. !HLReferences class methodsFor: 'testing'!
  75. canBeOpenAsTab
  76. ^ false
  77. ! !
  78. HLToolListWidget subclass: #HLReferencesListWidget
  79. slots: {}
  80. package: 'Helios-References'!
  81. !HLReferencesListWidget methodsFor: 'accessing'!
  82. commandCategory
  83. ^ 'Methods'
  84. !
  85. label
  86. ^ 'List'
  87. ! !
  88. !HLReferencesListWidget methodsFor: 'actions'!
  89. activateListItem: anItem
  90. self model withChangesDo: [ super activateListItem: anItem ]
  91. !
  92. observeModel
  93. self model announcer
  94. on: HLSearchReferences
  95. do: [ :ann | self onSearchReferences: ann searchString ];
  96. on: HLMethodSelected
  97. do: [ :ann | self onMethodSelected: ann item ]
  98. !
  99. selectItem: aMethod
  100. super selectItem: aMethod.
  101. self model selectedClass: nil; selectedMethod: aMethod
  102. ! !
  103. !HLReferencesListWidget methodsFor: 'reactions'!
  104. onMethodSelected: aMethod
  105. aMethod ifNil: [ ^ self ].
  106. (self items includes: aMethod) ifFalse: [ ^ self ].
  107. self
  108. selectedItem: aMethod;
  109. activateItem: aMethod
  110. !
  111. onSearchReferences: aString
  112. self subclassResponsibility
  113. ! !
  114. !HLReferencesListWidget methodsFor: 'rendering'!
  115. renderItemLabel: aMethod on: html
  116. html with: aMethod asString
  117. ! !
  118. !HLReferencesListWidget class methodsFor: 'instance creation'!
  119. on: aModel
  120. ^ self new
  121. model: aModel;
  122. yourself
  123. ! !
  124. HLReferencesListWidget subclass: #HLClassReferencesListWidget
  125. slots: {}
  126. package: 'Helios-References'!
  127. !HLClassReferencesListWidget methodsFor: 'accessing'!
  128. label
  129. ^ 'Class references'
  130. ! !
  131. !HLClassReferencesListWidget methodsFor: 'reactions'!
  132. onSearchReferences: aString
  133. self selectItem: nil.
  134. self items: (self model classReferencesOf: aString).
  135. self refresh
  136. ! !
  137. HLReferencesListWidget subclass: #HLImplementorsListWidget
  138. slots: {}
  139. package: 'Helios-References'!
  140. !HLImplementorsListWidget methodsFor: 'accessing'!
  141. label
  142. ^ 'Implementors'
  143. ! !
  144. !HLImplementorsListWidget methodsFor: 'reactions'!
  145. onSearchReferences: aString
  146. self selectItem: nil.
  147. self items: (self model implementorsOf: aString).
  148. self refresh
  149. ! !
  150. HLReferencesListWidget subclass: #HLRegexpListWidget
  151. slots: {}
  152. package: 'Helios-References'!
  153. !HLRegexpListWidget methodsFor: 'accessing'!
  154. label
  155. ^ 'Source search'
  156. ! !
  157. !HLRegexpListWidget methodsFor: 'reactions'!
  158. onSearchReferences: aString
  159. self selectItem: nil.
  160. self items: (self model regexpReferencesOf: aString).
  161. self refresh
  162. ! !
  163. HLReferencesListWidget subclass: #HLSendersListWidget
  164. slots: {}
  165. package: 'Helios-References'!
  166. !HLSendersListWidget methodsFor: 'accessing'!
  167. label
  168. ^ 'Senders'
  169. ! !
  170. !HLSendersListWidget methodsFor: 'reactions'!
  171. onSearchReferences: aString
  172. self selectItem: nil.
  173. self items: (self model sendersOf: aString).
  174. self refresh
  175. ! !
  176. HLToolModel subclass: #HLReferencesModel
  177. slots: {#methodsCache. #classesAndMetaclassesCache}
  178. package: 'Helios-References'!
  179. !HLReferencesModel methodsFor: 'accessing'!
  180. allMethods
  181. ^ self methodsCache
  182. !
  183. classReferencesOf: aString
  184. "Answer all methods referencing the class named aString"
  185. ^self allMethods select: [ :each |
  186. (each referencedClasses includes: aString) ]
  187. !
  188. classesAndMetaclasses
  189. ^ self classesAndMetaclassesCache
  190. !
  191. implementorsOf: aString
  192. ^ self allMethods select: [ :each |
  193. each selector = aString ]
  194. !
  195. regexpReferencesOf: aString
  196. ^ self allMethods select: [ :each |
  197. each source match: aString ]
  198. !
  199. sendersOf: aString
  200. ^ self allMethods select: [ :each |
  201. each messageSends includes: aString ]
  202. ! !
  203. !HLReferencesModel methodsFor: 'actions'!
  204. openClassNamed: aString
  205. | browser |
  206. self withChangesDo: [
  207. browser := HLBrowser openAsTab.
  208. browser openClassNamed: aString ]
  209. !
  210. openMethod
  211. | browser |
  212. self selectedMethod ifNil: [ ^ self ].
  213. self withChangesDo: [
  214. browser := HLBrowser openAsTab.
  215. browser openMethod: self selectedMethod ]
  216. !
  217. search: aString
  218. self updateCaches.
  219. self announcer announce: (HLSearchReferences new
  220. searchString: aString;
  221. yourself)
  222. ! !
  223. !HLReferencesModel methodsFor: 'cache'!
  224. classesAndMetaclassesCache
  225. classesAndMetaclassesCache ifNil: [ self updateClassesAndMetaclassesCache ].
  226. ^ classesAndMetaclassesCache
  227. !
  228. methodsCache
  229. methodsCache ifNil: [ self updateMethodsCache ].
  230. ^ methodsCache
  231. !
  232. updateCaches
  233. self
  234. updateClassesAndMetaclassesCache;
  235. updateMethodsCache
  236. !
  237. updateClassesAndMetaclassesCache
  238. classesAndMetaclassesCache := OrderedCollection new.
  239. self environment classes do: [ :each |
  240. classesAndMetaclassesCache add: each.
  241. each theMetaClass ifNotNil: [ :meta | classesAndMetaclassesCache add: meta ] ]
  242. !
  243. updateMethodsCache
  244. methodsCache := OrderedCollection new.
  245. self classesAndMetaclasses
  246. do: [ :each | methodsCache addAll: each methods ]
  247. ! !
  248. !HLReferencesModel methodsFor: 'testing'!
  249. isReferencesModel
  250. ^ true
  251. ! !