home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BURKS 2
/
BURKS_AUG97.ISO
/
BURKS
/
LANGUAGE
/
SMALTALK
/
TEXTBOOK
/
AP20.ST
(
.txt
)
< prev
next >
Wrap
Text File
|
1997-04-22
|
10KB
|
360 lines
'Smalltalk Textbook Appendix 20'!
View subclass: #EngiClockView
instanceVariableNames: 'cacheImage cacheTime '
classVariableNames: ''
poolDictionaries: ''
category: 'Engi-Clock'!
EngiClockView comment:
'
Engi 0.06 (19 March 1994)
Copyright (C) 1994 by Atsushi Aoki
'!
!EngiClockView methodsFor: 'controller accessing'!
defaultControllerClass
^EngiClockController! !
!EngiClockView methodsFor: 'display box accessing'!
bounds
(self topComponent width isNil or: [self topComponent height isNil])
ifTrue: [^nil].
^super bounds!
bounds: ignore
cacheImage := nil! !
!EngiClockView methodsFor: 'displaying'!
displayBackgroundImageOn: graphicsContext
| center radius rect paragraph degree x y |
graphicsContext paint: self backgroundColor.
graphicsContext displayRectangle: self bounds.
graphicsContext paint: self foregroundColor.
center := self bounds center.
radius := self bounds extent // 2 - 12.
rect := 0 @ 0 extent: 2 @ 2.
1 to: 12
do:
[:number |
paragraph := number printString asText asComposedText.
degree := number - 3 * 30.
x := degree degreesToRadians cos.
y := degree degreesToRadians sin.
paragraph displayOn: graphicsContext at: center + 1 + (x @ y * radius) - (paragraph extent // 2).
graphicsContext displayRectangle: rect at: center + (x @ y * (radius - 10))]!
displayLongHandOn: graphicsContext
| center radius minute x y points |
center := self bounds center.
radius := self bounds extent // 2 - 20.
minute := cacheTime minutes.
x := (minute * 6 - 90) degreesToRadians cos.
y := (minute * 6 - 90) degreesToRadians sin.
points := Array new: 5.
points at: 1 put: center + (self rotateBlock value: x @ y * 3 asPoint value: -180).
points at: 2 put: center + (self rotateBlock value: x @ y * 3 asPoint value: -90).
points at: 3 put: center + (x @ y * (radius * 9 // 10) asPoint).
points at: 4 put: center + (self rotateBlock value: x @ y * 3 asPoint value: 90).
points at: 5 put: points first copy.
points := points collect: [:p | p rounded].
graphicsContext capStyle: GraphicsContext capButt.
graphicsContext joinStyle: GraphicsContext joinMiter.
graphicsContext paint: self selectionForegroundColor.
graphicsContext lineWidth: 1.
graphicsContext displayPolygon: points.
graphicsContext paint: self selectionBackgroundColor.
graphicsContext displayPolyline: points!
displayOn: graphicsContext
self bounds notNil ifTrue: [self displayTimeOn: graphicsContext]!
displayPivotOn: graphicsContext
graphicsContext capStyle: GraphicsContext capButt.
graphicsContext joinStyle: GraphicsContext joinMiter.
graphicsContext paint: self backgroundColor.
graphicsContext lineWidth: 1.
graphicsContext
displayWedgeBoundedBy: ((self bounds center extent: Point zero)
expandedBy: 3)
startAngle: 0
sweepAngle: 360.
graphicsContext paint: self foregroundColor.
graphicsContext
displayArcBoundedBy: ((self bounds center extent: Point zero)
expandedBy: 3)
startAngle: 0
sweepAngle: 360!
displayShortHandOn: graphicsContext
| center radius minute x y hour points |
center := self bounds center.
radius := self bounds extent // 2 - 20.
minute := cacheTime minutes.
hour := cacheTime hours * 5 + (minute / 12) asFloat.
x := (hour * 6 - 90) degreesToRadians cos.
y := (hour * 6 - 90) degreesToRadians sin.
points := Array new: 5.
points at: 1 put: center + (self rotateBlock value: x @ y * 3 asPoint value: -180).
points at: 2 put: center + (self rotateBlock value: x @ y * 3 asPoint value: -90).
points at: 3 put: center + (x @ y * (radius * 7 // 10) asPoint).
points at: 4 put: center + (self rotateBlock value: x @ y * 3 asPoint value: 90).
points at: 5 put: points first copy.
points := points collect: [:p | p rounded].
graphicsContext capStyle: GraphicsContext capButt.
graphicsContext joinStyle: GraphicsContext joinMiter.
graphicsContext paint: self selectionForegroundColor.
graphicsContext lineWidth: 1.
graphicsContext displayPolygon: points.
graphicsContext paint: self selectionBackgroundColor.
graphicsContext displayPolyline: points!
displayTickHandOn: graphicsContext
| center radius length seconds x y |
center := self bounds center.
radius := self bounds extent // 2 - 20.
length := radius * 10 // 10.
seconds := cacheTime seconds.
x := (seconds * 6 - 90) degreesToRadians cos.
y := (seconds * 6 - 90) degreesToRadians sin.
graphicsContext capStyle: GraphicsContext capButt.
graphicsContext joinStyle: GraphicsContext joinMiter.
graphicsContext paint: self selectionBackgroundColor.
graphicsContext lineWidth: 1.
graphicsContext displayLineFrom: center to: center + (x @ y * length)!
displayTimeOn: graphicsContext
| aPixmap pixmapContext |
((cacheImage isNil or: [cacheTime isNil])
or: [self model currentTime minutes ~= cacheTime minutes])
ifTrue:
[cacheTime := self model currentTime.
aPixmap := Pixmap extent: self bounds extent.
pixmapContext := aPixmap graphicsContext.
self displayBackgroundImageOn: pixmapContext.
self displayShortHandOn: pixmapContext.
self displayLongHandOn: pixmapContext.
self displayPivotOn: pixmapContext.
cacheImage := aPixmap asImage.
aPixmap close]
ifFalse: [cacheTime := self model currentTime].
cacheImage displayOn: graphicsContext.
self displayTickHandOn: graphicsContext! !
!EngiClockView methodsFor: 'updating'!
update: ignore
self updateCheck ifFalse: [^nil].
self displayOn: self graphicsContext!
updateCheck
| topWindow topController |
topWindow := self topComponent.
(topWindow isKindOf: DisplaySurface)
ifFalse: [^false].
self isOpen ifFalse: [^false].
topController := topWindow controller.
(ScheduledControllers scheduledControllers includes: topController)
ifFalse: [^false].
^true! !
!EngiClockView methodsFor: 'private'!
rotateBlock
| block |
block :=
[:p :d |
| radians sin cos x y |
radians := d negated degreesToRadians.
sin := radians sin.
cos := radians cos.
x := p x * cos + (p y * sin).
y := p x * sin negated + (p y * cos).
x @ y].
^block! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
EngiClockView class
instanceVariableNames: ''!
!EngiClockView class methodsFor: 'instance creation'!
openOn: aClock
| topWindow clockView edgeDecorator |
topWindow := ScheduledWindow
model: aClock
label: 'Clock'
minimumSize: 100 @ 100.
clockView := self new model: aClock.
edgeDecorator := LookPreferences edgeDecorator on: clockView.
edgeDecorator noMenuBar.
edgeDecorator noVerticalScrollBar.
edgeDecorator noHorizontalScrollBar.
topWindow component: edgeDecorator.
topWindow open! !
Controller subclass: #EngiClockController
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Engi-Clock'!
EngiClockController comment:
'
Engi 0.06 (19 March 1994)
Copyright (C) 1994 by Atsushi Aoki
'!
!EngiClockController methodsFor: 'control defaults'!
controlActivity
(PopUpMenu labels: self model currentDateString) startUp!
isControlActive
^self viewHasCursor and: [self sensor redButtonPressed or: [self sensor yellowButtonPressed]]! !
Model subclass: #EngiClockModel
instanceVariableNames: 'clockProcess '
classVariableNames: ''
poolDictionaries: ''
category: 'Engi-Clock'!
EngiClockModel comment:
'
Engi 0.06 (19 March 1994)
Copyright (C) 1994 by Atsushi Aoki
'!
!EngiClockModel methodsFor: 'initialize-release'!
initialize
EngiSystem soleEngiSystem addDependent: self.
self resumeClockProcess!
release
self terminateClockProcess.
EngiSystem soleEngiSystem removeDependent: self! !
!EngiClockModel methodsFor: 'accessing'!
currentDate
^Date today!
currentDateString
| today stream |
today := self currentDate.
stream := WriteStream on: (String new: 20).
stream nextPutAll: ' '.
stream nextPutAll: today monthIndex printString.
stream nextPutAll: '/'.
stream nextPutAll: today dayOfMonth printString.
stream nextPutAll: ' ('.
stream nextPutAll: (today weekday copyFrom: 1 to: 3).
stream nextPutAll: ')'.
stream nextPutAll: ', '.
stream nextPutAll: today year printString.
stream nextPutAll: ' '.
^stream contents!
currentTime
^Time now!
currentTimeString
| now stream |
now := self