diff -r ed41e1bbd9a1 -r e23465aad9e8 Scroller.st --- a/Scroller.st Fri Mar 01 19:44:55 1996 +0100 +++ b/Scroller.st Fri Mar 01 19:48:00 1996 +0100 @@ -54,11 +54,6 @@ When moved, either a predefined action is performed (scrollAction), or a model is informed via the changeMsg (which is #value: by default). - Beside the obvious 3D rectangle, a scroller may draw a know-form - (as in NeXT) or little tally marks (as on SGI) in itself. - These are controlled by the shadowForm, lightForm, tallyLevel and tallyMarks - instance variables. - The scroller can work synchronous (i.e. every move leads to an immediate evaluation of the action, or asynchronous (i.e. perform action on end-of move). By default, scrollers are synchronous. Asynchronous operation makes sense, @@ -68,6 +63,20 @@ and as an abstract superclass for horizontalScrollers, sliders and miniScrollers. + range: + the value passed to the model or via the action blocks is scaled according + to the min/maxRange instance variables. + These default to 0..100 for percentage values. + It does not make sense to change the range for scrollbar-scrollers, + but may be useful with Sliders or in special applications. + + style stuff: + + Beside the obvious 3D rectangle, a scroller may draw a know-form + (as in NeXT) or little tally marks (as on SGI) in itself. + These are controlled by the shadowForm, lightForm, tallyLevel and tallyMarks + instance variables. + Instance variables: thumbOrigin origin of thumb (in percent) @@ -75,14 +84,14 @@ thumbColor color of thumb thumbFrameColor color of the frame around the thumb scrollAction 1 arg block to be evaluated when scrolled - (arg is position in percent) + (arg is position in percent) orientation #horizontal or #vertical thumbFrame frame of thumb in pixels (cached) thumbLevel level of thumb if 3d scrolling true during scroll pressOffset temporary (offset into frame when move started) synchronousOperation true if synchronous (i.e. dont wait till release - to perform action) + to perform action) shadowForm
bitmap of knob if any (shadow part) lightForm bitmap of knob if any (light part) inset number of pixels to inset thumb from view borders @@ -92,10 +101,10 @@ thumbHalfShadowColor used to draw smooth edges thumbHalfLightColor used to draw smooth edges thumbFrameSizeDifference number of pixels the thumb is larger than - it should be (can be negative for mswin-style) + it should be (can be negative for mswin-style) tallyLevel if not zero, specifies if tally-marks should - go into or out of the display (actually only <0/>0 is checked) - I dont know of a better word for these ... + go into or out of the display (actually only <0/>0 is checked) + I dont know of a better word for these ... tallyMarks number of tally marks fixThumbHeight perform 'wrong' height computation a la mswindows rangeStart the range of the scroller @@ -137,102 +146,116 @@ " basic scroller setup: - |top s| + |top s| - top := StandardSystemView new extent:200@200. - s := Scroller in:top. - s origin:(0.0@0.0) corner:(20@1.0). - s thumbHeight:10. 'percent'. - top open + top := StandardSystemView new extent:200@200. + s := Scroller in:top. + s origin:(0.0@0.0) corner:(20@1.0). + s thumbHeight:10. 'percent'. + top open setting its thumb-height: - |top s| + |top s| - top := StandardSystemView new extent:200@200. - s := Scroller in:top. - s origin:(0.0@0.0) corner:(20@1.0). - s thumbHeight:50. 'percent'. - top open + top := StandardSystemView new extent:200@200. + s := Scroller in:top. + s origin:(0.0@0.0) corner:(20@1.0). + s thumbHeight:50. 'percent'. + top open setting its thumb-origin: - |top s| + |top s| - top := StandardSystemView new extent:200@200. - s := Scroller in:top. - s origin:(0.0@0.0) corner:(20@1.0). - s thumbHeight:10. 'percent'. - s thumbOrigin:30. 'percent'. - top open + top := StandardSystemView new extent:200@200. + s := Scroller in:top. + s origin:(0.0@0.0) corner:(20@1.0). + s thumbHeight:10. 'percent'. + s thumbOrigin:30. 'percent'. + top open a scroller with action block (ST/X style): - |top s| + |top s| + + top := StandardSystemView new extent:200@200. + s := Scroller in:top. + s origin:(0.0@0.0) corner:(20@1.0). + s thumbHeight:10. 'percent'. + s scrollAction:[:percent | Transcript show:'moved to: '; showCr:percent asFloat]. + top open + - top := StandardSystemView new extent:200@200. - s := Scroller in:top. - s origin:(0.0@0.0) corner:(20@1.0). - s thumbHeight:10. 'percent'. - s scrollAction:[:percent | Transcript show:'moved to: '; showCr:percent asFloat]. - top open + setting its range: + + |top s| + + top := StandardSystemView new extent:200@200. + s := Scroller in:top. + s origin:(0.0@0.0) corner:(20@1.0). + s thumbHeight:10. 'percent'. + s scrollAction:[:percent | Transcript show:'moved to: '; showCr:percent asFloat]. + s start:0 stop:1. + top open create a scroller in its default extent and have it positioned - at the right; beside another view: + at the side; beside another view: - |top s v| + |top s v| - top := StandardSystemView new extent:200@200. - s := Scroller in:top. - s origin:(0.0@0.0) corner:(0.0@1.0). - s rightInset:(s preferredExtent x negated). - s thumbHeight:10. - s level:1. + top := StandardSystemView new extent:200@200. + s := Scroller in:top. + s origin:(0.0@0.0) corner:(0.0@1.0). + s rightInset:(s preferredExtent x negated). + s thumbHeight:10. + s level:1. - v := View in:top. - v origin:0.0@0.0 corner:1.0@1.0. - v leftInset:(s preferredExtent x). - v viewBackground:Color red. - v level:2. + v := View in:top. + v origin:0.0@0.0 corner:1.0@1.0. + v leftInset:(s preferredExtent x). + v viewBackground:Color red. + v level:2. - top open + top open using a model (ST-80 style): - |top s m| + |top s m| + + m := 0 asValue. + InspectorView openOn:m monitor:'value'. 'look at value'. - m := 0 asValue. - m inspect. 'look at value'. - top := StandardSystemView new extent:200@200. - s := Scroller in:top. - s origin:(0.0@0.0) corner:(20@1.0). - s thumbHeight:10. 'percent'. - s model:m. - top open + top := StandardSystemView new extent:200@200. + s := Scroller in:top. + s origin:(0.0@0.0) corner:(20@1.0). + s thumbHeight:10. 'percent'. + s model:m. + top open using a different changeSelector: - |top s1 s2 m| + |top s1 s2 m| - m := Plug new. - m respondTo:#value1: with:[:v | Transcript show:'scroller 1 moved to: '; showCr:v]. - m respondTo:#value2: with:[:v | Transcript show:'scroller 2 moved to: '; showCr:v]. + m := Plug new. + m respondTo:#value1: with:[:v | Transcript show:'scroller 1 moved to: '; showCr:v]. + m respondTo:#value2: with:[:v | Transcript show:'scroller 2 moved to: '; showCr:v]. - top := StandardSystemView new extent:200@200. - s1 := Scroller in:top. - s1 origin:(0.0@0.0) corner:(20@1.0). - s1 thumbHeight:10. 'percent'. - s1 model:m; change:#value1:. + top := StandardSystemView new extent:200@200. + s1 := Scroller in:top. + s1 origin:(0.0@0.0) corner:(20@1.0). + s1 thumbHeight:10. 'percent'. + s1 model:m; change:#value1:. - s2 := Scroller in:top. - s2 origin:(30@0.0) corner:(50@1.0). - s2 thumbHeight:10. 'percent'. - s2 model:m; change:#value2:. - top open + s2 := Scroller in:top. + s2 origin:(30@0.0) corner:(50@1.0). + s2 thumbHeight:10. 'percent'. + s2 model:m; change:#value2:. + top open " ! ! @@ -352,17 +375,180 @@ "Modified: 1.3.1996 / 19:12:10 / cg" ! -start:start - "set the scrollers range start" +or may be not available for the copy + " + (orientation == #vertical) ifTrue:[ + self drawThumbBackgroundInX:thumbLeft y:oldTop + width:tW height:(height - oldTop). + ] ifFalse:[ + self drawThumbBackgroundInX:oldLeft y:thumbTop + width:(width - oldLeft) height:tH. + ]. + self drawThumb. + ^ self + ]. + + self catchExpose. + " + copy the thumbs pixels + " + (orientation == #vertical) ifTrue:[ + self copyFrom:self x:thumbLeft y:oldTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ] ifFalse:[ + self copyFrom:self x:oldLeft y:thumbTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ]. - rangeStart := start. + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] ! -start:start stop:stop +ifTrue:[ + self drawThumbBackgroundInX:thumbLeft y:oldTop + width:tW height:(height - oldTop). + ] ifFalse:[ + self drawThumbBackgroundInX:oldLeft y:thumbTop + width:(width - oldLeft) height:tH. + ]. + self drawThumb. + ^ self + ]. + + self catchExpose. + " + copy the thumbs pixels + " + (orientation == #vertical) ifTrue:[ + self copyFrom:self x:thumbLeft y:oldTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ] ifFalse:[ + self copyFrom:self x:oldLeft y:thumbTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ]. + + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] +! + +start:start stop:stop step:step "set the scrollers range" rangeStart := start. - rangeEnd := stop + rangeEnd := stop. + rangeStep := step. + + "Created: 1.3.1996 / 19:39:18 / cg" ! step @@ -373,10 +559,82 @@ "Modified: 1.3.1996 / 19:12:16 / cg" ! -step:step - "set the scrollers range step" +:thumbTop + width:(width - oldLeft) height:tH. + ]. + self drawThumb. + ^ self + ]. + + self catchExpose. + " + copy the thumbs pixels + " + (orientation == #vertical) ifTrue:[ + self copyFrom:self x:thumbLeft y:oldTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ] ifFalse:[ + self copyFrom:self x:oldLeft y:thumbTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ]. - rangeStep := step + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] ! stop @@ -387,19 +645,114 @@ "Modified: 1.3.1996 / 19:12:20 / cg" ! -stop:stop - "set the scrollers range stop" +copy the thumbs pixels + " + (orientation == #vertical) ifTrue:[ + self copyFrom:self x:thumbLeft y:oldTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ] ifFalse:[ + self copyFrom:self x:oldLeft y:thumbTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ]. - rangeEnd := stop + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] ! -thumbFrame - "return the area used by the thumbFrame (in device coordinates). - Allows access to the thumbs physical screen position, for - example to position a label below (see Slider-Examples)" - - thumbFrame isNil ifTrue:[ self computeThumbFrame]. - ^ thumbFrame +umbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] ! thumbHeight @@ -410,47 +763,23 @@ "Modified: 1.3.1996 / 19:12:28 / cg" ! -thumbHeight:aNumber - "set the thumbs height (in percent by default)" - - |newHeight realNewHeight oldFrame nBg| - - newHeight := aNumber / (rangeEnd - rangeStart / 100). - - (newHeight > 100) ifTrue:[ - realNewHeight := 100 - ] ifFalse:[ - realNewHeight := newHeight - ]. - ((realNewHeight ~= thumbHeight) or:[thumbFrame isNil]) ifTrue:[ - thumbHeight := realNewHeight. - - (DefaultFullViewBackground notNil - and:[DefaultViewBackground notNil - and:[DefaultFullViewBackground ~~ DefaultViewBackground]]) ifTrue:[ - realNewHeight >= 100 ifTrue:[ - nBg := DefaultFullViewBackground. - ] ifFalse:[ - nBg := DefaultViewBackground - ]. - nBg := nBg on:device. - nBg ~~ viewBackground ifTrue:[ - self viewBackground:nBg. - shown ifTrue:[self clear]. - ] - ]. - - shown ifTrue:[ - oldFrame := thumbFrame. - self computeThumbFrame. - (fixThumbHeight or:[oldFrame ~~ thumbFrame]) ifTrue:[ - oldFrame notNil ifTrue:[ - self drawThumbBackgroundInX:(oldFrame left) - y:(oldFrame top) - width:(oldFrame width) - height:(oldFrame height). +[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. ]. - self drawThumb + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose ] ] ifFalse:[ thumbFrame := nil @@ -466,10 +795,1155 @@ "Modified: 1.3.1996 / 19:12:37 / cg" ! -thumbOrigin:aNumber - "set the thumbs origin (in percent by default)" +old ~~ new. + changed ifFalse:[ + old := self absFromPercent:thumbHeight. + new := self absFromPercent:realNewHeight. + changed := (old ~~ new) + ]. + (changed or:[thumbFrame isNil]) ifTrue:[ + thumbOrigin := realNewOrigin. + thumbHeight := realNewHeight. + + (DefaultFullViewBackground notNil + and:[DefaultViewBackground notNil + and:[DefaultFullViewBackground ~~ DefaultViewBackground]]) ifTrue:[ + realNewHeight >= 100 ifTrue:[ + nBg := DefaultFullViewBackground. + ] ifFalse:[ + nBg := DefaultViewBackground + ]. + nBg := nBg on:device. + nBg ~~ viewBackground ifTrue:[ + self viewBackground:nBg. + shown ifTrue:[self clear]. + ] + ]. + + shown ifTrue:[ + thumbFrame notNil ifTrue:[ + self drawThumbBackgroundInX:(thumbFrame left) + y:(thumbFrame top) + width:(thumbFrame width) + height:(thumbFrame height). + ]. + self computeThumbFrame. + self drawThumb + ] ifFalse:[ + thumbFrame := nil + ] + ] + ] +! + +humbColor. + self fillRectangleX:l y:t width:w-1 height:h. + + thumbLevel == 0 ifTrue:[ + thumbFrameColor notNil ifTrue:[ + self paint:thumbFrameColor. + self displayRectangle:thumbFrame. + ]. + ^ self + ]. + + "what a kludge - must be a parameter to drawEdge..." + self drawEdgesForX:l y:t width:w height:h level:thumbLevel + shadow:thumbShadowColor light:thumbLightColor + halfShadow:thumbHalfShadowColor halfLight:thumbHalfLightColor + style:thumbEdgeStyle. + + thumbFrameColor notNil ifTrue:[ + self paint:thumbFrameColor. + orientation == #vertical ifTrue:[ + self displayRectangleX:l y:t width:w"-1" height:h. + ] ifFalse:[ + self displayRectangleX:l y:t width:w height:h"-1". + ] + ]. + + (tallyLevel == 0 or:[tallyMarks == 0]) ifTrue:[ + shadowForm notNil ifTrue:[ + handleX := l + ((w - 8) // 2). + handleY := t + ((h - 8) // 2). + self drawHandleFormAtX:handleX y:handleY + ]. + ^ self + ]. + + "iris style - draw tallys" + + tallyLevel > 0 ifTrue:[ + color1 := thumbLightColor. + color2 := thumbShadowColor. + ] ifFalse:[ + color1 := thumbShadowColor. + color2 := thumbLightColor. + ]. + + "draw tally marks" + + (orientation == #vertical) ifTrue:[ + self paint:color1. + y := t + (h // 2) - 1. + xL := l + thumbLevel - 1. + xR := l + w - thumbLevel "+ 1". + self displayLineFromX:xL y:y toX:xR y:y. + y := y + 1. + self paint:color2. + self displayLineFromX:xL y:y toX:xR y:y. + + tallyMarks > 1 ifTrue:[ + "dont draw other marks if there is not enough space" + + mm := device verticalPixelPerMillimeter rounded. + h > (mm * (tallyMarks * 2)) ifTrue:[ + y := y - 1 - mm. + self paint:color1. + self displayLineFromX:xL y:y toX:xR y:y. + y := y + 1. + self paint:color2. + self displayLineFromX:xL y:y toX:xR y:y. + + y := y - 1 + mm + mm. + self paint:color1. + self displayLineFromX:xL y:y toX:xR y:y. + y := y + 1. + self paint:color2. + self displayLineFromX:xL y:y toX:xR y:y + ] + ] + ] ifFalse:[ + x := l + (w // 2) - 1. + yT := t + thumbLevel - 1. + yB := t + h - thumbLevel "+ 1". + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + self paint:color2. + x := x + 1. + self displayLineFromX:x y:yT toX:x y:yB. + + tallyMarks > 1 ifTrue:[ + "dont draw other marks if there is not enough space" + + mm := device horizontalPixelPerMillimeter rounded. + w > (mm * (tallyMarks * 2)) ifTrue:[ + x := x - 1 - mm. + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + x := x + 1. + self paint:color2. + self displayLineFromX:x y:yT toX:x y:yB. + + x := x - 1 + mm + mm. + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + x := x + 1. + self paint:color2. + self displayLineFromX:x y:yT toX:x y:yB + ] + ] + ] +! ! + +!Scroller methodsFor:'accessing-behavior'! + +start + "return the scrollers range min" + + ^ rangeStart + + "Modified: 1.3.1996 / 19:12:10 / cg" +! + +g" +! + +return the scrollers range max" + + ^ rangeEnd + + "Modified: 1.3.1996 / 19:12:20 / cg" +! + +/ 19:12:20 / cg" +! + +a used by the thumbFrame (in device coordinates). + Allows access to the thumbs physical screen position, for + example to position a label below (see Slider-Examples)" + + thumbFrame isNil ifTrue:[ self computeThumbFrame]. + ^ thumbFrame +! + +example to position a label below (see Slider-Examples)" + + thumbFrame isNil ifTrue:[ self computeThumbFrame]. + ^ thumbFrame +! + +self copyFrom:self x:thumbLeft y:oldTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ] ifFalse:[ + self copyFrom:self x:oldLeft y:thumbTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ]. + + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] +! ! + +!Scroller methodsFor:'accessing-look'! + +return the scrollers range step" + + ^ rangeStep + + "Modified: 1.3.1996 / 19:12:16 / cg" +! + +/ 19:12:16 / cg" +! + +toX:thumbLeft y:thumbTop + width:tW height:tH. + ]. + + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] +! + +. + + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] + ] ifFalse:[ + thumbFrame := nil + ] + ] +! ! + +!Scroller methodsFor:'drawing'! + +self displayLineFromX:xL y:y toX:xR y:y + ] + ] + ] ifFalse:[ + x := l + (w // 2) - 1. + yT := t + thumbLevel - 1. + yB := t + h - thumbLevel "+ 1". + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + self paint:color2. + x := x + 1. + self displayLineFromX:x y:yT toX:x y:yB. + + tallyMarks > 1 ifTrue:[ + "dont draw other marks if there is not enough space" + + mm := device horizontalPixelPerMillimeter rounded. + w > (mm * (tallyMarks * 2)) ifTrue:[ + x := x - 1 - mm. + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + x := x + 1. + self paint:color2. + self displayLineFromX:x y:yT toX:x y:yB. + + x := x - 1 + mm + mm. + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + x := x + 1. + self paint:color2. + self displayLineFromX:x y:yT toX:x y:yB + ] + ] + ] +! + +T toX:x y:yB. + + tallyMarks > 1 ifTrue:[ + "dont draw other marks if there is not enough space" + + mm := device horizontalPixelPerMillimeter rounded. + w > (mm * (tallyMarks * 2)) ifTrue:[ + x := x - 1 - mm. + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + x := x + 1. + self paint:color2. + self displayLineFromX:x y:yT toX:x y:yB. + + x := x - 1 + mm + mm. + self paint:color1. + self displayLineFromX:x y:yT toX:x y:yB. + x := x + 1. + self paint:color2. + self displayLineFromX:x y:yT toX:x y:yB + ] + ] + ] +! + +roll + action is now performed" + + |rect| + + scrolling ifTrue:[ + thumbFrame notNil ifTrue:[ + frameBeforeMove notNil ifTrue:[ + rect := frameBeforeMove. + frameBeforeMove := nil. + self drawThumbBackgroundInX:rect left + y:rect top + width:rect width + height:rect height. + (rect intersects:thumbFrame) ifTrue:[ + self drawThumb + ] + ]. + + scrolling := false. + synchronousOperation ifFalse: [ + self tellOthers. + ] + ] + ] + + "Modified: 23.12.1995 / 12:42:25 / cg" +! ! + +!Scroller methodsFor:'event handling'! + +l) ifTrue:[ + curr := y. + curr2 := y - (thumbFrame height // 2). + limit1 := height. + limit2 := thumbFrame top + ] ifFalse:[ + curr := x. + curr2 := x - (thumbFrame width // 2). + limit1 := width. + limit2 := thumbFrame left + ]. + + (curr2 < 0) ifTrue:[ "check against limits" + pos := 0 + ] ifFalse:[ + (curr2 > limit1) ifTrue:[ + pos := limit1 + ] ifFalse:[ + pos := curr2 + ] + ]. + + frameBeforeMove := thumbFrame insetBy:1@1. + + self thumbOrigin:(self percentFromAbs:pos). + self tellOthers. + + (orientation == #vertical) ifTrue:[ + limit2 := thumbFrame top + ] ifFalse:[ + limit2 := thumbFrame left + ]. + pressOffset := curr - limit2. + scrolling := true +! + +self + ]. + ((y + h) < thumbFrame top) ifTrue:[ + ^ self + ]. + self drawThumb + ] +! + +humb + ] +! + +ght" + + self thumbOrigin:(thumbOrigin + thumbHeight). + self tellOthers +! + +]. + DefaultShadowColor notNil ifTrue:[ + shadowColor := DefaultShadowColor on:device. + ]. + DefaultLightColor notNil ifTrue:[ + lightColor := DefaultLightColor on:device. + ]. + + tallyMarks := DefaultTallyMarks. + tallyLevel := DefaultTallyLevel. + DefaultLevel ~~ level ifTrue:[ + self level:DefaultLevel. + ]. + DefaultBorderWidth ~~ borderWidth ifTrue:[ + self borderWidth:DefaultBorderWidth. + ]. + thumbLevel := DefaultThumbLevel. + inset := DefaultInset. + fixThumbHeight := DefaultFixThumbHeight. + thumbEdgeStyle := DefaultEdgeStyle. + + DefaultGhostColor notNil ifTrue:[ + ghostColor := DefaultGhostColor on:device. + ]. + DefaultGhostFrameColor notNil ifTrue:[ + ghostFrameColor := DefaultGhostFrameColor on:device. + ]. + ghostLevel := DefaultGhostLevel. - |newOrigin realNewOrigin + DefaultThumbFrameColor notNil ifTrue:[ + thumbFrameColor := DefaultThumbFrameColor on:device. + ]. + DefaultThumbShadowColor notNil ifTrue:[ + thumbShadowColor := DefaultThumbShadowColor + ] ifFalse:[ + thumbShadowColor := shadowColor. + ]. + DefaultThumbLightColor notNil ifTrue:[ + thumbLightColor := DefaultThumbLightColor + ] ifFalse:[ + thumbLightColor := lightColor. + ]. + + thumbEdgeStyle notNil ifTrue:[ + DefaultThumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := DefaultThumbHalfShadowColor + ]. + DefaultThumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := DefaultThumbHalfLightColor + ]. + ]. + + device hasGreyscales ifFalse:[ + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor := Color darkGrey. + thumbHalfLightColor := White + ]. + + thumbShadowColor := Black. +"/ thumbLightColor := White. + + styleSheet name = #motif ifTrue:[ + DefaultThumbColor isNil ifTrue:[ + thumbColor := White . + ]. + ] + ]. + + DefaultThumbColor notNil ifTrue:[ + thumbColor := DefaultThumbColor on:device + ] ifFalse:[ + thumbColor := White. + styleSheet name ~= #normal ifTrue:[ + device hasGreyscales ifFalse:[ + thumbColor := Color grey + ]. + ]. + ]. + + thumbColor := thumbColor on:device. + thumbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! + +mbFrameColor := DefaultThumbFrameColor on:device. + ]. + DefaultThumbShadowColor notNil ifTrue:[ + thumbShadowColor := DefaultThumbShadowColor + ] ifFalse:[ + thumbShadowColor := shadowColor. + ]. + DefaultThumbLightColor notNil ifTrue:[ + thumbLightColor := DefaultThumbLightColor + ] ifFalse:[ + thumbLightColor := lightColor. + ]. + + thumbEdgeStyle notNil ifTrue:[ + DefaultThumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := DefaultThumbHalfShadowColor + ]. + DefaultThumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := DefaultThumbHalfLightColor + ]. + ]. + + device hasGreyscales ifFalse:[ + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor := Color darkGrey. + thumbHalfLightColor := White + ]. + + thumbShadowColor := Black. +"/ thumbLightColor := White. + + styleSheet name = #motif ifTrue:[ + DefaultThumbColor isNil ifTrue:[ + thumbColor := White . + ]. + ] + ]. + + DefaultThumbColor notNil ifTrue:[ + thumbColor := DefaultThumbColor on:device + ] ifFalse:[ + thumbColor := White. + styleSheet name ~= #normal ifTrue:[ + device hasGreyscales ifFalse:[ + thumbColor := Color grey + ]. + ]. + ]. + + thumbColor := thumbColor on:device. + thumbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! + +rue:[ + thumbShadowColor := DefaultThumbShadowColor + ] ifFalse:[ + thumbShadowColor := shadowColor. + ]. + DefaultThumbLightColor notNil ifTrue:[ + thumbLightColor := DefaultThumbLightColor + ] ifFalse:[ + thumbLightColor := lightColor. + ]. + + thumbEdgeStyle notNil ifTrue:[ + DefaultThumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := DefaultThumbHalfShadowColor + ]. + DefaultThumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := DefaultThumbHalfLightColor + ]. + ]. + + device hasGreyscales ifFalse:[ + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor := Color darkGrey. + thumbHalfLightColor := White + ]. + + thumbShadowColor := Black. +"/ thumbLightColor := White. + + styleSheet name = #motif ifTrue:[ + DefaultThumbColor isNil ifTrue:[ + thumbColor := White . + ]. + ] + ]. + + DefaultThumbColor notNil ifTrue:[ + thumbColor := DefaultThumbColor on:device + ] ifFalse:[ + thumbColor := White. + styleSheet name ~= #normal ifTrue:[ + device hasGreyscales ifFalse:[ + thumbColor := Color grey + ]. + ]. + ]. + + thumbColor := thumbColor on:device. + thumbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! + +:[ + DefaultThumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := DefaultThumbHalfShadowColor + ]. + DefaultThumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := DefaultThumbHalfLightColor + ]. + ]. + + device hasGreyscales ifFalse:[ + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor := Color darkGrey. + thumbHalfLightColor := White + ]. + + thumbShadowColor := Black. +"/ thumbLightColor := White. + + styleSheet name = #motif ifTrue:[ + DefaultThumbColor isNil ifTrue:[ + thumbColor := White . + ]. + ] + ]. + + DefaultThumbColor notNil ifTrue:[ + thumbColor := DefaultThumbColor on:device + ] ifFalse:[ + thumbColor := White. + styleSheet name ~= #normal ifTrue:[ + device hasGreyscales ifFalse:[ + thumbColor := Color grey + ]. + ]. + ]. + + thumbColor := thumbColor on:device. + thumbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! + +thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor := Color darkGrey. + thumbHalfLightColor := White + ]. + + thumbShadowColor := Black. +"/ thumbLightColor := White. + + styleSheet name = #motif ifTrue:[ + DefaultThumbColor isNil ifTrue:[ + thumbColor := White . + ]. + ] + ]. + + DefaultThumbColor notNil ifTrue:[ + thumbColor := DefaultThumbColor on:device + ] ifFalse:[ + thumbColor := White. + styleSheet name ~= #normal ifTrue:[ + device hasGreyscales ifFalse:[ + thumbColor := Color grey + ]. + ]. + ]. + + thumbColor := thumbColor on:device. + thumbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! ! + +!Scroller methodsFor:'forced scroll'! + +il ifTrue:[ + thumbColor := DefaultThumbColor on:device + ] ifFalse:[ + thumbColor := White. + styleSheet name ~= #normal ifTrue:[ + device hasGreyscales ifFalse:[ + thumbColor := Color grey + ]. + ]. + ]. + + thumbColor := thumbColor on:device. + thumbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! + +name ~= #normal ifTrue:[ + device hasGreyscales ifFalse:[ + thumbColor := Color grey + ]. + ]. + ]. + + thumbColor := thumbColor on:device. + thumbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! ! + +!Scroller methodsFor:'forwarding changed origin'! + +humbShadowColor notNil ifTrue:[ + thumbShadowColor := thumbShadowColor on:device. + ]. + thumbLightColor notNil ifTrue:[ + thumbLightColor := thumbLightColor on:device. + ]. + thumbHalfShadowColor notNil ifTrue:[ + thumbHalfShadowColor := thumbHalfShadowColor on:device. + ]. + thumbHalfLightColor notNil ifTrue:[ + thumbHalfLightColor := thumbHalfLightColor on:device. + ]. + thumbEdgeStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! ! + +!Scroller methodsFor:'initialization'! + +defaultExtent + "compute my extent from sub-components" + + ^ self preferredExtent + + "Created: 1.3.1996 / 19:22:21 / cg" +! + +eStyle notNil ifTrue:[ + thumbHalfShadowColor isNil ifTrue:[ + thumbHalfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! + +alfShadowColor := thumbShadowColor lightened on:device + ] + ]. + + styleSheet name = #next ifTrue:[ + shadowForm := self class handleShadowFormOn:device. + lightForm := self class handleLightFormOn:device + ] ifFalse:[ + shadowForm := lightForm := nil + ]. + + drawableId notNil ifTrue:[ + self computeThumbFrame + ] +! + +initialize + "initialize - setup instvars from defaults" + + super initialize. + orientation := #vertical. + + scrolling := false. + synchronousOperation := true. + + thumbOrigin := 0. + thumbHeight := 100. + thumbFrameSizeDifference := 0. + + rangeStart := 0. + rangeEnd := 100. + rangeStep := nil. "/ meaning: arbitrary precision +"/ inset := 1. + +"/ self computeThumbFrame + + "Modified: 1.3.1996 / 19:22:51 / cg" +! + +ame left) ifTrue:[ + (nh == thumbFrame height) ifTrue:[ + (nw == thumbFrame width) ifTrue:[ ^ self] + ] + ] + ] + ]. + thumbFrame := Rectangle left:nx top:ny width:nw height:nh +! ! + +!Scroller methodsFor:'private'! + +thumbFrame := Rectangle left:nx top:ny width:nw height:nh +! + +ases, this happens ... + val := 0 + ] ifFalse:[ + val := absValue / t * (rangeEnd - rangeStart). + ]. + val := val + rangeStart. + + val < rangeStart ifTrue:[^ rangeStart]. + val > rangeEnd ifTrue:[^ rangeEnd]. + ^ val + +! + +(orientation == #vertical) ifTrue:[aView innerHeight] + ifFalse:[aView innerWidth]. + percent := viewsSize * 100.0 / total + ]. + self thumbHeight:percent +! ! + +!Scroller methodsFor:'private-scrollView interface'! + +^ thumbFrame +! + +wOrigin realNewOrigin oldFrame oldTop oldBot oldLeft oldRight thumbTop thumbBot thumbLeft thumbRight tH "{ Class: SmallInteger }" @@ -611,957 +2085,126 @@ ] ! -thumbOrigin:originNumber thumbHeight:heightNumber - "set both thumbs height and origin (in percent by default)" - - |newHeight newOrigin realNewOrigin realNewHeight old new changed nBg| - - newOrigin := originNumber - rangeStart / (rangeEnd - rangeStart / 100). - newHeight := heightNumber / (rangeEnd - rangeStart / 100). - - (newHeight > 100) ifTrue:[ - realNewHeight := 100 - ] ifFalse:[ - realNewHeight := newHeight - ]. - ((newOrigin + realNewHeight) > 100) ifTrue:[ - realNewOrigin := 100 - realNewHeight - ] ifFalse: [ - realNewOrigin := newOrigin - ]. - (realNewOrigin < 0) ifTrue: [ - realNewOrigin := 0 - ]. - - changed := (realNewHeight ~= thumbHeight) or:[realNewOrigin ~= thumbOrigin]. - (changed or:[thumbFrame isNil]) ifTrue:[ - old := self absFromPercent:thumbOrigin. - new := self absFromPercent:realNewOrigin. - changed := old ~~ new. - changed ifFalse:[ - old := self absFromPercent:thumbHeight. - new := self absFromPercent:realNewHeight. - changed := (old ~~ new) - ]. - (changed or:[thumbFrame isNil]) ifTrue:[ - thumbOrigin := realNewOrigin. - thumbHeight := realNewHeight. - - (DefaultFullViewBackground notNil - and:[DefaultViewBackground notNil - and:[DefaultFullViewBackground ~~ DefaultViewBackground]]) ifTrue:[ - realNewHeight >= 100 ifTrue:[ - nBg := DefaultFullViewBackground. - ] ifFalse:[ - nBg := DefaultViewBackground - ]. - nBg := nBg on:device. - nBg ~~ viewBackground ifTrue:[ - self viewBackground:nBg. - shown ifTrue:[self clear]. - ] +e:[ + oldFrame := thumbFrame. + self computeThumbFrame. + (thumbHeight = 100) ifTrue:[ + "/ full: don't draw + ^ self ]. - shown ifTrue:[ - thumbFrame notNil ifTrue:[ - self drawThumbBackgroundInX:(thumbFrame left) - y:(thumbFrame top) - width:(thumbFrame width) - height:(thumbFrame height). + (thumbFrame ~~ oldFrame) ifTrue:[ + oldFrame isNil ifTrue:[ + self drawThumb. + ^ self ]. - self computeThumbFrame. - self drawThumb - ] ifFalse:[ - thumbFrame := nil - ] - ] - ] -! ! - -!Scroller methodsFor:'accessing-behavior'! - -action:aBlock - "for protocol compatibility; same as scrollAction:" - - self scrollAction:aBlock -! - -asynchronousOperation - "set scroll-mode to be asynchronous - scroll action is performed after - scrolling, when mouse-button is finally released" - - synchronousOperation := false -! + tH := thumbFrame height. + tW := thumbFrame width. -scrollAction - "answer the scroll action block" - - ^ scrollAction -! - -scrollAction:aBlock - "set the scroll action, aBlock which is evaluated when scrolled" - - scrollAction := aBlock -! + oldTop := oldFrame top. + oldBot := oldTop + tH. + oldLeft := oldFrame left. + oldRight := oldLeft + tW. -scrollDownAction:aBlock - "ignored - - but implemented, so that scroller can be used in place of a scrollbar" -! + thumbTop := thumbFrame top. + thumbBot := thumbTop + tH. + thumbLeft := thumbFrame left. + thumbRight := thumbLeft + tW. -scrollUpAction:aBlock - "ignored - - but implemented, so that scroller can be used in place of a scrollbar" -! - -synchronousOperation - "set scroll-mode to be synchronous - scroll action is performed for - every movement of thumb" - - synchronousOperation := true -! ! - -!Scroller methodsFor:'accessing-look'! + needFullDraw := self exposeEventPending + or:[((orientation == #vertical) and:[oldBot >= height]) + or:[((orientation ~~ #vertical) and:[oldRight >= width])]]. -is3D - styleSheet name = #mswindows ifTrue:[^ true]. - ^ super is3D -! - -orientation - "return the scrollers orientation (#vertical or #horizontal)" - - ^ orientation -! - -thumbColor - "return the thumbs color" - - ^ thumbColor -! - -thumbColor:aColor - "change the color of the thumb" - - thumbColor := aColor on:device. - (styleSheet name ~~ #normal) ifTrue:[ - thumbShadowColor := aColor darkened on:device. - thumbLightColor := aColor lightened on:device. - thumbHalfShadowColor := thumbShadowColor darkened on:device. - thumbHalfLightColor := thumbLightColor lightened on:device. - ]. - shown ifTrue:[ - self redraw - ] -! ! - -!Scroller methodsFor:'drawing'! + needFullDraw ifTrue:[ + " + cannot copy since thumb was below the end + or may be not available for the copy + " + (orientation == #vertical) ifTrue:[ + self drawThumbBackgroundInX:thumbLeft y:oldTop + width:tW height:(height - oldTop). + ] ifFalse:[ + self drawThumbBackgroundInX:oldLeft y:thumbTop + width:(width - oldLeft) height:tH. + ]. + self drawThumb. + ^ self + ]. -drawHandleFormAtX:x y:y - thumbShadowColor := thumbShadowColor on:device. - thumbLightColor := thumbLightColor on:device. - - self paint:thumbShadowColor. - self displayForm:shadowForm x:x y:y. - self paint:thumbLightColor. - self displayForm:lightForm x:x y:y. -! - -drawThumb - "draw the thumb" - - |handleX handleY l t - w "{ Class: SmallInteger }" - h "{ Class: SmallInteger }" - x "{ Class: SmallInteger }" - y "{ Class: SmallInteger }" - mm xL xR yT yB color1 color2| - - (thumbHeight >= 100) ifTrue:[^ self]. - orientation == #vertical ifTrue:[ - thumbFrame height >= height ifTrue:[^ self]. - ] ifFalse:[ - thumbFrame width >= width ifTrue:[^ self]. - ]. - - l := thumbFrame left. - t := thumbFrame top. - w := thumbFrame width. - h := thumbFrame height. - self paint:thumbColor. - self fillRectangleX:l y:t width:w-1 height:h. + self catchExpose. + " + copy the thumbs pixels + " + (orientation == #vertical) ifTrue:[ + self copyFrom:self x:thumbLeft y:oldTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ] ifFalse:[ + self copyFrom:self x:oldLeft y:thumbTop + toX:thumbLeft y:thumbTop + width:tW height:tH. + ]. - thumbLevel == 0 ifTrue:[ - thumbFrameColor notNil ifTrue:[ - self paint:thumbFrameColor. - self displayRectangle:thumbFrame. - ]. - ^ self - ]. - - "what a kludge - must be a parameter to drawEdge..." - self drawEdgesForX:l y:t width:w height:h level:thumbLevel - shadow:thumbShadowColor light:thumbLightColor - halfShadow:thumbHalfShadowColor halfLight:thumbHalfLightColor - style:thumbEdgeStyle. - - thumbFrameColor notNil ifTrue:[ - self paint:thumbFrameColor. - orientation == #vertical ifTrue:[ - self displayRectangleX:l y:t width:w"-1" height:h. + " + clear some of the previous thumbs area to background + " + (orientation == #vertical) ifTrue:[ + bgLeft := thumbLeft. + bgWidth := tW. + oldTop > thumbTop ifTrue:[ + delta := oldTop - thumbTop. + oldTop > thumbBot ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := thumbBot. + bgHeight := delta + ] + ] ifFalse:[ + delta := thumbTop - oldTop. + oldBot < thumbTop ifTrue:[ + bgTop := oldTop. + bgHeight := tH + 1 + ] ifFalse:[ + bgTop := oldTop. + bgHeight := delta + ] + ]. + ] ifFalse:[ + bgTop := thumbTop. + bgHeight := tH. + oldLeft > thumbLeft ifTrue:[ + delta := oldLeft - thumbLeft. + oldLeft > thumbRight ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := thumbRight. + bgWidth := delta. + ] + ] ifFalse:[ + delta := thumbLeft - oldLeft. + oldRight < thumbLeft ifTrue:[ + bgLeft := oldLeft. + bgWidth := tW + 1. + ] ifFalse:[ + bgLeft := oldLeft. + bgWidth := delta. + ] + ]. + ]. + self drawThumbBackgroundInX:bgLeft y:bgTop width:bgWidth height:bgHeight. + self waitForExpose + ] ] ifFalse:[ - self displayRectangleX:l y:t width:w height:h"-1". - ] - ]. - - (tallyLevel == 0 or:[tallyMarks == 0]) ifTrue:[ - shadowForm notNil ifTrue:[ - handleX := l + ((w - 8) // 2). - handleY := t + ((h - 8) // 2). - self drawHandleFormAtX:handleX y:handleY - ]. - ^ self - ]. - - "iris style - draw tallys" - - tallyLevel > 0 ifTrue:[ - color1 := thumbLightColor. - color2 := thumbShadowColor. - ] ifFalse:[ - color1 := thumbShadowColor. - color2 := thumbLightColor. - ]. - - "draw tally marks" - - (orientation == #vertical) ifTrue:[ - self paint:color1. - y := t + (h // 2) - 1. - xL := l + thumbLevel - 1. - xR := l + w - thumbLevel "+ 1". - self displayLineFromX:xL y:y toX:xR y:y. - y := y + 1. - self paint:color2. - self displayLineFromX:xL y:y toX:xR y:y. - - tallyMarks > 1 ifTrue:[ - "dont draw other marks if there is not enough space" - - mm := device verticalPixelPerMillimeter rounded. - h > (mm * (tallyMarks * 2)) ifTrue:[ - y := y - 1 - mm. - self paint:color1. - self displayLineFromX:xL y:y toX:xR y:y. - y := y + 1. - self paint:color2. - self displayLineFromX:xL y:y toX:xR y:y. - - y := y - 1 + mm + mm. - self paint:color1. - self displayLineFromX:xL y:y toX:xR y:y. - y := y + 1. - self paint:color2. - self displayLineFromX:xL y:y toX:xR y:y - ] - ] - ] ifFalse:[ - x := l + (w // 2) - 1. - yT := t + thumbLevel - 1. - yB := t + h - thumbLevel "+ 1". - self paint:color1. - self displayLineFromX:x y:yT toX:x y:yB. - self paint:color2. - x := x + 1. - self displayLineFromX:x y:yT toX:x y:yB. - - tallyMarks > 1 ifTrue:[ - "dont draw other marks if there is not enough space" - - mm := device horizontalPixelPerMillimeter rounded. - w > (mm * (tallyMarks * 2)) ifTrue:[ - x := x - 1 - mm. - self paint:color1. - self displayLineFromX:x y:yT toX:x y:yB. - x := x + 1. - self paint:color2. - self displayLineFromX:x y:yT toX:x y:yB. - - x := x - 1 + mm + mm. - self paint:color1. - self displayLineFromX:x y:yT toX:x y:yB. - x := x + 1. - self paint:color2. - self displayLineFromX:x y:yT toX:x y:yB - ] - ] - ] -! - -drawThumbBackgroundInX:x y:y width:w height:h - "draw part of the thumbs background; defined as a separate - method, to allow drawing of arbitrary patterns under thumb - (see ColorSlider)." - - shown ifTrue:[ - self clearRectangleX:x y:y width:w height:h. - frameBeforeMove notNil ifTrue:[ - self clippedTo:(Rectangle left:x top:y width:w height:h) do:[ - |gX gY gW gH| - - gX := frameBeforeMove left. - gY := frameBeforeMove top. - gW := frameBeforeMove width. - gH := frameBeforeMove height. - - ghostColor notNil ifTrue:[ - self fillRectangle:frameBeforeMove with:ghostColor. - ]. - (ghostLevel ~~ 0) ifTrue:[ - self drawEdgesForX:gX y:gY width:gW height:gH level:ghostLevel - ]. - ghostFrameColor notNil ifTrue:[ - self paint:ghostFrameColor. - self displayRectangleX:gX y:gY width:gW height:gH - ] - ] + thumbFrame := nil ] ] ! ! -!Scroller methodsFor:'event handling'! - -buttonMotion:state x:x y:y - "mouse-button was moved while pressed; - redraw thumb at its new position and, if scroll-mode is asynchronous, - the scroll action is performed" - - |pos curr limit prevOrigin newOrigin| - - scrolling ifFalse: [^ self]. "should not happen" - - frameBeforeMove isNil ifTrue:[ - (ghostColor notNil - or:[ghostFrameColor notNil - or:[ghostLevel ~~ 0]]) ifTrue:[ - frameBeforeMove := thumbFrame insetBy:1@1 - ] - ]. - - (orientation == #vertical) ifTrue:[ - curr := y. - limit := height - ] ifFalse:[ - curr := x. - limit := width - ]. - - (curr < 0) ifTrue:[ "check against limits" - pos := 0 - ] ifFalse:[ - (curr > limit) ifTrue:[ - pos := limit - ] ifFalse:[ - pos := curr - ] - ]. - - prevOrigin := self thumbOrigin. - newOrigin := self percentFromAbs:(pos - pressOffset). - prevOrigin ~= newOrigin ifTrue:[ - self thumbOrigin:newOrigin. - - synchronousOperation ifTrue: [ - self tellOthers. - ] - ] -! - -buttonMultiPress:button x:x y:y - ^ self buttonPress:button x:x y:y -! - -buttonPress:button x:x y:y - "button was pressed - if above thumb, page up; if below thumb, page down; - otherwise start scrolling" - - |curr limit1 limit2| - - shown ifFalse:[^ self]. - - (orientation == #vertical) ifTrue:[ - curr := y. - limit1 := thumbFrame top. - limit2 := thumbFrame bottom - ] ifFalse:[ - curr := x. - limit1 := thumbFrame left. - limit2 := thumbFrame right - ]. - - (curr < limit1) ifTrue:[ - "page up/left" - self pageUp - ] ifFalse:[ - (curr > limit2) ifTrue:[ - "page down/right" - self pageDown - ] ifFalse:[ - pressOffset := curr - limit1. - scrolling := true - ] - ] -! - -buttonRelease:button x:x y:y - "mouse-button was released - if scroll-mode is asynchronous, the scroll - action is now performed" - - |rect| - - scrolling ifTrue:[ - thumbFrame notNil ifTrue:[ - frameBeforeMove notNil ifTrue:[ - rect := frameBeforeMove. - frameBeforeMove := nil. - self drawThumbBackgroundInX:rect left - y:rect top - width:rect width - height:rect height. - (rect intersects:thumbFrame) ifTrue:[ - self drawThumb - ] - ]. - - scrolling := false. - synchronousOperation ifFalse: [ - self tellOthers. - ] - ] - ] - - "Modified: 23.12.1995 / 12:42:25 / cg" -! - -buttonShiftPress:button x:x y:y - "mouse-click with shift - jump to position" - - |pos curr curr2 limit1 limit2| - - (orientation == #vertical) ifTrue:[ - curr := y. - curr2 := y - (thumbFrame height // 2). - limit1 := height. - limit2 := thumbFrame top - ] ifFalse:[ - curr := x. - curr2 := x - (thumbFrame width // 2). - limit1 := width. - limit2 := thumbFrame left - ]. - - (curr2 < 0) ifTrue:[ "check against limits" - pos := 0 - ] ifFalse:[ - (curr2 > limit1) ifTrue:[ - pos := limit1 - ] ifFalse:[ - pos := curr2 - ] - ]. - - frameBeforeMove := thumbFrame insetBy:1@1. - - self thumbOrigin:(self percentFromAbs:pos). - self tellOthers. - - (orientation == #vertical) ifTrue:[ - limit2 := thumbFrame top - ] ifFalse:[ - limit2 := thumbFrame left - ]. - pressOffset := curr - limit2. - scrolling := true -! - -redraw - "redraw" - - self redrawX:0 y:0 width:width height:height. - self redrawEdges -! - -redrawX:x y:y width:w height:h - shown ifTrue:[ - thumbFrame isNil ifTrue:[self computeThumbFrame]. - self drawThumbBackgroundInX:x y:y width:w height:h. - (y > thumbFrame bottom) ifTrue:[ - ^ self - ]. - ((y + h) < thumbFrame top) ifTrue:[ - ^ self - ]. - self drawThumb - ] -! - -sizeChanged:how - "size of scroller changed - recompute thumbs frame and redraw it" - - |sensor| - - shown ifTrue:[ - self computeThumbFrame. - (sensor := self sensor) notNil ifTrue:[ - self redraw. - sensor flushExposeEventsFor:self - ] - ] -! - -update:something with:aParameter from:changedObject - "handle update from a model (if any)" - - (changedObject == model - "and:[something == aspectMsg]") ifTrue:[ - self thumbOrigin:(model value). - ^ self - ]. - super update:something with:aParameter from:changedObject -! ! - -!Scroller methodsFor:'forced scroll'! - -pageDown - "page down/right" - - self thumbOrigin:(thumbOrigin + thumbHeight). - self tellOthers -! - -pageUp - "page up/left" - - self thumbOrigin:(thumbOrigin - thumbHeight). - self tellOthers -! ! - -!Scroller methodsFor:'forwarding changed origin'! - -tellOthers - |org| - - org := self thumbOrigin. - " - the ST/X way of notifying scrolls - " - scrollAction notNil ifTrue:[ - scrollAction value:org - ]. - " - the ST-80 way of notifying scrolls - " - self sendChangeMessageWith:org. - self changed:#scrollerPosition. -! ! - -!Scroller methodsFor:'initialization'! - -computeInitialExtent - self extent:self preferredExtent -! - -initCursor - "set the cursor - a hand" - - cursor := Cursor hand -! - -initStyle - "initialize style dep. stuff" - - super initStyle. - - DefaultViewBackground notNil ifTrue:[ - viewBackground := DefaultViewBackground on:device. - ]. - DefaultShadowColor notNil ifTrue:[ - shadowColor := DefaultShadowColor on:device. - ]. - DefaultLightColor notNil ifTrue:[ - lightColor := DefaultLightColor on:device. - ]. - - tallyMarks := DefaultTallyMarks. - tallyLevel := DefaultTallyLevel. - DefaultLevel ~~ level ifTrue:[ - self level:DefaultLevel. - ]. - DefaultBorderWidth ~~ borderWidth ifTrue:[ - self borderWidth:DefaultBorderWidth. - ]. - thumbLevel := DefaultThumbLevel. - inset := DefaultInset. - fixThumbHeight := DefaultFixThumbHeight. - thumbEdgeStyle := DefaultEdgeStyle. - - DefaultGhostColor notNil ifTrue:[ - ghostColor := DefaultGhostColor on:device. - ]. - DefaultGhostFrameColor notNil ifTrue:[ - ghostFrameColor := DefaultGhostFrameColor on:device. - ]. - ghostLevel := DefaultGhostLevel. - - DefaultThumbFrameColor notNil ifTrue:[ - thumbFrameColor := DefaultThumbFrameColor on:device. - ]. - DefaultThumbShadowColor notNil ifTrue:[ - thumbShadowColor := DefaultThumbShadowColor - ] ifFalse:[ - thumbShadowColor := shadowColor. - ]. - DefaultThumbLightColor notNil ifTrue:[ - thumbLightColor := DefaultThumbLightColor - ] ifFalse:[ - thumbLightColor := lightColor. - ]. - - thumbEdgeStyle notNil ifTrue:[ - DefaultThumbHalfShadowColor notNil ifTrue:[ - thumbHalfShadowColor := DefaultThumbHalfShadowColor - ]. - DefaultThumbHalfLightColor notNil ifTrue:[ - thumbHalfLightColor := DefaultThumbHalfLightColor - ]. - ]. - - device hasGreyscales ifFalse:[ - thumbEdgeStyle notNil ifTrue:[ - thumbHalfShadowColor := Color darkGrey. - thumbHalfLightColor := White - ]. - - thumbShadowColor := Black. -"/ thumbLightColor := White. +!Scroller methodsFor:'queries'! - styleSheet name = #motif ifTrue:[ - DefaultThumbColor isNil ifTrue:[ - thumbColor := White . - ]. - ] - ]. - - DefaultThumbColor notNil ifTrue:[ - thumbColor := DefaultThumbColor on:device - ] ifFalse:[ - thumbColor := White. - styleSheet name ~= #normal ifTrue:[ - device hasGreyscales ifFalse:[ - thumbColor := Color grey - ]. - ]. - ]. - - thumbColor := thumbColor on:device. - thumbShadowColor notNil ifTrue:[ - thumbShadowColor := thumbShadowColor on:device. - ]. - thumbLightColor notNil ifTrue:[ - thumbLightColor := thumbLightColor on:device. - ]. - thumbHalfShadowColor notNil ifTrue:[ - thumbHalfShadowColor := thumbHalfShadowColor on:device. - ]. - thumbHalfLightColor notNil ifTrue:[ - thumbHalfLightColor := thumbHalfLightColor on:device. - ]. - thumbEdgeStyle notNil ifTrue:[ - thumbHalfShadowColor isNil ifTrue:[ - thumbHalfShadowColor := thumbShadowColor lightened on:device - ] - ]. - - styleSheet name = #next ifTrue:[ - shadowForm := self class handleShadowFormOn:device. - lightForm := self class handleLightFormOn:device - ] ifFalse:[ - shadowForm := lightForm := nil - ]. - - drawableId notNil ifTrue:[ - self computeThumbFrame - ] -! - -initialize - "initialize - setup instvars from defaults" - - super initialize. - self computeInitialExtent. - orientation := #vertical. - - scrolling := false. - synchronousOperation := true. - - thumbOrigin := 0. - thumbHeight := 100. - thumbFrameSizeDifference := 0. - - rangeStart := 0. - rangeEnd := 100. - rangeStep := nil. "/ meaning: arbitrary precision -"/ inset := 1. - -"/ self computeThumbFrame -! - -realize - super realize. - model notNil ifTrue:[ - self thumbOrigin:(model value). - ]. -! ! - -!Scroller methodsFor:'private'! - -absFromPercent:percent - "given a percentage, compute number of pixels" - - |fullSize| - - (orientation == #vertical) ifTrue:[ - fullSize := height - ] ifFalse:[ - fullSize := width - ]. -"/ ^ ((percent * (fullSize - (margin * 2))) / 100) rounded -"/ 20-apr-94 - - ^ ((percent * (fullSize - thumbFrameSizeDifference- (margin * 2))) / 100) rounded -! - -computeThumbFrame - "compute the thumbs frame (a rectangle) whenever thumb is moved, - changed height or the scrollers size has changed. - We take care, that the thumb will not become too small (i.e. - invisible or uncatchable). - Also, for mswindows style, its height/width is constant." - - |newPos1 newPos2 newSize1 newSize2 nh nw ny nx - computedSize minSz sz1 sz2| - - "compute position & size" - newPos1 := (self absFromPercent:thumbOrigin) + margin. - newSize1 := computedSize := self absFromPercent:thumbHeight. - (orientation == #vertical) ifTrue:[ - sz1 := height. - sz2 := width - ] ifFalse:[ - sz1 := width. - sz2 := height - ]. - - " - do we have to adjust the computed size ? - " - newPos2 := margin + inset. - newSize2 := sz2 - (2 * newPos2). -"/ (style ~~ #normal) ifTrue:[ - thumbLevel ~~ 0 ifTrue:[ - " - do not make thumb too small (for handle & to be catchable) - " - minSz := 10 + (2 * thumbLevel) - ] ifFalse:[ - " - do not make thumb too small (uncatchable) - " - minSz := 4 - ]. - - (newSize1 < minSz) ifTrue:[ - newSize1 := minSz. - thumbFrameSizeDifference := newSize1 - computedSize - ] ifFalse:[ - thumbFrameSizeDifference := 0. - ]. - - fixThumbHeight ifTrue:[ - "have a fix-size thumb (i.e. mswindows style)" - - newSize1 := sz2 - (2 * inset). "make it square" - thumbFrameSizeDifference := newSize1 - computedSize. - ]. - - " - oops - if height does not relect real visibible area, we have to adjust the origin - " - (thumbFrameSizeDifference == 0) ifFalse:[ - newPos1 := (self absFromPercent:thumbOrigin) + margin. -"/ newPos1 := ((thumbOrigin * (sz1 - thumbFrameSizeDifference - (margin * 2))) / 100) rounded + margin - ]. - - (orientation == #vertical) ifTrue:[ - ny := newPos1. - nx := newPos2. - nh := newSize1. - nw := newSize2. - ny + nh + margin > height ifTrue:[ - ny := height - margin - nh - ] - ] ifFalse:[ - nx := newPos1. - ny := newPos2. - nw := newSize1. - nh := newSize2. - nx + nw + margin > width ifTrue:[ - nx := width - margin - nw - ] - ]. - - " - do not create new Rectangle if its the same anyway - " - thumbFrame notNil ifTrue:[ - (ny == thumbFrame top) ifTrue:[ - (nx == thumbFrame left) ifTrue:[ - (nh == thumbFrame height) ifTrue:[ - (nw == thumbFrame width) ifTrue:[ ^ self] - ] - ] - ] - ]. - thumbFrame := Rectangle left:nx top:ny width:nw height:nh -! - -percentFromAbs:absValue - "given a number of pixels, compute percentage" - - |fullSize val t| - - (orientation == #vertical) ifTrue:[ - fullSize := height - ] ifFalse:[ - fullSize := width - ]. - - t := fullSize - thumbFrameSizeDifference - (margin * 2). - t = 0 ifTrue:[ - "/ in rare cases, this happens ... - val := 0 - ] ifFalse:[ - val := absValue / t * (rangeEnd - rangeStart). - ]. - val := val + rangeStart. - - val < rangeStart ifTrue:[^ rangeStart]. - val > rangeEnd ifTrue:[^ rangeEnd]. - ^ val - -! ! - -!Scroller methodsFor:'private-scrollView interface'! - -setThumbFor:aView - "get contents and size info from aView and adjust thumb" - - |percentSize percentOrigin contentsSize contentsPosition viewsSize| - - " - get the content's size - " - aView isNil ifTrue:[ - contentsSize := 0 - ] ifFalse:[ - orientation == #vertical ifTrue:[ - contentsSize := aView heightOfContents. - aView transformation notNil ifTrue:[ - contentsSize := aView transformation applyScaleY:contentsSize. - ]. - ] ifFalse:[ - contentsSize := aView widthOfContents. - aView transformation notNil ifTrue:[ - contentsSize := aView transformation applyScaleX:contentsSize. - ]. - ] - ]. - - (contentsSize = 0) ifTrue:[ - percentSize := 100. - percentOrigin := 100 - ] ifFalse:[ - (orientation == #vertical) ifTrue:[ - viewsSize := aView innerHeight. - contentsPosition := aView yOriginOfContents. - ] ifFalse:[ - viewsSize := aView innerWidth. - contentsPosition := aView xOriginOfContents - ]. - - percentSize := viewsSize * 100.0 / contentsSize. - percentOrigin := contentsPosition * 100.0 / contentsSize. - percentOrigin + percentSize > 100.0 ifTrue:[ - "actually showing stuff below contents of view" -" - contentsSize := contentsPosition + aView innerHeight. - percentSize := viewsSize * 100.0 / contentsSize. - percentOrigin := contentsPosition * 100.0 / contentsSize -" - ] - ]. - (percentSize = thumbHeight) ifTrue:[ - self thumbOrigin:percentOrigin - ] ifFalse:[ - (percentOrigin = thumbOrigin) ifTrue:[ - self thumbHeight:percentSize - ] ifFalse:[ - self thumbOrigin:percentOrigin thumbHeight:percentSize - ] - ] -! - -setThumbHeightFor:aView - "get contents and size info from aView and adjust thumb height" - - |percent total viewsSize| - - (orientation == #vertical) ifTrue:[ - total := aView heightOfContents. - aView transformation notNil ifTrue:[ - total := aView transformation applyScaleY:total. - ]. - ] ifFalse:[ - total := aView widthOfContents. - aView transformation notNil ifTrue:[ - total := aView transformation applyScaleX:total. - ]. - ]. - (total = 0) ifTrue:[ - percent := 100 - ] ifFalse:[ - viewsSize := (orientation == #vertical) ifTrue:[aView innerHeight] - ifFalse:[aView innerWidth]. - percent := viewsSize * 100.0 / total - ]. - self thumbHeight:percent -! - -setThumbOriginFor:aView - "get contents and size info from aView and adjust thumb origin" - - |percent total contentsPosition| - - (orientation == #vertical) ifTrue:[ - total := aView heightOfContents. - aView transformation notNil ifTrue:[ - total := aView transformation applyScaleY:total. - ]. - ] ifFalse:[ - total := aView widthOfContents. - aView transformation notNil ifTrue:[ - total := aView transformation applyScaleX:total. +otal := aView transformation applyScaleX:total. ]. ]. (total = 0) ifTrue:[ @@ -1574,18 +2217,8 @@ self thumbOrigin:percent ! ! -!Scroller methodsFor:'queries'! - -preferredExtent - |w h| - - h := self class defaultExtent y. - w := (device horizontalPixelPerMillimeter asFloat * 6) rounded. - ^ w @ h. -! ! - !Scroller class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libwidg/Scroller.st,v 1.36 1996-03-01 18:16:46 cg Exp $' + ^ '$Header: /cvs/stx/stx/libwidg/Scroller.st,v 1.37 1996-03-01 18:48:00 cg Exp $' ! !