editorActions.ts 39.1 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, IPickOpenEntry} 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
		// Count editors
		let visibleEditors = this.editorService.getVisibleEditors();
		let editorCount = visibleEditors.length;
		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 123 124

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

		// Cycle to the left and use module to start at 0 again
		let visibleEditors = this.editorService.getVisibleEditors();
		let editorCount = visibleEditors.length;
		let newIndex = (activeEditor.position + 1) % editorCount;

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

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

139 140
export class FocusFirstGroupAction extends Action {

B
Benjamin Pasero 已提交
141
	public static ID = 'workbench.action.focusFirstEditorGroup';
B
Benjamin Pasero 已提交
142
	public static LABEL = nls.localize('focusFirstEditorGroup', "Focus Left Editor Group");
E
Erich Gamma 已提交
143 144 145 146 147

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
148
		@IEditorGroupService private editorGroupService: IEditorGroupService,
149
		@IHistoryService private historyService: IHistoryService
E
Erich Gamma 已提交
150 151 152 153
	) {
		super(id, label);
	}

154
	public run(): TPromise<any> {
E
Erich Gamma 已提交
155 156 157

		// Find left editor and focus it
		let editors = this.editorService.getVisibleEditors();
B
Benjamin Pasero 已提交
158
		for (let editor of editors) {
E
Erich Gamma 已提交
159
			if (editor.position === Position.LEFT) {
160
				this.editorGroupService.focusGroup(Position.LEFT);
161 162

				return TPromise.as(true);
E
Erich Gamma 已提交
163 164 165 166
			}
		}

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

			// For now only support to open resources from history to the side
			if (!!getUntitledOrFileResource(input)) {
172
				return this.editorService.openEditor(input, null, Position.LEFT);
E
Erich Gamma 已提交
173 174 175
			}
		}

A
Alex Dima 已提交
176
		return TPromise.as(true);
E
Erich Gamma 已提交
177 178 179
	}
}

180
export abstract class BaseFocusSideGroupAction extends Action {
E
Erich Gamma 已提交
181 182 183 184 185

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
186
		@IEditorGroupService private editorGroupService: IEditorGroupService,
187
		@IHistoryService private historyService: IHistoryService
E
Erich Gamma 已提交
188 189 190 191 192 193 194 195
	) {
		super(id, label);
	}

	protected abstract getReferenceEditorSide(): Position;

	protected abstract getTargetEditorSide(): Position;

196
	public run(): TPromise<any> {
E
Erich Gamma 已提交
197 198 199 200 201 202 203 204 205

		// Require at least the reference editor to be visible
		let editors = this.editorService.getVisibleEditors();
		let referenceEditor: IEditor;
		for (let i = 0; i < editors.length; i++) {
			let editor = editors[i];

			// Target editor exists so focus it
			if (editor.position === this.getTargetEditorSide()) {
206
				this.editorGroupService.focusGroup(editor.position);
207 208

				return TPromise.as(true);
E
Erich Gamma 已提交
209 210 211 212 213 214 215 216 217
			}

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

		// Require the reference editor to be visible and supporting split editor
218
		if (referenceEditor && (<EditorInput>referenceEditor.input).supportsSplitEditor()) {
219 220 221 222 223

			// Options
			let options: EditorOptions;
			if (referenceEditor instanceof BaseTextEditor) {
				options = new TextEditorOptions();
224
				options.pinned = true;
225
				(<TextEditorOptions>options).fromEditor(referenceEditor.getControl());
226 227
			} else {
				options = EditorOptions.create({ pinned: true });
228 229 230
			}

			return this.editorService.openEditor(referenceEditor.input, options, this.getTargetEditorSide());
E
Erich Gamma 已提交
231 232 233 234
		}

		// Otherwise try to find a history entry to open to the target editor side
		else if (referenceEditor) {
235
			let history = this.historyService.getHistory();
B
Benjamin Pasero 已提交
236
			for (let input of history) {
E
Erich Gamma 已提交
237 238 239

				// For now only support to open files from history to the side
				if (!!getUntitledOrFileResource(input)) {
240
					return this.editorService.openEditor(input, { pinned: true }, this.getTargetEditorSide());
E
Erich Gamma 已提交
241 242 243 244
				}
			}
		}

A
Alex Dima 已提交
245
		return TPromise.as(true);
E
Erich Gamma 已提交
246 247 248
	}
}

