Object subclass:#Border
instanceVariableNames:'left right top bottom leftColor rightColor topColor bottomColor'
classVariableNames:''
poolDictionaries:''
category:'Interface-Support'
!
!Border class methodsFor:'documentation'!
documentation
"
a border holdes the values of a views (or components) border.
It is (currently) not used by ST/X, but provided as a comatibility hook.
(... however, ST/X is being rewritten to make use of it soon).
Notice:
this class was implemented using protocol information
from alpha testers, from reading PD programs and
from the Hopkins/Horan book.
- it may not be complete or compatible to the corresponding ST-80 class.
If you encounter any incompatibilities, please forward a note
describing the incompatibility verbal (i.e. no code) to the ST/X team.
[see also:]
Wrapper SimpleView
[author:]
Claus Gittinger
"
!
examples
"
|v b|
v := StandardSystemView extent:10@10.
v openAndWait.
b := Border width:2 color:Color red.
b displayOn:v forDisplayBox:(0@0 corner:9@9).
Delay waitForSeconds:1.
b setLeftColor:Color blue.
b displayOn:v forDisplayBox:(0@0 corner:9@9).
Delay waitForSeconds:1.
b setTopColor:Color green.
b displayOn:v forDisplayBox:(0@0 corner:9@9).
Delay waitForSeconds:1.
b setRightColor:Color magenta.
b displayOn:v forDisplayBox:(0@0 corner:9@9).
|v b|
v := StandardSystemView extent:100@100.
v openAndWait.
b := Border width:2 color:Color red.
b displayOn:v forDisplayBox:(0@0 corner:99@99).
Delay waitForSeconds:1.
b setLeft:5.
v clear.
b displayOn:v forDisplayBox:(0@0 corner:99@99).
Delay waitForSeconds:1.
b setTop:3.
v clear.
b displayOn:v forDisplayBox:(0@0 corner:99@99).
Delay waitForSeconds:1.
b setRight:1.
v clear.
b displayOn:v forDisplayBox:(0@0 corner:99@99).
"
! !
!Border class methodsFor:'instance creation'!
width:borderWidth
"create a new instance of the receiver with a border of the given width
(and default color)."
^ self width:borderWidth color:View defaultBorderColor
"Modified: 10.2.1997 / 15:19:57 / cg"
!
width:borderWidth color:aColor
"create a new instance of the receiver with a border of the given width
and color."
^ self new
setBorderWidth:borderWidth color:aColor
"Modified: 10.2.1997 / 15:20:32 / cg"
! !
!Border methodsFor:'accessing'!
bottom
"return the bottom border width"
^ bottom
"Created: 10.2.1997 / 14:51:34 / cg"
"Modified: 10.2.1997 / 15:39:01 / cg"
!
bottomColor
"return the value of the instance variable 'bottomColor' (automatically generated)"
^ bottomColor
"Created: 10.2.1997 / 14:51:34 / cg"
!
color:newColor
"set all four colors"
leftColor := rightColor := topColor := bottomColor := newColor
"Created: 10.2.1997 / 15:27:01 / cg"
!
left
"return the left border width"
^ left
"Created: 10.2.1997 / 14:51:34 / cg"
"Modified: 10.2.1997 / 15:39:05 / cg"
!
leftColor
"return the value of the instance variable 'leftColor' (automatically generated)"
^ leftColor
"Created: 10.2.1997 / 14:51:34 / cg"
!
right
"return the right border width"
^ right
"Created: 10.2.1997 / 14:51:34 / cg"
"Modified: 10.2.1997 / 15:39:08 / cg"
!
rightColor
"return the value of the instance variable 'rightColor' (automatically generated)"
^ rightColor
"Created: 10.2.1997 / 14:51:34 / cg"
!
setBottom:aSmallInteger
"set the bottom border width"
bottom := aSmallInteger
"Created: 10.2.1997 / 15:38:50 / cg"
!
setBottomColor:aColor
"set the bottomColor"
bottomColor := aColor
"Created: 10.2.1997 / 15:37:51 / cg"
!
setLeft:aSmallInteger
"set the left border width"
left := aSmallInteger
"Created: 10.2.1997 / 15:39:33 / cg"
!
setLeftColor:aColor
"set the leftColor"
leftColor := aColor
"Created: 10.2.1997 / 15:38:02 / cg"
!
setRight:aSmallInteger
"set the right border width"
right := aSmallInteger
"Created: 10.2.1997 / 15:39:44 / cg"
!
setRightColor:aColor
"set the rightColor"
rightColor := aColor
"Created: 10.2.1997 / 15:38:08 / cg"
!
setTop:aSmallInteger
"set the top border width"
top := aSmallInteger
"Created: 10.2.1997 / 15:39:27 / cg"
!
setTopColor:aColor
"set the topColor"
topColor := aColor
"Created: 10.2.1997 / 15:38:17 / cg"
!
top
"return the top border width"
^ top
"Created: 10.2.1997 / 14:51:34 / cg"
"Modified: 10.2.1997 / 15:39:11 / cg"
!
topColor
"return the value of the instance variable 'topColor' (automatically generated)"
^ topColor
"Created: 10.2.1997 / 14:51:34 / cg"
! !
!Border methodsFor:'displaying'!
displayOn:aGC forDisplayBox:aRectangle
"display the borders represented by the receiver in the specified rectangle.
The gc is restored after the draw."
self displayOn:aGC forDisplayBox:aRectangle using:nil
"Modified: 10.2.1997 / 14:56:10 / cg"
!
displayOn:aGC forDisplayBox:aRectangle using:colorSource
"display the borders represented by the receiver borders in the given rectangle.
colorSource is ignored here, but subclasses (i.e. 3D-borders) may use
it to ask for shadow/lightColors.
The gc's state is restored after the drawing."
|clipRectangle paint oldPaint
t r l b rL rR rT rB rW rH|
"/ clipRectangle := aGC clippingBounds.
"/ ((self insetDisplayBoxFor: aRectangle) contains: clipRectangle) ifTrue: [^self].
oldPaint := aGC paint.
r := aRectangle copy.
t := self top.
l := self left.
r := self right.
b := self bottom.
rL := aRectangle left.
rT := aRectangle top.
rR := aRectangle right.
rB := aRectangle bottom.
rH := aRectangle height.
rW := aRectangle width.
(l ~~ 0 and: [(paint := self leftColor) notNil]) ifTrue:[
aGC paint:paint.
aGC fillRectangleX:rL
y:rT
width:l
height:rH + 1 - b
].
(t ~~ 0 and: [(paint := self topColor) notNil]) ifTrue:[
aGC paint:paint.
aGC fillRectangleX:(rL + l)
y:rT
width:rW - l
height:t
].
(r ~~ 0 and: [(paint := self rightColor) notNil]) ifTrue:[
aGC paint:paint.
aGC fillRectangleX:(rR - r)
y:(rT + t)
width:r
height:rH + 1 - t
].
(b ~~ 0 and: [(paint := self bottomColor) notNil]) ifTrue:[
aGC paint:paint.
aGC fillRectangleX:(rL)
y:(rB + 1 - b)
width:rW - r
height:b
].
aGC paint: oldPaint
"Modified: 10.2.1997 / 15:55:04 / cg"
! !
!Border methodsFor:'private accessing'!
setBorderColor:aColor
leftColor := rightColor := topColor := bottomColor := aColor
!
setBorderWidth:aWidth
left := right := top := bottom := aWidth.
!
setBorderWidth:aWidth color:aColor
left := right := top := bottom := aWidth.
leftColor := rightColor := topColor := bottomColor := aColor
"Created: 10.2.1997 / 15:21:27 / cg"
! !
!Border methodsFor:'queries'!
allSidesEqual:aSmallInteger
left ~~ aSmallInteger ifTrue:[^ false].
top ~~ aSmallInteger ifTrue:[^ false].
right ~~ aSmallInteger ifTrue:[^ false].
bottom ~~ aSmallInteger ifTrue:[^ false].
^ true
"Created: 10.2.1997 / 14:53:13 / cg"
!
displayBoxFor:aRectangle
"return a rectangle representing the overall display box of a component
bordered by the receiver, which has bounds of aRectangle.
That is, the argument outset by the receivers borders."
|insetRectangle|
insetRectangle := aRectangle copy.
insetRectangle left:(insetRectangle left - self left).
insetRectangle right:(insetRectangle right + self right).
insetRectangle top:(insetRectangle top - self top).
insetRectangle bottom:(insetRectangle bottom + self bottom).
^ insetRectangle
"Created: 10.2.1997 / 15:43:00 / cg"
!
insetDisplayBoxFor:aRectangle
"return a rectangle representing the display box of a component
bordered by the receiver in the outer bounds, aRectangle.
That is, the argument inset by the receivers borders."
|insetRectangle|
insetRectangle := aRectangle copy.
insetRectangle left:(insetRectangle left + self left).
insetRectangle right:(insetRectangle right - self right).
insetRectangle top:(insetRectangle top + self top).
insetRectangle bottom:(insetRectangle bottom - self bottom).
^ insetRectangle
"Created: 10.2.1997 / 15:42:06 / cg"
! !
!Border class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libview/Border.st,v 1.4 2000-01-22 19:45:36 cg Exp $'
! !