55
66import 'vs/css!./media/scmViewlet' ;
77import { Event , Emitter } from 'vs/base/common/event' ;
8- import { IDisposable , dispose , Disposable } from 'vs/base/common/lifecycle' ;
8+ import { IDisposable , Disposable , DisposableStore , combinedDisposable } from 'vs/base/common/lifecycle' ;
99import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey' ;
1010import { IMenuService , MenuId , IMenu } from 'vs/platform/actions/common/actions' ;
1111import { IAction } from 'vs/base/common/actions' ;
@@ -20,13 +20,15 @@ function actionEquals(a: IAction, b: IAction): boolean {
2020 return a . id === b . id ;
2121}
2222
23- interface ISCMResourceGroupMenuEntry extends IDisposable {
23+ interface ISCMResourceGroupMenuEntry {
2424 readonly group : ISCMResourceGroup ;
25+ readonly disposable : IDisposable ;
2526}
2627
2728interface ISCMMenus {
2829 readonly resourceGroupMenu : IMenu ;
2930 readonly resourceMenu : IMenu ;
31+ readonly resourceFolderMenu : IMenu ;
3032}
3133
3234export function getSCMResourceContextKey ( resource : ISCMResourceGroup | ISCMResource ) : string {
@@ -48,7 +50,7 @@ export class SCMMenus implements IDisposable {
4850 private readonly resourceGroupMenuEntries : ISCMResourceGroupMenuEntry [ ] = [ ] ;
4951 private readonly resourceGroupMenus = new Map < ISCMResourceGroup , ISCMMenus > ( ) ;
5052
51- private readonly disposables : IDisposable [ ] = [ ] ;
53+ private readonly disposables = new DisposableStore ( ) ;
5254
5355 constructor (
5456 provider : ISCMProvider | undefined ,
@@ -68,7 +70,7 @@ export class SCMMenus implements IDisposable {
6870 }
6971
7072 this . titleMenu = this . menuService . createMenu ( MenuId . SCMTitle , this . contextKeyService ) ;
71- this . disposables . push ( this . titleMenu ) ;
73+ this . disposables . add ( this . titleMenu ) ;
7274
7375 this . titleMenu . onDidChange ( this . updateTitleActions , this , this . disposables ) ;
7476 this . updateTitleActions ( ) ;
@@ -109,6 +111,10 @@ export class SCMMenus implements IDisposable {
109111 return this . getActions ( MenuId . SCMResourceContext , resource ) . secondary ;
110112 }
111113
114+ getResourceFolderContextActions ( group : ISCMResourceGroup ) : IAction [ ] {
115+ return this . getActions ( MenuId . SCMResourceFolderContext , group ) . secondary ;
116+ }
117+
112118 private getActions ( menuId : MenuId , resource : ISCMResourceGroup | ISCMResource ) : { primary : IAction [ ] ; secondary : IAction [ ] ; } {
113119 const contextKeyService = this . contextKeyService . createScoped ( ) ;
114120 contextKeyService . createKey ( 'scmResourceGroup' , getSCMResourceContextKey ( resource ) ) ;
@@ -141,6 +147,14 @@ export class SCMMenus implements IDisposable {
141147 return this . resourceGroupMenus . get ( group ) ! . resourceMenu ;
142148 }
143149
150+ getResourceFolderMenu ( group : ISCMResourceGroup ) : IMenu {
151+ if ( ! this . resourceGroupMenus . has ( group ) ) {
152+ throw new Error ( 'SCM Resource Group menu not found' ) ;
153+ }
154+
155+ return this . resourceGroupMenus . get ( group ) ! . resourceFolderMenu ;
156+ }
157+
144158 private onDidSpliceGroups ( { start, deleteCount, toInsert } : ISplice < ISCMResourceGroup > ) : void {
145159 const menuEntriesToInsert = toInsert . map < ISCMResourceGroupMenuEntry > ( group => {
146160 const contextKeyService = this . contextKeyService . createScoped ( ) ;
@@ -149,30 +163,23 @@ export class SCMMenus implements IDisposable {
149163
150164 const resourceGroupMenu = this . menuService . createMenu ( MenuId . SCMResourceGroupContext , contextKeyService ) ;
151165 const resourceMenu = this . menuService . createMenu ( MenuId . SCMResourceContext , contextKeyService ) ;
166+ const resourceFolderMenu = this . menuService . createMenu ( MenuId . SCMResourceFolderContext , contextKeyService ) ;
167+ const disposable = combinedDisposable ( contextKeyService , resourceGroupMenu , resourceMenu , resourceFolderMenu ) ;
152168
153- this . resourceGroupMenus . set ( group , { resourceGroupMenu, resourceMenu } ) ;
154-
155- return {
156- group,
157- dispose ( ) {
158- contextKeyService . dispose ( ) ;
159- resourceGroupMenu . dispose ( ) ;
160- resourceMenu . dispose ( ) ;
161- }
162- } ;
169+ this . resourceGroupMenus . set ( group , { resourceGroupMenu, resourceMenu, resourceFolderMenu } ) ;
170+ return { group, disposable } ;
163171 } ) ;
164172
165173 const deleted = this . resourceGroupMenuEntries . splice ( start , deleteCount , ...menuEntriesToInsert ) ;
166174
167175 for ( const entry of deleted ) {
168176 this . resourceGroupMenus . delete ( entry . group ) ;
169- entry . dispose ( ) ;
177+ entry . disposable . dispose ( ) ;
170178 }
171179 }
172180
173181 dispose ( ) : void {
174- dispose ( this . disposables ) ;
175- dispose ( this . resourceGroupMenuEntries ) ;
176- this . resourceGroupMenus . clear ( ) ;
182+ this . disposables . dispose ( ) ;
183+ this . resourceGroupMenuEntries . forEach ( e => e . disposable . dispose ( ) ) ;
177184 }
178185}
0 commit comments