提交 f5a41b78 编写于 作者: D Daniel Imms

Implement open recently closed file(s) action

Exposes the workbench.files.action.openRecentlyClosedFile command that opens
the file or files most recently removed from the working files list.

Part of #3989
上级 be0565c6
......@@ -10,7 +10,7 @@ import {Action, IAction} from 'vs/base/common/actions';
import {ActionItem, BaseActionItem, Separator} from 'vs/base/browser/ui/actionbar/actionbar';
import {Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor} from 'vs/workbench/browser/actionBarRegistry';
import {IEditorInputActionContext, IEditorInputAction, EditorInputActionContributor} from 'vs/workbench/browser/parts/editor/baseEditor';
import {AddToWorkingFiles, FocusWorkingFiles, FocusFilesExplorer, OpenPreviousWorkingFile, OpenNextWorkingFile, CloseAllFilesAction, CloseFileAction, CloseOtherFilesAction, GlobalCompareResourcesAction, GlobalNewFolderAction, RevertFileAction, SaveFilesAction, SaveAllAction, SaveFileAction, keybindingForAction, MoveFileToTrashAction, TriggerRenameFileAction, PasteFileAction, CopyFileAction, SelectResourceForCompareAction, CompareResourcesAction, NewFolderAction, NewFileAction, OpenToSideAction, ShowActiveFileInExplorer} from 'vs/workbench/parts/files/browser/fileActions';
import {AddToWorkingFiles, FocusWorkingFiles, FocusFilesExplorer, OpenPreviousWorkingFile, OpenNextWorkingFile, CloseAllFilesAction, CloseFileAction, CloseOtherFilesAction, GlobalCompareResourcesAction, GlobalNewFolderAction, RevertFileAction, SaveFilesAction, SaveAllAction, SaveFileAction, keybindingForAction, MoveFileToTrashAction, TriggerRenameFileAction, PasteFileAction, CopyFileAction, SelectResourceForCompareAction, CompareResourcesAction, NewFolderAction, NewFileAction, OpenRecentlyClosedResourcesAction, OpenToSideAction, ShowActiveFileInExplorer} from 'vs/workbench/parts/files/browser/fileActions';
import {RevertLocalChangesAction, AcceptLocalChangesAction, ConflictResolutionDiffEditorInput} from 'vs/workbench/parts/files/browser/saveErrorHandler';
import {SyncActionDescriptor} from 'vs/platform/actions/common/actions';
import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry';
......@@ -169,6 +169,7 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(RevertFileAction, Reve
registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalNewFolderAction, GlobalNewFolderAction.ID, GlobalNewFolderAction.LABEL), category);
registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalCompareResourcesAction, GlobalCompareResourcesAction.ID, GlobalCompareResourcesAction.LABEL), category);
registry.registerWorkbenchAction(new SyncActionDescriptor(CloseFileAction, CloseFileAction.ID, CloseFileAction.LABEL, { primary: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_W) }), category);
registry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentlyClosedResourcesAction, OpenRecentlyClosedResourcesAction.ID, OpenRecentlyClosedResourcesAction.LABEL), category);
registry.registerWorkbenchAction(new SyncActionDescriptor(CloseOtherFilesAction, CloseOtherFilesAction.ID, CloseOtherFilesAction.LABEL, { primary: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_W) }), category);
registry.registerWorkbenchAction(new SyncActionDescriptor(CloseAllFilesAction, CloseAllFilesAction.ID, CloseAllFilesAction.LABEL, { primary: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_W) }), category);
registry.registerWorkbenchAction(new SyncActionDescriptor(OpenNextWorkingFile, OpenNextWorkingFile.ID, OpenNextWorkingFile.LABEL, { primary: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.DownArrow) }), category);
......
......@@ -1783,6 +1783,43 @@ export class OpenResourcesAction extends Action {
}
}
export class OpenRecentlyClosedResourcesAction extends Action {
public static ID = 'workbench.files.action.openRecentlyClosedFile';
public static LABEL = nls.localize('openRecentlyClosedFile', "Open Recently Closed File");
constructor(
id: string,
label: string,
@IPartService private partService: IPartService,
@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
@IViewletService private viewletService: IViewletService,
@ITextFileService private textFileService: ITextFileService
) {
super(id, label);
}
public run(): TPromise<any> {
return this.partService.joinCreation().then(() => {
let viewletPromise = TPromise.as(null);
if (!this.partService.isSideBarHidden()) {
viewletPromise = this.viewletService.openViewlet(Files.VIEWLET_ID, false);
}
return viewletPromise.then(() => {
let resource = this.textFileService.getWorkingFilesModel().restoreRecentlyRemovedEntry();
// If there are no files in the recently closed stack
if (resource === null) {
return TPromise.as(true);
}
return this.editorService.openEditor(resource);
});
});
}
}
export abstract class BaseCloseWorkingFileAction extends Action {
protected model: WorkingFilesModel;
private elements: URI[];
......
......@@ -105,6 +105,8 @@ export interface IWorkingFilesModel {
removeEntry(entry: IWorkingFileEntry): IWorkingFileEntry;
removeEntry(arg1: IWorkingFileEntry | URI): IWorkingFileEntry;
restoreRecentlyRemovedEntry(): IWorkingFileEntry;
reorder(source: IWorkingFileEntry, target: IWorkingFileEntry): void;
hasEntry(resource: URI): boolean;
......
......@@ -27,6 +27,7 @@ export class WorkingFilesModel implements IWorkingFilesModel {
private static STORAGE_KEY = 'workingFiles.model.entries';
private entries: WorkingFileEntry[];
private recentlyClosedEntries: (uri | uri[])[];
private pathLabelProvider: labels.PathLabelProvider;
private mapEntryToResource: { [resource: string]: WorkingFileEntry; };
private _onModelChange: Emitter<IWorkingFileModelChangeEvent>;
......@@ -44,6 +45,7 @@ export class WorkingFilesModel implements IWorkingFilesModel {
) {
this.pathLabelProvider = new labels.PathLabelProvider(this.contextService);
this.entries = [];
this.recentlyClosedEntries = [];
this.toDispose = [];
this.mapEntryToResource = Object.create(null);
this._onModelChange = new Emitter<IWorkingFileModelChangeEvent>();
......@@ -276,6 +278,7 @@ export class WorkingFilesModel implements IWorkingFilesModel {
let resource: uri = arg1 instanceof WorkingFileEntry ? (<WorkingFileEntry>arg1).resource : <uri>arg1;
let index = this.indexOf(resource);
if (index >= 0) {
this.recentlyClosedEntries.push(resource);
// Remove entry
let removed = this.entries.splice(index, 1)[0];
......@@ -300,6 +303,25 @@ export class WorkingFilesModel implements IWorkingFilesModel {
return null;
}
public restoreRecentlyRemovedEntry(): WorkingFileEntry {
if (this.recentlyClosedEntries.length > 0) {
var resource: (uri | uri[]) = this.recentlyClosedEntries.pop();
if (!(resource instanceof uri)) {
var resources = <uri[]>resource;
var newEntries: WorkingFileEntry[] = [];
var that = this;
resources.forEach(function (resource) {
newEntries.push(that.addEntry(resource));
});
// TODO: Restore the correct entry
return newEntries[0];
}
return this.addEntry(<uri>resource);
}
return null;
}
public reorder(source: WorkingFileEntry, target: WorkingFileEntry): void {
let sortedEntries = this.entries.slice(0).sort(WorkingFilesModel.compare);
......@@ -319,6 +341,9 @@ export class WorkingFilesModel implements IWorkingFilesModel {
}
public clear(): void {
this.recentlyClosedEntries.push(this.entries.map((entry) => {
return entry.resource;
}));
let deleted = this.entries;
this.entries = [];
this.mapEntryToResource = Object.create(null);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册