@@ -21,6 +21,7 @@ import { equals, distinct } from 'vs/base/common/arrays';
2121import { DataTransfers , StaticDND , IDragAndDropData } from 'vs/base/browser/dnd' ;
2222import { disposableTimeout , Delayer } from 'vs/base/common/async' ;
2323import { isFirefox } from 'vs/base/browser/browser' ;
24+ import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent' ;
2425
2526interface IItem < T > {
2627 readonly id : string ;
@@ -198,6 +199,7 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
198199
199200 get onDidScroll ( ) : Event < ScrollEvent > { return this . scrollableElement . onScroll ; }
200201 get onWillScroll ( ) : Event < ScrollEvent > { return this . scrollableElement . onWillScroll ; }
202+ get containerDomNode ( ) : HTMLElement { return this . rowsContainer ; }
201203
202204 constructor (
203205 container : HTMLElement ,
@@ -273,6 +275,28 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
273275 this . layout ( ) ;
274276 }
275277
278+ triggerScrollFromMouseWheelEvent ( browserEvent : IMouseWheelEvent ) {
279+ this . scrollableElement . triggerScrollFromMouseWheelEvent ( browserEvent ) ;
280+ }
281+
282+ updateElementHeight ( index : number , element : T , size : number ) : void {
283+ const lastRenderRange = this . getRenderRange ( this . lastRenderTop , this . lastRenderHeight ) ;
284+
285+ let heightDiff = index < lastRenderRange . start ? size - this . items [ index ] . size : 0 ;
286+ this . rangeMap . splice ( index , 1 , [ { size : size } ] ) ;
287+
288+ this . items [ index ] . size = size ;
289+
290+ this . render ( lastRenderRange , this . lastRenderTop + heightDiff , this . lastRenderHeight , undefined , undefined , true ) ;
291+
292+ if ( this . supportDynamicHeights ) {
293+ this . _rerender ( this . lastRenderTop , this . lastRenderHeight ) ;
294+ }
295+
296+ this . eventuallyUpdateScrollDimensions ( ) ;
297+ return ;
298+ }
299+
276300 splice ( start : number , deleteCount : number , elements : T [ ] = [ ] ) : T [ ] {
277301 if ( this . splicing ) {
278302 throw new Error ( 'Can\'t run recursive splices.' ) ;
@@ -516,14 +540,21 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
516540
517541 // Render
518542
519- private render ( renderTop : number , renderHeight : number , renderLeft : number , scrollWidth : number ) : void {
520- const previousRenderRange = this . getRenderRange ( this . lastRenderTop , this . lastRenderHeight ) ;
543+ private render ( previousRenderRange : IRange , renderTop : number , renderHeight : number , renderLeft : number | undefined , scrollWidth : number | undefined , updateItemsInDOM : boolean = false ) : void {
521544 const renderRange = this . getRenderRange ( renderTop , renderHeight ) ;
522545
523546 const rangesToInsert = Range . relativeComplement ( renderRange , previousRenderRange ) ;
524547 const rangesToRemove = Range . relativeComplement ( previousRenderRange , renderRange ) ;
525548 const beforeElement = this . getNextToLastElement ( rangesToInsert ) ;
526549
550+ if ( updateItemsInDOM ) {
551+ const rangesToUpdate = Range . intersect ( previousRenderRange , renderRange ) ;
552+
553+ for ( let i = rangesToUpdate . start ; i < rangesToUpdate . end ; i ++ ) {
554+ this . updateItemInDOM ( this . items [ i ] , i ) ;
555+ }
556+ }
557+
527558 for ( const range of rangesToInsert ) {
528559 for ( let i = range . start ; i < range . end ; i ++ ) {
529560 this . insertItemInDOM ( i , beforeElement ) ;
@@ -536,10 +567,13 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
536567 }
537568 }
538569
539- this . rowsContainer . style . left = `-${ renderLeft } px` ;
570+ if ( renderLeft !== undefined ) {
571+ this . rowsContainer . style . left = `-${ renderLeft } px` ;
572+ }
573+
540574 this . rowsContainer . style . top = `-${ renderTop } px` ;
541575
542- if ( this . horizontalScrolling ) {
576+ if ( this . horizontalScrolling && scrollWidth !== undefined ) {
543577 this . rowsContainer . style . width = `${ Math . max ( scrollWidth , this . renderWidth ) } px` ;
544578 }
545579
@@ -741,7 +775,8 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
741775
742776 private onScroll ( e : ScrollEvent ) : void {
743777 try {
744- this . render ( e . scrollTop , e . height , e . scrollLeft , e . scrollWidth ) ;
778+ const previousRenderRange = this . getRenderRange ( this . lastRenderTop , this . lastRenderHeight ) ;
779+ this . render ( previousRenderRange , e . scrollTop , e . height , e . scrollLeft , e . scrollWidth ) ;
745780
746781 if ( this . supportDynamicHeights ) {
747782 this . _rerender ( e . scrollTop , e . height ) ;
@@ -1097,6 +1132,14 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
10971132 }
10981133
10991134 const size = item . size ;
1135+
1136+ if ( item . row && item . row . domNode ) {
1137+ let newSize = item . row . domNode . offsetHeight ;
1138+ item . size = newSize ;
1139+ item . lastDynamicHeightWidth = this . renderWidth ;
1140+ return newSize - size ;
1141+ }
1142+
11001143 const row = this . cache . alloc ( item . templateId ) ;
11011144
11021145 row . domNode ! . style . height = '' ;
0 commit comments