DataSetColumn.st
changeset 1113 6b0513d33566
parent 1100 376515452be4
child 1115 7f3f4581c3d3
--- 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 $'
 ! !