Skip to content

Commit 481c26a

Browse files
authored
Reopen Editor With... unavailable in editor/title/context menu (fix microsoft#186233) (microsoft#186914)
1 parent fe1948f commit 481c26a

File tree

4 files changed

+38
-18
lines changed

4 files changed

+38
-18
lines changed

src/vs/workbench/browser/contextkeys.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { Event } from 'vs/base/common/event';
77
import { Disposable } from 'vs/base/common/lifecycle';
88
import { IContextKeyService, IContextKey, setConstant as setConstantContextKey } from 'vs/platform/contextkey/common/contextkey';
99
import { InputFocusedContext, IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsDevelopmentContext, IsIOSContext, ProductQualityContext, IsMobileContext } from 'vs/platform/contextkey/common/contextkeys';
10-
import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext } from 'vs/workbench/common/contextkeys';
11-
import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, DEFAULT_EDITOR_ASSOCIATION, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor';
10+
import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds } from 'vs/workbench/common/contextkeys';
11+
import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor';
1212
import { trackFocus, addDisposableListener, EventType } from 'vs/base/browser/dom';
1313
import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
1414
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
@@ -22,7 +22,6 @@ import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/wo
2222
import { isNative } from 'vs/base/common/platform';
2323
import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService';
2424
import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite';
25-
import { Schemas } from 'vs/base/common/network';
2625
import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess';
2726
import { IProductService } from 'vs/platform/product/common/productService';
2827
import { FileSystemProviderCapabilities, IFileService } from 'vs/platform/files/common/files';
@@ -296,17 +295,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
296295
this.activeEditorContext.set(activeEditorPane.getId());
297296
this.activeEditorCanRevert.set(!activeEditorPane.input.hasCapability(EditorInputCapabilities.Untitled));
298297
this.activeEditorCanSplitInGroup.set(activeEditorPane.input.hasCapability(EditorInputCapabilities.CanSplitInGroup));
299-
300-
const activeEditorResource = activeEditorPane.input.resource;
301-
const editors = activeEditorResource ? this.editorResolverService.getEditors(activeEditorResource).map(editor => editor.id) : [];
302-
if (activeEditorResource?.scheme === Schemas.untitled && activeEditorPane.input.editorId !== DEFAULT_EDITOR_ASSOCIATION.id) {
303-
// Non text editor untitled files cannot be easily serialized between extensions
304-
// so instead we disable this context key to prevent common commands that act on the active editor
305-
this.activeEditorAvailableEditorIds.set('');
306-
} else {
307-
this.activeEditorAvailableEditorIds.set(editors.join(','));
308-
}
309-
298+
applyAvailableEditorIds(this.activeEditorAvailableEditorIds, activeEditorPane.input, this.editorResolverService);
310299
this.activeEditorIsReadonly.set(!!activeEditorPane.input.isReadonly());
311300
const primaryEditorResource = EditorResourceAccessor.getOriginalUri(activeEditorPane.input, { supportSideBySide: SideBySideEditor.PRIMARY });
312301
this.activeEditorCanToggleReadonly.set(!!primaryEditorResource && this.fileService.hasProvider(primaryEditorResource) && !this.fileService.hasCapability(primaryEditorResource, FileSystemProviderCapabilities.Readonly));

src/vs/workbench/browser/parts/editor/tabsTitleControl.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import { UNLOCK_GROUP_COMMAND_ID } from 'vs/workbench/browser/parts/editor/edito
5454
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
5555
import { ITreeViewsDnDService } from 'vs/editor/common/services/treeViewsDndService';
5656
import { DraggedTreeItemsIdentifier } from 'vs/editor/common/services/treeViewsDnd';
57+
import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService';
5758