249 250
export class FocusSecondGroupAction extends BaseFocusSideGroupAction {

B
Benjamin Pasero 已提交
251
	public static ID = 'workbench.action.focusSecondEditorGroup';
B
Benjamin Pasero 已提交
252
	public static LABEL = nls.localize('focusSecondEditorGroup', "Focus Center Editor Group");
E
Erich Gamma 已提交
253 254 255 256 257

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
258
		@IEditorGroupService editorGroupService: IEditorGroupService,
259
		@IHistoryService historyService: IHistoryService
E
Erich Gamma 已提交
260
	) {
261
		super(id, label, editorService, editorGroupService, historyService);
E
Erich Gamma 已提交
262 263 264 265 266 267 268 269 270 271 272
	}

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

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

273 274
export class FocusThirdGroupAction extends BaseFocusSideGroupAction {

B
Benjamin Pasero 已提交
275
	public static ID = 'workbench.action.focusThirdEditorGroup';
B
Benjamin Pasero 已提交
276
	public static LABEL = nls.localize('focusThirdEditorGroup', "Focus Right Editor Group");
E
Erich Gamma 已提交
277 278 279 280 281

	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
282
		@IEditorGroupService editorGroupService: IEditorGroupService,
283
		@IHistoryService historyService: IHistoryService
E
Erich Gamma 已提交
284
	) {
285
		super(id, label, editorService, editorGroupService, historyService);
E
Erich Gamma 已提交
286 287 288 289 290 291 292 293 294 295 296
	}

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

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

B
Benjamin Pasero 已提交
297
export class FocusPreviousGroup extends Action {
298

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

302 303 304 305 306 307
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
E
Erich Gamma 已提交
308 309 310
		super(id, label);
	}

311
	public run(): TPromise<any> {
E
Erich Gamma 已提交
312 313 314 315

		// Require an active editor
		let activeEditor = this.editorService.getActiveEditor();
		if (!activeEditor) {
A
Alex Dima 已提交
316
			return TPromise.as(true);
E
Erich Gamma 已提交
317 318 319 320 321 322 323 324 325 326
		}


		// 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
327
		this.editorGroupService.focusGroup(nextPosition);
328 329

		return TPromise.as(true);
E
Erich Gamma 已提交
330 331 332
	}
}

B
Benjamin Pasero 已提交
333
export class FocusNextGroup extends Action {
334

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

E
Erich Gamma 已提交
338 339 340 341 342 343 344 345 346 347 348
	private navigateActions: Action[];

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

		this.navigateActions = [];
349 350 351
		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 已提交
352 353
	}

354
	public run(event?: any): TPromise<any> {
E
Erich Gamma 已提交
355 356 357 358 359 360 361 362 363 364 365 366 367

		// Find the next position to the right to use
		let nextPosition: Position;
		let activeEditor = this.editorService.getActiveEditor();
		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
368
		if (typeof nextPosition === 'number' && this.navigateActions[nextPosition]) {
E
Erich Gamma 已提交
369 370 371
			return this.navigateActions[nextPosition].run(event);
		}

A
Alex Dima 已提交
372
		return TPromise.as(true);
E
Erich Gamma 已提交
373 374 375 376 377 378 379 380
	}
}

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");

381
	constructor( @IWorkbenchEditorService private editorService: IWorkbenchEditorService) {
E
Erich Gamma 已提交
382 383 384 385 386 387 388 389 390 391 392 393
		super(OpenToSideAction.OPEN_TO_SIDE_ID, OpenToSideAction.OPEN_TO_SIDE_LABEL);

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

		this.updateEnablement();
	}

	private updateEnablement(): void {
		let activeEditor = this.editorService.getActiveEditor();
		this.enabled = (!activeEditor || activeEditor.position !== Position.RIGHT);
	}

394
	public run(context: any): TPromise<any> {
E
Erich Gamma 已提交
395 396
		let entry = toEditorQuickOpenEntry(context);
		if (entry) {
B
Benjamin Pasero 已提交
397 398 399 400 401
			let typedInputPromise: TPromise<EditorInput>;
			let input = entry.getInput();
			if (input instanceof EditorInput) {
				typedInputPromise = TPromise.as(input);
			} else {
B
Benjamin Pasero 已提交
402
				typedInputPromise = this.editorService.createInput(<IResourceInput>input);
B
Benjamin Pasero 已提交
403 404 405
			}

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

A
Alex Dima 已提交
408
		return TPromise.as(false);
E
Erich Gamma 已提交
409 410 411
	}
}

