TextRuler.st
changeset 28 ca403f4c5b86
parent 20 bf516dd2433b
child 36 160b8f0dfd7d
--- a/TextRuler.st	Thu Nov 17 15:42:58 1994 +0100
+++ b/TextRuler.st	Mon Nov 21 17:49:32 1994 +0100
@@ -1,130 +1,368 @@
-"
- COPYRIGHT (c) 1991 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.
-"
+'From Smalltalk/X, Version:2.10.4 on 18-nov-1994 at 16:11:48'!
 
 Ruler subclass:#TextRuler
-         instanceVariableNames:'leftMargin rightMargin tabSpec moving'
-            classVariableNames:'LeftAlignForm RightAlignForm
-                                AlignForm CenterForm LeftMarginForm
-                                RightMarginForm LeftTabForm RightTabForm
-                                CenterTabForm DecimalTabForm'
-         poolDictionaries:''
-         category:'Views-Interactors'
+	 instanceVariableNames:'leftMargin rightMargin spec moving settingTab'
+	 classVariableNames:'LeftAlignForm RightAlignForm AlignForm CenterForm LeftMarginForm
+		RightMarginForm LeftTabForm RightTabForm CenterTabForm
+		DecimalTabForm'
+	 poolDictionaries:''
+	 category:'Views-Interactors'
 !
 
 TextRuler comment:'
 COPYRIGHT (c) 1991 by Claus Gittinger
-              All Rights Reserved
+	      All Rights Reserved
 
 a Ruler for page layout showing tabs., margins etc.
 
-$Header: /cvs/stx/stx/libwidg2/TextRuler.st,v 1.7 1994-08-23 23:44:32 claus Exp $
+$Header: /cvs/stx/stx/libwidg2/TextRuler.st,v 1.8 1994-11-21 16:48:42 claus Exp $
 written oct 91 by claus
 '!
 
+!TextRuler class methodsFor:'documentation'!
+
+documentation
+"
+    This is a special ruler built for text processing
+    applications. Currently, it is not used in the system.
+    It allows setting of margins, tabs and text-layout.
+
+    TextRuler new open
+"
+
+! !
+
 !TextRuler class methodsFor:'defaults'!
 
-alignForm
-    "return the form displayed in the align-button"
+rightMarginForm
+    "return the form displayed for the right margin marker"
+
+    RightMarginForm isNil ifTrue:[
+	RightMarginForm := Form fromFile:'rightMarg.xbm' resolution:100
+    ].
+    ^ RightMarginForm
+!
+
+leftMarginForm
+    "return the form displayed for the left margin marker"
 
