editorActions.ts 38.8 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

7
import {TPromise} from 'vs/base/common/winjs.base';
E
Erich Gamma 已提交
8
import nls = require('vs/nls');
9
import {Action} from 'vs/base/common/actions';
10
import {EditorInput, getUntitledOrFileResource, TextEditorOptions, EditorOptions, IEditorIdentifier, IEditorContext, ActiveEditorMoveArguments, ActiveEditorMovePositioning, EditorCommands} from 'vs/workbench/common/editor';
E
Erich Gamma 已提交
11
import {QuickOpenEntryGroup} from 'vs/base/parts/quickopen/browser/quickOpenModel';
B
Benjamin Pasero 已提交
12
import {EditorQuickOpenEntry, EditorQuickOpenEntryGroup, IEditorQuickOpenEntry, QuickOpenAction} from 'vs/workbench/browser/quickopen';
13
import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService';
14
import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService';
15
import {IPartService} from 'vs/workbench/services/part/common/partService';
B
Benjamin Pasero 已提交
16
import {Position, IEditor, Direction, IResourceInput, IEditorInput} from 'vs/platform/editor/common/editor';
E
Erich Gamma 已提交
17
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
B
Benjamin Pasero 已提交
18
import {IHistoryService} from 'vs/workbench/services/history/common/history';
19
import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding';
20
import {IEditorGroupService, GroupArrangement} from 'vs/workbench/services/group/common/groupService';
21
import {BaseTextEditor} from 'vs/workbench/browser/parts/editor/textEditor';
22
import {ICommandService} from 'vs/platform/commands/common/commands';
E
Erich Gamma 已提交
23 24 25

export class SplitEditorAction extends Action {

26 27 28
	public static ID = 'workbench.action.splitEditor';
	public static LABEL = nls.localize('splitEditor', "Split Editor");

29 30 31 32 33 34
	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
		@IEditorGroupService private editorGroupService: IEditorGroupService
	) {
I
isidor 已提交
35
		super(id, label, 'split-editor-action');
E
Erich Gamma 已提交
36 37
	}

B
Benjamin Pasero 已提交
38
	public run(context?: IEditorContext): TPromise<any> {
39 40 41 42 43 44
		let editorToSplit: IEditor;
		if (context) {
			editorToSplit = this.editorService.getVisibleEditors()[this.editorGroupService.getStacksModel().positionOfGroup(context.group)];
		} else {
			editorToSplit = this.editorService.getActiveEditor();
		}
E
Erich Gamma 已提交
45

46 47
		// Can only split with target editor
		if (!editorToSplit) {
A
Alex Dima 已提交
48
			return TPromise.as(true);
E
Erich Gamma 已提交
49 50 51
		}

		// Return if the editor to split does not support split editing
52
		if (editorToSplit.input instanceof EditorInput && !(<EditorInput>editorToSplit.input).supportsSplitEditor()) {
A
Alex Dima 已提交
53
			return TPromise.as(true);
E
Erich Gamma 已提交
54 55
		}

56 57
		// Options
		let options: EditorOptions;
58
		if (editorToSplit instanceof BaseTextEditor) {
59
			options = new TextEditorOptions();
60
			(<TextEditorOptions>options).fromEditor(editorToSplit.getControl());
61 62 63 64 65
		} else {
			options = new EditorOptions();
		}
		options.pinned = true;

E
Erich Gamma 已提交
66
		// Count editors
67 68
		const visibleEditors = this.editorService.getVisibleEditors();
		const editorCount = visibleEditors.length;
E
Erich Gamma 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81
		let targetPosition: Position;

		switch (editorCount) {

			// Open split editor to the right of left one
			case 1:
				targetPosition = Position.CENTER;
				break;

			// Special case two editors opened
			case 2:

				// Continue splitting to the right
82
				if (editorToSplit.position === Position.CENTER) {
E
Erich Gamma 已提交
83 84 85
					targetPosition = Position.RIGHT;
				}

86
				// Push the center group to the right to make room for the splitted input
87
				else if (editorToSplit.position === Position.LEFT) {
E
Erich Gamma 已提交
88 89
					options.preserveFocus = true;

90
					return this.editorService.openEditor(editorToSplit.input, options, Position.RIGHT).then(() => {
91 92
						this.editorGroupService.moveGroup(Position.RIGHT, Position.CENTER);
						this.editorGroupService.focusGroup(Position.CENTER);
E
Erich Gamma 已提交
93 94 95 96
					});
				}
		}

97 98
		// Only split if we have a target position to split to
		if (typeof targetPosition === 'number') {
99
			return this.editorService.openEditor(editorToSplit.input, options, targetPosition);
E
Erich Gamma 已提交
100 101
		}

A
Alex Dima 已提交
102
		return TPromise.as(true);
E
Erich Gamma 已提交
103 104 105
	}
}

B
Benjamin Pasero 已提交
106
export class NavigateBetweenGroupsAction extends Action {
107

B
Benjamin Pasero 已提交
108 109
	public static ID = 'workbench.action.navigateEditorGroups';
	public static LABEL = nls.localize('navigateEditorGroups', "Navigate Between Editor Groups");
E
Erich Gamma 已提交
110

111 112 113 114 115 116
	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
		@IEditorGroupService private editorGroupService: IEditorGroupService
	) {
E
Erich Gamma 已提交
117 118 119
		super(id, label);
	}

120
	public run(): TPromise<any> {
E
Erich Gamma 已提交
121 122

		// Can cycle split with active editor
123
		const activeEditor = this.editorService.getActiveEditor();
E
Erich Gamma 已提交
124
		if (!activeEditor) {
A
Alex Dima 已提交
125
			return TPromise.as(false);
E
Erich Gamma 已提交
126 127 128
		}

		// Cycle to the left and use module to start at 0 again
129 130 131
		const visibleEditors = this.editorService.getVisibleEditors();
		const editorCount = visibleEditors.length;
		const newIndex = (activeEditor.position + 1) % editorCount;
E
Erich Gamma 已提交
132

133
		this.editorGroupService.focusGroup(<Position>newIndex);
134 135

		return TPromise.as(true);
E
Erich Gamma 已提交
136 137 138
	}
}

