Border.st
author Claus Gittinger <cg@exept.de>
Tue, 29 Sep 2009 21:33:02 +0200
changeset 5353 9b83c512effa
parent 3149 c383247cb500
child 5373 44c47ff50380
permissions -rw-r--r--
added: #copyright

"
 COPYRIGHT (c) 1997 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
"{ Package: 'stx:libview' }"

Object subclass:#Border
	instanceVariableNames:'left right top bottom leftColor rightColor topColor bottomColor'
	classVariableNames:''
	poolDictionaries:''
	category:'Interface-Support'
!

!Border class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1997 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

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.5 2009-09-29 19:33:02 cg Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/libview/Border.st,v 1.5 2009-09-29 19:33:02 cg Exp $'
! !