--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Ruler.st Fri Jul 16 11:44:30 1993 +0200
@@ -0,0 +1,209 @@
+"
+ COPYRIGHT (c) 1991-93 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.
+"
+
+View subclass:#Ruler
+ instanceVariableNames:'fgColor metric paperWidth paperHeight'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Views-Interactors'
+!
+
+Ruler comment:'
+
+COPYRIGHT (c) 1991-93 by Claus Gittinger
+ All Rights Reserved
+
+a Ruler for page layout.
+
+%W% %E%
+
+written oct 91 by claus
+'!
+
+!Ruler methodsFor:'accessing'!
+
+metric:aSymbol
+ "set the metric"
+
+ metric := aSymbol.
+ shown ifTrue:[
+ self redraw
+ ]
+! !
+
+!Ruler methodsFor:'redrawing'!
+
+redraw
+ "redraw scale"
+
+ |x pixelPerMM pixelPerInch mod pos shortLen veryShortLen longLen charY
+ top paperWidthMM paperWidthPixel|
+
+ self fill:viewBackground.
+
+ paperWidthPixel := (self inchToPixel:paperWidth) rounded.
+ (width > paperWidthPixel) ifTrue:[
+ self paint:(Color darkGrey).
+ self fillRectangleX:paperWidthPixel y:0
+ width:(width - paperWidthPixel) height:height.
+ self paint:fgColor.
+ self displayLineFromX:paperWidthPixel y:0
+ toX:paperWidthPixel y:height
+ ].
+
+ self paint:fgColor.
+
+ top := height - font height - font ascent.
+ longLen := font height.
+ shortLen := longLen // 2.
+ charY := top + (font ascent) + shortLen.
+ mod := 1.
+
+ (metric == #mm) ifTrue:[
+ "centimeter - long blibs every centimeter; short ones every half"
+
+ paperWidthMM := self inchToMillimeter:paperWidth.
+ pixelPerMM := self millimeterToPixel:1.
+ pos := 5.
+ x := (pixelPerMM * pos) rounded.
+ self displayString:'cm' x:3 y:charY.
+ [(x < width) and:[pos <= paperWidthMM]] whileTrue:[
+ (mod == 1) ifTrue:[
+ self displayLineFromX:x y:top
+ toX:x y:(top + shortLen)
+ ] ifFalse:[
+ self displayLineFromX:x y:top
+ toX:x y:(top + longLen).
+ self displayString:(pos // 10) asInteger printString
+ x:(x + 3)
+ y:charY
+ ].
+ mod := (mod + 1) \\ 2.
+ pos := pos + 5.
+ x := (pixelPerMM * pos) rounded
+ ]
+ ].
+ (metric == #inch) ifTrue:[
+ "inches - long blibs every inch; short ones every half; very
+ short ones every quarter"
+
+ pixelPerInch := self inchToPixel:1.
+ pos := 0.25.
+ x := (pixelPerInch * pos) rounded.
+ veryShortLen := longLen // 4.
+ self displayString:'inch' x:3 y:charY.
+ [(x < width) and:[pos <= paperWidth]] whileTrue:[
+ (mod == 0) ifTrue:[
+ self displayLineFromX:x y:top
+ toX:x y:(top + longLen).
+ self displayString:pos asInteger printString
+ x:(x + 3)
+ y:charY
+ ] ifFalse:[
+ (mod == 2) ifTrue:[
+ self displayLineFromX:x y:top
+ toX:x y:(top + shortLen)
+ ] ifFalse:[
+ self displayLineFromX:x y:top
+ toX:x y:(top + veryShortLen)
+ ]
+ ].
+ mod := (mod + 1) \\ 4.
+ pos := pos + 0.25.
+ x := (pixelPerInch * pos) rounded
+ ]
+ ].
+ self redrawEdges
+! !
+
+!Ruler methodsFor:'initialization'!
+
+initialize
+ super initialize.
+
+ fgColor := Black.
+ self height:(font height + font descent + font descent).
+ (Language == #english) ifTrue:[
+ metric := #inch
+ ] ifFalse:[
+ metric := #mm
+ ].
+ paperWidth := 8.5.
+ paperHeight := 11
+
+ "Ruler new realize"
+! !
+
+!Ruler methodsFor:'metric conversions'!
+
+inchToMillimeter:inches
+ "convert inches to mm"
+
+ ^ inches * 25.4
+!
+
+inchToPixel:inches
+ "convert inches to screen pixels"
+
+ ^ inches * self horizontalPixelPerInch
+!
+
+inchToTwip:inches
+ "convert inches to twips"
+
+ ^ inches * 1440
+
+!
+
+millimeterToPixel:mm
+ "convert mms to screen pixels"
+
+ ^ mm * self horizontalPixelPerMillimeter
+
+!
+
+millimeterToInch:mm
+ "convert mm to inches"
+
+ ^ mm / 25.4
+!
+
+pointToTwip:points
+ "convert points to twips"
+
+ ^ points * 20
+!
+
+twipToInch:twips
+ "convert twips to inches"
+
+ ^ twips / 1440.0
+!
+
+pixelToInch:pixels
+ "convert pixels to inches"
+
+ ^ pixels / self horizontalPixelPerInch
+!
+
+twipToPixel:twips
+ "convert twips to screen pixels"
+
+ ^ (twips / 1440.0) * self horizontalPixelPerInch
+
+!
+
+twipToPoint:twips
+ "convert twips to points"
+
+ ^ twips / 20.0
+! !