139 140 141 142 143 144 145 146 147 148 149 150 151 152
export class FocusActiveGroupAction extends Action {

	public static ID = 'workbench.action.focusActiveEditorGroup';
	public static LABEL = nls.localize('focusActiveEditorGroup', "Focus Active Editor Group");

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
B
hygiene  
Benjamin Pasero 已提交
153 154
		const activeEditor = this.editorService.getActiveEditor();
		if (activeEditor) {
D
Daniel Imms 已提交
155
			activeEditor.focus();
B
hygiene  
Benjamin Pasero 已提交
156
		}
D
Daniel Imms 已提交
157

158
		return TPromise.as(true);
E
Erich Gamma 已提交
159 160 161
	}
}

162 163
export class FocusFirstGroupAction extends Action {

B
Benjamin Pasero 已提交
164
	public static ID = 'workbench.action.focusFirstEditorGroup';
B
Benjamin Pasero 已提交
165
	public static LABEL = nls.localize('focusFirstEditorGroup', "Focus Left Editor Group");
E
Erich Gamma 已提交
166 167 168 169 170

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
171
		@IEditorGroupService private editorGroupService: IEditorGroupService,
172
		@IHistoryService private historyService: IHistoryService
E
Erich Gamma 已提交
173 174 175 176
	) {
		super(id, label);
	}

177
	public run(): TPromise<any> {
E
Erich Gamma 已提交
178 179

		// Find left editor and focus it
180
		const editors = this.editorService.getVisibleEditors();
B
Benjamin Pasero 已提交
181
		for (let editor of editors) {
E
Erich Gamma 已提交
182
			if (editor.position === Position.LEFT) {
183
				this.editorGroupService.focusGroup(Position.LEFT);
184 185

				return TPromise.as(true);
E
Erich Gamma 已提交
186 187 188 189
			}
		}

		// Since no editor is currently opened, try to open last history entry to the target side
190
		const history = this.historyService.getHistory();
B
Benjamin Pasero 已提交
191
		for (let input of history) {
E
Erich Gamma 已提交
192

193 194 195 196 197 198 199
			// For now only support to open files from history to the side
			if (input instanceof EditorInput) {
				if (!!getUntitledOrFileResource(input)) {
					return this.editorService.openEditor(input, null, Position.LEFT);
				}
			} else {
				return this.editorService.openEditor(input as IResourceInput, Position.LEFT);
E
Erich Gamma 已提交
200 201 202
			}
		}

A
Alex Dima 已提交
203
		return TPromise.as(true);
E
Erich Gamma 已提交
204 205 206
	}
}

207
export abstract class BaseFocusSideGroupAction extends Action {
E
Erich Gamma 已提交
208 209 210 211 212

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
213
		@IEditorGroupService private editorGroupService: IEditorGroupService,
214
		@IHistoryService private historyService: IHistoryService
E
Erich Gamma 已提交
215 216 217 218 219 220 221 222
	) {
		super(id, label);
	}

	protected abstract getReferenceEditorSide(): Position;

	protected abstract getTargetEditorSide(): Position;

223
	public run(): TPromise<any> {
E
Erich Gamma 已提交
224 225

		// Require at least the reference editor to be visible
226
		const editors = this.editorService.getVisibleEditors();
E
Erich Gamma 已提交
227 228
		let referenceEditor: IEditor;
		for (let i = 0; i < editors.length; i++) {
229
			const editor = editors[i];
E
Erich Gamma 已提交
230 231 232

			// Target editor exists so focus it
			if (editor.position === this.getTargetEditorSide()) {
233
				this.editorGroupService.focusGroup(editor.position);
234 235

				return TPromise.as(true);
E
Erich Gamma 已提交
236 237 238 239 240 241 242 243 244
			}

			// Remember reference editor
			if (editor.position === this.getReferenceEditorSide()) {
				referenceEditor = editor;
			}
		}

		// Require the reference editor to be visible and supporting split editor
245
		if (referenceEditor && (<EditorInput>referenceEditor.input).supportsSplitEditor()) {
246 247 248 249 250

			// Options
			let options: EditorOptions;
			if (referenceEditor instanceof BaseTextEditor) {
				options = new TextEditorOptions();
251
				options.pinned = true;
252
				(<TextEditorOptions>options).fromEditor(referenceEditor.getControl());
253 254
			} else {
				options = EditorOptions.create({ pinned: true });
255 256 257
			}

			return this.editorService.openEditor(referenceEditor.input, options, this.getTargetEditorSide());
E
Erich Gamma 已提交
258 259 260 261
		}

		// Otherwise try to find a history entry to open to the target editor side
		else if (referenceEditor) {
262
			const history = this.historyService.getHistory();
B
Benjamin Pasero 已提交
263
			for (let input of history) {
E
Erich Gamma 已提交
264 265

				// For now only support to open files from history to the side
266 267 268 269 270 271
				if (input instanceof EditorInput) {
					if (!!getUntitledOrFileResource(input)) {
						return this.editorService.openEditor(input, { pinned: true }, this.getTargetEditorSide());
					}
				} else {
					return this.editorService.openEditor({ resource: (input as IResourceInput).resource, options: { pinned: true } }, this.getTargetEditorSide());
E
Erich Gamma 已提交
272 273 274 275
				}
			}
		}

A
Alex Dima 已提交
276
		return TPromise.as(true);
E
Erich Gamma 已提交
277 278 279
	}
}

280 281
export class FocusSecondGroupAction extends BaseFocusSideGroupAction {

B
Benjamin Pasero 已提交
282
	public static ID = 'workbench.action.focusSecondEditorGroup';
B
Benjamin Pasero 已提交
283
	public static LABEL = nls.localize('focusSecondEditorGroup', "Focus Center Editor Group");
E
Erich Gamma 已提交
284 285 286 287 288

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
289
		@IEditorGroupService editorGroupService: IEditorGroupService,
290
		@IHistoryService historyService: IHistoryService
E
Erich Gamma 已提交
291
	) {
292
		super(id, label, editorService, editorGroupService, historyService);
E
Erich Gamma 已提交
293 294 295 296 297 298 299 300 301 302 303
	}

	protected getReferenceEditorSide(): Position {
		return Position.LEFT;
	}

	protected getTargetEditorSide(): Position {
		return Position.CENTER;
	}
}

