VerticalRuler.st
author claus
Wed, 21 Dec 1994 20:25:09 +0100
changeset 33 3e68e4c73db3
parent 28 ca403f4c5b86
child 34 159147b254e1
permissions -rw-r--r--
last version before big scrolling change

"
 COPYRIGHT (c) 1994 by Claus Gittinger
	      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.
"

Ruler subclass:#VerticalRuler
	 instanceVariableNames:''
	 classVariableNames:''
	 poolDictionaries:''
	 category:'Views-Misc'
!

VerticalRuler comment:'
COPYRIGHT (c) 1991 by Claus Gittinger
	      All Rights Reserved
'!

!VerticalRuler class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1994 by Claus Gittinger
	      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.
"
!

version
"
$Header: /cvs/stx/stx/libwidg2/VerticalRuler.st,v 1.3 1994-12-21 19:25:09 claus Exp $
"
!

documentation
"
    like a Ruler, but vertical.
    see documentation in Ruler
"
! !

!VerticalRuler methodsFor:'accessing'!

paperHeightInch:inches
    "set the width of the document"

    paperHeight := inches.
    shown ifTrue:[
	self redraw
    ]
!

paperHeightMM:millis
    "set the width of the document"

    paperHeight := self millimeterToInch:millis.
    shown ifTrue:[
	self redraw
    ]
! !

!VerticalRuler methodsFor:'redrawing'!

redraw
    "redraw the scale"

    |y pixelPerMM pixelPerInch mod pos shortLen veryShortLen longLen charX
     left paperHeightMM paperHeightPixel yOrigin labelBot marg fontHeight|

    shown ifFalse:[^ self].

    self clear.

    yOrigin := self viewOrigin y.

    paperHeightPixel := ((self inchToPixel:paperHeight) * scale) rounded.

    (yOrigin + height > paperHeightPixel) ifTrue:[
	self paint:(Color darkGrey).
	self fillRectangleX:0 y:paperHeightPixel - yOrigin
		      width:width
		      height:(height - (paperHeightPixel - yOrigin)).
	self paint:fgColor.
	self displayLineFromX:0 y:paperHeightPixel - yOrigin
			  toX:width y:paperHeightPixel - yOrigin
    ].

    self paint:fgColor.

    left := 0. "width - (font widthOf:'WW')"
    longLen := font widthOf:'WW'.
    shortLen := longLen // 2.
    charX := left + shortLen.
    mod := 1.
    marg := 3. "character shift"
    fontHeight := font height.

    (metric == #mm) ifTrue:[
	"centimeter - long blibs every centimeter; short ones every half"

	paperHeightMM := self inchToMillimeter:paperHeight.
	pixelPerMM := (self millimeterToPixel:1) * scale.
	pos := 5.
	showUnit ifTrue:[
	    labelBot := marg + font height + font ascent.
	] ifFalse:[
	    labelBot := 0
	].
	y := (pixelPerMM * pos - yOrigin) rounded.
	[(y < height) and:[pos <= paperHeightMM]] whileTrue:[
	    |l|

	    l := shortLen.
	    (mod ~~ 1) ifTrue:[
		y < labelBot ifFalse:[
		    l := longLen
		]
	    ].
	    self displayLineFromX:left y:y toX:(left + l) y:y.

	    (mod ~~ 1 and:[y >= labelBot]) ifTrue:[
		self displayString:(pos // 10) printString
				 x:charX
				 y:(y + marg + fontHeight)
	    ].
	    mod := (mod + 1) \\ 2.
	    pos := pos + 5.
	    y := (pixelPerMM * pos - yOrigin) rounded 
	].
	showUnit ifTrue:[
	    self displayString:'cm ' x:charX y:marg + fontHeight.
	]
    ].
    (metric == #inch) ifTrue:[
	"inches - long blibs every inch; short ones every half; very
	 short ones every quarter"

	pixelPerInch := (self inchToPixel:1) * scale.
	pos := 0.25.
	showUnit ifTrue:[
	    labelBot := marg + (font height + font ascent).
	] ifFalse:[
	    labelBot := 0
	].

	y := (pixelPerInch * pos - yOrigin) rounded.
	veryShortLen := longLen // 4.
	[(y < height) and:[pos <= paperHeight]] whileTrue:[
	    |l|

	    l := shortLen.
	    (mod == 0) ifTrue:[
		y < labelBot ifFalse:[
		    l := longLen.
		]
	    ] ifFalse:[
		(mod == 2) ifFalse:[
		    l := veryShortLen
		]
	    ].
	    self displayLineFromX:left y:y toX:(left + l) y:y.

	    (mod == 0) ifTrue:[
		y < labelBot ifFalse:[
		    self displayString:pos asInteger printString
				     x:charX
				     y:(y + marg + fontHeight)
		]
	    ].
	    mod := (mod + 1) \\ 4.
	    pos := pos + 0.25.
	    y := (pixelPerInch * pos - yOrigin) rounded
	].
	showUnit ifTrue:[
	    self displayString:'inch ' x:charX y:marg + fontHeight.
	]
    ].
    self redrawEdges
! !

!VerticalRuler methodsFor:'initialization'!

initialize
    super initialize.

    self width:(font widthOf:'inch').

    "
     VerticalRuler new open
    "
! !