diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index 92f4304b9207b60268026f83337dfa756ebaf03e..af23eedf5427a4c315b39ad8175566ab0f13fdee 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -416,9 +416,9 @@ export class QuickOpenWidget implements IModelProvider { } } - public show(prefix: string): void; - public show(input: IModel, autoFocus?: IAutoFocus, quickNavigateConfiguration?: IQuickNavigateConfiguration): void; - public show(param: any, autoFocus?: IAutoFocus, quickNavigateConfiguration?: IQuickNavigateConfiguration): void { + public show(prefix: string, quickNavigateConfiguration?: IQuickNavigateConfiguration): void; + public show(input: IModel, quickNavigateConfiguration?: IQuickNavigateConfiguration, autoFocus?: IAutoFocus): void; + public show(param: any, quickNavigateConfiguration?: IQuickNavigateConfiguration, autoFocus?: IAutoFocus): void { if (types.isUndefined(autoFocus)) { autoFocus = {}; } diff --git a/src/vs/workbench/browser/actions/triggerQuickOpen.ts b/src/vs/workbench/browser/actions/triggerQuickOpen.ts deleted file mode 100644 index 839a7651029a5f8eaf8eaad70a5e02031ace3370..0000000000000000000000000000000000000000 --- a/src/vs/workbench/browser/actions/triggerQuickOpen.ts +++ /dev/null @@ -1,167 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import nls = require('vs/nls'); -import {IWorkbenchActionRegistry, Extensions} from 'vs/workbench/common/actionRegistry'; -import {Registry} from 'vs/platform/platform'; -import {Action} from 'vs/base/common/actions'; -import {TPromise} from 'vs/base/common/winjs.base'; -import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; -import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService'; -import {KbExpr, IKeybindingService, IKeybindings} from 'vs/platform/keybinding/common/keybindingService'; -import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; -import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; - -// Trigger Quick Open -class GlobalQuickOpenAction extends Action { - - public static ID = 'workbench.action.quickOpen'; - public static LABEL = nls.localize('quickOpen', "Go to File..."); - - constructor(id: string, label: string, @IQuickOpenService private quickOpenService: IQuickOpenService) { - super(id, label); - - this.order = 100; // Allow other actions to position before or after - this.class = 'quickopen'; - } - - public run(): TPromise { - this.quickOpenService.show(null); - - return TPromise.as(true); - } -} - -// Open Previous Editor -class OpenPreviousEditorAction extends Action { - - public static ID = 'workbench.action.openPreviousEditor'; - public static LABEL = nls.localize('navigateEditorHistoryByInput', "Navigate History"); - - constructor( - id: string, - label: string, - @IQuickOpenService private quickOpenService: IQuickOpenService, - @IKeybindingService private keybindingService: IKeybindingService - ) { - super(id, label); - } - - public run(): TPromise { - let keys = this.keybindingService.lookupKeybindings(this.id); - - this.quickOpenService.show(null, { - keybindings: keys - }); - - return TPromise.as(true); - } -} - -class BaseQuickOpenNavigateAction extends Action { - private navigateNext: boolean; - - constructor( - id: string, - label: string, - navigateNext: boolean, - @IQuickOpenService private quickOpenService: IQuickOpenService, - @IKeybindingService private keybindingService: IKeybindingService - ) { - super(id, label); - - this.navigateNext = navigateNext; - } - - public run(event?: any): TPromise { - let keys = this.keybindingService.lookupKeybindings(this.id); - - this.quickOpenService.quickNavigate({ - keybindings: keys - }, this.navigateNext); - - return TPromise.as(true); - } -} - -class QuickOpenNavigateNextAction extends BaseQuickOpenNavigateAction { - - public static ID = 'workbench.action.quickOpenNavigateNext'; - public static LABEL = nls.localize('quickNavigateNext', "Navigate Next in Quick Open"); - - constructor( - id: string, - label: string, - @IQuickOpenService quickOpenService: IQuickOpenService, - @IKeybindingService keybindingService: IKeybindingService - ) { - super(id, label, true, quickOpenService, keybindingService); - } -} - -class QuickOpenNavigatePreviousAction extends BaseQuickOpenNavigateAction { - - public static ID = 'workbench.action.quickOpenNavigatePrevious'; - public static LABEL = nls.localize('quickNavigatePrevious', "Navigate Previous in Quick Open"); - - constructor( - id: string, - label: string, - @IQuickOpenService quickOpenService: IQuickOpenService, - @IKeybindingService keybindingService: IKeybindingService - ) { - super(id, label, false, quickOpenService, keybindingService); - } -} - -const quickOpenKb: IKeybindings = { - primary: KeyMod.CtrlCmd | KeyCode.KEY_P, - secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E] -}; - -const QUICK_NAVIGATE_KEY = KeyCode.KEY_Q; - -const prevEditorKb: IKeybindings = { - primary: KeyMod.CtrlCmd | QUICK_NAVIGATE_KEY, - secondary: [KeyMod.CtrlCmd | KeyMod.Shift | QUICK_NAVIGATE_KEY], - mac: { - primary: KeyMod.WinCtrl | QUICK_NAVIGATE_KEY, - secondary: [KeyMod.WinCtrl | KeyMod.Shift | QUICK_NAVIGATE_KEY] - } -}; - -function navigateKeybinding(shift: boolean): IKeybindings { - if (shift) { - return { - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P, - secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.CtrlCmd | KeyMod.Shift | QUICK_NAVIGATE_KEY], - mac: { - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P, - secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.WinCtrl | KeyMod.Shift | QUICK_NAVIGATE_KEY] - } - }; - } else { - return { - primary: KeyMod.CtrlCmd | KeyCode.KEY_P, - secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.CtrlCmd | QUICK_NAVIGATE_KEY], - mac: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_P, - secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.WinCtrl | QUICK_NAVIGATE_KEY] - } - }; - } -} - -// Contribute Quick Open -const registry = Registry.as(Extensions.WorkbenchActions); -registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalQuickOpenAction, GlobalQuickOpenAction.ID, GlobalQuickOpenAction.LABEL, quickOpenKb), 'Go to File...'); - -// Contribute Quick Navigate -registry.registerWorkbenchAction(new SyncActionDescriptor(OpenPreviousEditorAction, OpenPreviousEditorAction.ID, OpenPreviousEditorAction.LABEL, prevEditorKb), 'Navigate History'); - -// Contribute Quick Navigate in Quick Open -registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigateNextAction, QuickOpenNavigateNextAction.ID, QuickOpenNavigateNextAction.LABEL, navigateKeybinding(false), KbExpr.has('inQuickOpen')), 'Navigate Next in Quick Open'); -registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigatePreviousAction, QuickOpenNavigatePreviousAction.ID, QuickOpenNavigatePreviousAction.LABEL, navigateKeybinding(true), KbExpr.has('inQuickOpen'), KeybindingsRegistry.WEIGHT.workbenchContrib(50)), 'Navigate Previous in Quick Open'); \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 9eb9db1b6ae114518247a94b2bd82ffbf210538e..80f08e693e9d8a370359e498b772c0e8b98695dd 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -9,7 +9,7 @@ import nls = require('vs/nls'); import {TPromise} from 'vs/base/common/winjs.base'; import {Action, IAction} from 'vs/base/common/actions'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; -import {IEditorQuickOpenEntry} from 'vs/workbench/browser/quickopen'; +import {IEditorQuickOpenEntry, IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor} from 'vs/workbench/browser/quickopen'; import {StatusbarItemDescriptor, StatusbarAlignment, IStatusbarRegistry, Extensions as StatusExtensions} from 'vs/workbench/browser/parts/statusbar/statusbar'; import {EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions, IEditorInputActionContext, IEditorInputAction, EditorInputActionContributor, EditorInputAction} from 'vs/workbench/browser/parts/editor/baseEditor'; import {StringEditorInput} from 'vs/workbench/common/editor/stringEditorInput'; @@ -19,7 +19,7 @@ import {UntitledEditorInput} from 'vs/workbench/common/editor/untitledEditorInpu import {ResourceEditorInput} from 'vs/workbench/common/editor/resourceEditorInput'; import {IInstantiationService, ServicesAccessor} from 'vs/platform/instantiation/common/instantiation'; import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; -import {KbExpr} from 'vs/platform/keybinding/common/keybindingService'; +import {KbExpr, IKeybindings} from 'vs/platform/keybinding/common/keybindingService'; import {TextDiffEditor} from 'vs/workbench/browser/parts/editor/textDiffEditor'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {BinaryResourceDiffEditor} from 'vs/workbench/browser/parts/editor/binaryDiffEditor'; @@ -33,8 +33,9 @@ import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; import {EditorStacksModel} from 'vs/workbench/common/editor/editorStacksModel'; import {CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, PinEditorAction, UnpinEditorAction, CloseOtherEditorsInGroupAction, OpenToSideAction, - NavigateBetweenGroupsAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction, EvenGroupWidthsAction, MaximizeGroupAction, MinimizeOtherGroupsAction, FocusPreviousGroup, FocusNextGroup, - toEditorQuickOpenEntry, CloseLeftEditorsInGroupAction, CloseRightEditorsInGroupAction, OpenNextEditor, OpenPreviousEditor, NavigateBackwardsAction, NavigateForwardAction, ReopenClosedEditorAction + NavigateBetweenGroupsAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction, EvenGroupWidthsAction, MaximizeGroupAction, MinimizeOtherGroupsAction, FocusPreviousGroup, FocusNextGroup, ShowEditorsInGroupAction, + toEditorQuickOpenEntry, CloseLeftEditorsInGroupAction, CloseRightEditorsInGroupAction, OpenNextEditor, OpenPreviousEditor, NavigateBackwardsAction, NavigateForwardAction, ReopenClosedEditorAction, OpenPreviousEditorInGroupAction, NAVIGATE_IN_GROUP_PREFIX, + GlobalQuickOpenAction, OpenPreviousEditorAction, QuickOpenNavigateNextAction, QuickOpenNavigatePreviousAction } from 'vs/workbench/browser/parts/editor/editorActions'; // Register String Editor @@ -242,12 +243,62 @@ export class QuickOpenActionContributor extends ActionBarContributor { } } -// Contribute to Quick Open actionBarRegistry.registerActionBarContributor(Scope.VIEWER, QuickOpenActionContributor); +// Register quick open handler for navigating in editor group +Registry.as(QuickOpenExtensions.Quickopen).registerQuickOpenHandler( + new QuickOpenHandlerDescriptor( + 'vs/workbench/browser/parts/editor/editorGroupPicker', + 'EditorGroupPicker', + NAVIGATE_IN_GROUP_PREFIX, + [ + { + prefix: NAVIGATE_IN_GROUP_PREFIX, + needsEditor: false, + description: nls.localize('navigateInGroup', "Navigate in Editor Group") + } + ] + ) +); + +const quickOpenKb: IKeybindings = { + primary: KeyMod.CtrlCmd | KeyCode.KEY_P, + secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E] +}; + +function navigateKeybinding(shift: boolean): IKeybindings { + if (shift) { + return { + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P, + secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Tab], + mac: { + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P, + secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.WinCtrl | KeyMod.Shift | KeyCode.Tab] + } + }; + } else { + return { + primary: KeyMod.CtrlCmd | KeyCode.KEY_P, + secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.CtrlCmd | KeyCode.Tab], + mac: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_P, + secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.WinCtrl | KeyCode.Tab] + } + }; + } +} + // Register Editor Actions const category = nls.localize('view', "View"); - +registry.registerWorkbenchAction(new SyncActionDescriptor(OpenPreviousEditorInGroupAction, OpenPreviousEditorInGroupAction.ID, OpenPreviousEditorInGroupAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.Tab, + secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Tab], + mac: { + primary: KeyMod.WinCtrl | KeyCode.Tab, + secondary: [KeyMod.WinCtrl | KeyMod.Shift | KeyCode.Tab] + } +}), 'Open Previous in Editor Group'); +registry.registerWorkbenchAction(new SyncActionDescriptor(ShowEditorsInGroupAction, ShowEditorsInGroupAction.ID, ShowEditorsInGroupAction.LABEL), 'View: Show Editors in Group', category); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenNextEditor, OpenNextEditor.ID, OpenNextEditor.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.PageDown, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.RightArrow } @@ -292,4 +343,9 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(NavigateBackwardsActio win: { primary: KeyMod.Alt | KeyCode.LeftArrow }, mac: { primary: KeyMod.WinCtrl | KeyCode.US_MINUS }, linux: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.US_MINUS } -}), 'Go Back'); \ No newline at end of file +}), 'Go Back'); + +registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalQuickOpenAction, GlobalQuickOpenAction.ID, GlobalQuickOpenAction.LABEL, quickOpenKb), 'Go to File...'); +registry.registerWorkbenchAction(new SyncActionDescriptor(OpenPreviousEditorAction, OpenPreviousEditorAction.ID, OpenPreviousEditorAction.LABEL), 'Navigate History'); +registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigateNextAction, QuickOpenNavigateNextAction.ID, QuickOpenNavigateNextAction.LABEL, navigateKeybinding(false), KbExpr.has('inQuickOpen')), 'Navigate Next in Quick Open'); +registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigatePreviousAction, QuickOpenNavigatePreviousAction.ID, QuickOpenNavigatePreviousAction.LABEL, navigateKeybinding(true), KbExpr.has('inQuickOpen'), KeybindingsRegistry.WEIGHT.workbenchContrib(50)), 'Navigate Previous in Quick Open'); \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index cb9c18f9c6aedf8443e07ad2c13102a469081682..8a4fbaa05b6c8c43de4edd83de2ccd4fe17c4756 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -11,7 +11,7 @@ import {Action} from 'vs/base/common/actions'; import {BaseEditor} from 'vs/workbench/browser/parts/editor/baseEditor'; import {EditorInput, getUntitledOrFileResource, TextEditorOptions, EditorOptions} from 'vs/workbench/common/editor'; import {QuickOpenEntryGroup} from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import {EditorQuickOpenEntry, EditorQuickOpenEntryGroup, IEditorQuickOpenEntry} from 'vs/workbench/browser/quickopen'; +import {EditorQuickOpenEntry, EditorQuickOpenEntryGroup, IEditorQuickOpenEntry, QuickOpenAction} from 'vs/workbench/browser/quickopen'; import {IWorkbenchEditorService, GroupArrangement} from 'vs/workbench/services/editor/common/editorService'; import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService'; import {IPartService} from 'vs/workbench/services/part/common/partService'; @@ -19,6 +19,7 @@ import {Position, IEditor, Direction} from 'vs/platform/editor/common/editor'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IEditorIdentifier} from 'vs/workbench/common/editor/editorStacksModel'; import {IHistoryService} from 'vs/workbench/services/history/common/history'; +import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService'; export class SplitEditorAction extends Action { @@ -838,4 +839,141 @@ export class ReopenClosedEditorAction extends Action { return TPromise.as(false); } +} + +export const NAVIGATE_IN_GROUP_PREFIX = '~'; + +export class ShowEditorsInGroupAction extends QuickOpenAction { + + public static ID = 'workbench.action.showEditorsInGroup'; + public static LABEL = nls.localize('showEditorsInGroup', "Show Editors in Group"); + + constructor(actionId: string, actionLabel: string, @IQuickOpenService quickOpenService: IQuickOpenService) { + super(actionId, actionLabel, NAVIGATE_IN_GROUP_PREFIX, quickOpenService); + } +} + +export class OpenPreviousEditorInGroupAction extends Action { + + public static ID = 'workbench.action.openPreviousEditorInGroup'; + public static LABEL = nls.localize('openPreviousEditorInGroup', "Open Previous in Editor Group"); + + constructor( + id: string, + label: string, + @IQuickOpenService private quickOpenService: IQuickOpenService, + @IKeybindingService private keybindingService: IKeybindingService + ) { + super(id, label); + } + + public run(): TPromise { + let keys = this.keybindingService.lookupKeybindings(this.id); + + this.quickOpenService.show(NAVIGATE_IN_GROUP_PREFIX, { + keybindings: keys + }); + + return TPromise.as(true); + } +} + +export class GlobalQuickOpenAction extends Action { + + public static ID = 'workbench.action.quickOpen'; + public static LABEL = nls.localize('quickOpen', "Go to File..."); + + constructor(id: string, label: string, @IQuickOpenService private quickOpenService: IQuickOpenService) { + super(id, label); + + this.order = 100; // Allow other actions to position before or after + this.class = 'quickopen'; + } + + public run(): TPromise { + this.quickOpenService.show(null); + + return TPromise.as(true); + } +} + +export class OpenPreviousEditorAction extends Action { + + public static ID = 'workbench.action.openPreviousEditor'; + public static LABEL = nls.localize('navigateEditorHistoryByInput', "Navigate History"); + + constructor( + id: string, + label: string, + @IQuickOpenService private quickOpenService: IQuickOpenService, + @IKeybindingService private keybindingService: IKeybindingService + ) { + super(id, label); + } + + public run(): TPromise { + let keys = this.keybindingService.lookupKeybindings(this.id); + + this.quickOpenService.show(null, { + keybindings: keys + }); + + return TPromise.as(true); + } +} + +export class BaseQuickOpenNavigateAction extends Action { + private navigateNext: boolean; + + constructor( + id: string, + label: string, + navigateNext: boolean, + @IQuickOpenService private quickOpenService: IQuickOpenService, + @IKeybindingService private keybindingService: IKeybindingService + ) { + super(id, label); + + this.navigateNext = navigateNext; + } + + public run(event?: any): TPromise { + let keys = this.keybindingService.lookupKeybindings(this.id); + + this.quickOpenService.quickNavigate({ + keybindings: keys + }, this.navigateNext); + + return TPromise.as(true); + } +} + +export class QuickOpenNavigateNextAction extends BaseQuickOpenNavigateAction { + + public static ID = 'workbench.action.quickOpenNavigateNext'; + public static LABEL = nls.localize('quickNavigateNext', "Navigate Next in Quick Open"); + + constructor( + id: string, + label: string, + @IQuickOpenService quickOpenService: IQuickOpenService, + @IKeybindingService keybindingService: IKeybindingService + ) { + super(id, label, true, quickOpenService, keybindingService); + } +} + +export class QuickOpenNavigatePreviousAction extends BaseQuickOpenNavigateAction { + + public static ID = 'workbench.action.quickOpenNavigatePrevious'; + public static LABEL = nls.localize('quickNavigatePrevious', "Navigate Previous in Quick Open"); + + constructor( + id: string, + label: string, + @IQuickOpenService quickOpenService: IQuickOpenService, + @IKeybindingService keybindingService: IKeybindingService + ) { + super(id, label, false, quickOpenService, keybindingService); + } } \ No newline at end of file diff --git a/src/vs/workbench/parts/files/browser/workingFilesPicker.ts b/src/vs/workbench/browser/parts/editor/editorGroupPicker.ts similarity index 59% rename from src/vs/workbench/parts/files/browser/workingFilesPicker.ts rename to src/vs/workbench/browser/parts/editor/editorGroupPicker.ts index a70ca32d99a02fb5e720c2c71405e7e475cd88df..b938db0adc1ae73de920999f7a2fdba8d061a1cc 100644 --- a/src/vs/workbench/parts/files/browser/workingFilesPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupPicker.ts @@ -6,41 +6,33 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); -import paths = require('vs/base/common/paths'); import labels = require('vs/base/common/labels'); import URI from 'vs/base/common/uri'; import errors = require('vs/base/common/errors'); import strings = require('vs/base/common/strings'); import {IAutoFocus, Mode, IContext} from 'vs/base/parts/quickopen/common/quickOpen'; import {QuickOpenModel, QuickOpenEntry, QuickOpenEntryGroup} from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import {WorkingFilesModel, WorkingFileEntry} from 'vs/workbench/parts/files/common/workingFilesModel'; import scorer = require('vs/base/common/scorer'); import {QuickOpenHandler} from 'vs/workbench/browser/quickopen'; -import {ITextFileService} from 'vs/workbench/parts/files/common/files'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; +import {EditorInput, asFileEditorInput} from 'vs/workbench/common/editor'; -export class WorkingFilePickerEntry extends QuickOpenEntryGroup { - private name: string; - private description: string; - private workingFilesEntry: WorkingFileEntry; +export class EditorGroupPickerEntry extends QuickOpenEntryGroup { + private editor: EditorInput; constructor( - name: string, - description: string, - entry: WorkingFileEntry, + editor: EditorInput, @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { super(); - this.workingFilesEntry = entry; - this.name = name; - this.description = description; + this.editor = editor; } public getPrefix(): string { - if (this.workingFilesEntry.dirty) { + if (this.editor.isDirty()) { return '\u25cf '; // dirty decoration } @@ -48,23 +40,21 @@ export class WorkingFilePickerEntry extends QuickOpenEntryGroup { } public getLabel(): string { - return this.name; + return this.editor.getName(); } - public getAriaLabel(): string { - return nls.localize('entryAriaLabel', "{0}, working file picker", this.getLabel()); - } + public getResource(): URI { + const fileInput = asFileEditorInput(this.editor, true); - public getDescription(): string { - return this.description; + return fileInput && fileInput.getResource(); } - public getResource(): URI { - return this.workingFilesEntry.resource; + public getAriaLabel(): string { + return nls.localize('entryAriaLabel', "{0}, editor group picker", this.getLabel()); } - public getWorkingFilesEntry(): WorkingFileEntry { - return this.workingFilesEntry; + public getDescription(): string { + return this.editor.getDescription(); } public run(mode: Mode, context: IContext): boolean { @@ -76,22 +66,19 @@ export class WorkingFilePickerEntry extends QuickOpenEntryGroup { } private runOpen(context: IContext): boolean { - let event = context.event; - let sideBySide = (event && (event.ctrlKey || event.metaKey || (event.payload && event.payload.originalEvent && (event.payload.originalEvent.ctrlKey || event.payload.originalEvent.metaKey)))); - - this.editorService.openEditor({ resource: this.workingFilesEntry.resource }, sideBySide).done(null, errors.onUnexpectedError); + this.editorService.openEditor(this.editor).done(null, errors.onUnexpectedError); return true; } } -export class WorkingFilesPicker extends QuickOpenHandler { +export class EditorGroupPicker extends QuickOpenHandler { private scorerCache: { [key: string]: number }; constructor( @IInstantiationService private instantiationService: IInstantiationService, @IWorkspaceContextService private contextService: IWorkspaceContextService, - @ITextFileService private textFileService: ITextFileService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { super(); @@ -99,22 +86,18 @@ export class WorkingFilesPicker extends QuickOpenHandler { } public getResults(searchValue: string): TPromise { - searchValue = searchValue.trim(); + const stacks = this.editorService.getStacksModel(); + if (!stacks.activeGroup) { + return TPromise.as(null); + } + searchValue = searchValue.trim(); const normalizedSearchValueLowercase = strings.stripWildcards(searchValue).toLowerCase(); - return TPromise.as(new QuickOpenModel(this.textFileService.getWorkingFilesModel().getEntries() + return TPromise.as(new QuickOpenModel(stacks.activeGroup.getEditors(true) - // Convert working files to quick open entries - .map(e => { - let label = paths.basename(e.resource.fsPath); - let description = labels.getPathLabel(paths.dirname(e.resource.fsPath), this.contextService); - if (description === '.') { - description = null; // for untitled files - } - - return this.instantiationService.createInstance(WorkingFilePickerEntry, label, description, e); - }) + // Convert to quick open entries + .map(e => this.instantiationService.createInstance(EditorGroupPickerEntry, e)) // Filter by search value .filter(e => { @@ -122,7 +105,8 @@ export class WorkingFilesPicker extends QuickOpenHandler { return true; } - let targetToMatch = labels.getPathLabel(e.getResource(), this.contextService); + let resource = e.getResource(); + let targetToMatch = resource ? labels.getPathLabel(e.getResource(), this.contextService) : e.getLabel(); if (!scorer.matches(targetToMatch, normalizedSearchValueLowercase)) { return false; } @@ -136,7 +120,7 @@ export class WorkingFilesPicker extends QuickOpenHandler { // Sort by search value score or natural order if not searching sort((e1, e2) => { if (!searchValue) { - return WorkingFilesModel.compare(e1.getWorkingFilesEntry(), e2.getWorkingFilesEntry()); + return 0; } return QuickOpenEntry.compareByScore(e1, e2, searchValue, normalizedSearchValueLowercase, this.scorerCache); @@ -145,7 +129,7 @@ export class WorkingFilesPicker extends QuickOpenHandler { // Apply group label map((e, index) => { if (index === 0) { - e.setGroupLabel(nls.localize('workingFilesGroupLabel', "working files")); + e.setGroupLabel(nls.localize('groupLabel', "Group: {0}", stacks.activeGroup.label)); } return e; @@ -154,10 +138,10 @@ export class WorkingFilesPicker extends QuickOpenHandler { public getEmptyLabel(searchString: string): string { if (searchString) { - return nls.localize('noResultsFound', "No matching working files found"); + return nls.localize('noResultsFound', "No matching opened editor found in group"); } - return nls.localize('noWorkingFiles', "List of working files is currently empty"); + return nls.localize('noOpenedEditors', "List of opened editors is currently empty"); } public getAutoFocus(searchValue: string): IAutoFocus { @@ -167,7 +151,15 @@ export class WorkingFilesPicker extends QuickOpenHandler { }; } - return super.getAutoFocus(searchValue); + const stacks = this.editorService.getStacksModel(); + if (!stacks.activeGroup) { + return super.getAutoFocus(searchValue); + } + + return { + autoFocusFirstEntry: stacks.activeGroup.count === 1, + autoFocusSecondEntry: stacks.activeGroup.count > 1 + }; } public onClose(canceled: boolean): void { diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts index a65208ac16549ec8ace914369fba27a30b34f26b..1246e340a373ca364970b66effe0d3e0e0b94c35 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts @@ -7,7 +7,6 @@ import 'vs/css!./media/sidebyside'; import nls = require('vs/nls'); -import {TPromise} from 'vs/base/common/winjs.base'; import {Registry} from 'vs/platform/platform'; import {Scope, IActionBarRegistry, Extensions, prepareActions} from 'vs/workbench/browser/actionBarRegistry'; import {IAction, Action} from 'vs/base/common/actions'; @@ -34,7 +33,7 @@ import {IMessageService, Severity} from 'vs/platform/message/common/message'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService'; -import {CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, CloseEditorAction} from 'vs/workbench/browser/parts/editor/editorActions'; +import {ShowEditorsInGroupAction, CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, CloseEditorAction} from 'vs/workbench/browser/parts/editor/editorActions'; export enum Rochade { NONE, @@ -96,28 +95,6 @@ export interface ISideBySideEditorControl { dispose(): void; } -class ShowGroupEditors extends Action { - - public static ID = 'workbench.action.showGroupEditors'; - public static LABEL = nls.localize('showGroupEditors', "Show Editors in Group"); - - constructor(id: string, label: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService) { - super(id, label, 'show-editors-action'); - } - - public setOverflowing(isOverflowing: boolean): void { - if (isOverflowing) { - this.class = 'show-group-editors-overflowing-action'; - } else { - this.class = 'show-group-editors-action'; - } - } - - public run(position: Position): TPromise { - return TPromise.as(false); // TODO@Ben - } -} - /** * Helper class to manage multiple side by side editors for the editor part. */ @@ -147,7 +124,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti private mapActionsToEditors: { [editorId: string]: IEditorActions; }[]; private closeEditorActions: CloseEditorAction[]; - private showEditorsOfGroup: ShowGroupEditors[]; + private showEditorsOfGroup: ShowEditorsInGroupAction[]; private moveGroupLeftActions: MoveGroupLeftAction[]; private moveGroupRightActions: MoveGroupRightAction[]; private closeEditorsInGroupActions: CloseEditorsInGroupAction[]; @@ -216,7 +193,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti this.closeEditorActions = POSITIONS.map((position) => this.instantiationService.createInstance(CloseEditorAction, CloseEditorAction.ID, CloseEditorAction.LABEL)); // Show Editors - this.showEditorsOfGroup = POSITIONS.map((position) => this.instantiationService.createInstance(ShowGroupEditors, ShowGroupEditors.ID, ShowGroupEditors.LABEL)); + this.showEditorsOfGroup = POSITIONS.map((position) => this.instantiationService.createInstance(ShowEditorsInGroupAction, ShowEditorsInGroupAction.ID, ShowEditorsInGroupAction.LABEL)); // Split this.splitEditorAction = this.instantiationService.createInstance(SplitEditorAction, SplitEditorAction.ID, SplitEditorAction.LABEL); @@ -1330,7 +1307,11 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti } const showEditorAction = this.showEditorsOfGroup[position]; - showEditorAction.setOverflowing(isOverflowing); + if (isOverflowing) { + showEditorAction.class = 'show-group-editors-overflowing-action'; + } else { + showEditorAction.class = 'show-group-editors-action'; + } primaryActions.unshift(this.showEditorsOfGroup[position]); // Secondary Actions diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 88c29e932391e4841ecd4f11c36ba77fdcd15cf1..62faf7ad84e89a34512179095aa7f8c616479c6d 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -431,7 +431,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe // Set input if (!this.pickOpenWidget.isVisible()) { - this.pickOpenWidget.show(model, autoFocus); + this.pickOpenWidget.show(model, void 0, autoFocus); } else { this.pickOpenWidget.setInput(model, autoFocus); } @@ -544,7 +544,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe // Show quick open with prefix or editor history if (!this.quickOpenWidget.isVisible() || quickNavigateConfiguration) { if (prefix) { - this.quickOpenWidget.show(prefix); + this.quickOpenWidget.show(prefix, quickNavigateConfiguration); } else { let editorHistory = this.getEditorHistoryModelWithGroupLabel(); if (editorHistory.getEntries().length < 2) { @@ -559,7 +559,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe autoFocus = { autoFocusFirstEntry: visibleEditorCount === 0, autoFocusSecondEntry: visibleEditorCount !== 0 }; } - this.quickOpenWidget.show(editorHistory, autoFocus, quickNavigateConfiguration); + this.quickOpenWidget.show(editorHistory, quickNavigateConfiguration, autoFocus); } } diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index f62877508973eeccf2ff7ac0dc69ada67b6b75f0..8186af388cd4a1ba79fedb7ac778fa4cddb87444 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -12,13 +12,11 @@ import {ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, Tog import nls = require('vs/nls'); import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import {Registry} from 'vs/platform/platform'; -import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService'; import {IConfigurationRegistry, Extensions as ConfigurationExtensions} from 'vs/platform/configuration/common/configurationRegistry'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions} from 'vs/workbench/common/contributions'; import {IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory} from 'vs/workbench/browser/parts/editor/baseEditor'; import {EditorInput, IFileEditorInput} from 'vs/workbench/common/editor'; -import {QuickOpenHandlerDescriptor, IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenAction} from 'vs/workbench/browser/quickopen'; import {FileEditorDescriptor} from 'vs/workbench/parts/files/browser/files'; import {AutoSaveConfiguration, SUPPORTED_ENCODINGS} from 'vs/platform/files/common/files'; import {FILE_EDITOR_INPUT_ID, VIEWLET_ID} from 'vs/workbench/parts/files/common/files'; @@ -256,37 +254,4 @@ configurationRegistry.registerConfiguration({ 'default': true } } -}); - -// Register quick open handler for working files - -const ALL_WORKING_FILES_PREFIX = '~'; - -class OpenWorkingFileByNameAction extends QuickOpenAction { - - public static ID = 'workbench.files.action.workingFilesPicker'; - public static LABEL = nls.localize('workingFilesPicker', "Open Working File by Name"); - - constructor(actionId: string, actionLabel: string, @IQuickOpenService quickOpenService: IQuickOpenService) { - super(actionId, actionLabel, ALL_WORKING_FILES_PREFIX, quickOpenService); - } -} - -(Registry.as(QuickOpenExtensions.Quickopen)).registerQuickOpenHandler( - new QuickOpenHandlerDescriptor( - 'vs/workbench/parts/files/browser/workingFilesPicker', - 'WorkingFilesPicker', - ALL_WORKING_FILES_PREFIX, - [ - { - prefix: ALL_WORKING_FILES_PREFIX, - needsEditor: false, - description: nls.localize('openWorkingFile', "Open Working File By Name") - } - ] - ) -); - -registry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkingFileByNameAction, OpenWorkingFileByNameAction.ID, OpenWorkingFileByNameAction.LABEL, { - primary: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_P) -}), 'Files: Open Working File by Name', nls.localize('filesCategory', "Files")); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/vs/workbench/workbench.main.js b/src/vs/workbench/workbench.main.js index 49640b259bee3f6b52f089d593eaf48a47d99fac..c586a852b2535cb36b69e1195cf327a027721749 100644 --- a/src/vs/workbench/workbench.main.js +++ b/src/vs/workbench/workbench.main.js @@ -26,14 +26,13 @@ define([ // Workbench 'vs/workbench/browser/actions/toggleSidebarVisibility', 'vs/workbench/browser/actions/toggleSidebarPosition', - 'vs/workbench/browser/actions/triggerQuickOpen', 'vs/workbench/browser/actions/openSettings', 'vs/workbench/browser/actions/configureLocale', 'vs/workbench/parts/quickopen/browser/quickopen.contribution', + 'vs/workbench/browser/parts/editor/editorGroupPicker', 'vs/workbench/parts/files/browser/explorerViewlet', - 'vs/workbench/parts/files/browser/workingFilesPicker', 'vs/workbench/parts/files/browser/fileActions.contribution', 'vs/workbench/parts/files/browser/files.contribution', 'vs/workbench/parts/files/electron-browser/files.electron.contribution',