304 305
export class FocusThirdGroupAction extends BaseFocusSideGroupAction {

B
Benjamin Pasero 已提交
306
	public static ID = 'workbench.action.focusThirdEditorGroup';
B
Benjamin Pasero 已提交
307
	public static LABEL = nls.localize('focusThirdEditorGroup', "Focus Right Editor Group");
E
Erich Gamma 已提交
308 309 310 311 312

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
313
		@IEditorGroupService editorGroupService: IEditorGroupService,
314
		@IHistoryService historyService: IHistoryService
E
Erich Gamma 已提交
315
	) {
316
		super(id, label, editorService, editorGroupService, historyService);
E
Erich Gamma 已提交
317 318 319 320 321 322 323 324 325 326 327
	}

	protected getReferenceEditorSide(): Position {
		return Position.CENTER;
	}

	protected getTargetEditorSide(): Position {
		return Position.RIGHT;
	}
}

B
Benjamin Pasero 已提交
328
export class FocusPreviousGroup extends Action {
329

B
Benjamin Pasero 已提交
330 331
	public static ID = 'workbench.action.focusPreviousGroup';
	public static LABEL = nls.localize('focusPreviousGroup', "Focus Previous Group");
E
Erich Gamma 已提交
332

333 334 335 336 337 338
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
E
Erich Gamma 已提交
339 340 341
		super(id, label);
	}

342
	public run(): TPromise<any> {
E
Erich Gamma 已提交
343 344

		// Require an active editor
345
		const activeEditor = this.editorService.getActiveEditor();
E
Erich Gamma 已提交
346
		if (!activeEditor) {
A
Alex Dima 已提交
347
			return TPromise.as(true);
E
Erich Gamma 已提交
348 349 350 351 352 353 354 355 356 357
		}


		// Find the next position to the left
		let nextPosition: Position = Position.LEFT;
		if (activeEditor.position === Position.RIGHT) {
			nextPosition = Position.CENTER;
		}

		// Focus next position if provided
358
		this.editorGroupService.focusGroup(nextPosition);
359 360

		return TPromise.as(true);
E
Erich Gamma 已提交
361 362 363
	}
}

B
Benjamin Pasero 已提交
364
export class FocusNextGroup extends Action {
365

B
Benjamin Pasero 已提交
366 367
	public static ID = 'workbench.action.focusNextGroup';
	public static LABEL = nls.localize('focusNextGroup', "Focus Next Group");
368

E
Erich Gamma 已提交
369 370 371 372 373 374 375 376 377 378 379
	private navigateActions: Action[];

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
		@IInstantiationService instantiationService: IInstantiationService
	) {
		super(id, label);

		this.navigateActions = [];
380 381 382
		this.navigateActions[Position.LEFT] = instantiationService.createInstance(FocusFirstGroupAction, FocusFirstGroupAction.ID, FocusFirstGroupAction.LABEL);
		this.navigateActions[Position.CENTER] = instantiationService.createInstance(FocusSecondGroupAction, FocusSecondGroupAction.ID, FocusSecondGroupAction.LABEL);
		this.navigateActions[Position.RIGHT] = instantiationService.createInstance(FocusThirdGroupAction, FocusThirdGroupAction.ID, FocusThirdGroupAction.LABEL);
E
Erich Gamma 已提交
383 384
	}

385
	public run(event?: any): TPromise<any> {
E
Erich Gamma 已提交
386 387 388

		// Find the next position to the right to use
		let nextPosition: Position;
389
		const activeEditor = this.editorService.getActiveEditor();
E
Erich Gamma 已提交
390 391 392 393 394 395 396 397 398
		if (!activeEditor) {
			nextPosition = Position.LEFT;
		} else if (activeEditor.position === Position.LEFT) {
			nextPosition = Position.CENTER;
		} else if (activeEditor.position === Position.CENTER) {
			nextPosition = Position.RIGHT;
		}

		// Run the action for the target next position
399
		if (typeof nextPosition === 'number' && this.navigateActions[nextPosition]) {
E
Erich Gamma 已提交
400 401 402
			return this.navigateActions[nextPosition].run(event);
		}

A
Alex Dima 已提交
403
		return TPromise.as(true);
E
Erich Gamma 已提交
404 405 406 407 408 409 410 411
	}
}

export class OpenToSideAction extends Action {

	public static OPEN_TO_SIDE_ID = 'workbench.action.openToSide';
	public static OPEN_TO_SIDE_LABEL = nls.localize('openToSide', "Open to the Side");

B
💄  
Benjamin Pasero 已提交
412
	constructor(@IWorkbenchEditorService private editorService: IWorkbenchEditorService) {
E
Erich Gamma 已提交
413 414 415 416 417 418 419 420
		super(OpenToSideAction.OPEN_TO_SIDE_ID, OpenToSideAction.OPEN_TO_SIDE_LABEL);

		this.class = 'quick-open-sidebyside';

		this.updateEnablement();
	}

	private updateEnablement(): void {
421
		const activeEditor = this.editorService.getActiveEditor();
E
Erich Gamma 已提交
422 423 424
		this.enabled = (!activeEditor || activeEditor.position !== Position.RIGHT);
	}

425
	public run(context: any): TPromise<any> {
E
Erich Gamma 已提交
426 427
		let entry = toEditorQuickOpenEntry(context);
		if (entry) {
B
Benjamin Pasero 已提交
428
			let typedInputPromise: TPromise<EditorInput>;
429
			const input = entry.getInput();
B
Benjamin Pasero 已提交
430 431 432
			if (input instanceof EditorInput) {
				typedInputPromise = TPromise.as(input);
			} else {
B
Benjamin Pasero 已提交
433
				typedInputPromise = this.editorService.createInput(<IResourceInput>input);
B
Benjamin Pasero 已提交
434 435 436
			}

			return typedInputPromise.then(typedInput => this.editorService.openEditor(typedInput, entry.getOptions(), true));
E
Erich Gamma 已提交
437 438
		}

A
Alex Dima 已提交
439
		return TPromise.as(false);
E
Erich Gamma 已提交
440 441 442
	}
}