412
export function toEditorQuickOpenEntry(element: any): IEditorQuickOpenEntry {
E
Erich Gamma 已提交
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430

	// QuickOpenEntryGroup
	if (element instanceof QuickOpenEntryGroup) {
		let group = <QuickOpenEntryGroup>element;
		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 {
431 432 433 434

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

435 436 437 438 439 440
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
I
isidor 已提交
441
		super(id, label, 'close-editor-action');
E
Erich Gamma 已提交
442 443
	}

B
Benjamin Pasero 已提交
444
	public run(context?: IEditorContext): TPromise<any> {
445
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
446

447
		// Close Active Editor
448
		if (typeof position !== 'number') {
B
Benjamin Pasero 已提交
449 450
			let activeEditor = this.editorService.getActiveEditor();
			if (activeEditor) {
451
				return this.editorService.closeEditor(activeEditor.position, activeEditor.input);
B
Benjamin Pasero 已提交
452
			}
453 454
		}

I
isidor 已提交
455
		let input = context ? context.editor : null;
I
isidor 已提交
456
		if (!input) {
B
Benjamin Pasero 已提交
457

I
isidor 已提交
458 459 460
			// Get Top Editor at Position
			let visibleEditors = this.editorService.getVisibleEditors();
			if (visibleEditors[position]) {
461
				input = visibleEditors[position].input;
I
isidor 已提交
462 463 464 465 466
			}
		}

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

A
Alex Dima 已提交
469
		return TPromise.as(false);
E
Erich Gamma 已提交
470 471 472
	}
}

B
Benjamin Pasero 已提交
473
export class CloseLeftEditorsInGroupAction extends Action {
474

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

478 479 480
	constructor(
		id: string,
		label: string,
B
Benjamin Pasero 已提交
481 482
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
		@IEditorGroupService private groupService: IEditorGroupService
483
	) {
484 485 486
		super(id, label);
	}

B
Benjamin Pasero 已提交
487
	public run(context?: IEditorContext): TPromise<any> {
B
Benjamin Pasero 已提交
488 489 490
		let editor = getTarget(this.editorService, this.groupService, context);
		if (editor) {
			return this.editorService.closeEditors(editor.position, editor.input, Direction.LEFT);
491 492 493 494 495 496 497 498
		}

		return TPromise.as(false);
	}
}

export class CloseRightEditorsInGroupAction extends Action {

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

B
Benjamin Pasero 已提交
502 503 504 505 506 507
	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
		@IEditorGroupService private groupService: IEditorGroupService
	) {
508 509 510
		super(id, label);
	}

B
Benjamin Pasero 已提交
511 512 513 514
	public run(context?: IEditorContext): TPromise<any> {
		let editor = getTarget(this.editorService, this.groupService, context);
		if (editor) {
			return this.editorService.closeEditors(editor.position, editor.input, Direction.RIGHT);
515 516 517 518 519 520
		}

		return TPromise.as(false);
	}
}

E
Erich Gamma 已提交
521 522
export class CloseAllEditorsAction extends Action {

523 524 525
	public static ID = 'workbench.action.closeAllEditors';
	public static LABEL = nls.localize('closeAllEditors', "Close All Editors");

E
Erich Gamma 已提交
526
	constructor(id: string, label: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService) {
I
isidor 已提交
527
		super(id, label, 'action-close-all-files');
E
Erich Gamma 已提交
528 529
	}

530
	public run(): TPromise<any> {
531
		return this.editorService.closeAllEditors();
E
Erich Gamma 已提交
532 533 534
	}
}

535 536 537 538 539
export class CloseEditorsInOtherGroupsAction extends Action {

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

540 541 542 543 544 545
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
546 547 548
		super(id, label);
	}

B
Benjamin Pasero 已提交
549
	public run(context?: IEditorContext): TPromise<any> {
550
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
551
		if (typeof position !== 'number') {
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
			let activeEditor = this.editorService.getActiveEditor();
			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 已提交
569
	public static LABEL = nls.localize('closeOtherEditorsInGroup', "Close Other Editors");
E
Erich Gamma 已提交
570

571 572 573 574 575 576
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
E
Erich Gamma 已提交
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;
I
isidor 已提交
582
		let input = context ? context.editor : null;
I
isidor 已提交
583 584

		// If position or input are not passed in take the position and input of the active editor.
585 586
		const active = this.editorService.getActiveEditor();
		if (active) {
I
isidor 已提交
587
			position = typeof position === 'number' ? position : active.position;
588
			input = input ? input : <EditorInput>active.input;
I
isidor 已提交
589 590 591 592
		}

		if (typeof position === 'number' && input) {
			return this.editorService.closeEditors(position, input);
593 594 595
		}

		return TPromise.as(false);
E
Erich Gamma 已提交
596 597 598
	}
}

