DataSetColumn.st
changeset 1088 c2e474a7d0f2
parent 1065 332afeb89d6b
child 1089 931865a72ba7
--- 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 $'
 ! !