443
export function toEditorQuickOpenEntry(element: any): IEditorQuickOpenEntry {
E
Erich Gamma 已提交
444 445 446

	// QuickOpenEntryGroup
	if (element instanceof QuickOpenEntryGroup) {
447
		const group = <QuickOpenEntryGroup>element;
E
Erich Gamma 已提交
448 449 450 451 452 453 454 455 456 457 458 459 460 461
		if (group.getEntry()) {
			element = group.getEntry();
		}
	}

	// EditorQuickOpenEntry or EditorQuickOpenEntryGroup both implement IEditorQuickOpenEntry
	if (element instanceof EditorQuickOpenEntry || element instanceof EditorQuickOpenEntryGroup) {
		return element;
	}

	return null;
}

export class CloseEditorAction extends Action {
462 463 464 465

	public static ID = 'workbench.action.closeEditor';
	public static LABEL = nls.localize('closeEditor', "Close Editor");

466 467 468 469 470 471
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
I
isidor 已提交
472
		super(id, label, 'close-editor-action');
E
Erich Gamma 已提交
473 474
	}

B
Benjamin Pasero 已提交
475
	public run(context?: IEditorContext): TPromise<any> {
476
		const position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
477

478
		// Close Active Editor
479
		if (typeof position !== 'number') {
480
			const activeEditor = this.editorService.getActiveEditor();
B
Benjamin Pasero 已提交
481
			if (activeEditor) {
482
				return this.editorService.closeEditor(activeEditor.position, activeEditor.input);
B
Benjamin Pasero 已提交
483
			}
484 485
		}

I
isidor 已提交
486
		let input = context ? context.editor : null;
I
isidor 已提交
487
		if (!input) {
B
Benjamin Pasero 已提交
488

I
isidor 已提交
489
			// Get Top Editor at Position
490
			const visibleEditors = this.editorService.getVisibleEditors();
I
isidor 已提交
491
			if (visibleEditors[position]) {
492
				input = visibleEditors[position].input;
I
isidor 已提交
493 494 495 496 497
			}
		}

		if (input) {
			return this.editorService.closeEditor(position, input);
E
Erich Gamma 已提交
498 499
		}

A
Alex Dima 已提交
500
		return TPromise.as(false);
E
Erich Gamma 已提交
501 502 503
	}
}

B
Benjamin Pasero 已提交
504
export class CloseLeftEditorsInGroupAction extends Action {
505

B
Benjamin Pasero 已提交
506 507
	public static ID = 'workbench.action.closeEditorsToTheLeft';
	public static LABEL = nls.localize('closeEditorsToTheLeft', "Close Editors to the Left");
508

509 510 511
	constructor(
		id: string,
		label: string,
B
Benjamin Pasero 已提交
512 513
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
		@IEditorGroupService private groupService: IEditorGroupService
514
	) {
515 516 517
		super(id, label);
	}

B
Benjamin Pasero 已提交
518
	public run(context?: IEditorContext): TPromise<any> {
519
		const editor = getTarget(this.editorService, this.groupService, context);
B
Benjamin Pasero 已提交
520 521
		if (editor) {
			return this.editorService.closeEditors(editor.position, editor.input, Direction.LEFT);
522 523 524 525 526 527 528 529
		}

		return TPromise.as(false);
	}
}

export class CloseRightEditorsInGroupAction extends Action {

B
Benjamin Pasero 已提交
530 531
	public static ID = 'workbench.action.closeEditorsToTheRight';
	public static LABEL = nls.localize('closeEditorsToTheRight', "Close Editors to the Right");
532

B
Benjamin Pasero 已提交
533 534 535 536 537 538
	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
		@IEditorGroupService private groupService: IEditorGroupService
	) {
539 540 541
		super(id, label);
	}

B
Benjamin Pasero 已提交
542
	public run(context?: IEditorContext): TPromise<any> {
543
		const editor = getTarget(this.editorService, this.groupService, context);
B
Benjamin Pasero 已提交
544 545
		if (editor) {
			return this.editorService.closeEditors(editor.position, editor.input, Direction.RIGHT);
546 547 548 549 550 551
		}

		return TPromise.as(false);
	}
}

E
Erich Gamma 已提交
552 553
export class CloseAllEditorsAction extends Action {

554 555 556
	public static ID = 'workbench.action.closeAllEditors';
	public static LABEL = nls.localize('closeAllEditors', "Close All Editors");

E
Erich Gamma 已提交
557
	constructor(id: string, label: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService) {
I
isidor 已提交
558
		super(id, label, 'action-close-all-files');
E
Erich Gamma 已提交
559 560
	}

561
	public run(): TPromise<any> {
562
		return this.editorService.closeAllEditors();
E
Erich Gamma 已提交
563 564 565
	}
}

566 567 568 569 570
export class CloseEditorsInOtherGroupsAction extends Action {

	public static ID = 'workbench.action.closeEditorsInOtherGroups';
	public static LABEL = nls.localize('closeEditorsInOtherGroups', "Close Editors in Other Groups");

571 572 573 574 575 576
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
577 578 579
		super(id, label);
	}

B
Benjamin Pasero 已提交
580
	public run(context?: IEditorContext): TPromise<any> {
581
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
582
		if (typeof position !== 'number') {
583
			const activeEditor = this.editorService.getActiveEditor();
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
			if (activeEditor) {
				position = activeEditor.position;
			}
		}

		if (typeof position === 'number') {
			return this.editorService.closeAllEditors(position);
		}

		return TPromise.as(false);
	}
}

export class CloseOtherEditorsInGroupAction extends Action {