B
Benjamin Pasero 已提交
599
export class CloseEditorsInGroupAction extends Action {
I
isidor 已提交
600

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

604 605 606 607 608 609
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
B
Benjamin Pasero 已提交
610
		super(id, label);
I
isidor 已提交
611 612
	}

B
Benjamin Pasero 已提交
613
	public run(context?: IEditorContext): TPromise<any> {
614
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
I
isidor 已提交
615 616 617 618 619 620 621 622 623 624
		if (typeof position !== 'number') {
			let activeEditor = this.editorService.getActiveEditor();
			if (activeEditor) {
				position = activeEditor.position;
			}
		}

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

		return TPromise.as(false);
I
isidor 已提交
627 628 629
	}
}

B
Benjamin Pasero 已提交
630
export class MoveGroupLeftAction extends Action {
E
Erich Gamma 已提交
631

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

635 636 637 638 639 640
	constructor(
		id: string,
		label: string,
		@IEditorGroupService private editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
E
Erich Gamma 已提交
641 642 643
		super(id, label);
	}

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

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

B
Benjamin Pasero 已提交
656
			// Move group
657
			this.editorGroupService.moveGroup(position, newPosition);
E
Erich Gamma 已提交
658 659
		}

A
Alex Dima 已提交
660
		return TPromise.as(false);
E
Erich Gamma 已提交
661 662 663
	}
}

B
Benjamin Pasero 已提交
664
export class MoveGroupRightAction extends Action {
E
Erich Gamma 已提交
665

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

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

B
Benjamin Pasero 已提交
678
	public run(context?: IEditorContext): TPromise<any> {
679
		let position = context ? this.editorGroupService.getStacksModel().positionOfGroup(context.group) : null;
680
		if (typeof position !== 'number') {
681 682 683 684 685 686 687 688 689 690
			let activeEditor = this.editorService.getActiveEditor();
			let editors = this.editorService.getVisibleEditors();

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

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

B
Benjamin Pasero 已提交
692
			// Move group
693
			this.editorGroupService.moveGroup(position, newPosition);
E
Erich Gamma 已提交
694 695
		}

A
Alex Dima 已提交
696
		return TPromise.as(false);
E
Erich Gamma 已提交
697 698 699
	}
}

700
export class MinimizeOtherGroupsAction extends Action {
E
Erich Gamma 已提交
701

702 703 704
	public static ID = 'workbench.action.minimizeOtherEditors';
	public static LABEL = nls.localize('minimizeOtherEditorGroups', "Minimize Other Editor Groups");

705
	constructor(id: string, label: string, @IEditorGroupService private editorGroupService: IEditorGroupService) {
E
Erich Gamma 已提交
706 707 708
		super(id, label);
	}

709
	public run(): TPromise<any> {
710
		this.editorGroupService.arrangeGroups(GroupArrangement.MINIMIZE_OTHERS);
E
Erich Gamma 已提交
711

A
Alex Dima 已提交
712
		return TPromise.as(false);
E
Erich Gamma 已提交
713 714 715
	}
}

