Skip to content

Commit b078a67

Browse files
committed
when with panel service when figuring out the active editor, microsoft#55309
1 parent ae90f6d commit b078a67

3 files changed

Lines changed: 83 additions & 56 deletions

File tree

src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,31 @@
44
*--------------------------------------------------------------------------------------------*/
55
'use strict';
66

7-
import { IModelService, shouldSynchronizeModel } from 'vs/editor/common/services/modelService';
8-
import { ITextModel } from 'vs/editor/common/model';
9-
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
7+
import { Emitter, Event } from 'vs/base/common/event';
8+
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
9+
import URI from 'vs/base/common/uri';
10+
import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser';
11+
import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService';
1012
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
11-
import { Event, Emitter } from 'vs/base/common/event';
12-
import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IModelAddedData, ITextEditorAddData, IDocumentsAndEditorsDelta, IExtHostContext, MainContext } from '../node/extHost.protocol';
13-
import { MainThreadTextEditor } from './mainThreadEditor';
14-
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
15-
import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService';
16-
import { EditorViewColumn, editorGroupToViewColumn } from 'vs/workbench/api/shared/editor';
17-
import { IEditor } from 'vs/workbench/common/editor';
13+
import { IEditor } from 'vs/editor/common/editorCommon';
14+
import { ITextModel } from 'vs/editor/common/model';
15+
import { IModelService, shouldSynchronizeModel } from 'vs/editor/common/services/modelService';
16+
import { IModeService } from 'vs/editor/common/services/modeService';
17+
import { ITextModelService } from 'vs/editor/common/services/resolverService';
18+
import { IFileService } from 'vs/platform/files/common/files';
1819
import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
1920
import { MainThreadDocuments } from 'vs/workbench/api/electron-browser/mainThreadDocuments';
2021
import { MainThreadTextEditors } from 'vs/workbench/api/electron-browser/mainThreadEditors';
21-
import { IModeService } from 'vs/editor/common/services/modeService';
22-
import { IFileService } from 'vs/platform/files/common/files';
23-
import { ITextModelService } from 'vs/editor/common/services/resolverService';
24-
import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
22+
import { editorGroupToViewColumn, EditorViewColumn } from 'vs/workbench/api/shared/editor';
23+
import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor';
24+
import { IEditor as IWorkbenchEditor } from 'vs/workbench/common/editor';
2525
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
26-
import { isDiffEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser';
27-
import URI from 'vs/base/common/uri';
28-
import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService';
26+
import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService';
27+
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
28+
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
29+
import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
30+
import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IExtHostContext, IModelAddedData, ITextEditorAddData, MainContext } from '../node/extHost.protocol';
31+
import { MainThreadTextEditor } from './mainThreadEditor';
2932