	public static ID = 'workbench.action.closeOtherEditors';
B
Benjamin Pasero 已提交
600
	public static LABEL = nls.localize('closeOtherEditorsInGroup', "Close Other Editors");
E
Erich Gamma 已提交
601

602 603 604 605 606 607
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
E
Erich Gamma 已提交
608 609 610
		super(id, label);
	}

B
Benjamin Pasero 已提交
611
	public run(context?: IEditorContext): TPromise<any> {
612
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
I
isidor 已提交
613
		let input = context ? context.editor : null;
I
isidor 已提交
614 615

		// If position or input are not passed in take the position and input of the active editor.
616 617
		const active = this.editorService.getActiveEditor();
		if (active) {
I
isidor 已提交
618
			position = typeof position === 'number' ? position : active.position;
619
			input = input ? input : <EditorInput>active.input;
I
isidor 已提交
620 621 622 623
		}

		if (typeof position === 'number' && input) {
			return this.editorService.closeEditors(position, input);
624 625 626
		}

		return TPromise.as(false);
E
Erich Gamma 已提交
627 628 629
	}
}

B
Benjamin Pasero 已提交
630
export class CloseEditorsInGroupAction extends Action {
I
isidor 已提交
631

B
Benjamin Pasero 已提交
632 633
	public static ID = 'workbench.action.closeEditorsInGroup';
	public static LABEL = nls.localize('closeEditorsInGroup', "Close All Editors in Group");
I
isidor 已提交
634

635 636 637 638 639 640
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
B
Benjamin Pasero 已提交
641
		super(id, label);
I
isidor 已提交
642 643
	}

B
Benjamin Pasero 已提交
644
	public run(context?: IEditorContext): TPromise<any> {
645
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
I
isidor 已提交
646
		if (typeof position !== 'number') {
647
			const activeEditor = this.editorService.getActiveEditor();
I
isidor 已提交
648 649 650 651 652 653 654 655
			if (activeEditor) {
				position = activeEditor.position;
			}
		}

		if (typeof position === 'number') {
			return this.editorService.closeEditors(position);
		}
B
Benjamin Pasero 已提交
656 657

		return TPromise.as(false);
I
isidor 已提交
658 659 660
	}
}

B
Benjamin Pasero 已提交
661
export class MoveGroupLeftAction extends Action {
E
Erich Gamma 已提交
662

B
Benjamin Pasero 已提交
663
	public static ID = 'workbench.action.moveActiveEditorGroupLeft';
664 665
	public static LABEL = nls.localize('moveActiveGroupLeft', "Move Editor Group Left");

666 667 668 669 670 671
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
E
Erich Gamma 已提交
672 673 674
		super(id, label);
	}

B
Benjamin Pasero 已提交
675
	public run(context?: IEditorContext): TPromise<any> {
676
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
677
		if (typeof position !== 'number') {
678
			const activeEditor = this.editorService.getActiveEditor();
679 680 681 682 683 684
			if (activeEditor && (activeEditor.position === Position.CENTER || activeEditor.position === Position.RIGHT)) {
				position = activeEditor.position;
			}
		}

		if (typeof position === 'number') {
685
			const newPosition = (position === Position.CENTER) ? Position.LEFT : Position.CENTER;
E
Erich Gamma 已提交
686

B
Benjamin Pasero 已提交
687
			// Move group
688
			this.editorGroupService.moveGroup(position, newPosition);
E
Erich Gamma 已提交
689 690
		}

A
Alex Dima 已提交
691
		return TPromise.as(false);
E
Erich Gamma 已提交
692 693 694
	}
}

B
Benjamin Pasero 已提交
695
export class MoveGroupRightAction extends Action {
E
Erich Gamma 已提交
696

B
Benjamin Pasero 已提交
697
	public static ID = 'workbench.action.moveActiveEditorGroupRight';
698 699
	public static LABEL = nls.localize('moveActiveGroupRight', "Move Editor Group Right");

700 701 702 703 704 705
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
E
Erich Gamma 已提交
706 707 708
		super(id, label);
	}

B
Benjamin Pasero 已提交
709
	public run(context?: IEditorContext): TPromise<any> {
710
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
711
		if (typeof position !== 'number') {
712 713
			const activeEditor = this.editorService.getActiveEditor();
			const editors = this.editorService.getVisibleEditors();
714 715 716 717 718 719 720

			if ((editors.length === 2 && activeEditor.position === Position.LEFT) || (editors.length === 3 && activeEditor.position !== Position.RIGHT)) {
				position = activeEditor.position;
			}
		}

		if (typeof position === 'number') {
721
			const newPosition = (position === Position.LEFT) ? Position.CENTER : Position.RIGHT;
E
Erich Gamma 已提交
722

B
Benjamin Pasero 已提交
723
			// Move group
724
			this.editorGroupService.moveGroup(position, newPosition);
E
Erich Gamma 已提交
725 726
		}

A
Alex Dima 已提交
727
		return TPromise.as(false);
E
Erich Gamma 已提交
728 729 730
	}
}

731
export class MinimizeOtherGroupsAction extends Action {
E
Erich Gamma 已提交
732

733 734 735
	public static ID = 'workbench.action.minimizeOtherEditors';
	public static LABEL = nls.localize('minimizeOtherEditorGroups', "Minimize Other Editor Groups");

736
	constructor(id: string, label: string, @IEditorGroupService private editorGroupService: IEditorGroupService) {
E
Erich Gamma 已提交
737 738 739
		super(id, label);
	}

740
	public run(): TPromise<any> {
741
		this.editorGroupService.arrangeGroups(GroupArrangement.MINIMIZE_OTHERS);
E
Erich Gamma 已提交
742

A
Alex Dima 已提交
743
		return TPromise.as(false);
E
Erich Gamma 已提交
744 745 746
	}
}

747
export class EvenGroupWidthsAction extends Action {
E
Erich Gamma 已提交
748

749 750 751
	public static ID = 'workbench.action.evenEditorWidths';
	public static LABEL = nls.localize('evenEditorGroups', "Even Editor Group Widths");

752
	constructor(id: string, label: string, @IEditorGroupService private editorGroupService: IEditorGroupService) {
E
Erich Gamma 已提交
753 754 755
		super(id, label);
	}

756
	public run(): TPromise<any> {
757
		this.editorGroupService.arrangeGroups(GroupArrangement.EVEN_WIDTH);
E
Erich Gamma 已提交
758

A
Alex Dima 已提交
759
		return TPromise.as(false);
E
Erich Gamma 已提交
760 761 762
	}
}