716
export class EvenGroupWidthsAction extends Action {
E
Erich Gamma 已提交
717

718 719 720
	public static ID = 'workbench.action.evenEditorWidths';
	public static LABEL = nls.localize('evenEditorGroups', "Even Editor Group Widths");

721
	constructor(id: string, label: string, @IEditorGroupService private editorGroupService: IEditorGroupService) {
E
Erich Gamma 已提交
722 723 724
		super(id, label);
	}

725
	public run(): TPromise<any> {
726
		this.editorGroupService.arrangeGroups(GroupArrangement.EVEN_WIDTH);
E
Erich Gamma 已提交
727

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

732
export class MaximizeGroupAction extends Action {
733

734 735 736
	public static ID = 'workbench.action.maximizeEditor';
	public static LABEL = nls.localize('maximizeEditor', "Maximize Editor Group and Hide Sidebar");

737 738 739 740
	constructor(
		id: string,
		label: string,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
741
		@IEditorGroupService private editorGroupService: IEditorGroupService,
742 743 744 745 746
		@IPartService private partService: IPartService
	) {
		super(id, label);
	}

747
	public run(): TPromise<any> {
748
		if (this.editorService.getActiveEditor()) {
749
			this.editorGroupService.arrangeGroups(GroupArrangement.MINIMIZE_OTHERS);
750 751 752
			this.partService.setSideBarHidden(true);
		}

A
Alex Dima 已提交
753
		return TPromise.as(false);
754 755 756
	}
}

B
Benjamin Pasero 已提交
757
export class KeepEditorAction extends Action {
758

B
Benjamin Pasero 已提交
759 760
	public static ID = 'workbench.action.keepEditor';
	public static LABEL = nls.localize('keepEditor', "Keep Editor");
761 762 763 764

	constructor(
		id: string,
		label: string,
765
		@IEditorGroupService private editorGroupService: IEditorGroupService,
766 767 768 769 770
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

B
Benjamin Pasero 已提交
771 772 773 774
	public run(context?: IEditorContext): TPromise<any> {
		let target = getTarget(this.editorService, this.editorGroupService, context);
		if (target) {
			this.editorGroupService.pinEditor(target.position, target.input);
775 776 777 778 779 780
		}

		return TPromise.as(true);
	}
}

B
Benjamin Pasero 已提交
781 782 783 784 785 786 787 788 789 790 791 792 793
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;
}

794 795
export abstract class BaseNavigateEditorAction extends Action {

796 797 798 799 800 801
	constructor(
		id: string,
		label: string,
		protected editorGroupService: IEditorGroupService,
		protected editorService: IWorkbenchEditorService
	) {
802 803 804 805
		super(id, label);
	}

	public run(): TPromise<any> {
806
		const model = this.editorGroupService.getStacksModel();
807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822
		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");

823 824 825 826 827 828 829
	constructor(
		id: string,
		label: string,
		@IEditorGroupService editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService
	) {
		super(id, label, editorGroupService, editorService);
830 831 832
	}

	protected navigate(): IEditorIdentifier {
833
		return this.editorGroupService.getStacksModel().next();
834 835 836 837 838 839 840 841
	}
}

export class OpenPreviousEditor extends BaseNavigateEditorAction {

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

842 843 844 845 846 847 848
	constructor(
		id: string,
		label: string,
		@IEditorGroupService editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService
	) {
		super(id, label, editorGroupService, editorService);
849 850 851
	}

	protected navigate(): IEditorIdentifier {
852
		return this.editorGroupService.getStacksModel().previous();
853
	}
B
Benjamin Pasero 已提交
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
}

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 已提交
886
}
887 888 889 890 891 892 893 894 895

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,
896
		@IHistoryService private historyService: IHistoryService,
897
		@IEditorGroupService private editorGroupService: IEditorGroupService,
898 899 900 901 902 903
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
904
		const stacks = this.editorGroupService.getStacksModel();
905 906

		// Find an editor that was closed and is currently not opened in the group
907
		let lastClosedEditor = this.historyService.popLastClosedEditor();
908
		while (lastClosedEditor && stacks.activeGroup && stacks.activeGroup.indexOf(lastClosedEditor.editor) >= 0) {
909
			lastClosedEditor = this.historyService.popLastClosedEditor();
910 911 912
		}

		if (lastClosedEditor) {
913
			this.editorService.openEditor(lastClosedEditor.editor, { pinned: true, index: lastClosedEditor.index });
914 915 916 917
		}

		return TPromise.as(false);
	}
B
Benjamin Pasero 已提交
918 919
}

920
export const NAVIGATE_IN_LEFT_GROUP_PREFIX = 'edt left ';
B
Benjamin Pasero 已提交
921

922
export class ShowEditorsInLeftGroupAction extends QuickOpenAction {
B
Benjamin Pasero 已提交
923

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

927 928 929 930 931 932
	constructor(
		actionId: string,
		actionLabel: string,
		@IQuickOpenService quickOpenService: IQuickOpenService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
933
		super(actionId, actionLabel, NAVIGATE_IN_LEFT_GROUP_PREFIX, quickOpenService);
934 935

		this.class = 'show-group-editors-action';
B
Benjamin Pasero 已提交
936
	}
937
}
938

939 940 941 942 943 944 945 946 947 948 949 950 951 952
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,
		@IQuickOpenService quickOpenService: IQuickOpenService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(actionId, actionLabel, NAVIGATE_IN_CENTER_GROUP_PREFIX, quickOpenService);
953 954

		this.class = 'show-group-editors-action';
955 956
	}
}
957

