diff -r e2a1b5f187ef -r e895ac4cc7c8 ListView.st --- a/ListView.st Wed Aug 24 01:38:00 1994 +0200 +++ b/ListView.st Wed Aug 24 01:38:59 1994 +0200 @@ -24,7 +24,8 @@ fontIsFixedWidth fontWidth normalFont boldFont italicFont autoScrollBlock autoScrollDeltaT - searchPattern wordCheck' + searchPattern wordCheck + includesNonStrings' classVariableNames:'' poolDictionaries:'' category:'Views-Text' @@ -34,7 +35,7 @@ COPYRIGHT (c) 1989 by Claus Gittinger All Rights Reserved -$Header: /cvs/stx/stx/libwidg/ListView.st,v 1.8 1994-08-07 13:22:46 claus Exp $ +$Header: /cvs/stx/stx/libwidg/ListView.st,v 1.9 1994-08-23 23:38:21 claus Exp $ '! !ListView class methodsFor:'documentation'! @@ -55,7 +56,7 @@ version " -$Header: /cvs/stx/stx/libwidg/ListView.st,v 1.8 1994-08-07 13:22:46 claus Exp $ +$Header: /cvs/stx/stx/libwidg/ListView.st,v 1.9 1994-08-23 23:38:21 claus Exp $ " ! @@ -142,7 +143,8 @@ textStartTop := topMargin + margin. innerWidth := width - textStartLeft - (margin * 2). self getFontParameters. - wordCheck := [:char | char isNationalAlphaNumeric] + wordCheck := [:char | char isNationalAlphaNumeric]. + includesNonStrings := false ! initStyle @@ -239,7 +241,7 @@ ^ leftMargin ! -setList:aCollection +setList:aCollection expandTabs:expandTabs "set the contents (a collection of strings); dont change position (i.e. do not scroll). This can be used to update a self-changing list @@ -252,7 +254,11 @@ list := aCollection. list notNil ifTrue:[ - self expandTabs + expandTabs ifTrue:[ + self expandTabs + ] ifFalse:[ + includesNonStrings := (list findFirst:[:l | l notNil and:[l isString not]]) ~~ 0. + ] ]. self contentsChanged. shown ifTrue:[ @@ -260,6 +266,15 @@ ] ! +setList:aCollection + "set the contents (a collection of strings); + dont change position (i.e. do not scroll). + This can be used to update a self-changing list + (for example: a file list being shown, without disturbing user too much)" + + ^ self setList:aCollection expandTabs:true +! + list:aCollection "set the contents (a collection of strings) and scroll to top-left" @@ -304,22 +319,30 @@ This can be used to update a self-changing list (for example: a file list being shown, without disturbing user too much)." - something isNil ifTrue:[ - self setList:nil - ] ifFalse:[ - self setList:(something asText) - ] + |l| + + l := something. + l notNil ifTrue:[ + l isString ifTrue:[ + l := l asText + ] + ]. + self setList:l ! contents:something "set the contents (either a string or a Collection of strings) also scroll to top-left" - something isNil ifTrue:[ - self list:nil - ] ifFalse:[ - self list:(something asText) - ] + |l| + + l := something. + l notNil ifTrue:[ + l isString ifTrue:[ + l := l asText + ] + ]. + self list:l ! contents @@ -517,15 +540,33 @@ list isNil ifTrue:[^ 0]. - fontIsFixedWidth ifTrue:[ - max := self lengthOfLongestLine * fontWidth + includesNonStrings ifTrue:[ + max := list + inject:0 + into:[:maxSoFar :entry | + ( + entry isNil ifTrue:[ + 0 + ] ifFalse:[ + entry isString ifTrue:[ + font widthOf:entry + ] ifFalse:[ + entry widthIn:self + ] + ] + ) max:maxSoFar. + ] ] ifFalse:[ - max := 0. - list notNil ifTrue:[ - max := max max:(font widthOf:list) + fontIsFixedWidth ifTrue:[ + max := self lengthOfLongestLine * fontWidth + ] ifFalse:[ + max := 0. + list notNil ifTrue:[ + max := max max:(font widthOf:list) + ]. ]. - ]. - ^ max + (leftMargin * 2) + ^ max + (leftMargin * 2) + ] ! yOriginOfContents @@ -681,6 +722,10 @@ thisLen "{ Class: SmallInteger }" listSize "{ Class: SmallInteger }" | + includesNonStrings ifTrue:[ + ^ width + ]. + fontIsFixedWidth ifTrue:[ ^ (self lengthOfLongestLineBetween:firstLine and:lastLine) * fontWidth ]. @@ -1398,7 +1443,8 @@ |w "{ Class:SmallInteger }" h "{ Class:SmallInteger }" m2 "{ Class:SmallInteger }" - count "{ Class:SmallInteger }"| + count "{ Class:SmallInteger }" + prevFirst| count := nLines. (firstLineShown + nLines + nFullLinesShown > list size) ifTrue:[ @@ -1407,28 +1453,29 @@ count <= 0 ifTrue:[^ self]. self originWillChange. - (count >= nLinesShown) ifTrue:[ - firstLineShown := firstLineShown + count. - self redrawFromVisibleLine:1 to:nLinesShown. - self originChanged:(count negated) - ] ifFalse:[ - m2 := margin * 2. - w := self widthForScrollBetween:firstLineShown - and:(firstLineShown + nLinesShown). - w := w + leftMargin. + prevFirst := firstLineShown. + firstLineShown := firstLineShown + count. + shown ifTrue:[ + (count >= nLinesShown) ifTrue:[ + self redrawFromVisibleLine:1 to:nLinesShown. + ] ifFalse:[ + m2 := margin * 2. + w := self widthForScrollBetween:prevFirst + and:(prevFirst + nLinesShown). + w := w + leftMargin. - firstLineShown := firstLineShown + count. - h := (fontHeight * count) + textStartTop. - self catchExpose. - self copyFrom:self x:margin y:h - toX:margin y:textStartTop - width:w height:(height - m2 - h). + h := (fontHeight * count) + textStartTop. + self catchExpose. + self copyFrom:self x:margin y:h + toX:margin y:textStartTop + width:w height:(height - m2 - h). - self redrawFromVisibleLine:(nFullLinesShown - count + 1) - to:nLinesShown. - self waitForExpose. - self originChanged:(count negated). - ] + self redrawFromVisibleLine:(nFullLinesShown - count + 1) + to:nLinesShown. + self waitForExpose. + ]. + ]. + self originChanged:count. ! scrollDown @@ -1442,7 +1489,8 @@ |w "{ Class:SmallInteger }" h "{ Class:SmallInteger }" - count "{ Class:SmallInteger }"| + count "{ Class:SmallInteger }" + prevFirst| count := nLines. count >= firstLineShown ifTrue:[ @@ -1451,24 +1499,25 @@ (count == 0) ifTrue:[^ self]. self originWillChange. - (count >= nLinesShown) ifTrue:[ - firstLineShown := firstLineShown - count. - self redrawFromVisibleLine:1 to:nLinesShown. - self originChanged:(count negated) - ] ifFalse:[ - w := self widthForScrollBetween:firstLineShown - and:(firstLineShown + nLinesShown). - w := w + leftMargin. - firstLineShown := firstLineShown - count. - h := (fontHeight * count) + topMargin. - self catchExpose. - self copyFrom:self x:margin y:topMargin - toX:margin y:h - width:w height:(height - h - margin). - self redrawFromVisibleLine:1 to:count. - self waitForExpose. - self originChanged:(count negated). - ] + prevFirst := firstLineShown. + firstLineShown := firstLineShown - count. + shown ifTrue:[ + (count >= nLinesShown) ifTrue:[ + self redrawFromVisibleLine:1 to:nLinesShown. + ] ifFalse:[ + w := self widthForScrollBetween:prevFirst + and:(prevFirst + nLinesShown). + w := w + leftMargin. + h := (fontHeight * count) + topMargin. + self catchExpose. + self copyFrom:self x:margin y:topMargin + toX:margin y:h + width:w height:(height - h - margin). + self redrawFromVisibleLine:1 to:count. + self waitForExpose. + ]. + ]. + self originChanged:(count negated). ! scrollUp @@ -1693,16 +1742,20 @@ self paint:bg. - (lineString isNil or:[col > lineString size]) ifTrue:[ - self fillRectangleX:x y:y width:(font widthOf:' ') - height:fontHeight. - self paint:fg + (lineString notNil and:[lineString isString not]) ifTrue:[ + self drawVisibleLine:visLineNr with:fg and:bg ] ifFalse:[ - characterString := (lineString at:col) asString. - self fillRectangleX:x y:y width:(font widthOf:characterString) - height:fontHeight. - self paint:fg. - self displayString:characterString x:x y:(y + fontAscent) + col > lineString size ifTrue:[ + self fillRectangleX:x y:y width:(font width) height:fontHeight. + self paint:fg + ] ifFalse:[ + characterString := (lineString at:col) asString. + self fillRectangleX:x y:y + width:(font widthOf:characterString) + height:fontHeight. + self paint:fg. + self displayString:characterString x:x y:(y + fontAscent) + ] ] ! @@ -1713,27 +1766,31 @@ (endCol >= startCol) ifTrue:[ lineString := self visibleAt:visLineNr. - x := (self xOfCol:startCol inLine:visLineNr) - leftOffset. - y := (self yOfLine:visLineNr). - - len := lineString size. - (startCol > len) ifTrue:[ - len := endCol - startCol + 1. - self paint:bg. - self fillRectangleX:x y:y - width:(fontWidth * len) - height:fontHeight + + (lineString notNil and:[lineString isString not]) ifTrue:[ + self drawVisibleLine:visLineNr with:fg and:bg. ] ifFalse:[ - (endCol > len) ifTrue:[ - characterString := String new:endCol. - characterString replaceFrom:1 to:len with:lineString startingAt:1. - lineString := characterString - ]. - self paint:bg. - self fillRectangleX:x y:y width:(font widthOf:lineString from:startCol to:endCol) - height:fontHeight. - self paint:fg. - self displayString:lineString from:startCol to:endCol x:x y:(y + fontAscent) + x := (self xOfCol:startCol inLine:visLineNr) - leftOffset. + y := (self yOfLine:visLineNr). + len := lineString size. + (startCol > len) ifTrue:[ + len := endCol - startCol + 1. + self paint:bg. + self fillRectangleX:x y:y + width:(fontWidth * len) + height:fontHeight + ] ifFalse:[ + (endCol > len) ifTrue:[ + characterString := String new:endCol. + characterString replaceFrom:1 to:len with:lineString startingAt:1. + lineString := characterString + ]. + self paint:bg. + self fillRectangleX:x y:y width:(font widthOf:lineString from:startCol to:endCol) + height:fontHeight. + self paint:fg. + self displayString:lineString from:startCol to:endCol x:x y:(y + fontAscent) + ] ] ] ! @@ -1754,14 +1811,18 @@ self fillRectangleX:x y:y width:(width + leftOffset - x) height:fontHeight. - + lineString := self visibleAt:visLineNr. lineString notNil ifTrue:[ - index2 := lineString size. - (index2 < index1) ifTrue:[^ self]. - (index1 <= index2) ifTrue:[ - self paint:fg. - self displayString:lineString from:index1 to:index2 x:x y:(y + fontAscent) + lineString isString ifFalse:[ + self drawVisibleLine:visLineNr with:fg and:bg. + ] ifTrue:[ + index2 := lineString size. + (index2 < index1) ifTrue:[^ self]. + (index1 <= index2) ifTrue:[ + self paint:fg. + self displayString:lineString from:index1 to:index2 x:x y:(y + fontAscent) + ] ] ] ! @@ -2018,27 +2079,33 @@ "if area is big enough redraw whole lines" self redrawFromVisibleLine:startLine to:stopLine ] ifFalse:[ - fontIsFixedWidth ifFalse:[ - "start/end col has to be computed for each line" - + includesNonStrings ifTrue:[ startLine to:stopLine do:[:i | - startCol := self colOfX:x inVisibleLine:i. - endCol := self colOfX:(x + w) inVisibleLine:i. - startCol > 0 ifTrue:[ - endCol > 0 ifTrue:[ - self redrawVisibleLine:i from:startCol to:endCol + self redrawVisibleLine:i + ] + ] ifFalse:[ + fontIsFixedWidth ifFalse:[ + "start/end col has to be computed for each line" + + startLine to:stopLine do:[:i | + startCol := self colOfX:x inVisibleLine:i. + endCol := self colOfX:(x + w) inVisibleLine:i. + startCol > 0 ifTrue:[ + endCol > 0 ifTrue:[ + self redrawVisibleLine:i from:startCol to:endCol + ] ] ] - ] - ] ifTrue:[ - "start/end col is the same for all lines" + ] ifTrue:[ + "start/end col is the same for all lines" - startCol := self colOfX:x inVisibleLine:startLine. - endCol := self colOfX:(x + w) inVisibleLine:startLine. - startCol > 0 ifTrue:[ - endCol > 0 ifTrue:[ - startLine to:stopLine do:[:i | - self redrawVisibleLine:i from:startCol to:endCol + startCol := self colOfX:x inVisibleLine:startLine. + endCol := self colOfX:(x + w) inVisibleLine:startLine. + startCol > 0 ifTrue:[ + endCol > 0 ifTrue:[ + startLine to:stopLine do:[:i | + self redrawVisibleLine:i from:startCol to:endCol + ] ] ] ]