-    AlignForm isNil ifTrue:[
-        AlignForm := Form fromFile:'align.xbm' resolution:100
+    LeftMarginForm isNil ifTrue:[
+	LeftMarginForm := Form fromFile:'leftMargin.xbm' resolution:100
     ].
-    ^ AlignForm
+    ^ LeftMarginForm
+!
+
+rightAlignForm
+    "return the form displayed in the rightAlign-button"
+
+    RightAlignForm isNil ifTrue:[
+	RightAlignForm :=  Form fromFile:'rightAlign.xbm' resolution:100
+    ].
+    ^ RightAlignForm
+!
+
+leftTabForm
+    "return the form displayed in the leftTab-button"
+
+    LeftTabForm isNil ifTrue:[
+	LeftTabForm := Form fromFile:'leftTab.xbm' resolution:100
+    ].
+    ^ LeftTabForm
 !
 
 centerForm
     "return the form displayed in the center-button"
 
     CenterForm isNil ifTrue:[
-        CenterForm := Form fromFile:'center.xbm' resolution:100
+	CenterForm := Form fromFile:'center.xbm' resolution:100
     ].
     ^ CenterForm
 !
 
+alignForm
+    "return the form displayed in the align-button"
+
+    AlignForm isNil ifTrue:[
+	AlignForm := Form fromFile:'align.xbm' resolution:100
+    ].
+    ^ AlignForm
+!
+
+rightTabForm
+    "return the form displayed in the rightTab-button"
+
+    RightTabForm isNil ifTrue:[
+	RightTabForm := Form fromFile:'rightTab.xbm' resolution:100
+    ].
+    ^ RightTabForm
+!
+
 leftAlignForm
     "return the form displayed in the leftAlign-button"
 
     LeftAlignForm isNil ifTrue:[
-        LeftAlignForm := Form fromFile:'leftAlign.xbm' resolution:100
+	LeftAlignForm := Form fromFile:'leftAlign.xbm' resolution:100
     ].
     ^ LeftAlignForm
 !
 
-rightAlignForm
-    "return the form displayed in the rightAlign-button"
-
-    RightAlignForm isNil ifTrue:[
-        RightAlignForm :=  Form fromFile:'rightAlign.xbm' resolution:100
-    ].
-    ^ RightAlignForm
-!
-
-rightTabForm
-    "return the form displayed in the rightTab-button"
+decimalTabForm
+    "return the form displayed in the decimalTab-button"
 
-    RightTabForm isNil ifTrue:[
-        RightTabForm := Form fromFile:'rightTab.xbm' resolution:100
+    DecimalTabForm isNil ifTrue:[
+	DecimalTabForm := Form fromFile:'decimalTab.xbm' resolution:100
     ].
-    ^ RightTabForm
-!
-
-leftTabForm
-    "return the form displayed in the leftTab-button"
-
-    LeftTabForm isNil ifTrue:[
-        LeftTabForm := Form fromFile:'leftTab.xbm' resolution:100
-    ].
-    ^ LeftTabForm
+    ^ DecimalTabForm
 !
 
 centerTabForm
     "return the form displayed in the centerTab-button"
 
     CenterTabForm isNil ifTrue:[
-        CenterTabForm := Form fromFile:'centerTab.xbm' resolution:100
+	CenterTabForm := Form fromFile:'centerTab.xbm' resolution:100
     ].
     ^ CenterTabForm
+! !
+
+!TextRuler methodsFor:'accessing'!
+
+paragraphSpecification:aSpec
+    spec := aSpec
+! !
+
+!TextRuler methodsFor:'redrawing'!
+
+redraw
+    "redraw margin & tab marks"
+
+    |x top form tab type tabStops tabAlign viewOrigin orgX orgY|
+
+    super redraw.
+
+    viewOrigin := self viewOrigin.
+    orgX := viewOrigin x.
+    orgY := viewOrigin y.
+
+    self paint:fgColor.
+
+    top := height - (font height) - (font ascent).
+
+    x := (self inchToPixel:leftMargin) rounded.
+    form := self class leftMarginForm.
+    self displayForm:form 
+		   x:(x - (form width // 2) - orgX)
+		   y:(top - form height - orgY).
+
+    x := (self inchToPixel:rightMargin) rounded.
+    form := self class rightMarginForm.
+    self displayForm:form 
+		   x:(x - (form width // 2) - orgX)
+		   y:(top - form height - orgY).
+
+    spec notNil ifTrue:[
+	tabStops := spec positions.
+	tabAlign := spec align.
+	tabStops notNil ifTrue:[
+	    1 to:tabStops size do:[:tabNr |
+		tab := tabStops at:tabNr.
+		type := tabAlign at:tabNr.
+		x := (spec positionOfTab:tabNr on:self) rounded.
+		(type == #left) ifTrue:[
+		    form := self class leftTabForm
+		] ifFalse:[
+		    (type == #right) ifTrue:[
+			form := self class rightTabForm
+		    ] ifFalse:[
+			(type == #center) ifTrue:[
+			    form := self class centerTabForm
+			] ifFalse:[
+			    (type == #decimal) ifTrue:[
+				form := self class decimalTabForm
+			    ]
+			]
+		    ]
+		].
+		self displayForm:form 
+			       x:(x - (form width // 2) - orgX)
+			       y:(top - form height - orgY)
+	    ]
+	]
+    ]
 !
 
+clearMargin:which
+    "clear margin"
 
-decimalTabForm
-    "return the form displayed in the decimalTab-button"
+    |this other otherX otherX2 x x2 top form symOther viewOrigin|
+
+    self paint:viewBackground.
+
+    top := height - (font height) - (font ascent).
 
-    DecimalTabForm isNil ifTrue:[
-        DecimalTabForm := Form fromFile:'decimalTab.xbm' resolution:100
+    (which == #left) ifTrue:[
+	this := leftMargin.
+	other := rightMargin. symOther := #right.
+	form := self class leftMarginForm
+    ].
+    (which == #right) ifTrue:[
+	this := rightMargin.
+	other := leftMargin. symOther := #left.
+	form := self class rightMarginForm
     ].
-    ^ DecimalTabForm
+
+    x := (self inchToPixel:this) rounded - (form width // 2).
+    viewOrigin := self viewOrigin.
+    self displayForm:form 
+		   x:x + viewOrigin x
+		   y:(top - form height - viewOrigin y).
+
+    "
+     if it covers any other, redraw them
+    "
+    x2 := x + form width.
+    otherX := (self inchToPixel:other) rounded - (form width // 2).
+    otherX2 := otherX + form width.
+
+    otherX  > x2 ifFalse:[
+	otherX2 < x ifFalse:[
+	    self drawMargin:symOther
+	]
+    ].
 !
 
-leftMarginForm
-    "return the form displayed for the left margin marker"
+drawMargin:which
+    "clear margin"
+
+    |x top form viewOrigin|
+
+    self paint:fgColor.
+
+    top := height - (font height) - (font ascent).
 
-    LeftMarginForm isNil ifTrue:[
-        LeftMarginForm := Form fromFile:'leftMargin.xbm' resolution:100
+    (which == #left) ifTrue:[
+	x := (self inchToPixel:leftMargin) rounded.
+	form := self class leftMarginForm
+    ].
+    (which == #right) ifTrue:[
+	x := (self inchToPixel:rightMargin) rounded.
+	form := self class rightMarginForm
     ].
-    ^ LeftMarginForm
+
+    viewOrigin := self viewOrigin.
+    self displayForm:form 
+		   x:(x - (form width // 2) - viewOrigin x)
+		   y:(top - form height - viewOrigin y).
+
+! !
+
+!TextRuler methodsFor:'user interaction'!
+
+buttonRelease:button x:x y:y
+    "position a tab or start moving a ruler"
+
+    moving := nil
 !
 
-rightMarginForm
-    "return the form displayed for the right margin marker"
+buttonPress:button x:pX y:y
+    "position a tab or start moving a ruler"
+
+    |mpos x|
+
+    ((button == #select) or:[button == 1]) ifFalse:[
+	^ super buttonPress:button x:pX y:y
+    ].
+
+    x := pX + self viewOrigin x.
+    settingTab notNil ifTrue:[
+	self setTabX:x.
+	settingTab := nil.
+	^ self
+    ].
+
+    mpos := self inchToPixel:leftMargin.
+    (((mpos - 4) <= x) and:[x <= (mpos + 4)]) ifTrue:[
+	"start moving left margin"
+	moving := #left.
+	^ self
+    ].
+    mpos := self inchToPixel:rightMargin.
+    (((mpos - 4) <= x) and:[x <= (mpos + 4)]) ifTrue:[
+	"start moving right margin"
+	moving := #right.
+	^ self
+    ].
+
+    ^ self
+!
+
+buttonMotion:state x:x y:y
+    "position a tab or start moving a ruler"
+
+    |mpos|
 
-    RightMarginForm isNil ifTrue:[
-        RightMarginForm := Form fromFile:'rightMarg.xbm' resolution:100
-    ].
-    ^ RightMarginForm
+    moving notNil ifTrue:[
+	self clearMargin:moving.
+	mpos := self pixelToInch:x + self viewOrigin x.
+	(mpos < 0) ifTrue:[
+	    mpos := 0
+	].
+	(mpos > paperWidth) ifTrue:[
+	    mpos := paperWidth
+	].
+	(moving == #left) ifTrue:[
+	    leftMargin := mpos
+	].
+	(moving == #right) ifTrue:[
+	    rightMargin := mpos
+	].
+	self drawMargin:moving
+    ]
+!
+
+leftAlign
+    ^ self
+!
+
+rightAlign
+    ^ self
+!
+
+leftTab
+    settingTab := #left.
+
+!
+
+align
+    ^ self
+!
+
+center
+    ^ self
+!
+
+centerTab
+    settingTab := #center.
+!
+
+rightTab
+    settingTab := #right.
+
+!
+
+decimalTab
+    settingTab := #decimal.
+
 ! !
 
 !TextRuler methodsFor:'initializing'!
 
+initEvents
+    super initEvents.
+    self enableButtonEvents.
+    self enableButtonMotionEvents
+
+!
+
 initialize
     |leftAlignToggle alignToggle centerToggle rightAlignToggle
      leftTabButton centerTabButton rightTabButton decimalTabButton
@@ -137,251 +375,59 @@
 
     h := self class leftAlignForm height.
     panel1 := HorizontalPanelView
-                        origin:(0.0 @ 0.0)
-                        extent:[(width // 3) @ (h*2) "(height - scaleHeight)"]
-                            in:self.
+			origin:(0.0 @ 0.0)
+			extent:[(width // 3 * 2) @ (h*2)]
+			    in:self.
     panel1 borderWidth:0.
-    panel1 layout:#left.
-
-    panel2 := HorizontalPanelView
-                        origin:[(width // 3) @ margin]
-                        extent:[(width // 3) @ (h*2) "(height - scaleHeight)"]
-                            in:self.
-    panel2 borderWidth:0.
-    panel2 layout:#center.
+    panel1 layout:#leftSpace.
 
     panel3 := HorizontalPanelView
-                        origin:[(width // 3 * 2) @ margin]
-                        extent:[((width // 3)-margin) @ (h*2) "(height - scaleHeight)"]
-                            in:self.
+			origin:[(width // 3 * 2) @ margin]
+			extent:[((width // 3)-margin) @ (h*2) "(height - scaleHeight)"]
+			    in:self.
     panel3 borderWidth:0.
     panel3 layout:#right.
 
     leftAlignToggle := RadioButton form:(self class leftAlignForm)
-                                 action:[self leftAlign]
-                                     in:panel1.
+				 action:[self leftAlign]
+				     in:panel1.
     alignToggle := RadioButton form:(self class alignForm)
-                             action:[self align]
-                                 in:panel1.
+			     action:[self align]
+				 in:panel1.
     centerToggle := RadioButton form:(self class centerForm)
-                              action:[self center]
-                                  in:panel1.
+			      action:[self center]
+				  in:panel1.
     rightAlignToggle := RadioButton form:(self class rightAlignForm)
-                                  action:[self rightAlign]
-                                      in:panel1.
+				  action:[self rightAlign]
+				      in:panel1.
     group := RadioButtonGroup new.
     group add:leftAlignToggle.
     group add:alignToggle.
     group add:centerToggle.
     group add:rightAlignToggle.
 
+    "separator"
+    (View in:panel1) extent:(50 @ 2); borderWidth:0; level:0.
+
     leftTabButton := Button form:(self class leftTabForm)
-                          action:[self leftTab]
-                              in:panel2.
+			  action:[self leftTab]
+			      in:panel1.
     centerTabButton := Button form:(self class centerTabForm)
-                            action:[self centerTab]
-                                in:panel2.
+			    action:[self centerTab]
+				in:panel1.
     rightTabButton := Button form:(self class rightTabForm)
-                           action:[self rightTab]
-                               in:panel2.
+			   action:[self rightTab]
+			       in:panel1.
     decimalTabButton := Button form:(self class decimalTabForm)
-                             action:[self decimalTab]
-                                 in:panel2.
+			     action:[self decimalTab]
+				 in:panel1.
 
-    lineSpacingField := EditField in:panel3.
+"/    lineSpacingField := EditField in:panel3.
 
 
-    leftMargin := 0.25.
-    rightMargin := 8.25
-
-    "TextRuler new realize"
-!
+    leftMargin := 0.0.
+    rightMargin := 8.5 
 
-initEvents
-    super initEvents.
-    self enableButtonEvents.
-    self enableButtonMotionEvents
-
+    "TextRuler new open"
 ! !
 
-!TextRuler methodsFor:'user interaction'!
-
-leftAlign
-    ^ self
-!
-
-rightAlign
-    ^ self
-!
-
-align
-    ^ self
-!
-
-center
-    ^ self
-!
-
-leftTab
-    ^ self
-!
-
-rightTab
-    ^ self
-!
-
-centerTab
-    ^ self
-!
-
-decimalTab
-    ^ self
-!
-
-buttonPress:button x:x y:y
-    "position a tab or start moving a ruler"
-
-    |mpos|
-
-    mpos := self inchToPixel:leftMargin.
-    (((mpos - 4) <= x) and:[x <= (mpos + 4)]) ifTrue:[
-        "start moving left margin"
-        moving := #left.
-        ^ self
-    ].
-    mpos := self inchToPixel:rightMargin.
-    (((mpos - 4) <= x) and:[x <= (mpos + 4)]) ifTrue:[
-        "start moving right margin"
-        moving := #right.
-        ^ self
-    ].
-
-    ^ self
-!
-
-buttonMotion:state x:x y:y
-    "position a tab or start moving a ruler"
-
-    |mpos|
-
-    moving notNil ifTrue:[
-        self clearMargin:moving.
-        mpos := self pixelToInch:x.
-        (mpos < 0) ifTrue:[
-            mpos := 0
-        ].
-        (mpos > paperWidth) ifTrue:[
-            mpos := paperWidth
-        ].
-        (moving == #left) ifTrue:[
-            leftMargin := mpos
-        ].
-        (moving == #right) ifTrue:[
-            rightMargin := mpos
-        ].
-        self drawMargin:moving
-    ]
-!
-
-buttonRelease:button x:x y:y
-    "position a tab or start moving a ruler"
-
-    moving := nil
-! !
-
-!TextRuler methodsFor:'redrawing'!
-
-clearMargin:which
-    "clear margin"
-
-    |x top form|
-
-    self paint:viewBackground.
-    self background:viewBackground.
-
-    top := height - (font height) - (font ascent).
-
-    (which == #left) ifTrue:[
-        x := (self inchToPixel:leftMargin) rounded.
-        form := self class leftMarginForm
-    ].
-    (which == #right) ifTrue:[
-        x := (self inchToPixel:rightMargin) rounded.
-        form := self class rightMarginForm
-    ].
-
-    self displayOpaqueForm:form x:(x - (form width // 2))
-!
-
-drawMargin:which
-    "clear margin"
-
-    |x top form|
-
-    self paint:fgColor.
-    self background:viewBackground.
-
-    top := height - (font height) - (font ascent).
-
-    (which == #left) ifTrue:[
-        x := (self inchToPixel:leftMargin) rounded.
-        form := self class leftMarginForm
-    ].
-    (which == #right) ifTrue:[
-        x := (self inchToPixel:rightMargin) rounded.
-        form := self class rightMarginForm
-    ].
-
-    self displayOpaqueForm:form x:(x - (form width // 2))
-!
-
-redraw
-    "redraw margin & tab marks"
-
-    |x top form tab type tabStops tabAlign|
-
-    super redraw.
-
-    self paint:fgColor.
-    self background:viewBackground.
-
-    top := height - (font height) - (font ascent).
-
-    x := (self inchToPixel:leftMargin) rounded.
-    form := self class leftMarginForm.
-    self displayOpaqueForm:form x:(x - (form width // 2))
-                             y:(top - form height).
-    x := (self inchToPixel:rightMargin) rounded.
-    form := self class rightMarginForm.
-    self displayOpaqueForm:form 
-                         x:(x - (form width // 2))
-                         y:(top - form height).
-
-    tabStops := tabSpec positions.
-    tabAlign := tabSpec align.
-    tabStops notNil ifTrue:[
-        1 to:tabStops size do:[:tabNr |
-            tab := tabStops at:tabNr.
-            type := tabAlign at:tabNr.
-            x := (tabSpec positionOfTab:tabNr on:self) rounded.
-            (type == #left) ifTrue:[
-                form := self class leftTabForm
-            ] ifFalse:[
-                (type == #right) ifTrue:[
-                    form := self class rightTabForm
-                ] ifFalse:[
-                    (type == #center) ifTrue:[
-                        form := self class centerTabForm
-                    ] ifFalse:[
-                        (type == #decimal) ifTrue:[
-                            form := self class decimalTabForm
-                        ]
-                    ]
-                ]
-            ].
-            self displayOpaqueForm:form 
-				 x:(x - (form width // 2))
-                                 y:(top - form height)
-        ]
-    ]
-! !