diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index ff494235a74e0d20c090a0e33e1283a2b21ef697..4235bf53368108f8665492ec8fc61bbe1b74ce4a 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -310,6 +310,10 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return this.paneItems.map(i => i.pane); } + get views(): IView[] { + return this.panes; + } + get length(): number { return this.paneItems.length; } diff --git a/src/vs/workbench/browser/parts/views/views.ts b/src/vs/workbench/browser/parts/views/views.ts index 566e186ca84ae9fc54296f3139ddb4b7d24fec7a..751b8b5c819af9d007dc8f38d7b1bf3770663344 100644 --- a/src/vs/workbench/browser/parts/views/views.ts +++ b/src/vs/workbench/browser/parts/views/views.ts @@ -9,7 +9,7 @@ import { IViewDescriptorService, ViewContainer, IViewDescriptor, IViewContainers import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Event, Emitter } from 'vs/base/common/event'; import { firstIndex, move } from 'vs/base/common/arrays'; import { isUndefinedOrNull, isUndefined, isString } from 'vs/base/common/types'; @@ -464,15 +464,19 @@ export class ViewsService extends Disposable implements IViewsService { private readonly _onDidChangeViewVisibility: Emitter<{ id: string, visible: boolean }> = this._register(new Emitter<{ id: string, visible: boolean }>()); readonly onDidChangeViewVisibility: Event<{ id: string, visible: boolean }> = this._onDidChangeViewVisibility.event; + private readonly visibleViewContextKeys: Map>; + constructor( @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, @IPanelService private readonly panelService: IPanelService, - @IViewletService private readonly viewletService: IViewletService + @IViewletService private readonly viewletService: IViewletService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, ) { super(); this.viewContainersRegistry = Registry.as(ViewExtensions.ViewContainersRegistry); this.viewDisposable = new Map(); + this.visibleViewContextKeys = new Map>(); this._register(toDisposable(() => { this.viewDisposable.forEach(disposable => disposable.dispose()); @@ -483,16 +487,50 @@ export class ViewsService extends Disposable implements IViewsService { this._register(this.viewContainersRegistry.onDidRegister(({ viewContainer, viewContainerLocation }) => this.onDidRegisterViewContainer(viewContainer, viewContainerLocation))); } + registerViewPaneContainer(viewPaneContainer: ViewPaneContainer): ViewPaneContainer { + this._register(viewPaneContainer.onDidAddViews(views => this.onViewsAdded(views))); + this._register(viewPaneContainer.onDidChangeViewVisibility(view => this.onViewsVisibilityChanged(view, view.isBodyVisible()))); + this._register(viewPaneContainer.onDidRemoveViews(views => this.onViewsRemoved(views))); + return viewPaneContainer; + } + + private onViewsAdded(added: IView[]): void { + for (const view of added) { + this.onViewsVisibilityChanged(view, view.isBodyVisible()); + } + } + + private onViewsVisibilityChanged(view: IView, visible: boolean): void { + this.getOrCreateActiveViewContextKey(view).set(visible); + this._onDidChangeViewVisibility.fire({ id: view.id, visible: visible }); + } + + private onViewsRemoved(removed: IView[]): void { + for (const view of removed) { + this.onViewsVisibilityChanged(view, false); + } + } + + private getOrCreateActiveViewContextKey(view: IView): IContextKey { + const visibleContextKeyId = `${view.id}.visible`; + let contextKey = this.visibleViewContextKeys.get(visibleContextKeyId); + if (!contextKey) { + contextKey = new RawContextKey(visibleContextKeyId, false).bindTo(this.contextKeyService); + this.visibleViewContextKeys.set(visibleContextKeyId, contextKey); + } + return contextKey; + } + private onDidRegisterViewContainer(viewContainer: ViewContainer, location: ViewContainerLocation): void { const viewDescriptorCollection = this.viewDescriptorService.getViewDescriptors(viewContainer); - this.onViewsAdded(viewDescriptorCollection.allViewDescriptors, viewContainer); + this.onViewDescriptorsAdded(viewDescriptorCollection.allViewDescriptors, viewContainer); this._register(viewDescriptorCollection.onDidChangeViews(({ added, removed }) => { - this.onViewsAdded(added, viewContainer); - this.onViewsRemoved(removed); + this.onViewDescriptorsAdded(added, viewContainer); + this.onViewDescriptorsRemoved(removed); })); } - private onViewsAdded(views: IViewDescriptor[], container: ViewContainer): void { + private onViewDescriptorsAdded(views: IViewDescriptor[], container: ViewContainer): void { const location = this.viewContainersRegistry.getViewContainerLocation(container); if (location === undefined) { return; @@ -561,7 +599,7 @@ export class ViewsService extends Disposable implements IViewsService { } } - private onViewsRemoved(views: IViewDescriptor[]): void { + private onViewDescriptorsRemoved(views: IViewDescriptor[]): void { for (const view of views) { const disposable = this.viewDisposable.get(view); if (disposable) { @@ -629,7 +667,7 @@ export class ViewsService extends Disposable implements IViewsService { if (activeViewPaneContainer) { const view = activeViewPaneContainer.getView(id); if (view) { - if (activeViewPaneContainer.length === 1) { + if (activeViewPaneContainer.views.length === 1) { const location = this.viewContainersRegistry.getViewContainerLocation(viewContainer); if (location === ViewContainerLocation.Sidebar) { this.viewletService.hideActiveViewlet(); @@ -661,13 +699,6 @@ export class ViewsService extends Disposable implements IViewsService { return null; } - - registerViewPaneContainer(viewPaneContainer: ViewPaneContainer): ViewPaneContainer { - this._register(viewPaneContainer.onDidAddViews(views => views.forEach(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: view.isBodyVisible() })))); - this._register(viewPaneContainer.onDidChangeViewVisibility(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: view.isBodyVisible() }))); - this._register(viewPaneContainer.onDidRemoveViews(views => views.forEach(view => this._onDidChangeViewVisibility.fire({ id: view.id, visible: false })))); - return viewPaneContainer; - } } export function createFileIconThemableTreeContainerScope(container: HTMLElement, themeService: IWorkbenchThemeService): IDisposable { diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 59bfebf08c847dfc16c05c7a01fcfb26b705754f..25c8d926946b8f7152c57ef52cf75add4fb2a5ba 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -529,7 +529,7 @@ export interface IViewPaneContainer { onDidRemoveViews: Event; onDidChangeViewVisibility: Event; - readonly length: number; + readonly views: IView[]; setVisible(visible: boolean): void; isVisible(): boolean; diff --git a/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts b/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts index ce8d83b187b583d8af68e5f7d7468f2984df337a..87549aaf25c161b08dde5cfc5993a70e644a8242 100644 --- a/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts +++ b/src/vs/workbench/contrib/debug/browser/debugTaskRunner.ts @@ -8,7 +8,6 @@ import severity from 'vs/base/common/severity'; import { Event } from 'vs/base/common/event'; import Constants from 'vs/workbench/contrib/markers/browser/constants'; import { ITaskService, ITaskSummary } from 'vs/workbench/contrib/tasks/common/taskService'; -import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace'; import { TaskEvent, TaskEventKind, TaskIdentifier } from 'vs/workbench/contrib/tasks/common/tasks'; @@ -18,6 +17,7 @@ import { withUndefinedAsNull } from 'vs/base/common/types'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IDebugConfiguration } from 'vs/workbench/contrib/debug/common/debug'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; +import { IViewsService } from 'vs/workbench/common/views'; function once(match: (e: TaskEvent) => boolean, event: Event): Event { return (listener, thisArgs = null, disposables?) => { @@ -44,7 +44,7 @@ export class DebugTaskRunner { @ITaskService private readonly taskService: ITaskService, @IMarkerService private readonly markerService: IMarkerService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IPanelService private readonly panelService: IPanelService, + @IViewsService private readonly viewsService: IViewsService, @IDialogService private readonly dialogService: IDialogService, ) { } @@ -68,7 +68,7 @@ export class DebugTaskRunner { return TaskRunResult.Success; } if (onTaskErrors === 'showErrors') { - await this.panelService.openPanel(Constants.MARKERS_PANEL_ID); + await this.viewsService.openView(Constants.MARKERS_VIEW_ID); return Promise.resolve(TaskRunResult.Failure); } @@ -97,7 +97,7 @@ export class DebugTaskRunner { return TaskRunResult.Success; } - await this.panelService.openPanel(Constants.MARKERS_PANEL_ID); + await this.viewsService.openView(Constants.MARKERS_VIEW_ID); return Promise.resolve(TaskRunResult.Failure); } catch (err) { await onError(err.message, [this.taskService.configureAction()]); diff --git a/src/vs/workbench/contrib/markers/browser/constants.ts b/src/vs/workbench/contrib/markers/browser/constants.ts index 470a762569e1ef4bc8f045b7de9213f0f1cfc6d9..6a06908d88a53faa0c2ba130a07081558de6a716 100644 --- a/src/vs/workbench/contrib/markers/browser/constants.ts +++ b/src/vs/workbench/contrib/markers/browser/constants.ts @@ -6,22 +6,23 @@ import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; export default { - MARKERS_PANEL_ID: 'workbench.panel.markers', - MARKERS_PANEL_STORAGE_ID: 'workbench.panel.markers', + MARKERS_CONTAINER_ID: 'workbench.panel.markers', MARKERS_VIEW_ID: 'workbench.panel.markers.view', + MARKERS_VIEW_STORAGE_ID: 'workbench.panel.markers', MARKER_COPY_ACTION_ID: 'problems.action.copy', MARKER_COPY_MESSAGE_ACTION_ID: 'problems.action.copyMessage', RELATED_INFORMATION_COPY_MESSAGE_ACTION_ID: 'problems.action.copyRelatedInformationMessage', FOCUS_PROBLEMS_FROM_FILTER: 'problems.action.focusProblemsFromFilter', - MARKERS_PANEL_FOCUS_FILTER: 'problems.action.focusFilter', - MARKERS_PANEL_SHOW_MULTILINE_MESSAGE: 'problems.action.showMultilineMessage', - MARKERS_PANEL_SHOW_SINGLELINE_MESSAGE: 'problems.action.showSinglelineMessage', + MARKERS_VIEW_FOCUS_FILTER: 'problems.action.focusFilter', + MARKERS_VIEW_SHOW_MULTILINE_MESSAGE: 'problems.action.showMultilineMessage', + MARKERS_VIEW_SHOW_SINGLELINE_MESSAGE: 'problems.action.showSinglelineMessage', MARKER_OPEN_SIDE_ACTION_ID: 'problems.action.openToSide', MARKER_SHOW_PANEL_ID: 'workbench.action.showErrorsWarnings', MARKER_SHOW_QUICK_FIX: 'problems.action.showQuickFixes', + TOGGLE_MARKERS_VIEW_ACTION_ID: 'workbench.actions.view.toggleProblems', - MarkerPanelFocusContextKey: new RawContextKey('problemsViewFocus', false), + MarkerViewFocusContextKey: new RawContextKey('problemsViewFocus', false), MarkerFocusContextKey: new RawContextKey('problemFocus', false), - MarkerPanelFilterFocusContextKey: new RawContextKey('problemsFilterFocus', false), + MarkerViewFilterFocusContextKey: new RawContextKey('problemsFilterFocus', false), RelatedInformationFocusContextKey: new RawContextKey('relatedInformationFocus', false) }; diff --git a/src/vs/workbench/contrib/markers/browser/markers.contribution.ts b/src/vs/workbench/contrib/markers/browser/markers.contribution.ts index 728ec69438b4635fedf55d14b086f522e8fce37b..2966f1a8986c0b3ad409a9e087ffb09def0477cf 100644 --- a/src/vs/workbench/contrib/markers/browser/markers.contribution.ts +++ b/src/vs/workbench/contrib/markers/browser/markers.contribution.ts @@ -12,7 +12,7 @@ import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/co import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { localize } from 'vs/nls'; import { Marker, RelatedInformation } from 'vs/workbench/contrib/markers/browser/markersModel'; -import { MarkersView, getMarkersView } from 'vs/workbench/contrib/markers/browser/markersView'; +import { MarkersView } from 'vs/workbench/contrib/markers/browser/markersView'; import { MenuId, MenuRegistry, SyncActionDescriptor, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; import { TogglePanelAction } from 'vs/workbench/browser/panel'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -24,12 +24,11 @@ import { IMarkersWorkbenchService, MarkersWorkbenchService, ActivityUpdater } fr import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { ActivePanelContext } from 'vs/workbench/common/panel'; import { Disposable } from 'vs/base/common/lifecycle'; import { IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment, IStatusbarEntry } from 'vs/workbench/services/statusbar/common/statusbar'; import { IMarkerService, MarkerStatistics } from 'vs/platform/markers/common/markers'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { ViewContainer, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; +import { ViewContainer, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry, IViewsService } from 'vs/workbench/common/views'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; @@ -46,7 +45,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ primary: KeyMod.WinCtrl | KeyCode.Enter }, handler: (accessor, args: any) => { - const markersView = getMarkersView(accessor.get(IPanelService))!; + const markersView = accessor.get(IViewsService).getActiveViewWithId(Constants.MARKERS_VIEW_ID)!; markersView.openFileAtElement(markersView.getFocusElement(), false, true, true); } }); @@ -57,7 +56,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ when: undefined, primary: undefined, handler: async (accessor, args: any) => { - await accessor.get(IPanelService).openPanel(Constants.MARKERS_PANEL_ID); + await accessor.get(IViewsService).openView(Constants.MARKERS_VIEW_ID); } }); @@ -67,7 +66,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ when: Constants.MarkerFocusContextKey, primary: KeyMod.CtrlCmd | KeyCode.US_DOT, handler: (accessor, args: any) => { - const markersView = getMarkersView(accessor.get(IPanelService))!; + const markersView = accessor.get(IViewsService).getActiveViewWithId(Constants.MARKERS_VIEW_ID)!; const focusedElement = markersView.getFocusElement(); if (focusedElement instanceof Marker) { markersView.showQuickFixes(focusedElement); @@ -104,15 +103,15 @@ class ToggleMarkersPanelAction extends TogglePanelAction { @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, @IPanelService panelService: IPanelService ) { - super(id, label, Constants.MARKERS_PANEL_ID, panelService, layoutService); + super(id, label, Constants.MARKERS_CONTAINER_ID, panelService, layoutService); } } // markers view container const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({ - id: Constants.MARKERS_PANEL_ID, + id: Constants.MARKERS_CONTAINER_ID, name: Messages.MARKERS_PANEL_TITLE_PROBLEMS, - ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [Constants.MARKERS_PANEL_ID, Constants.MARKERS_PANEL_STORAGE_ID, { mergeViewWithContainerWhenSingleView: true, donotShowContainerTitleWhenMergedWithContainer: true }]), + ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [Constants.MARKERS_CONTAINER_ID, Constants.MARKERS_VIEW_STORAGE_ID, { mergeViewWithContainerWhenSingleView: true, donotShowContainerTitleWhenMergedWithContainer: true }]), focusCommand: { id: ToggleMarkersPanelAction.ID, keybindings: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_M @@ -155,7 +154,7 @@ registerAction2(class extends Action2 { }); } async run(accessor: ServicesAccessor) { - await copyMarker(accessor.get(IPanelService), accessor.get(IClipboardService)); + await copyMarker(accessor.get(IViewsService), accessor.get(IClipboardService)); } }); registerAction2(class extends Action2 { @@ -171,7 +170,7 @@ registerAction2(class extends Action2 { }); } async run(accessor: ServicesAccessor) { - await copyMessage(accessor.get(IPanelService), accessor.get(IClipboardService)); + await copyMessage(accessor.get(IViewsService), accessor.get(IClipboardService)); } }); registerAction2(class extends Action2 { @@ -187,7 +186,7 @@ registerAction2(class extends Action2 { }); } async run(accessor: ServicesAccessor) { - await copyRelatedInformationMessage(accessor.get(IPanelService), accessor.get(IClipboardService)); + await copyRelatedInformationMessage(accessor.get(IViewsService), accessor.get(IClipboardService)); } }); registerAction2(class extends Action2 { @@ -196,46 +195,46 @@ registerAction2(class extends Action2 { id: Constants.FOCUS_PROBLEMS_FROM_FILTER, title: localize('focusProblemsList', "Focus problems view"), keybinding: { - when: Constants.MarkerPanelFilterFocusContextKey, + when: Constants.MarkerViewFilterFocusContextKey, weight: KeybindingWeight.WorkbenchContrib, primary: KeyMod.CtrlCmd | KeyCode.DownArrow } }); } run(accessor: ServicesAccessor) { - focusProblemsView(accessor.get(IPanelService)); + focusProblemsView(accessor.get(IViewsService)); } }); registerAction2(class extends Action2 { constructor() { super({ - id: Constants.MARKERS_PANEL_FOCUS_FILTER, + id: Constants.MARKERS_VIEW_FOCUS_FILTER, title: localize('focusProblemsFilter', "Focus problems filter"), keybinding: { - when: Constants.MarkerPanelFocusContextKey, + when: Constants.MarkerViewFocusContextKey, weight: KeybindingWeight.WorkbenchContrib, primary: KeyMod.CtrlCmd | KeyCode.KEY_F } }); } run(accessor: ServicesAccessor) { - focusProblemsFilter(accessor.get(IPanelService)); + focusProblemsFilter(accessor.get(IViewsService)); } }); registerAction2(class extends Action2 { constructor() { super({ - id: Constants.MARKERS_PANEL_SHOW_MULTILINE_MESSAGE, + id: Constants.MARKERS_VIEW_SHOW_MULTILINE_MESSAGE, title: { value: localize('show multiline', "Show message in multiple lines"), original: 'Problems: Show message in multiple lines' }, category: localize('problems', "Problems"), menu: { id: MenuId.CommandPalette, - when: ActivePanelContext.isEqualTo(Constants.MARKERS_PANEL_ID) + when: ContextKeyExpr.has(`${Constants.MARKERS_VIEW_ID}.visible`) } }); } run(accessor: ServicesAccessor) { - const markersView = getMarkersView(accessor.get(IPanelService)); + const markersView = accessor.get(IViewsService).getActiveViewWithId(Constants.MARKERS_VIEW_ID)!; if (markersView) { markersView.markersViewModel.multiline = true; } @@ -244,25 +243,25 @@ registerAction2(class extends Action2 { registerAction2(class extends Action2 { constructor() { super({ - id: Constants.MARKERS_PANEL_SHOW_SINGLELINE_MESSAGE, + id: Constants.MARKERS_VIEW_SHOW_SINGLELINE_MESSAGE, title: { value: localize('show singleline', "Show message in single line"), original: 'Problems: Show message in single line' }, category: localize('problems', "Problems"), menu: { id: MenuId.CommandPalette, - when: ActivePanelContext.isEqualTo(Constants.MARKERS_PANEL_ID) + when: ContextKeyExpr.has(`${Constants.MARKERS_VIEW_ID}.visible`) } }); } run(accessor: ServicesAccessor) { - const markersView = getMarkersView(accessor.get(IPanelService)); + const markersView = accessor.get(IViewsService).getActiveViewWithId(Constants.MARKERS_VIEW_ID); if (markersView) { markersView.markersViewModel.multiline = false; } } }); -async function copyMarker(panelService: IPanelService, clipboardService: IClipboardService) { - const markersView = getMarkersView(panelService); +async function copyMarker(viewsService: IViewsService, clipboardService: IClipboardService) { + const markersView = viewsService.getActiveViewWithId(Constants.MARKERS_VIEW_ID); if (markersView) { const element = markersView.getFocusElement(); if (element instanceof Marker) { @@ -271,8 +270,8 @@ async function copyMarker(panelService: IPanelService, clipboardService: IClipbo } } -async function copyMessage(panelService: IPanelService, clipboardService: IClipboardService) { - const markersView = getMarkersView(panelService); +async function copyMessage(viewsService: IViewsService, clipboardService: IClipboardService) { + const markersView = viewsService.getActiveViewWithId(Constants.MARKERS_VIEW_ID); if (markersView) { const element = markersView.getFocusElement(); if (element instanceof Marker) { @@ -281,8 +280,8 @@ async function copyMessage(panelService: IPanelService, clipboardService: IClipb } } -async function copyRelatedInformationMessage(panelService: IPanelService, clipboardService: IClipboardService) { - const markersView = getMarkersView(panelService); +async function copyRelatedInformationMessage(viewsService: IViewsService, clipboardService: IClipboardService) { + const markersView = viewsService.getActiveViewWithId(Constants.MARKERS_VIEW_ID); if (markersView) { const element = markersView.getFocusElement(); if (element instanceof RelatedInformation) { @@ -291,15 +290,15 @@ async function copyRelatedInformationMessage(panelService: IPanelService, clipbo } } -function focusProblemsView(panelService: IPanelService) { - const markersView = getMarkersView(panelService); +function focusProblemsView(viewsService: IViewsService) { + const markersView = viewsService.getActiveViewWithId(Constants.MARKERS_VIEW_ID); if (markersView) { markersView.focus(); } } -function focusProblemsFilter(panelService: IPanelService): void { - const markersView = getMarkersView(panelService); +function focusProblemsFilter(viewsService: IViewsService): void { + const markersView = viewsService.getActiveViewWithId(Constants.MARKERS_VIEW_ID); if (markersView) { markersView.focusFilter(); } @@ -314,13 +313,12 @@ MenuRegistry.appendMenuItem(MenuId.MenubarViewMenu, { order: 4 }); -CommandsRegistry.registerCommand('workbench.actions.view.toggleProblems', async (accessor) => { - const panelService = accessor.get(IPanelService); - const panel = accessor.get(IPanelService).getActivePanel(); - if (panel && panel.getId() === Constants.MARKERS_PANEL_ID) { - panelService.hideActivePanel(); +CommandsRegistry.registerCommand(Constants.TOGGLE_MARKERS_VIEW_ACTION_ID, async (accessor) => { + const viewsService = accessor.get(IViewsService); + if (viewsService.isViewVisible(Constants.MARKERS_VIEW_ID)) { + viewsService.closeView(Constants.MARKERS_VIEW_ID); } else { - await panelService.openPanel(Constants.MARKERS_PANEL_ID, true); + viewsService.openView(Constants.MARKERS_VIEW_ID, true); } }); diff --git a/src/vs/workbench/contrib/markers/browser/markers.ts b/src/vs/workbench/contrib/markers/browser/markers.ts index cdcf72b64cd8e9b1d8c5433b97e377c2a8968dc6..cd1fdf7c35125f358c4aba00c2314d2aeb1fca87 100644 --- a/src/vs/workbench/contrib/markers/browser/markers.ts +++ b/src/vs/workbench/contrib/markers/browser/markers.ts @@ -70,6 +70,6 @@ export class ActivityUpdater extends Disposable implements IWorkbenchContributio const { errors, warnings, infos } = this.markerService.getStatistics(); const total = errors + warnings + infos; const message = localize('totalProblems', 'Total {0} Problems', total); - this.activity.value = this.activityService.showActivity(Constants.MARKERS_PANEL_ID, new NumberBadge(total, () => message)); + this.activity.value = this.activityService.showActivity(Constants.MARKERS_CONTAINER_ID, new NumberBadge(total, () => message)); } } diff --git a/src/vs/workbench/contrib/markers/browser/markersView.ts b/src/vs/workbench/contrib/markers/browser/markersView.ts index 95398693f7ed5457e778666624ee44f64557980b..32dff982d8975130c4e339b857b93124583e7b17 100644 --- a/src/vs/workbench/contrib/markers/browser/markersView.ts +++ b/src/vs/workbench/contrib/markers/browser/markersView.ts @@ -9,7 +9,6 @@ import { URI } from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import { IAction, IActionViewItem, Action } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { PaneCompositePanel } from 'vs/workbench/browser/panel'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import Constants from 'vs/workbench/contrib/markers/browser/constants'; import { Marker, ResourceMarkers, RelatedInformation, MarkerChangesEvent } from 'vs/workbench/contrib/markers/browser/markersModel'; @@ -49,17 +48,8 @@ import { PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { KeyCode } from 'vs/base/common/keyCodes'; import { editorLightBulbForeground, editorLightBulbAutoFixForeground } from 'vs/platform/theme/common/colorRegistry'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IViewDescriptorService } from 'vs/workbench/common/views'; -export function getMarkersView(panelService: IPanelService): MarkersView | undefined { - const activePanel = panelService.getActivePanel(); - if (activePanel instanceof PaneCompositePanel) { - return activePanel.getViewPaneContainer().getView(Constants.MARKERS_VIEW_ID); - } - return undefined; -} - function createResourceMarkersIterator(resourceMarkers: ResourceMarkers): Iterator> { const markersIt = Iterator.fromArray(resourceMarkers.markers); @@ -116,8 +106,8 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { @IStorageService storageService: IStorageService, ) { super({ ...(options as IViewPaneOptions), id: Constants.MARKERS_VIEW_ID, ariaHeaderLabel: Messages.MARKERS_PANEL_TITLE_PROBLEMS }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService); - this.panelFoucusContextKey = Constants.MarkerPanelFocusContextKey.bindTo(contextKeyService); - this.panelState = new Memento(Constants.MARKERS_PANEL_STORAGE_ID, storageService).getMemento(StorageScope.WORKSPACE); + this.panelFoucusContextKey = Constants.MarkerViewFocusContextKey.bindTo(contextKeyService); + this.panelState = new Memento(Constants.MARKERS_VIEW_STORAGE_ID, storageService).getMemento(StorageScope.WORKSPACE); this.markersViewModel = this._register(instantiationService.createInstance(MarkersViewModel, this.panelState['multiline'])); this._register(this.markersViewModel.onDidChange(marker => this.onDidChangeViewState(marker))); this.setCurrentActiveEditor(); diff --git a/src/vs/workbench/contrib/markers/browser/markersViewActions.ts b/src/vs/workbench/contrib/markers/browser/markersViewActions.ts index e8b570efdbe4cf6bab0ba8be23771f4d87be3b30..3130ecaee2ead364403dff18ca7373d0ec05c8e4 100644 --- a/src/vs/workbench/contrib/markers/browser/markersViewActions.ts +++ b/src/vs/workbench/contrib/markers/browser/markersViewActions.ts @@ -12,7 +12,6 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import Messages from 'vs/workbench/contrib/markers/browser/messages'; import Constants from 'vs/workbench/contrib/markers/browser/constants'; -import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IThemeService, registerThemingParticipant, ICssStyleCollector, ITheme } from 'vs/platform/theme/common/themeService'; import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { toDisposable } from 'vs/base/common/lifecycle'; @@ -27,6 +26,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { FilterOptions } from 'vs/workbench/contrib/markers/browser/markersFilterOptions'; import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; +import { IViewsService } from 'vs/workbench/common/views'; export class ShowProblemsPanelAction extends Action { @@ -34,13 +34,13 @@ export class ShowProblemsPanelAction extends Action { public static readonly LABEL = Messages.MARKERS_PANEL_SHOW_LABEL; constructor(id: string, label: string, - @IPanelService private readonly panelService: IPanelService + @IViewsService private readonly viewsService: IViewsService ) { super(id, label); } public run(): Promise { - return this.panelService.openPanel(Constants.MARKERS_PANEL_ID, true); + return this.viewsService.openView(Constants.MARKERS_VIEW_ID, true); } } @@ -271,7 +271,7 @@ export class MarkersFilterActionViewItem extends BaseActionViewItem { @IContextKeyService contextKeyService: IContextKeyService ) { super(null, action); - this.focusContextKey = Constants.MarkerPanelFilterFocusContextKey.bindTo(contextKeyService); + this.focusContextKey = Constants.MarkerViewFilterFocusContextKey.bindTo(contextKeyService); this.delayedFilterUpdate = new Delayer(200); this._register(toDisposable(() => this.delayedFilterUpdate.cancel())); this._register(action.onFocus(() => this.focus())); diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 65fcf406eaa3b957e5792aa2376919e416d9fc01..282a0fd4f573731b6da4d7874aa7ae310d67801d 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -27,7 +27,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IFileService, IFileStat } from 'vs/platform/files/common/files'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { ProblemMatcherRegistry, NamedProblemMatcher } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IProgressService, IProgressOptions, ProgressLocation } from 'vs/platform/progress/common/progress'; @@ -41,7 +41,6 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import Constants from 'vs/workbench/contrib/markers/browser/constants'; -import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace'; @@ -80,6 +79,7 @@ import { ITextEditorSelection, TextEditorSelectionRevealType } from 'vs/platform import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { find } from 'vs/base/common/arrays'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; +import { IViewsService } from 'vs/workbench/common/views'; const QUICKOPEN_HISTORY_LIMIT_CONFIG = 'task.quickOpen.history'; const QUICKOPEN_DETAIL_CONFIG = 'task.quickOpen.detail'; @@ -238,6 +238,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer @IMarkerService protected readonly markerService: IMarkerService, @IOutputService protected readonly outputService: IOutputService, @IPanelService private readonly panelService: IPanelService, + @IViewsService private readonly viewsService: IViewsService, + @ICommandService private readonly commandService: ICommandService, @IEditorService private readonly editorService: IEditorService, @IFileService protected readonly fileService: IFileService, @IWorkspaceContextService protected readonly contextService: IWorkspaceContextService, @@ -257,7 +259,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer @INotificationService private readonly notificationService: INotificationService, @IContextKeyService contextKeyService: IContextKeyService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @ITerminalInstanceService private readonly terminalInstanceService: ITerminalInstanceService, @IRemotePathService private readonly remotePathService: IRemotePathService, @ITextModelService private readonly textModelResolverService: ITextModelService, @@ -413,14 +414,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return this.runShowTasks(); }); - CommandsRegistry.registerCommand('workbench.action.tasks.toggleProblems', async () => { - const panel = this.panelService.getActivePanel(); - if (panel && panel.getId() === Constants.MARKERS_PANEL_ID) { - this.layoutService.setPanelHidden(true); - } else { - await this.panelService.openPanel(Constants.MARKERS_PANEL_ID, true); - } - }); + CommandsRegistry.registerCommand('workbench.action.tasks.toggleProblems', () => this.commandService.executeCommand(Constants.TOGGLE_MARKERS_VIEW_ACTION_ID)); CommandsRegistry.registerCommand('workbench.action.tasks.openUserTasks', async () => { const resource = this.getResourceForKind(TaskSourceKind.User); @@ -1336,7 +1330,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer protected createTerminalTaskSystem(): ITaskSystem { return new TerminalTaskSystem( - this.terminalService, this.outputService, this.panelService, this.markerService, + this.terminalService, this.outputService, this.panelService, this.viewsService, this.markerService, this.modelService, this.configurationResolverService, this.telemetryService, this.contextService, this.environmentService, AbstractTaskService.OutputChannelId, this.fileService, this.terminalInstanceService, diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 9a17b4e2cf91c57616326f127c5fef7cdb0c8a96..32b3e307552471ec53fb86ef049971b622f084a3 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -45,6 +45,7 @@ import { Schemas } from 'vs/base/common/network'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IRemotePathService } from 'vs/workbench/services/path/common/remotePathService'; import { env as processEnv, cwd as processCwd } from 'vs/base/common/process'; +import { IViewsService } from 'vs/workbench/common/views'; interface TerminalData { terminal: ITerminalInstance; @@ -170,6 +171,7 @@ export class TerminalTaskSystem implements ITaskSystem { private terminalService: ITerminalService, private outputService: IOutputService, private panelService: IPanelService, + private viewsService: IViewsService, private markerService: IMarkerService, private modelService: IModelService, private configurationResolverService: IConfigurationResolverService, private telemetryService: ITelemetryService, @@ -619,7 +621,7 @@ export class TerminalTaskSystem implements ITaskSystem { let reveal = task.command.presentation!.reveal; let revealProblems = task.command.presentation!.revealProblems; if (revealProblems === RevealProblemKind.OnProblem) { - this.panelService.openPanel(Constants.MARKERS_PANEL_ID, true); + this.viewsService.openView(Constants.MARKERS_VIEW_ID, true); } else if (reveal === RevealKind.Silent) { this.terminalService.setActiveInstance(terminal!); this.terminalService.showPanel(false); @@ -768,7 +770,7 @@ export class TerminalTaskSystem implements ITaskSystem { let revealProblems = task.command.presentation!.revealProblems; let revealProblemPanel = terminal && (revealProblems === RevealProblemKind.OnProblem) && (startStopProblemMatcher.numberOfMatches > 0); if (revealProblemPanel) { - this.panelService.openPanel(Constants.MARKERS_PANEL_ID); + this.viewsService.openView(Constants.MARKERS_VIEW_ID); } else if (terminal && (reveal === RevealKind.Silent) && ((exitCode !== 0) || (startStopProblemMatcher.numberOfMatches > 0) && startStopProblemMatcher.maxMarkerSeverity && (startStopProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error))) { this.terminalService.setActiveInstance(terminal); @@ -799,7 +801,7 @@ export class TerminalTaskSystem implements ITaskSystem { let showProblemPanel = task.command.presentation && (task.command.presentation.revealProblems === RevealProblemKind.Always); if (showProblemPanel) { - this.panelService.openPanel(Constants.MARKERS_PANEL_ID); + this.viewsService.openView(Constants.MARKERS_VIEW_ID); } else if (task.command.presentation && (task.command.presentation.reveal === RevealKind.Always)) { this.terminalService.setActiveInstance(terminal); this.terminalService.showPanel(task.command.presentation.focus);