home *** CD-ROM | disk | FTP | other *** search
/ BURKS 2 / BURKS_AUG97.ISO / BURKS / LANGUAGE / SMALTALK / TEXTBOOK / AP10.ST (.txt) < prev    next >
Text File  |  1997-04-22  |  7KB  |  277 lines

  1.  
  2. 'Smalltalk Textbook Appendix 10'!
  3.  
  4.  
  5.  
  6.  
  7.  
  8. Browser subclass: #EngiBrowser
  9.     instanceVariableNames: 'engiClasses '
  10.     classVariableNames: 'EngiCategoryMenu EngiClassMenu '
  11.     poolDictionaries: ''
  12.     category: 'Engi-Programming'!
  13. EngiBrowser comment:
  14. '
  15.  
  16. Engi 0.03 (29 January 1994)
  17. Copyright (C) 1994 by Atsushi Aoki
  18.  
  19. '!
  20.  
  21.  
  22. !EngiBrowser methodsFor: 'copying'!
  23.  
  24. postCopy
  25.     super postCopy.
  26.     self flushEngiClasses! !
  27.  
  28. !EngiBrowser methodsFor: 'category list'!
  29.  
  30. categoryList
  31.     | engiCategories |
  32.     engiCategories := self engiClasses collect: [:each | each category].
  33.     ^organization categories select: [:each | (engiCategories includes: each)
  34.             or: [EngiSystem system , '*' match: each]]!
  35.  
  36. categoryMenu
  37.     InputState default shiftDown
  38.         ifTrue: [^self engiCategoryMenu]
  39.         ifFalse: [^super categoryMenu]! !
  40.  
  41. !EngiBrowser methodsFor: 'class list'!
  42.  
  43. classList
  44.     | engiClassNames |
  45.     category == nil ifTrue: [^nil].
  46.     engiClassNames := self engiClassNames asSet.
  47.     ^(organization listAtCategoryNamed: category)
  48.         select: [:each | engiClassNames includes: each]!
  49.  
  50. classMenu
  51.     InputState default shiftDown
  52.         ifTrue: [^self engiClassMenu]
  53.         ifFalse: [^super classMenu]! !
  54.  
  55. !EngiBrowser methodsFor: 'private-category functions'!
  56.  
  57. addCategory
  58.     self flushEngiClasses.
  59.     ^super addCategory!
  60.  
  61. editCategories
  62.     self flushEngiClasses.
  63.     ^super editCategories!
  64.  
  65. pickAClass: prompt 
  66.     | destClassName destClass classes chosenSelector |
  67.     destClassName := DialogView request: prompt initialAnswer: ParagraphEditor currentSelection.
  68.     destClassName = '' ifTrue: [^''].
  69.     (destClassName findString: '*' startingAt: 1)
  70.         ~= 0
  71.         ifTrue: 
  72.             [classes := OrderedCollection new.
  73.             Cursor execute showWhile: [classes := self engiClassNames select: [:cn | destClassName match: cn]].
  74.             (classes == nil or: [classes size = 0])
  75.                 ifTrue: [^nil].
  76.             (chosenSelector := (PopUpMenu labelList: (Array with: classes)) startUp) = 0
  77.                 ifTrue: [^'']
  78.                 ifFalse: [destClassName := classes at: chosenSelector]]
  79.         ifFalse: [destClassName := Smalltalk keys detect: [:cn | destClassName match: cn]
  80.                         ifNone: [^nil]].
  81.     destClass := Smalltalk at: destClassName asSymbol ifAbsent: [^nil].
  82.     meta ifTrue: [destClass := destClass class].
  83.     ^destClass!
  84.  
  85. removeCategory
  86.     self flushEngiClasses.
  87.     ^super removeCategory!
  88.  
  89. renameCategory
  90.     self flushEngiClasses.
  91.     ^super renameCategory!
  92.  
  93. updateCategories
  94.     self changeRequest ifFalse: [^self].
  95.     self flushEngiClasses.
  96.     self newCategoryList: category! !
  97.  
  98. !EngiBrowser methodsFor: 'private-class functions'!
  99.  
  100. acceptClass: aText from: aController 
  101.     self flushEngiClasses.
  102.     ^super acceptClass: aText from: aController!
  103.  
  104. removeClass
  105.     self flushEngiClasses.
  106.     ^super removeClass!
  107.  
  108. renameClass
  109.     self flushEngiClasses.
  110.     ^super renameClass! !
  111.  
  112. !EngiBrowser methodsFor: 'private-engi system'!
  113.  
  114. engiCategoryMenu
  115.     "EngiBrowser flushMenus."
  116.  
  117.     | collection boolean size array |
  118.     EngiCategoryMenu isNil
  119.         ifTrue: 
  120.             [collection := OrderedCollection new.
  121.             collection add: 'about Engi System' -> [:aController | EngiSystem about].
  122.             collection add: nil.
  123.             collection add: 'number of classes'
  124.                     -> 
  125.                         [:aController | 
  126.                         Cursor wait showWhile: [size := EngiSystem classes size].
  127.                         (PopUpMenu labels: size printString , ' classes') startUp].
  128.             collection add: 'number of messages'
  129.                     -> 
  130.                         [:aController | 
  131.                         Cursor wait showWhile: [array := EngiSystem numberOfMessages].
  132.                         array at: 1 put: (array at: 1) printString , ' instance messages'.
  133.                         array at: 2 put: (array at: 2) printString , ' class messages'.
  134.                         (PopUpMenu labelArray: array) startUp].
  135.             collection add: nil.
  136.             collection add: 'save sources'
  137.                     -> 
  138.                         [:aController | 
  139.                         boolean := DialogView confirm: 'Do you want to save sources?' initialAnswer: true.
  140.                         boolean = true ifTrue: [EngiSystem save]].
  141.             collection add: 'save image'
  142.                     -> 
  143.                         [:aController | 
  144.                         boolean := DialogView confirm: 'Do you want to save this image?' initialAnswer: true.
  145.                         boolean = true ifTrue: [ObjectMemory saveDialogThenQuit: false]].
  146.             collection add: nil.
  147.             collection add: 'condense changes'
  148.                     -> 
  149.                         [:aController | 
  150.                         boolean := DialogView confirm: 'Do you want to condense changes?' initialAnswer: false.
  151.                         boolean = true ifTrue: [SourceFileManager default condenseChanges]].
  152.             EngiCategoryMenu := EngiMenuMaker fromCollection: collection].
  153.     ^EngiCategoryMenu!
  154.  
  155. engiClasses
  156.     engiClasses isNil ifTrue: [Cursor wait showWhile: [engiClasses := EngiSystem classes]].
  157.     ^engiClasses!
  158.  
  159. engiClassMenu
  160.     "EngiBrowser flushMenus."
  161.  
  162.     | collection that string menu |
  163.     EngiClassMenu isNil
  164.         ifTrue: 
  165.             [collection := OrderedCollection new.
  166.             collection add: 'about Engi System' -> [:aController | EngiSystem about].
  167.             collection add: nil.
  168.             collection add: 'source directory'
  169.                     -> 
  170.                         [:aController | 
  171.                         string := EngiSystem saveDirectory asString.
  172.                         menu := PopUpMenu labels: 'directory: ' , string.
  173.                         menu startUp].
  174.             collection add: 'source file'
  175.                     -> 
  176.                         [:aController | 
  177.                         that := self nonMetaClass.
  178.                         that notNil
  179.                             ifTrue: 
  180.                                 [string := EngiSystem saveFileAt: that name.
  181.                                 string notNil
  182.                                     ifTrue: 
  183.                                         [menu := PopUpMenu labels: 'file: ' , string.
  184.                                         menu startUp]]].
  185.             EngiClassMenu := EngiMenuMaker fromCollection: collection].
  186.     ^EngiClassMenu!
  187.  
  188. engiClassNames
  189.     | collection |
  190.     collection := SortedCollection new: self engiClasses size.
  191.     self engiClasses do: [:each | collection add: each name].
  192.     ^collection!
  193.  
  194. flushEngiClasses
  195.     engiClasses := nil! !
  196. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  197.  
  198. EngiBrowser class
  199.     instanceVariableNames: ''!
  200.  
  201.  
  202. !EngiBrowser class methodsFor: 'class initialization'!
  203.  
  204. flushMenus
  205.     "EngiBrowser flushMenus."
  206.  
  207.     EngiCategoryMenu := nil.
  208.     EngiClassMenu := nil! !
  209.  
  210. !EngiBrowser class methodsFor: 'view creation'!
  211.  
  212. openOn: aBrowser withTextState: anArray 
  213.     | buttonOffset topWindow divider topView |
  214.     buttonOffset := self buttonOffset.
  215.     topWindow := ScheduledWindow
  216.                 model: aBrowser
  217.                 label: 'Engi System Browser'
  218.                 minimumSize: 400 @ 250.
  219.     divider := 0.35.
  220.     topView := DependentComposite new.
  221.     (self
  222.         addCategoryViewTo: topView
  223.         in: (0 @ 0 extent: 0.25 @ divider)
  224.         on: aBrowser
  225.         readOnly: false) component useHorizontalScrollBar.
  226.     (self
  227.         addClassViewTo: topView
  228.         in: (LayoutFrame
  229.                 leftFraction: 0.25
  230.                 offset: 0
  231.                 rightFraction: 0.5
  232.                 offset: 0
  233.                 topFraction: 0
  234.                 offset: 0
  235.                 bottomFraction: divider
  236.                 offset: buttonOffset)
  237.         on: aBrowser
  238.         readOnly: false) component useHorizontalScrollBar.
  239.     self
  240.         addClassAndInstanceButtonViewTo: topView
  241.         in: (LayoutFrame
  242.                 leftFraction: 0.25
  243.                 offset: 0
  244.                 rightFraction: 0.5
  245.                 offset: 0
  246.                 topFraction: divider
  247.                 offset: buttonOffset
  248.                 bottomFraction: divider
  249.                 offset: 0)
  250.         on: aBrowser.
  251.     (self
  252.         addProtocolViewTo: topView
  253.         in: (0.5 @ 0 extent: 0.25 @ divider)
  254.         on: aBrowser
  255.         readOnly: false) component useHorizontalScrollBar.
  256.     (self
  257.         addSelectorViewTo: topView
  258.         in: (0.75 @ 0 extent: 0.25 @ divider)
  259.         on: aBrowser
  260.         readOnly: false) component useHorizontalScrollBar.
  261.     self
  262.         addTextViewTo: topView
  263.         in: (0 @ divider corner: 1.0 @ 1.0)
  264.         on: aBrowser
  265.         initialSelection: nil
  266.         initialState: anArray.
  267.     topWindow component: topView.
  268.     topWindow icon: (Icon constantNamed: #systemBrowser).
  269.     topWindow openWithExtent: topWindow minimumSize! !
  270.  
  271. !EngiBrowser class methodsFor: 'examples'!
  272.  
  273. example1
  274.     "EngiBrowser example1."
  275.  
  276.     EngiBrowser open! !
  277.