--- a/DataSetColumn.st Sun Sep 06 15:15:19 1998 +0200
+++ b/DataSetColumn.st Sun Sep 06 15:16:19 1998 +0200
@@ -15,9 +15,10 @@
Object subclass:#DataSetColumn
instanceVariableNames:'columnNumber dataSet minWidth width description buttonExtent
- drawableAction rendererType drawFormSelector backgroundColor
- foregroundColor fgSelector bgSelector columnAlignment label
- readSelector columnAdaptor'
+ drawableAction rendererType backgroundColor rowSeparatorSelector
+ showColSeparator showRowSeparator foregroundColor fgSelector
+ bgSelector columnAlignment label readSelector
+ numArgsToReadSelector columnAdaptor'
classVariableNames:''
poolDictionaries:''
category:'Views-DataSet'
@@ -86,11 +87,21 @@
readSelector <Symbol> cached readSelector (from the spec)
+ numArgsToReadSelector <Integer> number of arguments to the readSelector
+
columnAdaptor <nil or any> if non-nil, that one is asked (via
read-writeSelectors to extract a column
from a row object.
If nil, the row object is used itself.
+ showColSeparator <Boolean> true: vertical separators are enabled;
+ separator between columns
+
+ showRowSeparator <Boolean> true: horizontal separators are enabled;
+ separator between rows
+
+ rowSeparatorSelector <Selector or nil> access specific showRowSeparator state
+ for a cell
[author:]
Claus Atzkern
@@ -127,7 +138,10 @@
!
backgroundColor
- ^ backgroundColor
+ "returns the background color or nil
+ "
+ ^ backgroundColor == dataSet backgroundColor ifTrue:[nil]
+ ifFalse:[backgroundColor]
!
description
@@ -139,7 +153,10 @@
!
foregroundColor
- ^ foregroundColor
+ "returns the foreground color or nil
+ "
+ ^ foregroundColor == dataSet foregroundColor ifTrue:[nil]
+ ifFalse:[foregroundColor]
!
label
@@ -173,7 +190,7 @@
end := 10 min:dataSet size.
1 to:end do:[:aRowNr||lbl|
- lbl := self drawableAt:aRowNr.
+ lbl := drawableAction value:(dataSet at:aRowNr).
(lbl respondsTo:#widthOn:) ifTrue:[
width := width max:(lbl widthOn:dataSet)
@@ -211,157 +228,123 @@
!DataSetColumn methodsFor:'drawing'!
-drawCheckTogglesX:xTop y:yTop from:start to:stop
- "draw CheckToggles between start and stop
+drawLabelAt:aCellIndex x:xLeft y:yTop h:h
+ "redraw label in cell
"
- |extent form psvForm actForm
- level "{ Class:SmallInteger }"
- rowHg "{ Class:SmallInteger }"
- sepSz "{ Class:SmallInteger }"
- w "{ Class:SmallInteger }"
- h "{ Class:SmallInteger }"
- y "{ Class:SmallInteger }"
- x "{ Class:SmallInteger }"
+ |fg bg label row isSel
+ y "{ Class:SmallInteger }"
+ x "{ Class:SmallInteger }"
|
- form := dataSet checkToggleActiveImage.
- rowHg := dataSet rowHeight.
- sepSz := dataSet separatorSize - 1.
- h := buttonExtent y.
- w := buttonExtent x.
+ row := dataSet at:aCellIndex.
+ y := yTop.
+ x := xLeft.
+
+ isSel := dataSet isSelected:aCellIndex inColumn:columnNumber.
- form isNil ifTrue:[
- form := dataSet checkToggleForm.
- level := dataSet checkToggleLevel.
- extent := (buttonExtent - form extent) // 2.
+ (isSel and:[description showSelectionHighLighted]) ifTrue:[
+ fg := dataSet hgLgFgColor.
+ bg := dataSet hgLgBgColor.
+ ] ifFalse:[
+ (bgSelector notNil and:[(bg := row perform:bgSelector) notNil]) ifTrue:[
+ bg := dataSet colorOnDevice:bg
+ ] ifFalse:[
+ bg := backgroundColor
+ ].
+
+ (fgSelector notNil and:[(fg := row perform:fgSelector) notNil]) ifTrue:[
+ fg := dataSet colorOnDevice:fg
+ ] ifFalse:[
+ fg := foregroundColor
+ ]
+ ].
- y := yTop + (rowHg - h - sepSz // 2).
- x := xTop + (width - w - sepSz // 2).
-
- start to:stop do:[:aRowNr|
- dataSet drawButtonAt:x y:y width:w height:h level:level rownNumber:aRowNr.
+ bg notNil ifTrue:[
+ dataSet paint:bg.
+ dataSet fillRectangleX:x y:y width:width height:h.
+ ] ifFalse:[
+ bg := dataSet backgroundColor.
+ ].
- (self extractColFromRow:(dataSet at:aRowNr)) ifTrue:[
- dataSet displayImage:form x:(x + extent x) y:(y + extent y).
- ].
- y := y + rowHg.
- ]
+ rendererType == #rowSelector ifTrue:[
+ isSel ifFalse:[ ^ self ].
+ label := dataSet rowSelectorForm.
+ x := x + (dataSet horizontalSpacing).
] ifFalse:[
- psvForm := dataSet checkTogglePassiveImage.
- actForm := form.
- extent := (buttonExtent - actForm extent) // 2.
+ (label := drawableAction value:row) isNil ifTrue:[ ^ self ].
- y := yTop + (rowHg - h - sepSz // 2).
- x := xTop + (width - w - sepSz // 2).
+ columnAlignment == #left ifTrue:[
+ x := x + (dataSet horizontalSpacing).
+ ] ifFalse:[
+ x := width - (label widthOn:dataSet).
- start to:stop do:[:aRowNr|
- form := (self extractColFromRow:(dataSet at:aRowNr)) ifTrue:[actForm] ifFalse:[psvForm].
- dataSet displayImage:form x:(x + extent x) y:(y + extent y).
- y := y + rowHg.
+ columnAlignment == #right ifTrue:[x := x - (dataSet horizontalSpacing)]
+ ifFalse:[x := x // 2].
+ x := (xLeft + x) max:0.
]
- ]
+ ].
+
+ y := y + (h - (label heightOn:dataSet) // 2).
+
+ label isImageOrForm ifFalse:[
+ y := y + dataSet rowFontAscent
+ ].
+ dataSet paint:fg on:bg.
+ label displayOn:dataSet x:x y:y
+
+
!
-drawComboButtonsX:xTop y:yTop from:start to:stop
- "draw ComboButtons between start and stop
+drawSeparatorsAt:aCellIndex x:xLeft y:yTop mode3D:is3D
+ "redraw separators for cell
"
- |extent form
- level "{ Class:SmallInteger }"
- rowHg "{ Class:SmallInteger }"
- w "{ Class:SmallInteger }"
- h "{ Class:SmallInteger }"
- y "{ Class:SmallInteger }"
- x "{ Class:SmallInteger }"
+ |xL "{ Class:SmallInteger }"
+ xR "{ Class:SmallInteger }"
+ yB "{ Class:SmallInteger }"
+ yT "{ Class:SmallInteger }"
|
- form := dataSet comboButtonForm.
- level := dataSet comboButtonLevel.
- rowHg := dataSet rowHeight.
- w := buttonExtent x.
- h := buttonExtent y.
- extent := (buttonExtent - form extent) // 2.
+ is3D ifTrue:[dataSet paint:(dataSet separatorDarkColor)]
+ ifFalse:[dataSet paint:(dataSet foregroundColor)].
- y := yTop + (rowHg - h - (dataSet separatorSize) // 2).
- x := xTop + (width - w - 4).
+ xL := xLeft.
+ yT := yTop.
+ xR := xL - 1 + width.
+ yB := yT - 1 + dataSet rowHeight.
- start to:stop do:[:aRowNr|
- (self hasChoices:aRowNr) ifTrue:[
- dataSet drawButtonAt:x y:y width:w height:h level:level rownNumber:aRowNr.
- dataSet displayImage:form x:(x + extent x) y:(y + extent y)
- ].
- y := y + rowHg.
- ]
+ showRowSeparator ifTrue:[
+ ( rowSeparatorSelector isNil or:[aCellIndex == dataSet size
+ or:[((dataSet at:aCellIndex) perform:rowSeparatorSelector) ~~ false]]
+ ) ifTrue:[
+ dataSet displayLineFromX:xL y:yB toX:xR y:yB
+ ]
+ ].
+ showColSeparator ifTrue:[
+ dataSet displayLineFromX:xR y:yT toX:xR y:yB.
+ ].
-!
+ is3D ifFalse:[
+ ^ self
+ ].
-drawSeparatorsX:xTop y:yTop from:start to:stop
- "redraw rows between start and stop
- "
- |lgCol showColSeparator showRowSeparator yBot
- h "{ Class:SmallInteger }"
- y "{ Class:SmallInteger }"
- x "{ Class:SmallInteger }"
- n "{ Class:SmallInteger }"
- |
- h := dataSet rowHeight.
- x := xTop + width - 1.
- n := stop - start + 1.
+ dataSet paint:(dataSet separatorLightColor).
- showRowSeparator := description showRowSeparator.
+ ( columnNumber == 1
+ or:[(dataSet columnAt:(columnNumber - 1)) showColSeparator]
+ ) ifTrue:[
+ dataSet displayLineFromX:xL y:yT toX:xL y:yB.
+ ] ifFalse:[
+ xL := xL - 1.
+ ].
- (showColSeparator := description showColSeparator) ifTrue:[
- yBot := yTop - 1 + (h * n).
- ] ifFalse:[
- showRowSeparator ifFalse:[
- ^ self
+ showRowSeparator ifTrue:[
+ ( rowSeparatorSelector isNil or:[aCellIndex == 1
+ or:[((dataSet at:(aCellIndex - 1)) perform:rowSeparatorSelector) ~~ false]]
+ ) ifTrue:[
+ dataSet displayLineFromX:xL y:yT toX:xR - 1 y:yT.
]
].
- dataSet separatorSize == 1 ifTrue:[
- dataSet paint:(dataSet foregroundColor).
- showColSeparator ifTrue:[
- dataSet displayLineFromX:x y:yTop toX:x y:yBot
- ].
- showRowSeparator ifTrue:[
- y := yTop - 1.
-
- n timesRepeat:[
- y := y + h.
- dataSet displayLineFromX:xTop y:y toX:x y:y
- ]
- ]
- ] ifFalse:[
- lgCol := dataSet separatorLightColor.
-
- showColSeparator ifTrue:[
- dataSet paint:lgCol.
- dataSet displayLineFromX:x y:yTop toX:x y:yBot.
- x := x - 1.
- dataSet paint:(dataSet separatorDarkColor).
- dataSet displayLineFromX:x y:yTop toX:x y:yBot.
- ] ifFalse:[
- dataSet paint:(dataSet separatorDarkColor).
- x := x + 1.
- ].
-
- showRowSeparator ifTrue:[
- y := yTop - 2.
-
- n timesRepeat:[
- y := y + h.
- dataSet displayLineFromX:xTop y:y toX:x y:y.
- ].
- y := yTop - 1.
- dataSet paint:lgCol.
-
- n timesRepeat:[
- y := y + h.
- dataSet displayLineFromX:xTop y:y toX:x y:y.
- ]
- ]
- ]
-
- "Modified: / 24.8.1998 / 16:58:55 / cg"
!
invalidate
@@ -371,101 +354,58 @@
!
-redrawX:xTop y:yTop from:start to:stop
+redrawX:xLeft y:yTop from:start to:stop
"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 }"
+ |is3D
+ h "{ Class:SmallInteger }"
+ x "{ Class:SmallInteger }"
+ y "{ Class:SmallInteger }"
|
h := dataSet rowHeight.
-
- (bg := backgroundColor) isNil ifTrue:[
- bg := dataSet backgroundColor
- ] ifFalse:[
- dataSet paint:(dataSet colorOnDevice:bg).
- dataSet fillRectangleX:xTop y:yTop width:width height:(h * (stop - start + 1) - 1)
- ].
-
- (fg := foregroundColor) isNil ifTrue:[
- fg := dataSet foregroundColor
- ].
- 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
- ].
+ y := yTop.
+ x := xLeft.
- 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)
- ]
- ].
+ "/ DRAW CELL: BACKGROUND/FOREGROUND/LABEL
+ "/ ======================================
+ start to:stop do:[:aCellIndex|
+ self drawLabelAt:aCellIndex x:x y:y h:h.
y := y + h.
].
- "/ DRAW FORM
- drawFormSelector notNil ifTrue:[
- self perform:drawFormSelector with:xTop with:yTop with:start with:stop
+ y := yTop.
+
+ "/ DRAW INDICATORS
+ "/ ===============
+ (rendererType == #ComboBox or:[rendererType == #ComboList]) ifTrue:[
+ start to:stop do:[:aCellIndex|
+ (self hasChoices:aCellIndex) ifTrue:[
+ dataSet drawComboButtonAt:aCellIndex x:x y:y w:width
+ ].
+ y := y + h.
+ ]
+ ] ifFalse:[
+ rendererType == #CheckToggle ifTrue:[
+ start to:stop do:[:aCellIndex|
+ dataSet drawCheckToggleAt:aCellIndex x:x y:y w:width
+ state:(self extractColFromRow:(dataSet at:aCellIndex)).
+ y := y + h.
+ ]
+ ]
].
"/ DRAW SEPARATORS
- self drawSeparatorsX:xTop y:yTop from:start to:stop
+ "/ ===============
+ (showColSeparator or:[showRowSeparator]) ifTrue:[
+ y := yTop.
+ is3D := dataSet has3Dseparators.
+
+ start to:stop do:[:aCellIndex|
+ self drawSeparatorsAt:aCellIndex x:x y:y mode3D:is3D.
+ y := y + h.
+ ]
+ ].
+
! !
!DataSetColumn methodsFor:'editing'!
@@ -527,7 +467,7 @@
on:aDSVColumnView description:aDescription columnNumber:aNumber
"instance creation; set attributes dependent on the description
"
- |device selector format idx type oldFont newFont|
+ |device selector format idx type oldFont newFont args|
columnNumber := aNumber.
dataSet := aDSVColumnView.
@@ -536,20 +476,28 @@
width := nil.
device := dataSet device.
drawableAction := [:aRow| nil ].
+ rowSeparatorSelector := description rowSeparatorSelector.
fgSelector := description foregroundSelector.
bgSelector := description backgroundSelector.
- backgroundColor := description backgroundColor.
- foregroundColor := description foregroundColor.
- readSelector := description readSelector.
+ showColSeparator := description showColSeparator.
+ showRowSeparator := description showRowSeparator.
columnAdaptor := dataSet columnAdaptor.
buttonExtent := 0 @ 0.
columnAlignment := #left.
- drawFormSelector := nil.
- backgroundColor notNil ifTrue:[
+ (readSelector := description readSelector) notNil ifTrue:[
+ numArgsToReadSelector := readSelector numArgs.
+ ] ifFalse:[
+ numArgsToReadSelector := 0
+ ].
+
+ (backgroundColor := description backgroundColor) notNil ifTrue:[
backgroundColor := backgroundColor on:dataSet device
].
- foregroundColor notNil ifTrue:[
+
+ (foregroundColor := description foregroundColor) isNil ifTrue:[
+ foregroundColor := dataSet foregroundColor
+ ] ifFalse:[
foregroundColor := foregroundColor on:dataSet device
].
@@ -575,8 +523,7 @@
].
rendererType == #CheckToggle ifTrue:[
- buttonExtent := dataSet checkToggleExtent.
- drawFormSelector := #drawCheckTogglesX:y:from:to:.
+ buttonExtent := dataSet checkToggleExtent.
^ self
].
@@ -587,7 +534,6 @@
(rendererType == #ComboBox or:[rendererType == #ComboList]) ifTrue:[
buttonExtent := dataSet comboButtonExtent.
- drawFormSelector := #drawComboButtonsX:y:from:to:.
] ifFalse:[
columnAlignment := description columnAlignment
].
@@ -595,7 +541,16 @@
selector := description printSelector.
selector notNil ifTrue:[
- drawableAction := [:aRow| aRow perform:selector with:dataSet ].
+ args := selector numArgs.
+ args == 0 ifTrue:[
+ drawableAction := [:aRow| aRow perform:selector ]
+ ] ifFalse:[
+ args == 1 ifTrue:[
+ drawableAction := [:aRow| aRow perform:selector with:dataSet ]
+ ] ifFalse:[
+ drawableAction := [:aRow| aRow perform:selector with:dataSet with:columnNumber ]
+ ]
+ ].
^ self
].
@@ -641,9 +596,7 @@
].
description translateLabel == true ifTrue:[
(appl := aBuilder application) notNil ifTrue:[
- (l2 := appl resources string:label) notNil ifTrue:[
- ^ l2
- ]
+ (l2 := appl resources string:label) notNil ifTrue:[^ l2]
]
]
].
@@ -652,24 +605,16 @@
!DataSetColumn methodsFor:'private'!
-drawableAt:aRowNr
- "get the drawable label at an index
- "
- ^ drawableAction value:(dataSet at:aRowNr)
-!
+extractColFromRow:aRow
-extractColFromRow:aRow
- |numArgs|
-
- numArgs := readSelector numArgs.
columnAdaptor notNil ifTrue:[
- numArgs == 1 ifTrue:[
+ numArgsToReadSelector == 1 ifTrue:[
^ columnAdaptor perform:readSelector with:aRow
].
^ columnAdaptor perform:readSelector with:aRow with:columnNumber
].
- numArgs == 0 ifTrue:[
+ numArgsToReadSelector == 0 ifTrue:[
^ aRow perform:readSelector
].
^ aRow perform:readSelector with:columnNumber
@@ -747,7 +692,7 @@
end := 10 min:dataSet size.
1 to:end do:[:aRowNr| |lbl|
- lbl := self drawableAt:aRowNr.
+ lbl := drawableAction value:(dataSet at:aRowNr).
lbl notNil ifTrue:[
(lbl respondsTo:#heightOn:) ifTrue:[
@@ -761,6 +706,12 @@
]
].
^ hMin max:hObj.
+!
+
+showColSeparator
+ "returns true if column separator is on
+ "
+ ^ showColSeparator
! !
!DataSetColumn methodsFor:'searching'!
@@ -776,9 +727,10 @@
char := aChar asLowercase.
start to:stop do:[:aRowNr| |lbl|
- lbl := self drawableAt:aRowNr.
+ lbl := drawableAction value:(dataSet at:aRowNr).
- lbl isString ifTrue:[
+ (lbl respondsTo:#string) ifTrue:[
+ lbl := lbl string.
(lbl size ~~ 0 and:[(lbl at:1) asLowercase == char]) ifTrue:[
^ aRowNr
]
@@ -796,5 +748,5 @@
!DataSetColumn class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libwidg2/DataSetColumn.st,v 1.32 1998-08-29 13:48:12 ca Exp $'
+ ^ '$Header: /cvs/stx/stx/libwidg2/DataSetColumn.st,v 1.33 1998-09-06 13:16:19 ca Exp $'
! !