763
export class MaximizeGroupAction extends Action {
764

765 766 767
	public static ID = 'workbench.action.maximizeEditor';
	public static LABEL = nls.localize('maximizeEditor', "Maximize Editor Group and Hide Sidebar");

768 769 770 771
	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
772
		@IEditorGroupService private editorGroupService: IEditorGroupService,
773 774 775 776 777
		@IPartService private partService: IPartService
	) {
		super(id, label);
	}

778
	public run(): TPromise<any> {
779
		if (this.editorService.getActiveEditor()) {
780
			this.editorGroupService.arrangeGroups(GroupArrangement.MINIMIZE_OTHERS);
781 782 783
			this.partService.setSideBarHidden(true);
		}

A
Alex Dima 已提交
784
		return TPromise.as(false);
785 786 787
	}
}

B
Benjamin Pasero 已提交
788
export class KeepEditorAction extends Action {
789

B
Benjamin Pasero 已提交
790 791
	public static ID = 'workbench.action.keepEditor';
	public static LABEL = nls.localize('keepEditor', "Keep Editor");
792 793 794 795

	constructor(
		id: string,
		label: string,
796
		@IEditorGroupService private editorGroupService: IEditorGroupService,
797 798 799 800 801
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

B
Benjamin Pasero 已提交
802
	public run(context?: IEditorContext): TPromise<any> {
803
		const target = getTarget(this.editorService, this.editorGroupService, context);
B
Benjamin Pasero 已提交
804 805
		if (target) {
			this.editorGroupService.pinEditor(target.position, target.input);
806 807 808 809 810 811
		}

		return TPromise.as(true);
	}
}

B
Benjamin Pasero 已提交
812 813 814 815 816 817 818 819 820 821 822 823 824
function getTarget(editorService: IWorkbenchEditorService, editorGroupService: IEditorGroupService, context?: IEditorContext): { input: IEditorInput, position: Position } {
	if (context) {
		return { input: context.editor, position: editorGroupService.getStacksModel().positionOfGroup(context.group) };
	}

	const activeEditor = editorService.getActiveEditor();
	if (activeEditor) {
		return { input: activeEditor.input, position: activeEditor.position };
	}

	return null;
}

825 826
export abstract class BaseNavigateEditorAction extends Action {

827 828 829 830 831 832
	constructor(
		id: string,
		label: string,
		protected editorGroupService: IEditorGroupService,
		protected editorService: IWorkbenchEditorService
	) {
833 834 835 836
		super(id, label);
	}

	public run(): TPromise<any> {
837
		const model = this.editorGroupService.getStacksModel();
838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853
		const result = this.navigate();
		if (result) {
			return this.editorService.openEditor(result.editor, null, model.positionOfGroup(result.group));
		}

		return TPromise.as(false);
	}

	protected abstract navigate(): IEditorIdentifier;
}

export class OpenNextEditor extends BaseNavigateEditorAction {

	public static ID = 'workbench.action.nextEditor';
	public static LABEL = nls.localize('openNextEditor', "Open Next Editor");

854 855 856 857 858 859 860
	constructor(
		id: string,
		label: string,
		@IEditorGroupService editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService
	) {
		super(id, label, editorGroupService, editorService);
861 862 863
	}

	protected navigate(): IEditorIdentifier {
864
		return this.editorGroupService.getStacksModel().next();
865 866 867 868 869 870 871 872
	}
}

export class OpenPreviousEditor extends BaseNavigateEditorAction {

	public static ID = 'workbench.action.previousEditor';
	public static LABEL = nls.localize('openPreviousEditor', "Open Previous Editor");

873 874 875 876 877 878 879
	constructor(
		id: string,
		label: string,
		@IEditorGroupService editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService
	) {
		super(id, label, editorGroupService, editorService);
880 881 882
	}

	protected navigate(): IEditorIdentifier {
883
		return this.editorGroupService.getStacksModel().previous();
884
	}
B
Benjamin Pasero 已提交
885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916
}

export class NavigateForwardAction extends Action {

	public static ID = 'workbench.action.navigateForward';
	public static LABEL = nls.localize('navigateNext', "Go Forward");

	constructor(id: string, label: string, @IHistoryService private historyService: IHistoryService) {
		super(id, label);
	}

	public run(): TPromise<any> {
		this.historyService.forward();

		return TPromise.as(null);
	}
}

export class NavigateBackwardsAction extends Action {

	public static ID = 'workbench.action.navigateBack';
	public static LABEL = nls.localize('navigatePrevious', "Go Back");

	constructor(id: string, label: string, @IHistoryService private historyService: IHistoryService) {
		super(id, label);
	}

	public run(): TPromise<any> {
		this.historyService.back();

		return TPromise.as(null);
	}
I
isidor 已提交
917
}
918 919 920 921 922 923 924 925 926

export class ReopenClosedEditorAction extends Action {

	public static ID = 'workbench.action.reopenClosedEditor';
	public static LABEL = nls.localize('reopenClosedEditor', "Reopen Closed Editor");

	constructor(
		id: string,
		label: string,
927
		@IHistoryService private historyService: IHistoryService,
928
		@IEditorGroupService private editorGroupService: IEditorGroupService,
929 930 931 932 933 934
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
935
		this.historyService.reopenLastClosedEditor();
936 937 938

		return TPromise.as(false);
	}
B
Benjamin Pasero 已提交
939 940
}

941
export const NAVIGATE_IN_LEFT_GROUP_PREFIX = 'edt left ';
B
Benjamin Pasero 已提交
942

943
export class ShowEditorsInLeftGroupAction extends QuickOpenAction {
B
Benjamin Pasero 已提交
944

945 946
	public static ID = 'workbench.action.showEditorsInLeftGroup';
	public static LABEL = nls.localize('showEditorsInLeftGroup', "Show Editors in Left Group");
B
Benjamin Pasero 已提交
947

948 949 950
	constructor(
		actionId: string,
		actionLabel: string,
951
		@IQuickOpenService quickOpenService: IQuickOpenService
952
	) {
953
		super(actionId, actionLabel, NAVIGATE_IN_LEFT_GROUP_PREFIX, quickOpenService);
954 955

		this.class = 'show-group-editors-action';
B
Benjamin Pasero 已提交
956
	}
957
}
958

959 960 961 962 963 964 965 966 967 968
export const NAVIGATE_IN_CENTER_GROUP_PREFIX = 'edt center ';

export class ShowEditorsInCenterGroupAction extends QuickOpenAction {

