# HG changeset patch # User ca # Date 891679557 -7200 # Node ID d15daece0c548f3882c0ecba49edc9fb04817fe8 # Parent 5d437be03bcf65113c664bbe96ac8055844b87a0 optimize algorithm to get list from model and to recompute width of longest line diff -r 5d437be03bcf -r d15daece0c54 SelTreeV.st --- a/SelTreeV.st Sat Apr 04 08:48:46 1998 +0200 +++ b/SelTreeV.st Sat Apr 04 10:45:57 1998 +0200 @@ -814,7 +814,7 @@ buttonPress:button x:x y:y "check for indicator " - |expand node lineNr oldSize isExpandable| + |expand node lineNr isExpandable| lineNr := self indicatiorLineForButton:button atX:x y:y. @@ -868,16 +868,7 @@ self redrawLine:lineNr. ] ifFalse:[ "/ with children; update list and redraw to end. - oldSize := list size. - model removeDependent:self. - model recomputeList. - model addDependent:self. - list := self listFromModel. - - oldSize ~~ list size ifTrue:[ - self redrawFromLine:lineNr. - self contentsChanged. - ] + self recomputeListFromNodeAt:lineNr ] @@ -1252,19 +1243,30 @@ "get list from model and return the new list. If listMessage is nil, try aspectMessage for backward compatibilty. " - |msg| - + |msg list + runs "{ Class: SmallInteger }" + idx "{ Class: SmallInteger }" + | widthOfWidestLine := nil. (msg := listMsg ? aspectMsg) notNil ifTrue:[ listOfNodes := model perform:msg. - listOfNodes size ~~ 0 ifTrue:[ + + (runs := listOfNodes size) ~~ 0 ifTrue:[ self refetchDeviceResources. - ^ listOfNodes collect:[:n|n name] + idx := 1. + list := OrderedCollection new:runs. + + runs timesRepeat:[ + list add:(listOfNodes at:idx) name. + idx := idx + 1. + ]. + ^ list ] ]. listOfNodes := #(). ^ #() + ! model:aModel @@ -1359,7 +1361,7 @@ "setup new list; keep selection dependent on the boolean state keepSelection " - |list| + |list time| list := aList. @@ -1399,15 +1401,21 @@ self redrawLine:anIndex. ] ifFalse:[ "/ with children; update list and redraw to end. - model removeDependent:self. - model recomputeList. - model addDependent:self. - list := self listFromModel. - self redrawFromLine:anIndex. - self contentsChanged. + self recomputeListFromNodeAt:anIndex ] +! + +recomputeListFromNodeAt:anIndex + + model removeDependent:self. + model recomputeList. + model addDependent:self. + + list := self listFromModel. + self redrawFromLine:anIndex. + self contentsChanged. ! ! !SelectionInTreeView methodsFor:'private - drag and drop'! @@ -1495,34 +1503,54 @@ widthOfContents:firstLine and:lastLine "return the length (in pixels) of the longest line in a line-range " - |max "{ Class: SmallInteger }" - thisLen "{ Class: SmallInteger }" - first "{ Class: SmallInteger }" - last "{ Class: SmallInteger }" | + |parent name item tmpValue + max "{ Class: SmallInteger }" + index "{ Class: SmallInteger }" + runs "{ Class: SmallInteger }" + level "{ Class: SmallInteger }" + xOfStr "{ Class: SmallInteger }" + dltX "{ Class: SmallInteger }" + width "{ Class: SmallInteger }" + newSz "{ Class: SmallInteger }" + maxSz "{ Class: SmallInteger }"| - listOfNodes size == 0 ifTrue:[^ 0]. - - last := listOfNodes size. - first := firstLine. - - (first > last) ifTrue:[^ 0]. + ( (listOfNodes size == 0) + or:[(runs := lastLine min:(listOfNodes size)) < firstLine] + ) ifTrue:[ + ^ 0 + ]. - (lastLine < last) ifTrue:[ - last := lastLine - ]. - max := 0. + level := 1. + xOfStr := self xOfStringLevel:level. + max := xOfStr. + dltX := imageInset + imageWidth. + width := '1' widthOn:self. + parent := 4711. "/ to force a computation + index := firstLine. + runs := runs - index + 1. - listOfNodes from:first to:last do:[:anItem||name| - thisLen := self xOfStringNode:anItem. + runs timesRepeat:[ + item := listOfNodes at:index. + name := item name. + index := index + 1. - (name := anItem name) notNil ifTrue:[ - thisLen := thisLen + (name widthOn:self). - ]. - (thisLen > max) ifTrue:[ - max := thisLen. + (newSz := name size) ~~ 0 ifTrue:[ + item parent ~~ parent ifTrue:[ + parent := item parent. + tmpValue := item level. + xOfStr := xOfStr + ((tmpValue - level) * dltX). + level := tmpValue. + maxSz := 0. + ]. + maxSz < newSz ifTrue:[ + maxSz := newSz. + max := max max:(xOfStr + (maxSz * width)). + ] ] ]. - ^ max + leftOffset. + ^ max + leftOffset. + + ! withoutRedrawAt:anIndex put:aString @@ -1537,12 +1565,7 @@ (widthOfWidestLine := width) notNil ifTrue:[ width := self widthOfContents:anIndex and:anIndex. - - width > widthOfWidestLine ifTrue:[ - widthOfWidestLine := width - ] ifFalse:[ - widthOfWidestLine := nil "/ means: unknown - ] + widthOfWidestLine := widthOfWidestLine max:width. ]. @@ -1811,5 +1834,5 @@ !SelectionInTreeView class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libwidg2/Attic/SelTreeV.st,v 1.52 1998-04-03 08:41:09 ca Exp $' + ^ '$Header: /cvs/stx/stx/libwidg2/Attic/SelTreeV.st,v 1.53 1998-04-04 08:45:17 ca Exp $' ! ! diff -r 5d437be03bcf -r d15daece0c54 SelectionInTreeView.st --- a/SelectionInTreeView.st Sat Apr 04 08:48:46 1998 +0200 +++ b/SelectionInTreeView.st Sat Apr 04 10:45:57 1998 +0200 @@ -814,7 +814,7 @@ buttonPress:button x:x y:y "check for indicator " - |expand node lineNr oldSize isExpandable| + |expand node lineNr isExpandable| lineNr := self indicatiorLineForButton:button atX:x y:y. @@ -868,16 +868,7 @@ self redrawLine:lineNr. ] ifFalse:[ "/ with children; update list and redraw to end. - oldSize := list size. - model removeDependent:self. - model recomputeList. - model addDependent:self. - list := self listFromModel. - - oldSize ~~ list size ifTrue:[ - self redrawFromLine:lineNr. - self contentsChanged. - ] + self recomputeListFromNodeAt:lineNr ] @@ -1252,19 +1243,30 @@ "get list from model and return the new list. If listMessage is nil, try aspectMessage for backward compatibilty. " - |msg| - + |msg list + runs "{ Class: SmallInteger }" + idx "{ Class: SmallInteger }" + | widthOfWidestLine := nil. (msg := listMsg ? aspectMsg) notNil ifTrue:[ listOfNodes := model perform:msg. - listOfNodes size ~~ 0 ifTrue:[ + + (runs := listOfNodes size) ~~ 0 ifTrue:[ self refetchDeviceResources. - ^ listOfNodes collect:[:n|n name] + idx := 1. + list := OrderedCollection new:runs. + + runs timesRepeat:[ + list add:(listOfNodes at:idx) name. + idx := idx + 1. + ]. + ^ list ] ]. listOfNodes := #(). ^ #() + ! model:aModel @@ -1359,7 +1361,7 @@ "setup new list; keep selection dependent on the boolean state keepSelection " - |list| + |list time| list := aList. @@ -1399,15 +1401,21 @@ self redrawLine:anIndex. ] ifFalse:[ "/ with children; update list and redraw to end. - model removeDependent:self. - model recomputeList. - model addDependent:self. - list := self listFromModel. - self redrawFromLine:anIndex. - self contentsChanged. + self recomputeListFromNodeAt:anIndex ] +! + +recomputeListFromNodeAt:anIndex + + model removeDependent:self. + model recomputeList. + model addDependent:self. + + list := self listFromModel. + self redrawFromLine:anIndex. + self contentsChanged. ! ! !SelectionInTreeView methodsFor:'private - drag and drop'! @@ -1495,34 +1503,54 @@ widthOfContents:firstLine and:lastLine "return the length (in pixels) of the longest line in a line-range " - |max "{ Class: SmallInteger }" - thisLen "{ Class: SmallInteger }" - first "{ Class: SmallInteger }" - last "{ Class: SmallInteger }" | + |parent name item tmpValue + max "{ Class: SmallInteger }" + index "{ Class: SmallInteger }" + runs "{ Class: SmallInteger }" + level "{ Class: SmallInteger }" + xOfStr "{ Class: SmallInteger }" + dltX "{ Class: SmallInteger }" + width "{ Class: SmallInteger }" + newSz "{ Class: SmallInteger }" + maxSz "{ Class: SmallInteger }"| - listOfNodes size == 0 ifTrue:[^ 0]. - - last := listOfNodes size. - first := firstLine. - - (first > last) ifTrue:[^ 0]. + ( (listOfNodes size == 0) + or:[(runs := lastLine min:(listOfNodes size)) < firstLine] + ) ifTrue:[ + ^ 0 + ]. - (lastLine < last) ifTrue:[ - last := lastLine - ]. - max := 0. + level := 1. + xOfStr := self xOfStringLevel:level. + max := xOfStr. + dltX := imageInset + imageWidth. + width := '1' widthOn:self. + parent := 4711. "/ to force a computation + index := firstLine. + runs := runs - index + 1. - listOfNodes from:first to:last do:[:anItem||name| - thisLen := self xOfStringNode:anItem. + runs timesRepeat:[ + item := listOfNodes at:index. + name := item name. + index := index + 1. - (name := anItem name) notNil ifTrue:[ - thisLen := thisLen + (name widthOn:self). - ]. - (thisLen > max) ifTrue:[ - max := thisLen. + (newSz := name size) ~~ 0 ifTrue:[ + item parent ~~ parent ifTrue:[ + parent := item parent. + tmpValue := item level. + xOfStr := xOfStr + ((tmpValue - level) * dltX). + level := tmpValue. + maxSz := 0. + ]. + maxSz < newSz ifTrue:[ + maxSz := newSz. + max := max max:(xOfStr + (maxSz * width)). + ] ] ]. - ^ max + leftOffset. + ^ max + leftOffset. + + ! withoutRedrawAt:anIndex put:aString @@ -1537,12 +1565,7 @@ (widthOfWidestLine := width) notNil ifTrue:[ width := self widthOfContents:anIndex and:anIndex. - - width > widthOfWidestLine ifTrue:[ - widthOfWidestLine := width - ] ifFalse:[ - widthOfWidestLine := nil "/ means: unknown - ] + widthOfWidestLine := widthOfWidestLine max:width. ]. @@ -1811,5 +1834,5 @@ !SelectionInTreeView class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libwidg2/SelectionInTreeView.st,v 1.52 1998-04-03 08:41:09 ca Exp $' + ^ '$Header: /cvs/stx/stx/libwidg2/SelectionInTreeView.st,v 1.53 1998-04-04 08:45:17 ca Exp $' ! ! diff -r 5d437be03bcf -r d15daece0c54 TreeItem.st --- a/TreeItem.st Sat Apr 04 08:48:46 1998 +0200 +++ b/TreeItem.st Sat Apr 04 10:45:57 1998 +0200 @@ -672,10 +672,20 @@ "add all shown children and its shown sub children into a list " + |item + size "{ Class: SmallInteger }" + idx "{ Class: SmallInteger }" + | + hide ifFalse:[ - self childrenDo:[:aChild| - aList add:aChild. - aChild recomputeList:aList + (size := self children size) ~~ 0 ifTrue:[ + idx := 1. + + size timesRepeat:[ + aList add:(item := children at:idx). + item recomputeList:aList. + idx := idx + 1. + ] ] ] ! @@ -817,5 +827,5 @@ !TreeItem class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libwidg2/TreeItem.st,v 1.18 1998-04-04 06:48:46 ca Exp $' + ^ '$Header: /cvs/stx/stx/libwidg2/TreeItem.st,v 1.19 1998-04-04 08:45:57 ca Exp $' ! !