3033
namespace mapset {
3134

@@ -161,7 +164,8 @@ class MainThreadDocumentAndEditorStateComputer {
161164
private readonly _onDidChangeState: (delta: DocumentAndEditorStateDelta) => void,
162165
@IModelService private readonly _modelService: IModelService,
163166
@ICodeEditorService private readonly _codeEditorService: ICodeEditorService,
164-
@IEditorService private readonly _editorService: IEditorService
167+
@IEditorService private readonly _editorService: IEditorService,
168+
@IPanelService private readonly _panelService: IPanelService,
165169
) {
166170
this._modelService.onModelAdded(this._updateStateOnModelAdd, this, this._toDispose);
167171
this._modelService.onModelRemoved(this._updateState, this, this._toDispose);
@@ -252,13 +256,21 @@ class MainThreadDocumentAndEditorStateComputer {
252256
}
253257

254258
// active editor: if none of the previous editors had focus we try
255-
// to match the active workbench editor with one of editor we have
256-
// just computed
259+
// to match output panels or the the active workbench editor with
260+
// one of editor we have just computed
257261
if (!activeEditor) {
258-
let candidate = this._editorService.activeTextEditorWidget;
259-
if (isDiffEditor(candidate)) {
260-
candidate = candidate.getModifiedEditor();
262+
263+
let candidate: IEditor;
264+
let panel = this._panelService.getActivePanel();
265+
if (panel instanceof BaseTextEditor && isCodeEditor(panel.getControl())) {
266+
candidate = panel.getControl();
267+
} else {
268+
candidate = this._editorService.activeTextEditorWidget;
269+
if (isDiffEditor(candidate)) {
270+
candidate = candidate.getModifiedEditor();
271+
}
261272
}
273+
262274
if (candidate) {
263275
editors.forEach(snapshot => {
264276
if (candidate === snapshot.editor) {
@@ -307,7 +319,8 @@ export class MainThreadDocumentsAndEditors {
307319
@ITextModelService textModelResolverService: ITextModelService,
308320
@IUntitledEditorService untitledEditorService: IUntitledEditorService,
309321
@IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService,
310-
@IBulkEditService bulkEditService: IBulkEditService
322+
@IBulkEditService bulkEditService: IBulkEditService,
323+
@IPanelService panelService: IPanelService
311324

312325
) {
313326
this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentsAndEditors);
@@ -319,7 +332,7 @@ export class MainThreadDocumentsAndEditors {
319332
extHostContext.set(MainContext.MainThreadTextEditors, mainThreadTextEditors);
320333

321334
// It is expected that the ctor of the state computer calls our `_onDelta`.
322-
this._stateComputer = new MainThreadDocumentAndEditorStateComputer(delta => this._onDelta(delta), _modelService, codeEditorService, this._editorService);
335+
this._stateComputer = new MainThreadDocumentAndEditorStateComputer(delta => this._onDelta(delta), _modelService, codeEditorService, this._editorService, panelService);
323336

324337
this._toDispose = [
325338
mainThreadDocuments,
@@ -430,7 +443,7 @@ export class MainThreadDocumentsAndEditors {
430443
return undefined;
431444
}
432445

433-
findTextEditorIdFor(editor: IEditor): string {
446+
findTextEditorIdFor(editor: IWorkbenchEditor): string {
434447
for (let id in this._textEditors) {
435448
if (this._textEditors[id].matches(editor)) {
436449
return id;

src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,22 @@
66
'use strict';
77

88
import * as assert from 'assert';
9-
import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors';
10-
import { SingleProxyRPCProtocol } from './testRPCProtocol';
11-
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
9+
import { Event } from 'vs/base/common/event';
10+
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
11+
import { ITextModel } from 'vs/editor/common/model';
1212
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
1313
import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices';
14-
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
15-
import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/node/extHost.protocol';
1614
import { createTestCodeEditor, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor';
17-
import { mock } from 'vs/workbench/test/electron-browser/api/mock';
18-
import { TestEditorService, TestEditorGroupsService } from 'vs/workbench/test/workbenchTestServices';
19-
import { Event } from 'vs/base/common/event';
20-
import { ITextModel } from 'vs/editor/common/model';
21-
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
22-
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
15+
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
2316
import { IFileService } from 'vs/platform/files/common/files';
17+
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
18+
import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors';
19+
import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/node/extHost.protocol';
20+
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
21+
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
22+
import { mock } from 'vs/workbench/test/electron-browser/api/mock';
23+
import { TestEditorGroupsService, TestEditorService } from 'vs/workbench/test/workbenchTestServices';
24+
import { SingleProxyRPCProtocol } from './testRPCProtocol';
2425

2526
suite('MainThreadDocumentsAndEditors', () => {
2627

@@ -74,7 +75,13 @@ suite('MainThreadDocumentsAndEditors', () => {
7475
null,
7576
null,
7677
editorGroupService,
77-
null
78+
null,
79+
new class extends mock<IPanelService>() implements IPanelService {
80+
_serviceBrand: any;
81+
getActivePanel() {
82+
return null;
83+
}
84+
}
7885
);
7986
/* tslint:enable */
8087
});

src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,30 @@
66
'use strict';
77

88
import * as assert from 'assert';
9-
import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors';
10-
import { SingleProxyRPCProtocol, TestRPCProtocol } from './testRPCProtocol';
11-
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
12-
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
13-
import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices';
14-
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
15-
import { ExtHostDocumentsAndEditorsShape, ExtHostContext, ExtHostDocumentsShape } from 'vs/workbench/api/node/extHost.protocol';
16-
import { mock } from 'vs/workbench/test/electron-browser/api/mock';
179
import { Event } from 'vs/base/common/event';
18-
import { MainThreadTextEditors } from 'vs/workbench/api/electron-browser/mainThreadEditors';
10+
import { ImmortalReference, IReference } from 'vs/base/common/lifecycle';
1911
import URI from 'vs/base/common/uri';
20-
import { Range } from 'vs/editor/common/core/range';
21-
import { Position } from 'vs/editor/common/core/position';
22-
import { IModelService } from 'vs/editor/common/services/modelService';
23-
import { EditOperation } from 'vs/editor/common/core/editOperation';
24-
import { TestFileService, TestEditorService, TestEditorGroupsService, TestEnvironmentService, TestContextService } from 'vs/workbench/test/workbenchTestServices';
2512
import { TPromise } from 'vs/base/common/winjs.base';
13+
import { EditOperation } from 'vs/editor/common/core/editOperation';
14+
import { Position } from 'vs/editor/common/core/position';
15+
import { Range } from 'vs/editor/common/core/range';
2616
import { ResourceTextEdit } from 'vs/editor/common/modes';
27-
import { BulkEditService } from 'vs/workbench/services/bulkEdit/electron-browser/bulkEditService';
28-
import { NullLogService } from 'vs/platform/log/common/log';
29-
import { ITextModelService, ITextEditorModel } from 'vs/editor/common/services/resolverService';
30-
import { IReference, ImmortalReference } from 'vs/base/common/lifecycle';
17+
import { IModelService } from 'vs/editor/common/services/modelService';
18+
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
19+
import { ITextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService';
20+
import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices';
21+
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
3122
import { LabelService } from 'vs/platform/label/common/label';
23+
import { NullLogService } from 'vs/platform/log/common/log';
24+
import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors';
25+
import { MainThreadTextEditors } from 'vs/workbench/api/electron-browser/mainThreadEditors';
26+
import { ExtHostContext, ExtHostDocumentsAndEditorsShape, ExtHostDocumentsShape } from 'vs/workbench/api/node/extHost.protocol';
27+
import { BulkEditService } from 'vs/workbench/services/bulkEdit/electron-browser/bulkEditService';
28+
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
29+
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
30+
import { mock } from 'vs/workbench/test/electron-browser/api/mock';
31+
import { TestContextService, TestEditorGroupsService, TestEditorService, TestEnvironmentService, TestFileService } from 'vs/workbench/test/workbenchTestServices';
32+
import { SingleProxyRPCProtocol, TestRPCProtocol } from './testRPCProtocol';
3233

3334
suite('MainThreadEditors', () => {
3435

@@ -108,6 +109,12 @@ suite('MainThreadEditors', () => {
108109
null,
109110
editorGroupService,
110111
bulkEditService,
112+
new class extends mock<IPanelService>() implements IPanelService {
113+
_serviceBrand: any;
114+
getActivePanel() {
115+
return null;
116+
}
117+
}
111118
);
112119

113120
editors = new MainThreadTextEditors(

0 commit comments

Comments
 (0)