	public static ID = 'workbench.action.showEditorsInCenterGroup';
	public static LABEL = nls.localize('showEditorsInCenterGroup', "Show Editors in Center Group");

	constructor(
		actionId: string,
		actionLabel: string,
969
		@IQuickOpenService quickOpenService: IQuickOpenService
970 971
	) {
		super(actionId, actionLabel, NAVIGATE_IN_CENTER_GROUP_PREFIX, quickOpenService);
972 973

		this.class = 'show-group-editors-action';
974 975
	}
}
976

977 978 979 980 981 982 983 984 985 986
export const NAVIGATE_IN_RIGHT_GROUP_PREFIX = 'edt right ';

export class ShowEditorsInRightGroupAction extends QuickOpenAction {

	public static ID = 'workbench.action.showEditorsInRightGroup';
	public static LABEL = nls.localize('showEditorsInRightGroup', "Show Editors in Right Group");

	constructor(
		actionId: string,
		actionLabel: string,
987
		@IQuickOpenService quickOpenService: IQuickOpenService
988 989
	) {
		super(actionId, actionLabel, NAVIGATE_IN_RIGHT_GROUP_PREFIX, quickOpenService);
990 991

		this.class = 'show-group-editors-action';
992
	}
B
Benjamin Pasero 已提交
993 994
}

B
Benjamin Pasero 已提交
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
export class ShowEditorsInGroupAction extends Action {

	public static ID = 'workbench.action.showEditorsInGroup';
	public static LABEL = nls.localize('showEditorsInGroup', "Show Editors in Group");

	constructor(
		id: string,
		label: string,
		@IQuickOpenService private quickOpenService: IQuickOpenService,
		@IEditorGroupService private editorGroupService: IEditorGroupService
	) {
		super(id, label);
	}

	public run(context?: IEditorContext): TPromise<any> {
		const stacks = this.editorGroupService.getStacksModel();
		const groupCount = stacks.groups.length;
		if (groupCount <= 1 || !context) {
			return this.quickOpenService.show(NAVIGATE_ALL_EDITORS_GROUP_PREFIX);
		}

		switch (stacks.positionOfGroup(context.group)) {
			case Position.CENTER:
				return this.quickOpenService.show((groupCount === 2) ? NAVIGATE_IN_RIGHT_GROUP_PREFIX : NAVIGATE_IN_CENTER_GROUP_PREFIX);
			case Position.RIGHT:
				return this.quickOpenService.show(NAVIGATE_IN_RIGHT_GROUP_PREFIX);
		}

		return this.quickOpenService.show(NAVIGATE_IN_LEFT_GROUP_PREFIX);
	}
}

1027
export const NAVIGATE_ALL_EDITORS_GROUP_PREFIX = 'edt ';
B
Benjamin Pasero 已提交
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038

export class ShowAllEditorsAction extends QuickOpenAction {

	public static ID = 'workbench.action.showAllEditors';
	public static LABEL = nls.localize('showAllEditors', "Show All Editors");

	constructor(actionId: string, actionLabel: string, @IQuickOpenService quickOpenService: IQuickOpenService) {
		super(actionId, actionLabel, NAVIGATE_ALL_EDITORS_GROUP_PREFIX, quickOpenService);
	}
}

1039
export class BaseQuickOpenEditorInGroupAction extends Action {
B
Benjamin Pasero 已提交
1040 1041 1042 1043 1044

	constructor(
		id: string,
		label: string,
		@IQuickOpenService private quickOpenService: IQuickOpenService,
1045
		@IKeybindingService private keybindingService: IKeybindingService,
1046
		@IEditorGroupService private editorGroupService: IEditorGroupService
B
Benjamin Pasero 已提交
1047 1048 1049 1050 1051
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
1052
		const keys = this.keybindingService.lookupKeybindings(this.id);
B
Benjamin Pasero 已提交
1053

1054
		const stacks = this.editorGroupService.getStacksModel();
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
		if (stacks.activeGroup) {
			const activePosition = stacks.positionOfGroup(stacks.activeGroup);
			const count = stacks.groups.length;
			let prefix = NAVIGATE_IN_LEFT_GROUP_PREFIX;

			if (activePosition === Position.CENTER && count === 3) {
				prefix = NAVIGATE_IN_CENTER_GROUP_PREFIX;
			} else if (activePosition === Position.RIGHT || (activePosition === Position.CENTER && count === 2)) {
				prefix = NAVIGATE_IN_RIGHT_GROUP_PREFIX;
			}

B
Benjamin Pasero 已提交
1066
			this.quickOpenService.show(prefix, { quickNavigateConfiguration: { keybindings: keys } });
1067
		}
B
Benjamin Pasero 已提交
1068 1069 1070 1071 1072

		return TPromise.as(true);
	}
}

1073 1074 1075 1076 1077 1078 1079 1080 1081 1082
export class OpenPreviousRecentlyUsedEditorInGroupAction extends BaseQuickOpenEditorInGroupAction {

	public static ID = 'workbench.action.openPreviousRecentlyUsedEditorInGroup';
	public static LABEL = nls.localize('openPreviousEditorInGroup', "Open Previous Recently Used Editor in Group");

