@@ -22,6 +22,8 @@ import { DiffEditorWidget } from "vs/editor/browser/widget/diffEditorWidget";
2222import { DomScrollableElement } from "vs/base/browser/ui/scrollbar/scrollableElement" ;
2323import { editorLineNumbers } from "vs/editor/common/view/editorColorRegistry" ;
2424import { KeyCode , KeyMod } from "vs/base/common/keyCodes" ;
25+ import { ActionBar } from "vs/base/browser/ui/actionbar/actionbar" ;
26+ import { Action } from "vs/base/common/actions" ;
2527
2628const DIFF_LINES_PADDING = 3 ;
2729
@@ -68,6 +70,8 @@ export class DiffReview extends Disposable {
6870 private readonly _diffEditor : DiffEditorWidget ;
6971 private _isVisible : boolean ;
7072 public readonly shadow : FastDomNode < HTMLElement > ;
73+ private readonly _actionBar : ActionBar ;
74+ public readonly actionBarContainer : FastDomNode < HTMLElement > ;
7175 public readonly domNode : FastDomNode < HTMLElement > ;
7276 private readonly _content : FastDomNode < HTMLElement > ;
7377 private readonly scrollbar : DomScrollableElement ;
@@ -82,10 +86,22 @@ export class DiffReview extends Disposable {
8286 this . shadow = createFastDomNode ( document . createElement ( 'div' ) ) ;
8387 this . shadow . setClassName ( 'diff-review-shadow' ) ;
8488
89+ this . actionBarContainer = createFastDomNode ( document . createElement ( 'div' ) ) ;
90+ this . actionBarContainer . setClassName ( 'diff-review-actions' ) ;
91+ this . _actionBar = this . _register ( new ActionBar (
92+ this . actionBarContainer . domNode
93+ ) ) ;
94+
95+ this . _actionBar . push ( new Action ( 'diffreview.close' , nls . localize ( 'label.close' , "Close" ) , 'close-diff-review' , true , ( ) => {
96+ this . hide ( ) ;
97+ return null ;
98+ } ) , { label : false , icon : true } ) ;
99+
85100 this . domNode = createFastDomNode ( document . createElement ( 'div' ) ) ;
86101 this . domNode . setClassName ( 'diff-review monaco-editor-background' ) ;
87102
88103 this . _content = createFastDomNode ( document . createElement ( 'div' ) ) ;
104+ this . _content . setClassName ( 'diff-review-content' ) ;
89105 this . scrollbar = this . _register ( new DomScrollableElement ( this . _content . domNode , { } ) ) ;
90106 this . domNode . domNode . appendChild ( this . scrollbar . getDomNode ( ) ) ;
91107
@@ -137,11 +153,30 @@ export class DiffReview extends Disposable {
137153 e . preventDefault ( ) ;
138154 this . hide ( ) ;
139155 }
156+
157+ if (
158+ e . equals ( KeyCode . Space )
159+ || e . equals ( KeyCode . Enter )
160+ ) {
161+ e . preventDefault ( ) ;
162+ this . accept ( ) ;
163+ }
140164 } ) ) ;
141165 this . _diffs = [ ] ;
142166 this . _currentDiff = null ;
143167 }
144168
169+ private accept ( ) : void {
170+ let current = this . _getCurrentFocusedRow ( ) ;
171+ if ( current ) {
172+ let lineNumber = parseInt ( current . getAttribute ( 'data-line' ) , 10 ) ;
173+ if ( ! isNaN ( lineNumber ) ) {
174+ this . _diffEditor . setPosition ( new Position ( lineNumber , 1 ) ) ;
175+ }
176+ }
177+ this . hide ( ) ;
178+ }
179+
145180 private hide ( ) : void {
146181 this . _isVisible = false ;
147182 this . _diffEditor . focus ( ) ;
@@ -187,7 +222,7 @@ export class DiffReview extends Disposable {
187222 let prev = this . _getCurrentFocusedRow ( ) ;
188223 row . tabIndex = 0 ;
189224 row . focus ( ) ;
190- if ( prev ) {
225+ if ( prev && prev !== row ) {
191226 prev . tabIndex = - 1 ;
192227 }
193228 this . scrollbar . scanDomNode ( ) ;
@@ -209,6 +244,14 @@ export class DiffReview extends Disposable {
209244 this . domNode . setHeight ( height ) ;
210245 this . _content . setHeight ( height ) ;
211246 this . _content . setWidth ( width ) ;
247+
248+ if ( this . _isVisible ) {
249+ this . actionBarContainer . setAttribute ( 'aria-hidden' , 'false' ) ;
250+ this . actionBarContainer . setDisplay ( 'block' ) ;
251+ } else {
252+ this . actionBarContainer . setAttribute ( 'aria-hidden' , 'true' ) ;
253+ this . actionBarContainer . setDisplay ( 'none' ) ;
254+ }
212255 }
213256
214257 private _compute ( ) : Diff [ ] {
@@ -451,18 +494,23 @@ export class DiffReview extends Disposable {
451494 header . className = 'diff-review-row' ;
452495
453496 let cell = document . createElement ( 'div' ) ;
454- cell . className = 'diff-review-cell' ;
497+ cell . className = 'diff-review-cell diff-review-summary ' ;
455498 cell . appendChild ( document . createTextNode ( `${ diffIndex + 1 } /${ this . _diffs . length } : @@ -${ minOriginalLine } ,${ maxOriginalLine - minOriginalLine + 1 } +${ minModifiedLine } ,${ maxModifiedLine - minModifiedLine + 1 } @@` ) ) ;
499+ header . setAttribute ( 'data-line' , String ( minModifiedLine ) ) ;
456500 header . setAttribute ( 'aria-label' , nls . localize ( 'header' , "Difference {0} of {1}: original {2}, {3} lines, modified {4}, {5} lines" , ( diffIndex + 1 ) , this . _diffs . length , minOriginalLine , maxOriginalLine - minOriginalLine + 1 , minModifiedLine , maxModifiedLine - minModifiedLine + 1 ) ) ;
457501 header . appendChild ( cell ) ;
458502
459503 // @@ -504,7 +517,7 @@
460504 header . setAttribute ( 'role' , 'listitem' ) ;
461505 container . appendChild ( header ) ;
462506
507+ let modLine = minModifiedLine ;
463508 for ( let i = 0 , len = diffs . length ; i < len ; i ++ ) {
464509 const diffEntry = diffs [ i ] ;
465- DiffReview . _renderSection ( container , diffEntry , this . _width , originalOpts , originalModel , originalModelOpts , modifiedOpts , modifiedModel , modifiedModelOpts ) ;
510+ DiffReview . _renderSection ( container , diffEntry , modLine , this . _width , originalOpts , originalModel , originalModelOpts , modifiedOpts , modifiedModel , modifiedModelOpts ) ;
511+ if ( diffEntry . modifiedLineStart !== 0 ) {
512+ modLine = diffEntry . modifiedLineEnd ;
513+ }
466514 }
467515
468516 dom . clearNode ( this . _content . domNode ) ;
@@ -471,7 +519,7 @@ export class DiffReview extends Disposable {
471519 }
472520
473521 private static _renderSection (
474- dest : HTMLElement , diffEntry : DiffEntry , width : number ,
522+ dest : HTMLElement , diffEntry : DiffEntry , modLine : number , width : number ,
475523 originalOpts : editorOptions . InternalEditorOptions , originalModel : editorCommon . IModel , originalModelOpts : editorCommon . TextModelResolvedOptions ,
476524 modifiedOpts : editorOptions . InternalEditorOptions , modifiedModel : editorCommon . IModel , modifiedModelOpts : editorCommon . TextModelResolvedOptions
477525 ) : void {
@@ -504,6 +552,9 @@ export class DiffReview extends Disposable {
504552 originalLineEnd - originalLineStart
505553 ) ;
506554
555+ const originalLineNumbersWidth = originalOpts . layoutInfo . glyphMarginWidth + originalOpts . layoutInfo . lineNumbersWidth ;
556+ const modifiedLineNumbersWidth = 10 + modifiedOpts . layoutInfo . glyphMarginWidth + modifiedOpts . layoutInfo . lineNumbersWidth ;
557+
507558 for ( let i = 0 ; i <= cnt ; i ++ ) {
508559 const originalLine = ( originalLineStart === 0 ? 0 : originalLineStart + i ) ;
509560 const modifiedLine = ( modifiedLineStart === 0 ? 0 : modifiedLineStart + i ) ;
@@ -512,14 +563,18 @@ export class DiffReview extends Disposable {
512563 row . style . minWidth = width + 'px' ;
513564 row . className = rowClassName ;
514565 row . setAttribute ( 'role' , 'listitem' ) ;
566+ if ( modifiedLine !== 0 ) {
567+ modLine = modifiedLine ;
568+ }
569+ row . setAttribute ( 'data-line' , String ( modLine ) ) ;
515570
516571 let cell = document . createElement ( 'div' ) ;
517572 cell . className = 'diff-review-cell' ;
518573 row . appendChild ( cell ) ;
519574
520575 const originalLineNumber = document . createElement ( 'span' ) ;
521- originalLineNumber . style . width = ( originalOpts . layoutInfo . lineNumbersWidth + 'px' ) ;
522- originalLineNumber . style . minWidth = ( originalOpts . layoutInfo . lineNumbersWidth + 'px' ) ;
576+ originalLineNumber . style . width = ( originalLineNumbersWidth + 'px' ) ;
577+ originalLineNumber . style . minWidth = ( originalLineNumbersWidth + 'px' ) ;
523578 originalLineNumber . className = 'diff-review-line-number' + lineNumbersExtraClassName ;
524579 if ( originalLine !== 0 ) {
525580 originalLineNumber . appendChild ( document . createTextNode ( String ( originalLine ) ) ) ;
@@ -529,8 +584,8 @@ export class DiffReview extends Disposable {
529584 cell . appendChild ( originalLineNumber ) ;
530585
531586 const modifiedLineNumber = document . createElement ( 'span' ) ;
532- modifiedLineNumber . style . width = ( 10 + modifiedOpts . layoutInfo . lineNumbersWidth + 'px' ) ;
533- modifiedLineNumber . style . minWidth = ( 10 + modifiedOpts . layoutInfo . lineNumbersWidth + 'px' ) ;
587+ modifiedLineNumber . style . width = ( modifiedLineNumbersWidth + 'px' ) ;
588+ modifiedLineNumber . style . minWidth = ( modifiedLineNumbersWidth + 'px' ) ;
534589 modifiedLineNumber . style . paddingRight = '10px' ;
535590 modifiedLineNumber . className = 'diff-review-line-number' + lineNumbersExtraClassName ;
536591 if ( modifiedLine !== 0 ) {
0 commit comments