5859
interface IEditorInputLabel {
5960
editor: EditorInput;
@@ -150,9 +151,10 @@ export class TabsTitleControl extends TitleControl {
150151
@IEditorService private readonly editorService: EditorServiceImpl,
151152
@IPathService private readonly pathService: IPathService,
152153
@IEditorGroupsService private readonly editorGroupService: IEditorGroupsService,
153-
@ITreeViewsDnDService private readonly treeViewsDragAndDropService: ITreeViewsDnDService
154+
@ITreeViewsDnDService private readonly treeViewsDragAndDropService: ITreeViewsDnDService,
155+
@IEditorResolverService editorResolverService: IEditorResolverService
154156
) {
155-
super(parent, accessor, group, contextMenuService, instantiationService, contextKeyService, keybindingService, notificationService, menuService, quickInputService, themeService, configurationService, fileService);
157+
super(parent, accessor, group, contextMenuService, instantiationService, contextKeyService, keybindingService, notificationService, menuService, quickInputService, themeService, configurationService, fileService, editorResolverService);
156158

157159
// Resolve the correct path library for the OS we are on
158160
// If we are connected to remote, this accounts for the

src/vs/workbench/browser/parts/editor/titleControl.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { BreadcrumbsControl, IBreadcrumbsControlOptions } from 'vs/workbench/bro
3030
import { IEditorGroupsAccessor, IEditorGroupTitleHeight, IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor';
3131
import { IEditorCommandsContext, EditorResourceAccessor, IEditorPartOptions, SideBySideEditor, EditorsOrder, EditorInputCapabilities } from 'vs/workbench/common/editor';
3232
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
33-
import { ResourceContextKey, ActiveEditorPinnedContext, ActiveEditorStickyContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, ActiveEditorLastInGroupContext, ActiveEditorFirstInGroupContext } from 'vs/workbench/common/contextkeys';
33+
import { ResourceContextKey, ActiveEditorPinnedContext, ActiveEditorStickyContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, ActiveEditorLastInGroupContext, ActiveEditorFirstInGroupContext, ActiveEditorAvailableEditorIdsContext, applyAvailableEditorIds } from 'vs/workbench/common/contextkeys';
3434
import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview';
3535
import { IFileService } from 'vs/platform/files/common/files';
3636
import { withNullAsUndefined, withUndefinedAsNull, assertIsDefined } from 'vs/base/common/types';
@@ -40,6 +40,7 @@ import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEdit
4040
import { WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar';
4141
import { LocalSelectionTransfer } from 'vs/platform/dnd/browser/dnd';
4242
import { DraggedTreeItemsIdentifier } from 'vs/editor/common/services/treeViewsDnd';
43+
import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService';
4344

4445
export interface IToolbarActions {
4546
primary: IAction[];
@@ -102,6 +103,7 @@ export abstract class TitleControl extends Themable {
102103
private editorIsFirstContext: IContextKey<boolean>;
103104
private editorIsLastContext: IContextKey<boolean>;
104105
private editorStickyContext: IContextKey<boolean>;
106+
private editorAvailableEditorIds: IContextKey<string>;
105107

106108
private editorCanSplitInGroupContext: IContextKey<boolean>;
107109
private sideBySideEditorContext: IContextKey<boolean>;
@@ -125,7 +127,8 @@ export abstract class TitleControl extends Themable {
125127
@IQuickInputService protected quickInputService: IQuickInputService,
126128
@IThemeService themeService: IThemeService,
127129
@IConfigurationService protected configurationService: IConfigurationService,
128-
@IFileService private readonly fileService: IFileService
130+
@IFileService private readonly fileService: IFileService,
131+
@IEditorResolverService private readonly editorResolverService: IEditorResolverService
129132
) {
130133
super(themeService);
131134

@@ -135,6 +138,7 @@ export abstract class TitleControl extends Themable {
135138
this.editorIsFirstContext = ActiveEditorFirstInGroupContext.bindTo(contextKeyService);
136139
this.editorIsLastContext = ActiveEditorLastInGroupContext.bindTo(contextKeyService);
137140
this.editorStickyContext = ActiveEditorStickyContext.bindTo(contextKeyService);
141+
this.editorAvailableEditorIds = ActiveEditorAvailableEditorIdsContext.bindTo(this.contextKeyService);
138142

139143
this.editorCanSplitInGroupContext = ActiveEditorCanSplitInGroupContext.bindTo(contextKeyService);
140144
this.sideBySideEditorContext = SideBySideEditorActiveContext.bindTo(contextKeyService);
@@ -253,6 +257,7 @@ export abstract class TitleControl extends Themable {
253257
this.editorIsFirstContext.set(activeEditor ? this.group.isFirst(activeEditor) : false);
254258
this.editorIsLastContext.set(activeEditor ? this.group.isLast(activeEditor) : false);
255259
this.editorStickyContext.set(activeEditor ? this.group.isSticky(activeEditor) : false);
260+
applyAvailableEditorIds(this.editorAvailableEditorIds, activeEditor, this.editorResolverService);
256261

257262
this.editorCanSplitInGroupContext.set(activeEditor ? activeEditor.hasCapability(EditorInputCapabilities.CanSplitInGroup) : false);
258263
this.sideBySideEditorContext.set(activeEditor?.typeId === SideBySideEditorInput.ID);
@@ -370,6 +375,8 @@ export abstract class TitleControl extends Themable {
370375
this.editorCanSplitInGroupContext.set(editor.hasCapability(EditorInputCapabilities.CanSplitInGroup));
371376
const currentSideBySideEditorContext = !!this.sideBySideEditorContext.get();
372377
this.sideBySideEditorContext.set(editor.typeId === SideBySideEditorInput.ID);
378+
const currentEditorAvailableEditorIds = this.editorAvailableEditorIds.get() ?? '';
379+
applyAvailableEditorIds(this.editorAvailableEditorIds, editor, this.editorResolverService);
373380

374381
// Find target anchor
375382
let anchor: HTMLElement | { x: number; y: number } = node;
@@ -397,6 +404,7 @@ export abstract class TitleControl extends Themable {
397404
this.groupLockedContext.set(currentGroupLockedContext);
398405
this.editorCanSplitInGroupContext.set(currentEditorCanSplitContext);
399406
this.sideBySideEditorContext.set(currentSideBySideEditorContext);
407+
this.editorAvailableEditorIds.set(currentEditorAvailableEditorIds);
400408

401409
// restore focus to active group
402410
this.accessor.activeGroup.focus();

src/vs/workbench/common/contextkeys.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import { ILanguageService } from 'vs/editor/common/languages/language';
1212
import { IFileService } from 'vs/platform/files/common/files';
1313
import { IModelService } from 'vs/editor/common/services/model';
1414
import { Schemas } from 'vs/base/common/network';
15+
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
16+
import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService';
17+
import { DEFAULT_EDITOR_ASSOCIATION } from 'vs/workbench/common/editor';
1518

1619
//#region < --- Workbench --- >
1720

@@ -266,3 +269,21 @@ export class ResourceContextKey {
266269
}
267270

268271
//#endregion
272+
273+
export function applyAvailableEditorIds(contextKey: IContextKey<string>, editor: EditorInput | undefined | null, editorResolverService: IEditorResolverService): void {
274+
if (!editor) {
275+
contextKey.set('');
276+
return;
277+
}
278+
279+
const editorResource = editor.resource;
280+
const editors = editorResource ? editorResolverService.getEditors(editorResource).map(editor => editor.id) : [];
281+
282+
if (editorResource?.scheme === Schemas.untitled && editor.editorId !== DEFAULT_EDITOR_ASSOCIATION.id) {
283+
// Non text editor untitled files cannot be easily serialized between extensions
284+
// so instead we disable this context key to prevent common commands that act on the active editor
285+
contextKey.set('');
286+
} else {
287+
contextKey.set(editors.join(','));
288+
}
289+
}

0 commit comments

Comments
 (0)