958 959 960 961 962 963 964 965 966 967 968 969 970 971
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,
		@IQuickOpenService quickOpenService: IQuickOpenService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
	) {
		super(actionId, actionLabel, NAVIGATE_IN_RIGHT_GROUP_PREFIX, quickOpenService);
972 973

		this.class = 'show-group-editors-action';
974
	}
B
Benjamin Pasero 已提交
975 976
}

B
Benjamin Pasero 已提交
977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
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);
	}
}

1009
export const NAVIGATE_ALL_EDITORS_GROUP_PREFIX = 'edt ';
B
Benjamin Pasero 已提交
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020

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);
	}
}

1021
export class BaseQuickOpenEditorInGroupAction extends Action {
B
Benjamin Pasero 已提交
1022 1023 1024 1025 1026

	constructor(
		id: string,
		label: string,
		@IQuickOpenService private quickOpenService: IQuickOpenService,
1027
		@IKeybindingService private keybindingService: IKeybindingService,
1028
		@IEditorGroupService private editorGroupService: IEditorGroupService,
1029
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
B
Benjamin Pasero 已提交
1030 1031 1032 1033 1034 1035 1036
	) {
		super(id, label);
	}

	public run(): TPromise<any> {
		let keys = this.keybindingService.lookupKeybindings(this.id);

1037
		const stacks = this.editorGroupService.getStacksModel();
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
		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 已提交
1049
			this.quickOpenService.show(prefix, { quickNavigateConfiguration: { keybindings: keys } });
1050
		}
B
Benjamin Pasero 已提交
1051 1052 1053 1054 1055

		return TPromise.as(true);
	}
}

1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
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,
		@IEditorGroupService editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService
	) {
		super(id, label, quickOpenService, keybindingService, editorGroupService, editorService);
	}
}

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,
		@IEditorGroupService editorGroupService: IEditorGroupService,
		@IWorkbenchEditorService editorService: IWorkbenchEditorService
	) {
		super(id, label, quickOpenService, keybindingService, editorGroupService, editorService);
	}
}

1090
export class OpenPreviousEditorFromHistoryAction extends Action {
B
Benjamin Pasero 已提交
1091

1092
	public static ID = 'workbench.action.openPreviousEditorFromHistory';
B
Benjamin Pasero 已提交
1093
	public static LABEL = nls.localize('navigateEditorHistoryByInput', "Open Previous Editor from History");
B
Benjamin Pasero 已提交
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106

	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);

B
Benjamin Pasero 已提交
1107
		this.quickOpenService.show(null, { quickNavigateConfiguration: { keybindings: keys } });
B
Benjamin Pasero 已提交
1108 1109 1110 1111 1112

		return TPromise.as(true);
	}
}

1113 1114 1115 1116 1117 1118 1119 1120 1121
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,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
1122
		@IEditorGroupService private editorGroupService: IEditorGroupService,
1123 1124 1125 1126 1127 1128 1129
		@IHistoryService private historyService: IHistoryService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {

1130
		// Editor history
1131 1132 1133 1134 1135 1136
		this.historyService.clear();

		return TPromise.as(true);
	}
}

1137 1138 1139 1140 1141 1142 1143 1144
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,
1145
		@IEditorGroupService private editorGroupService: IEditorGroupService,
1146 1147 1148 1149 1150 1151 1152 1153 1154
		@IQuickOpenService private quickOpenService: IQuickOpenService,
		@IHistoryService private historyService: IHistoryService
	) {
		super(id, label);
	}

	public run(): TPromise<any> {

		// Listen for next editor to open
1155
		let unbind = this.editorGroupService.onEditorOpening(e => {
1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
			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);
	}
}

1171 1172
interface IEditorPickOpenEntry extends IPickOpenEntry {
	identifier: IEditorIdentifier;
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
}

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);
			}
		}

1200 1201 1202 1203
		return TPromise.as(true);
	}
}

1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218
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 = {
1219
			to: ActiveEditorMovePositioning.LEFT
1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241
		};
		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 = {
1242
			to: ActiveEditorMovePositioning.RIGHT
1243 1244 1245 1246 1247 1248 1249
		};
		this.commandService.executeCommand(EditorCommands.MoveActiveEditor, args);

		return TPromise.as(true);
	}
}

1250 1251 1252 1253 1254 1255 1256 1257 1258 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
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);
		}

1294 1295
		return TPromise.as(true);
	}
B
Benjamin Pasero 已提交
1296
}