提交 18bd8798 编写于 作者: B Benjamin Pasero

navigate in editor groups

上级 bc8547c4
......@@ -416,9 +416,9 @@ export class QuickOpenWidget implements IModelProvider {
}
}
public show(prefix: string): void;
public show(input: IModel<any>, 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<any>, quickNavigateConfiguration?: IQuickNavigateConfiguration, autoFocus?: IAutoFocus): void;
public show(param: any, quickNavigateConfiguration?: IQuickNavigateConfiguration, autoFocus?: IAutoFocus): void {
if (types.isUndefined(autoFocus)) {
autoFocus = {};
}
......
/*---------------------------------------------------------------------------------------------
* 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<any> {
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<any> {
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<any> {
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<IWorkbenchActionRegistry>(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
......@@ -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<IQuickOpenRegistry>(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
......@@ -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<any> {
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<any> {
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<any> {
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<any> {
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
......@@ -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<QuickOpenModel> {
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 {
......
......@@ -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<any> {
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
......
......@@ -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);
}
}
......
......@@ -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);
}
}
(<IQuickOpenRegistry>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
......@@ -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',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册