diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index 2b3171abc6a57a4a8d960bcd18f8df9f76839f2c..7d223123221d8badbcfa458e98b3ec24a758a96d 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -35,6 +35,8 @@ export interface IProgress { report(item: T): void; } +export const emptyProgress: IProgress = Object.freeze({ report() { } }); + export class Progress implements IProgress { private _callback: () => void; diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index f8e3f8211af2fd32a0824b5a95ae6ab872774c0a..a695a27acfd1209c810f46ba7c19558856b12e6e 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -464,6 +464,10 @@ export abstract class CompositePart extends Part { this.messageService.show(Severity.Error, types.isString(error) ? new Error(error) : error); } + public getProgressIndicator(id: string): IProgressService { + return this.mapProgressServiceToComposite[id]; + } + protected getActions(): IAction[] { return []; } diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index cdbf0867f75d39fa57dd89a8951b78e40aae5abb..56e283310f092a2287c79c7fae2692531853cb34 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -25,16 +25,7 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import Event from 'vs/base/common/event'; -export interface ISidebar { - onDidViewletOpen: Event; - onDidViewletClose: Event; - openViewlet(id: string, focus?: boolean): TPromise; - getActiveViewlet(): IViewlet; - getLastActiveViewletId(): string; - hideActiveViewlet(): TPromise; -} - -export class SidebarPart extends CompositePart implements ISidebar { +export class SidebarPart extends CompositePart { public static activeViewletSettingsKey = 'workbench.sidebar.activeviewletid'; diff --git a/src/vs/workbench/services/progress/browser/progressService2.ts b/src/vs/workbench/services/progress/browser/progressService2.ts index 3b4f05d2c2b26d1dab824b023fbe5a7a5e8843de..ac0555c6026e99039833185ad675c730632c0a30 100644 --- a/src/vs/workbench/services/progress/browser/progressService2.ts +++ b/src/vs/workbench/services/progress/browser/progressService2.ts @@ -5,39 +5,16 @@ 'use strict'; import 'vs/css!vs/workbench/services/progress/browser/media/progressService2'; -import { always } from 'vs/base/common/async'; +import * as dom from 'vs/base/browser/dom'; +import { IActivityBarService, ProgressBadge } from 'vs/workbench/services/activity/common/activityBarService'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { Registry } from 'vs/platform/platform'; -import { IProgressService2, IProgress, Progress } from 'vs/platform/progress/common/progress'; +import { IProgressService2, IProgress, Progress, emptyProgress } from 'vs/platform/progress/common/progress'; +import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { OcticonLabel } from 'vs/base/browser/ui/octiconLabel/octiconLabel'; +import { Registry } from 'vs/platform/platform'; import { StatusbarAlignment, IStatusbarRegistry, StatusbarItemDescriptor, Extensions, IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IActivityBarService, ProgressBadge } from 'vs/workbench/services/activity/common/activityBarService'; -import * as dom from 'vs/base/browser/dom'; - -class ActivityBarProgress implements IProgress { - - private _handle: IDisposable; - - constructor( - private _activityBar: IActivityBarService, - private _viewletId: string) { - - } - - dispose(): void { - if (this._handle) { - this._handle.dispose(); - this._handle = undefined; - } - } - - report(n: number): void { - if (!this._handle) { - this._handle = this._activityBar.showActivity(this._viewletId, new ProgressBadge(() => '...'), 'progress-badge'); - } - } -} +import { always } from 'vs/base/common/async'; class WindowProgressItem implements IStatusbarItem { @@ -79,7 +56,8 @@ export class ProgressService2 implements IProgressService2 { private _stack: Progress[] = []; constructor( - @IActivityBarService private _activityBar: IActivityBarService + @IActivityBarService private _activityBar: IActivityBarService, + @IViewletService private _viewletService: IViewletService ) { // } @@ -98,11 +76,6 @@ export class ProgressService2 implements IProgressService2 { }); } - withViewletProgress(viewletId: string, task: (progress: IProgress) => TPromise): void { - const progress = new ActivityBarProgress(this._activityBar, viewletId); - always(task(progress), () => progress.dispose()); - } - private _updateProgress() { if (this._stack.length === 0) { WindowProgressItem.Instance.hide(); @@ -111,6 +84,26 @@ export class ProgressService2 implements IProgressService2 { WindowProgressItem.Instance.text = this._stack[0].value; } } + + withViewletProgress(viewletId: string, task: (progress: IProgress) => TPromise): void { + + const promise = task(emptyProgress); + + // show in viewlet + const viewletProgress = this._viewletService.getProgressIndicator(viewletId); + viewletProgress.showWhile(promise); + + // show activity bar + const activityProgress = this._activityBar.showActivity( + viewletId, + new ProgressBadge(() => '...'), + 'progress-badge' + ); + + always(promise, () => { + activityProgress.dispose(); + }); + } } diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index 8160c2e9b05f15a5a4f31d39f89df45cea5f7e51..a556e8389a72b6e7a9731b6ecb32a70f63417ee5 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -9,6 +9,7 @@ import { IViewlet } from 'vs/workbench/common/viewlet'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import Event from 'vs/base/common/event'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; +import { IProgressService } from 'vs/platform/progress/common/progress'; export const IViewletService = createDecorator('viewletService'); @@ -42,4 +43,9 @@ export interface IViewletService { * Returns all registered viewlets */ getViewlets(): ViewletDescriptor[]; -} \ No newline at end of file + + /** + * + */ + getProgressIndicator(id: string): IProgressService; +} diff --git a/src/vs/workbench/services/viewlet/browser/viewletService.ts b/src/vs/workbench/services/viewlet/browser/viewletService.ts index a3565893566ef70bc1fbfea02e151b38fe620825..c155b36e972e439a5dafda61e30cd362152e08ba 100644 --- a/src/vs/workbench/services/viewlet/browser/viewletService.ts +++ b/src/vs/workbench/services/viewlet/browser/viewletService.ts @@ -8,16 +8,17 @@ import { TPromise, ValueCallback } from 'vs/base/common/winjs.base'; import { IViewlet } from 'vs/workbench/common/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import Event from 'vs/base/common/event'; -import { ISidebar } from 'vs/workbench/browser/parts/sidebar/sidebarPart'; +import { SidebarPart } from 'vs/workbench/browser/parts/sidebar/sidebarPart'; import { Registry } from 'vs/platform/platform'; import { ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions } from 'vs/workbench/browser/viewlet'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { IProgressService } from 'vs/platform/progress/common/progress'; export class ViewletService implements IViewletService { public _serviceBrand: any; - private sidebarPart: ISidebar; + private sidebarPart: SidebarPart; private viewletRegistry: ViewletRegistry; private extensionViewlets: ViewletDescriptor[]; @@ -28,7 +29,7 @@ export class ViewletService implements IViewletService { public get onDidViewletClose(): Event { return this.sidebarPart.onDidViewletClose; }; constructor( - sidebarPart: ISidebar, + sidebarPart: SidebarPart, @IExtensionService private extensionService: IExtensionService ) { this.sidebarPart = sidebarPart; @@ -99,4 +100,8 @@ export class ViewletService implements IViewletService { public getViewlet(id: string): ViewletDescriptor { return this.getViewlets().filter(viewlet => viewlet.id === id)[0]; } -} \ No newline at end of file + + public getProgressIndicator(id: string): IProgressService { + return this.sidebarPart.getProgressIndicator(id); + } +} diff --git a/src/vs/workbench/test/browser/services.test.ts b/src/vs/workbench/test/browser/services.test.ts index 8d3032bf5b80062938f5acb8971f1a647ec99cf1..af83eb0ec5f2dda95d147161df3de0d8f3846e5d 100644 --- a/src/vs/workbench/test/browser/services.test.ts +++ b/src/vs/workbench/test/browser/services.test.ts @@ -126,6 +126,10 @@ class TestViewletService implements IViewletService { public getViewlet(id: string): ViewletDescriptor { return null; } + + public getProgressIndicator(id: string) { + return null; + } } class TestPanelService implements IPanelService { @@ -444,4 +448,4 @@ suite('Workbench UI Services', () => { }); }); }); -}); \ No newline at end of file +});