home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BURKS 2
/
BURKS_AUG97.ISO
/
BURKS
/
LANGUAGE
/
SMALTALK
/
TEXTBOOK
/
AP10.ST
(
.txt
)
< prev
next >
Wrap
Text File
|
1997-04-22
|
7KB
|
277 lines
'Smalltalk Textbook Appendix 10'!
Browser subclass: #EngiBrowser
instanceVariableNames: 'engiClasses '
classVariableNames: 'EngiCategoryMenu EngiClassMenu '
poolDictionaries: ''
category: 'Engi-Programming'!
EngiBrowser comment:
'
Engi 0.03 (29 January 1994)
Copyright (C) 1994 by Atsushi Aoki
'!
!EngiBrowser methodsFor: 'copying'!
postCopy
super postCopy.
self flushEngiClasses! !
!EngiBrowser methodsFor: 'category list'!
categoryList
| engiCategories |
engiCategories := self engiClasses collect: [:each | each category].
^organization categories select: [:each | (engiCategories includes: each)
or: [EngiSystem system , '*' match: each]]!
categoryMenu
InputState default shiftDown
ifTrue: [^self engiCategoryMenu]
ifFalse: [^super categoryMenu]! !
!EngiBrowser methodsFor: 'class list'!
classList
| engiClassNames |
category == nil ifTrue: [^nil].
engiClassNames := self engiClassNames asSet.
^(organization listAtCategoryNamed: category)
select: [:each | engiClassNames includes: each]!
classMenu
InputState default shiftDown
ifTrue: [^self engiClassMenu]
ifFalse: [^super classMenu]! !
!EngiBrowser methodsFor: 'private-category functions'!
addCategory
self flushEngiClasses.
^super addCategory!
editCategories
self flushEngiClasses.
^super editCategories!
pickAClass: prompt
| destClassName destClass classes chosenSelector |
destClassName := DialogView request: prompt initialAnswer: ParagraphEditor currentSelection.
destClassName = '' ifTrue: [^''].
(destClassName findString: '*' startingAt: 1)
~= 0
ifTrue:
[classes := OrderedCollection new.
Cursor execute showWhile: [classes := self engiClassNames select: [:cn | destClassName match: cn]].
(classes == nil or: [classes size = 0])
ifTrue: [^nil].
(chosenSelector := (PopUpMenu labelList: (Array with: classes)) startUp) = 0
ifTrue: [^'']
ifFalse: [destClassName := classes at: chosenSelector]]
ifFalse: [destClassName := Smalltalk keys detect: [:cn | destClassName match: cn]
ifNone: [^nil]].
destClass := Smalltalk at: destClassName asSymbol ifAbsent: [^nil].
meta ifTrue: [destClass := destClass class].
^destClass!
removeCategory
self flushEngiClasses.
^super removeCategory!
renameCategory
self flushEngiClasses.
^super renameCategory!
updateCategories
self changeRequest ifFalse: [^self].
self flushEngiClasses.
self newCategoryList: category! !
!EngiBrowser methodsFor: 'private-class functions'!
acceptClass: aText from: aController
self flushEngiClasses.
^super acceptClass: aText from: aController!
removeClass
self flushEngiClasses.
^super removeClass!
renameClass
self flushEngiClasses.
^super renameClass! !
!EngiBrowser methodsFor: 'private-engi system'!
engiCategoryMenu
"EngiBrowser flushMenus."
| collection boolean size array |
EngiCategoryMenu isNil
ifTrue:
[collection := OrderedCollection new.
collection add: 'about Engi System' -> [:aController | EngiSystem about].
collection add: nil.
collection add: 'number of classes'
->
[:aController |
Cursor wait showWhile: [size := EngiSystem classes size].
(PopUpMenu labels: size printString , ' classes') startUp].
collection add: 'number of messages'
->
[:aController |
Cursor wait showWhile: [array := EngiSystem numberOfMessages].
array at: 1 put: (array at: 1) printString , ' instance messages'.
array at: 2 put: (array at: 2) printString , ' class messages'.
(PopUpMenu labelArray: array) startUp].
collection add: nil.
collection add: 'save sources'
->
[:aController |
boolean := DialogView confirm: 'Do you want to save sources?' initialAnswer: true.
boolean = true ifTrue: [EngiSystem save]].
collection add: 'save image'
->
[:aController |
boolean := DialogView confirm: 'Do you want to save this image?' initialAnswer: true.
boolean = true ifTrue: [ObjectMemory saveDialogThenQuit: false]].
collection add: nil.
collection add: 'condense changes'
->
[:aController |
boolean := DialogView confirm: 'Do you want to condense changes?' initialAnswer: false.
boolean = true ifTrue: [SourceFileManager default condenseChanges]].
EngiCategoryMenu := EngiMenuMaker fromCollection: collection].
^EngiCategoryMenu!
engiClasses
engiClasses isNil ifTrue: [Cursor wait showWhile: [engiClasses := EngiSystem classes]].
^engiClasses!
engiClassMenu
"EngiBrowser flushMenus."
| collection that string menu |
EngiClassMenu isNil
ifTrue:
[collection := OrderedCollection new.
collection add: 'about Engi System' -> [:aController | EngiSystem about].
collection add: nil.
collection add: 'source directory'
->
[:aController |
string := EngiSystem saveDirectory asString.
menu := PopUpMenu labels: 'directory: ' , string.
menu startUp].
collection add: 'source file'
->
[:aController |
that := self nonMetaClass.
that notNil
ifTrue:
[string := EngiSystem saveFileAt: that name.
string notNil
ifTrue:
[menu := PopUpMenu labels: 'file: ' , string.
menu startUp]]].
EngiClassMenu := EngiMenuMaker fromCollection: collection].
^EngiClassMenu!
engiClassNames
| collection |
collection := SortedCollection new: self engiClasses size.
self engiClasses do: [:each | collection add: each name].
^collection!
flushEngiClasses
engiClasses := nil! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
EngiBrowser class
instanceVariableNames: ''!
!EngiBrowser class methodsFor: 'class initialization'!
flushMenus
"EngiBrowser flushMenus."
EngiCategoryMenu := nil.
EngiClassMenu := nil! !
!EngiBrowser class methodsFor: 'view creation'!
openOn: aBrowser withTextState: anArray
| buttonOffset topWindow divider topView |
buttonOffset := self buttonOffset.
topWindow := ScheduledWindow
model: aBrowser
label: 'Engi System Browser'
minimumSize: 400 @ 250.
divider := 0.35.
topView := DependentComposite new.
(self
addCategoryViewTo: topView
in: (0 @ 0 extent: 0.25 @ divider)
on: aBrowser
readOnly: false) component useHorizontalScrollBar.
(self
addClassViewTo: topView
in: (LayoutFrame
leftFraction: 0.25
offset: 0
rightFraction: 0.5
offset: 0
topFraction: 0
offset: 0
bottomFraction: divider
offset: buttonOffset)
on: aBrowser
readOnly: false) component useHorizontalScrollBar.
self
addClassAndInstanceButtonViewTo: topView
in: (LayoutFrame
leftFraction: 0.25
offset: 0
rightFraction: 0.5
offset: 0
topFraction: divider
offset: buttonOffset
bottomFraction: divider
offset: 0)
on: aBrowser.
(self
addProtocolViewTo: topView
in: (0.5 @ 0 extent: 0.25 @ divider)
on: aBrowser
readOnly: false) component useHorizontalScrollBar.
(self
addSelectorViewTo: topView
in: (0.75 @ 0 extent: 0.25 @ divider)
on: aBrowser
readOnly: false) component useHorizontalScrollBar.
self
addTextViewTo: topView
in: (0 @ divider corner: 1.0 @ 1.0)
on: aBrowser
initialSelection: nil
initialState: anArray.
topWindow component: topView.
topWindow icon: (Icon constantNamed: #systemBrowser).
topWindow openWithExtent: topWindow minimumSize! !
!EngiBrowser class methodsFor: 'examples'!
example1
"EngiBrowser example1."
EngiBrowser open! !