"Change Set: OptimizingList Date: 22 December 2000 Author: Daniel Vainsencher Takes ~30% off the time to update list morphs. Creates a complete every-single-instance-variable initalization method for StringMorph, and uses the assumption that lists are simple things to speed scroll ranges. A few other small speed refactorings."! !ScrollPane methodsFor: 'initialization' stamp: 'dvf 12/17/2000 01:41'! setScrollDeltas "Set the ScrollBar deltas, value and interval, based on the current scroll pane size, offset and range." | range delta innerHeight | self hideOrShowScrollBar. scroller hasSubmorphs ifFalse: [scrollBar interval: 1.0. ^ self]. range _ self leftoverScrollRange. delta _ self scrollDeltaHeight. innerHeight _ self innerBounds height. range = 0 ifTrue: [^ scrollBar scrollDelta: 0.02 pageDelta: 0.2; interval: 1.0]. "Set up for one line (for arrow scrolling), or a full pane less one line (for paging)." scrollBar scrollDelta: (delta / range) asFloat pageDelta: ((innerHeight - delta) / range) asFloat. scrollBar interval: ((innerHeight - delta) / self totalScrollRange) asFloat. scrollBar value: (scroller offset y / self leftoverScrollRange) asFloat.! ! !ScrollPane methodsFor: 'geometry' stamp: 'dvf 12/17/2000 00:26'! unadjustedScrollRange "Return the difference between the height extent of the receiver's submorphs and its own height extent (plus an extra 1/2 line height)." scroller hasSubmorphs ifFalse: [^ 0]. ^ self totalScrollRange - bounds height + (self scrollDeltaHeight / 2) max: 0! ! !PluggableListMorph methodsFor: 'initialization' stamp: 'dvf 12/17/2000 01:37'! list: listOfStrings | morphList index height handler itemEmphasis currentDist | scroller removeAllMorphs. list _ listOfStrings ifNil: [Array new]. list isEmpty ifTrue: [self setScrollDeltas. ^ self selectedMorph: nil]. font ifNil: [font _ Preferences standardListFont]. height _ font height. handler _ self defaultEventHandler. "quick StringMorph init message, combines event install and positioning" morphList _ list collectWithIndex: [:item :itemIndex | itemEmphasis _ item isText ifTrue: [item emphasisAt: 1] ifFalse: [0]. currentDist _ itemIndex - 1 * height. StringMorph contents: item font: font emphasis: itemEmphasis bounds: (0 @ currentDist corner: 9999 @ (currentDist + height)) handler: handler]. scroller addAllMorphs: morphList. index _ self getCurrentSelectionIndex. self selectedMorph: ((index = 0 or: [index > morphList size]) ifFalse: [morphList at: index]). self setScrollDeltas. scrollBar setValue: 0.0! ! !PluggableListMorph methodsFor: 'drag and drop' stamp: 'dvf 12/16/2000 22:37'! defaultEventHandler | handler | handler _ EventHandler new. handler on: #mouseDown send: #mouseDown:onItem: to: self; on: #mouseUp send: #mouseUp:onItem: to: self; on: #doubleClick send: #doubleClick:onItem: to: self. self dragEnabled ifTrue: [handler on: #startDrag send: #startDrag:onItem: to: self]. self dropEnabled ifTrue: [handler on: #mouseEnterDragging send: #mouseEnterDragging:onItem: to: self. handler on: #mouseLeaveDragging send: #mouseLeaveDragging:onItem: to: self]. ^handler ! ! !PluggableListMorph methodsFor: 'drag and drop' stamp: 'dvf 12/16/2000 22:37'! installEventHandlerOn: morphList | handler | handler _ self defaultEventHandler. morphList do: [:m | m eventHandler: handler]. ! ! !PluggableListMorph methodsFor: 'drag and drop' stamp: 'dvf 12/17/2000 00:07'! totalScrollRange | subs | "Return the entire scrolling range." subs _ scroller submorphs. ^((subs first bounds merge: subs last bounds) encompass: 0@0) height ! ! !StringMorph methodsFor: 'initialization' stamp: 'dvf 12/16/2000 23:51'! initWithContents: aString font: aFont emphasis: emphasisCode bounds: initialBounds handler: evtHandler super initialize. color _ Color black. font _ aFont. emphasis _ emphasisCode. hasFocus _ false. contents _ aString. self eventHandler: evtHandler. self bounds: initialBounds. ! ! !StringMorph class methodsFor: 'instance creation' stamp: 'dvf 12/16/2000 22:34'! contents: aString font: aFont emphasis: emphasisCode bounds: bounds handler: evthandler ^ self basicNew initWithContents: aString font: aFont emphasis: emphasisCode bounds: bounds handler: evthandler! !