	constructor(
		id: string,
		label: string,
		@IQuickOpenService quickOpenService: IQuickOpenService,
		@IKeybindingService keybindingService: IKeybindingService,
1083
		@IEditorGroupService editorGroupService: IEditorGroupService
1084
	) {
1085
		super(id, label, quickOpenService, keybindingService, editorGroupService);
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
	}
}

export class OpenNextRecentlyUsedEditorInGroupAction extends BaseQuickOpenEditorInGroupAction {

	public static ID = 'workbench.action.openNextRecentlyUsedEditorInGroup';
	public static LABEL = nls.localize('openNextEditorInGroup', "Open Next Recently Used Editor in Group");

	constructor(
		id: string,
		label: string,
		@IQuickOpenService quickOpenService: IQuickOpenService,
		@IKeybindingService keybindingService: IKeybindingService,
1099
		@IEditorGroupService editorGroupService: IEditorGroupService
1100
	) {
1101
		super(id, label, quickOpenService, keybindingService, editorGroupService);
1102 1103 1104
	}
}

1105
export class OpenPreviousEditorFromHistoryAction extends Action {
B
Benjamin Pasero 已提交
1106

1107
	public static ID = 'workbench.action.openPreviousEditorFromHistory';
B
Benjamin Pasero 已提交
1108
	public static LABEL = nls.localize('navigateEditorHistoryByInput', "Open Previous Editor from History");
B
Benjamin Pasero 已提交
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119

	constructor(
		id: string,
		label: string,
		@IQuickOpenService private quickOpenService: IQuickOpenService,
		@IKeybindingService private keybindingService: IKeybindingService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
1120
		const keys = this.keybindingService.lookupKeybindings(this.id);
B
Benjamin Pasero 已提交
1121

B
Benjamin Pasero 已提交
1122
		this.quickOpenService.show(null, { quickNavigateConfiguration: { keybindings: keys } });
B
Benjamin Pasero 已提交
1123 1124 1125 1126 1127

		return TPromise.as(true);
	}
}

1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142
export class ClearEditorHistoryAction extends Action {

	public static ID = 'workbench.action.clearEditorHistory';
	public static LABEL = nls.localize('clearEditorHistory', "Clear Editor History");

	constructor(
		id: string,
		label: string,
		@IHistoryService private historyService: IHistoryService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {

1143
		// Editor history
1144 1145 1146 1147 1148 1149
		this.historyService.clear();

		return TPromise.as(true);
	}
}

1150 1151 1152 1153 1154 1155 1156 1157
export class RemoveFromEditorHistoryAction extends Action {

	public static ID = 'workbench.action.removeFromEditorHistory';
	public static LABEL = nls.localize('removeFromEditorHistory', "Remove From Editor History");

	constructor(
		id: string,
		label: string,
1158
		@IEditorGroupService private editorGroupService: IEditorGroupService,
1159 1160 1161 1162 1163 1164 1165 1166 1167
		@IQuickOpenService private quickOpenService: IQuickOpenService,
		@IHistoryService private historyService: IHistoryService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {

		// Listen for next editor to open
1168
		const unbind = this.editorGroupService.onEditorOpening(e => {
1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
			unbind.dispose(); // listen once

			e.prevent();
			this.historyService.remove(e.editorInput);
		});

		// Bring up quick open
		this.quickOpenService.show().then(() => {
			unbind.dispose(); // make sure to unbind if quick open is closing
		});

		return TPromise.as(true);
	}
}

1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
export class FocusLastEditorInStackAction extends Action {

	public static ID = 'workbench.action.openLastEditorInGroup';
	public static LABEL = nls.localize('focusLastEditorInStack', "Open Last Editor in Group");

	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
		const active = this.editorService.getActiveEditor();
		if (active) {
			const group = this.editorGroupService.getStacksModel().groupAt(active.position);
			const editor = group.getEditor(group.count - 1);

			if (editor) {
				return this.editorService.openEditor(editor);
			}
		}

1209 1210 1211 1212
		return TPromise.as(true);
	}
}

1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
export class MoveEditorLeftInGroupAction extends Action {

	public static ID = 'workbench.action.moveEditorLeftInGroup';
	public static LABEL = nls.localize('moveEditorLeft', "Move Editor Left");

	constructor(
		id: string,
		label: string,
		@ICommandService private commandService: ICommandService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
		const args: ActiveEditorMoveArguments = {
1228
			to: ActiveEditorMovePositioning.LEFT
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
		};
		this.commandService.executeCommand(EditorCommands.MoveActiveEditor, args);

		return TPromise.as(true);
	}
}

export class MoveEditorRightInGroupAction extends Action {

	public static ID = 'workbench.action.moveEditorRightInGroup';
	public static LABEL = nls.localize('moveEditorRight', "Move Editor Right");

	constructor(
		id: string,
		label: string,
		@ICommandService private commandService: ICommandService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
		const args: ActiveEditorMoveArguments = {
1251
			to: ActiveEditorMovePositioning.RIGHT
1252 1253 1254 1255 1256 1257 1258
		};
		this.commandService.executeCommand(EditorCommands.MoveActiveEditor, args);

		return TPromise.as(true);
	}
}

1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
export class MoveEditorToLeftGroupAction extends Action {

	public static ID = 'workbench.action.moveEditorToLeftGroup';
	public static LABEL = nls.localize('moveEditorToLeftGroup', "Move Editor into Group to the Left");

	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
		const activeEditor = this.editorService.getActiveEditor();
		if (activeEditor && activeEditor.position !== Position.LEFT) {
			this.editorGroupService.moveEditor(activeEditor.input, activeEditor.position, activeEditor.position - 1);
		}

		return TPromise.as(true);
	}
}

export class MoveEditorToRightGroupAction extends Action {

	public static ID = 'workbench.action.moveEditorToRightGroup';
	public static LABEL = nls.localize('moveEditorToRightGroup', "Move Editor into Group to the Right");

	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
		const activeEditor = this.editorService.getActiveEditor();
		if (activeEditor && activeEditor.position !== Position.RIGHT) {
			this.editorGroupService.moveEditor(activeEditor.input, activeEditor.position, activeEditor.position + 1);
		}

1303 1304
		return TPromise.as(true);
	}
D
Daniel Imms 已提交
1305
}