--- a/DataSetColumn.st Sun Aug 23 15:14:03 1998 +0200
+++ b/DataSetColumn.st Sun Aug 23 15:14:46 1998 +0200
@@ -14,10 +14,10 @@
Object subclass:#DataSetColumn
- instanceVariableNames:'columnNumber dataSet labelExtent minWidth width description form
- buttonInset buttonExtent textInset drawableAction toggleExtent
- rendererType backgroundColor foregroundColor fgSelector
- bgSelector columnAlignment label readSelector columnAdaptor'
+ instanceVariableNames:'columnNumber dataSet minWidth width description buttonExtent
+ drawableAction rendererType backgroundColor foregroundColor
+ fgSelector bgSelector columnAlignment label readSelector
+ columnAdaptor'
classVariableNames:''
poolDictionaries:''
category:'Views-DataSet'
@@ -50,23 +50,15 @@
columnNumber <Integer> sequence number (into list of columns)
- description <DataSetColumnSpec> the column description
-
dataSet <DSVColumnView> the view it belongs to
- width <Integer> width of column
-
minWidth <Integer> minimum required width by the column
- buttonInset <Integer> top inset of a button (toggle)
-
- buttonExtent <Point> extent of form
+ width <Integer> width of column
- textInset <Integer> top inset of a string
+ description <DataSetColumnSpec> the column description
- form <Form> a form drawn in the cell
-
- labelExtent <Point> the preferred extent of the cell label on device
+ buttonExtent <Point> extent of drawable form
drawableAction <Action> action to access the printable
label of a cell
@@ -86,6 +78,12 @@
bgSelector <Selector or nil> access specific background color for
a cell
+ columnAlignment <Symbol> align text/icon #left #right or #center
+ in row (on default: #left).
+
+ label <label/icon or nil> label resolved by the builder shown
+ in the column description field.
+
readSelector <Symbol> cached readSelector (from the spec)
columnAdaptor <nil or any> if non-nil, that one is asked (via
@@ -189,7 +187,11 @@
width := width + (dataSet font widthOn:dataSet device)
].
].
- width := (width + buttonExtent x) max:(4 + labelExtent x)
+ width := width + buttonExtent x.
+
+ label notNil ifTrue:[
+ width := width max:(4 + (label widthOn:dataSet))
+ ]
].
^ width := minWidth := width + dataSet separatorSize + (2 * dataSet horizontalSpacing).
!
@@ -209,182 +211,141 @@
!DataSetColumn methodsFor:'drawing'!
-drawButtonAtIndex:anIndex x:xR y:yR with:fgColor and:bgColor
- |y0 x0 extent lv w|
+drawCheckTogglesX:xTop y:yTop from:start to:stop with:fgColor and:bgColor
+ "draw CheckToggles between start and stop
+ "
+ |extent toggleForm
+ toggleLevel "{ Class:SmallInteger }"
+ toggleWidth "{ Class:SmallInteger }"
+ toggleHeight "{ Class:SmallInteger }"
+ separatorSz "{ Class:SmallInteger }"
+ height "{ Class:SmallInteger }"
+ y "{ Class:SmallInteger }"
+ x "{ Class:SmallInteger }"
+ |
+ toggleForm := dataSet checkToggleForm.
+ toggleHeight := buttonExtent y.
+ toggleWidth := buttonExtent x.
+ toggleLevel := dataSet checkToggleLevel.
+ height := dataSet rowHeight.
+ extent := (buttonExtent - toggleForm extent) // 2.
+ separatorSz := dataSet separatorSize - 1.
- w := buttonExtent x.
+ y := yTop + (height - toggleHeight - separatorSz // 2).
+ x := xTop + (width - toggleWidth - separatorSz // 2).
+
+ start to:stop do:[:aRowNr|
+ dataSet drawEdgesAtX:x y:y width:toggleWidth height:toggleHeight level:toggleLevel.
- rendererType ~~ #CheckToggle ifTrue:[
- (self hasChoices:anIndex) ifFalse:[
- ^ self
+ (self extractColFromRow:(dataSet at:aRowNr)) ifTrue:[
+ (dataSet isRowSelected:aRowNr) ifFalse:[dataSet paint:fgColor on:bgColor]
+ ifTrue:[dataSet paint:(dataSet hgLgFgColor) on:(dataSet hgLgBgColor)].
+
+ dataSet displayImage:toggleForm x:(x + extent x) y:(y + extent y).
].
- lv := dataSet comboButtonLevel.
- x0 := width - w - 4
- ] ifFalse:[
- lv := dataSet checkToggleLevel.
- x0 := width - w - (dataSet separatorSize) + 1 // 2
- ].
-
- y0 := yR + buttonInset.
- x0 := xR + x0.
+ y := y + height.
+ ]
- dataSet drawEdgesAtX:x0 y:y0 width:w height:(buttonExtent y) level:lv.
-
- (rendererType ~~ #CheckToggle or:[self at:anIndex]) ifTrue:[
- (dataSet isRowSelected:anIndex) ifFalse:[dataSet paint:fgColor on:bgColor]
- ifTrue:[dataSet paint:(dataSet hgLgFgColor)
- on:(dataSet hgLgBgColor)
- ].
- extent := (buttonExtent - form extent) // 2.
- dataSet displayImage:form x:(x0 + extent x) y:(y0 + extent y)
- ].
!
-drawFrom:start times:nTimes x0:x0 yTop:yTop yBot:yBot with:fgColor and:bgColor
+drawComboButtonsX:xTop y:yTop from:start to:stop with:fgColor and:bgColor
+ "draw ComboButtons between start and stop
+ "
+ |extent buttonForm
+ buttonLevel "{ Class:SmallInteger }"
+ buttonWidth "{ Class:SmallInteger }"
+ buttonHeight "{ Class:SmallInteger }"
+ height "{ Class:SmallInteger }"
+ y "{ Class:SmallInteger }"
+ x "{ Class:SmallInteger }"
+ |
+ buttonForm := dataSet comboButtonForm.
+ buttonLevel := dataSet comboButtonLevel.
+ buttonWidth := buttonExtent x.
+ buttonHeight := buttonExtent y.
+ height := dataSet rowHeight.
+ extent := (buttonExtent - buttonForm extent) // 2.
+
+ y := yTop + (height - buttonHeight - (dataSet separatorSize) // 2).
+ x := xTop + (width - buttonWidth - 4).
+
+ start to:stop do:[:aRowNr|
+ (self hasChoices:aRowNr) ifTrue:[
+ dataSet drawEdgesAtX:x y:y width:buttonWidth height:buttonHeight level:buttonLevel.
+
+ (dataSet isRowSelected:aRowNr) ifFalse:[dataSet paint:fgColor on:bgColor]
+ ifTrue:[dataSet paint:(dataSet hgLgFgColor)
+ on:(dataSet hgLgBgColor)
+ ].
+
+ dataSet displayImage:buttonForm x:(x + extent x) y:(y + extent y)
+ ].
+ y := y + height.
+ ]
+!
+
+drawSeparatorsX:xTop y:yTop from:start to:stop with:fgColor
"redraw rows between start and stop
"
- |lgCol dkCol fg bg lblFg lblBg lbl row colSp sepSz sel
+ |lgCol showColSeparator showRowSeparator yBot
h "{ Class:SmallInteger }"
- n "{ Class:SmallInteger }"
y "{ Class:SmallInteger }"
x "{ Class:SmallInteger }"
- xCol "{ Class:SmallInteger }"
- spacing "{ Class:SmallInteger }"|
-
- h := dataSet rowHeight.
-
- (bg := backgroundColor) isNil ifTrue:[
- bg := bgColor
- ] ifFalse:[
- dataSet paint:(dataSet colorOnDevice:bg).
- dataSet fillRectangleX:x0 y:yTop width:width height:(yBot - yTop - 1)
- ].
- fg := foregroundColor ? fgColor.
- lgCol := dataSet hgLgFgColor.
- dkCol := dataSet hgLgBgColor.
- sepSz := dataSet separatorSize.
- spacing := dataSet horizontalSpacing.
- y := yTop + textInset.
- x := x0 + spacing.
- n := start.
-
- nTimes timesRepeat:[
- row := dataSet at:n.
- sel := dataSet isSelected:n inColumn:columnNumber.
-
- rendererType == #rowSelector ifTrue:[
- sel ifTrue:[
- lbl := form.
- sel := false.
- ] ifFalse:[
- lbl := nil
- ]
- ] ifFalse:[
- lbl := drawableAction value:row
- ].
+ n "{ Class:SmallInteger }"
+ |
+ h := dataSet rowHeight.
+ x := xTop + width - 1.
+ n := stop - start + 1.
- sel ifTrue:[
- dataSet paint:dkCol.
- dataSet fillRectangleX:x0 y:y - textInset width:width height:(h - 2).
- lbl isText ifTrue:[lbl := lbl string].
- lblBg := dkCol.
- lblFg := lgCol.
- ] ifFalse:[
- (bgSelector notNil and:[(lblBg := row perform:bgSelector) notNil]) ifTrue:[
- dataSet paint:(lblBg := dataSet colorOnDevice:lblBg).
- dataSet fillRectangleX:x0 y:y - textInset width:width height:(h - 2).
- ] ifFalse:[
- lblBg := bg
- ].
- lbl notNil ifTrue:[
- (fgSelector notNil and:[(lblFg := row perform:fgSelector) notNil]) ifFalse:[
- lblFg := fg.
- ] ifTrue:[
- lblFg := dataSet colorOnDevice:lblFg.
- ].
- ]
- ].
- lbl notNil ifTrue:[
- columnAlignment == #left ifTrue:[
- xCol := x
- ] ifFalse:[
- xCol := width - (lbl widthOn:dataSet).
-
- columnAlignment == #right ifTrue:[xCol := xCol - spacing]
- ifFalse:[xCol := xCol // 2].
-
- xCol := (x0 + xCol) max:0.
- ].
- dataSet paint:lblFg on:lblBg.
- lbl displayOn:dataSet x:xCol y:y
- ].
- y := y + h.
- n := n + 1.
+ (showColSeparator := description showColSeparator) ifTrue:[
+ yBot := yTop - 1 + (h * n).
+ ] ifFalse:[
+ (showRowSeparator := description showRowSeparator) ifFalse:[
+ ^ self
+ ]
].
- (form notNil and:[rendererType ~~ #rowSelector]) ifTrue:[
- y := yTop.
- n := start.
-
- nTimes timesRepeat:[
- self drawButtonAtIndex:n x:x0 y:y with:fgColor and:bgColor.
- y := y + h.
- n := n + 1.
- ].
- ].
-
- "/ DRAW SEPARATORS
-
- x := x0 + width - 1.
-
- sepSz == 1 ifTrue:[
- y := yTop.
-
+ dataSet separatorSize == 1 ifTrue:[
dataSet paint:fgColor.
- description showColSeparator ifTrue:[
- dataSet displayLineFromX:x y:yTop toX:x y:yBot - 1
+ showColSeparator ifTrue:[
+ dataSet displayLineFromX:x y:yTop toX:x y:yBot
].
-
- description showRowSeparator ifTrue:[
+ showRowSeparator ifTrue:[
y := yTop - 1.
- nTimes timesRepeat:[
+ n timesRepeat:[
y := y + h.
- dataSet displayLineFromX:x0 y:y toX:x y:y
+ dataSet displayLineFromX:xTop y:y toX:x y:y
]
]
] ifFalse:[
- dkCol := dataSet separatorDarkColor.
lgCol := dataSet separatorLightColor.
- (colSp := description showColSeparator) ifTrue:[
- y := yBot - 1.
+ showColSeparator ifTrue:[
dataSet paint:lgCol.
- dataSet displayLineFromX:x y:yTop toX:x y:y.
+ dataSet displayLineFromX:x y:yTop toX:x y:yBot.
x := x - 1.
- dataSet paint:dkCol.
- dataSet displayLineFromX:x y:yTop toX:x y:y.
+ dataSet paint:(dataSet separatorDarkColor).
+ dataSet displayLineFromX:x y:yTop toX:x y:yBot.
] ifFalse:[
- dataSet paint:dkCol
+ dataSet paint:(dataSet separatorDarkColor).
+ x := x + 1.
].
- description showRowSeparator ifTrue:[
+ showRowSeparator ifTrue:[
y := yTop - 2.
- x := x0 + width.
- colSp ifTrue:[x := x - 2].
-
- nTimes timesRepeat:[
+ n timesRepeat:[
y := y + h.
- dataSet displayLineFromX:x0 y:y toX:x y:y.
+ dataSet displayLineFromX:xTop y:y toX:x y:y.
].
y := yTop - 1.
dataSet paint:lgCol.
- nTimes timesRepeat:[
+ n timesRepeat:[
y := y + h.
- dataSet displayLineFromX:x0 y:y toX:x y:y.
+ dataSet displayLineFromX:xTop y:y toX:x y:y.
]
]
]
@@ -396,6 +357,104 @@
"
minWidth := width := nil.
+!
+
+redrawX:xTop y:yTop from:start to:stop with:fgColor and:bgColor
+ "redraw rows between start and stop
+ "
+ |lgCol dkCol fg bg lblFg lblBg label row sel
+ h "{ Class:SmallInteger }"
+ y "{ Class:SmallInteger }"
+ x "{ Class:SmallInteger }"
+ lblX "{ Class:SmallInteger }"
+ space "{ Class:SmallInteger }"
+ inset "{ Class:SmallInteger }"
+ |
+ h := dataSet rowHeight.
+
+ (bg := backgroundColor) isNil ifTrue:[
+ bg := bgColor
+ ] ifFalse:[
+ dataSet paint:(dataSet colorOnDevice:bg).
+ dataSet fillRectangleX:xTop y:yTop width:width height:(h * (stop - start + 1) - 1)
+ ].
+ fg := foregroundColor ? fgColor.
+ lgCol := dataSet hgLgFgColor.
+ dkCol := dataSet hgLgBgColor.
+ space := dataSet horizontalSpacing.
+ inset := dataSet rowFontAscent.
+ y := yTop.
+ x := xTop + space.
+
+ start to:stop do:[:anIndex|
+ row := dataSet at:anIndex.
+ sel := dataSet isSelected:anIndex inColumn:columnNumber.
+
+ rendererType == #rowSelector ifTrue:[
+ sel ifTrue:[
+ label := dataSet rowSelectorForm.
+ sel := false.
+ ] ifFalse:[
+ label := nil
+ ]
+ ] ifFalse:[
+ label := drawableAction value:row
+ ].
+
+ sel ifTrue:[
+ dataSet paint:dkCol.
+ dataSet fillRectangleX:xTop y:y width:width height:(h - 2).
+ label isText ifTrue:[label := label string].
+ lblBg := dkCol.
+ lblFg := lgCol.
+ ] ifFalse:[
+ (bgSelector notNil and:[(lblBg := row perform:bgSelector) notNil]) ifTrue:[
+ dataSet paint:(lblBg := dataSet colorOnDevice:lblBg).
+ dataSet fillRectangleX:xTop y:y width:width height:(h - 2).
+ ] ifFalse:[
+ lblBg := bg
+ ].
+ label notNil ifTrue:[
+ (fgSelector notNil and:[(lblFg := row perform:fgSelector) notNil]) ifFalse:[
+ lblFg := fg.
+ ] ifTrue:[
+ lblFg := dataSet colorOnDevice:lblFg.
+ ].
+ ]
+ ].
+ label notNil ifTrue:[
+ columnAlignment == #left ifTrue:[
+ lblX := x
+ ] ifFalse:[
+ lblX := width - (label widthOn:dataSet).
+
+ columnAlignment == #right ifTrue:[lblX := lblX - space]
+ ifFalse:[lblX := lblX // 2].
+
+ lblX := (xTop + lblX) max:0.
+ ].
+ dataSet paint:lblFg on:lblBg.
+
+ label isImageOrForm ifFalse:[
+ label displayOn:dataSet x:lblX y:(y + inset)
+ ] ifTrue:[
+ label displayOn:dataSet x:lblX y:y + ((h - label height - dataSet separatorSize) // 2)
+ ]
+ ].
+ y := y + h.
+ ].
+
+ "/ DRAW FORM
+ rendererType == #CheckToggle ifTrue:[
+ self drawCheckTogglesX:xTop y:yTop from:start to:stop with:fgColor and:bgColor
+ ] ifFalse:[
+ (rendererType == #ComboList or:[rendererType == #ComboBox]) ifTrue:[
+ self drawComboButtonsX:xTop y:yTop from:start to:stop with:fgColor and:bgColor
+ ]
+ ].
+
+ "/ DRAW SEPARATORS
+ self drawSeparatorsX:xTop y:yTop from:start to:stop with:fgColor
! !
!DataSetColumn methodsFor:'editing'!
@@ -420,48 +479,6 @@
].
^ super doesNotUnderstand:aMessage
-!
-
-textInsetChanged:aTextInset
- "recompute all attributes
- "
- |lbl|
-
- self containsText ifTrue:[
- textInset := dataSet verticalSpacing.
-
- dataSet size ~~ 0 ifTrue:[
- lbl := self drawableAt:1.
-
- (lbl isString or:[lbl isNumber]) ifTrue:[
- textInset := aTextInset
- ] ifFalse:[
- (lbl isNil and:[description printSelector isNil]) ifTrue:[
- textInset := aTextInset.
- ]
- ]
- ]
- ] ifFalse:[
- textInset := ( (dataSet rowHeight)
- - (form height)
- - (dataSet separatorSize)
- ) // 2.
- ].
-
- form isNil ifTrue:[
- buttonInset := 0
- ] ifFalse:[
- buttonInset := ( (dataSet rowHeight)
- - (buttonExtent x)
- - (dataSet separatorSize)
- ) // 2.
-
- rendererType == #CheckToggle ifTrue:[
- buttonInset := buttonInset + 1
- ]
- ].
-
-
! !
!DataSetColumn methodsFor:'grow & degrow'!
@@ -505,7 +522,7 @@
dataSet := aDSVColumnView.
description := aDescription.
rendererType := description rendererType.
- form := width := nil.
+ width := nil.
device := dataSet device.
drawableAction := [:aRow| nil ].
fgSelector := description foregroundSelector.
@@ -515,7 +532,6 @@
readSelector := description readSelector.
columnAdaptor := dataSet columnAdaptor.
buttonExtent := 0 @ 0.
- labelExtent := 0 @ 0.
columnAlignment := #left.
backgroundColor notNil ifTrue:[
@@ -542,28 +558,21 @@
]
].
- label notNil ifTrue:[
- labelExtent := Point x:(label widthOn:dataSet) y:(label heightOn:dataSet).
- ].
-
oldFont notNil ifTrue:[
dataSet font:oldFont
].
rendererType == #CheckToggle ifTrue:[
- form := dataSet checkToggleForm.
buttonExtent := dataSet checkToggleExtent.
^ self
].
rendererType == #rowSelector ifTrue:[
- form := dataSet rowSelectorForm.
buttonExtent := dataSet rowSelectorExtent.
^ self
].
(rendererType == #ComboBox or:[rendererType == #ComboList]) ifTrue:[
- form := dataSet comboButtonForm.
buttonExtent := dataSet comboButtonExtent.
] ifFalse:[
columnAlignment := description columnAlignment
@@ -707,6 +716,21 @@
^ (rendererType ~~ #rowSelector and:[rendererType ~~ #CheckToggle])
!
+drawableForm
+ rendererType == #CheckToggle ifTrue:[
+ ^ dataSet checkToggleForm.
+ ].
+ (rendererType == #ComboBox or:[rendererType == #ComboList]) ifTrue:[
+ ^ dataSet comboButtonForm
+ ].
+ rendererType == #rowSelector ifTrue:[
+ ^ dataSet rowSelectorForm
+ ].
+ ^ nil
+
+
+!
+
hasChoices:aRowNr
^ (description choicesFor:(dataSet at:aRowNr)) notNil
!
@@ -716,11 +740,7 @@
"
|hObj hMin end|
- hMin := dataSet font heightOn:dataSet device.
-
- form notNil ifTrue:[
- hMin := hMin max:(buttonExtent y)
- ].
+ hMin := (dataSet font heightOn:dataSet device) max:(buttonExtent y).
(hObj := description height) == 0 ifTrue:[
self containsText ifTrue:[
@@ -777,5 +797,5 @@
!DataSetColumn class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libwidg2/DataSetColumn.st,v 1.28 1998-08-08 11:46:10 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libwidg2/DataSetColumn.st,v 1.29 1998-08-23 13:14:46 ca Exp $'
! !