104 lines
4.6 KiB
TypeScript
104 lines
4.6 KiB
TypeScript
// *****************************************************************************
|
|
// Copyright (C) 2018 TypeFox and others.
|
|
//
|
|
// This program and the accompanying materials are made available under the
|
|
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
// http://www.eclipse.org/legal/epl-2.0.
|
|
//
|
|
// This Source Code may also be made available under the following Secondary
|
|
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
// with the GNU Classpath Exception which is available at
|
|
// https://www.gnu.org/software/classpath/license.html.
|
|
//
|
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
// *****************************************************************************
|
|
|
|
import { injectable, inject, postConstruct } from '@theia/core/shared/inversify';
|
|
import { MenuModelRegistry, Command, CommandRegistry } from '@theia/core/lib/common';
|
|
import { AbstractViewContribution, OpenViewArguments, KeybindingRegistry } from '@theia/core/lib/browser';
|
|
import { EDITOR_CONTEXT_MENU, CurrentEditorAccess, EditorManager } from '@theia/editor/lib/browser';
|
|
import { CallHierarchyTreeWidget } from './callhierarchy-tree/callhierarchy-tree-widget';
|
|
import { CALLHIERARCHY_ID, CALL_HIERARCHY_LABEL, CALL_HIERARCHY_TOGGLE_COMMAND_ID } from './callhierarchy';
|
|
import { CallHierarchyServiceProvider } from './callhierarchy-service';
|
|
import URI from '@theia/core/lib/common/uri';
|
|
import { ContextKey, ContextKeyService } from '@theia/core/lib/browser/context-key-service';
|
|
export { CALL_HIERARCHY_LABEL, CALL_HIERARCHY_TOGGLE_COMMAND_ID };
|
|
|
|
export namespace CallHierarchyCommands {
|
|
export const OPEN = Command.toLocalizedCommand({
|
|
id: 'callhierarchy:open',
|
|
label: 'Open Call Hierarchy'
|
|
}, 'theia/callhierarchy/open');
|
|
}
|
|
|
|
@injectable()
|
|
export class CallHierarchyContribution extends AbstractViewContribution<CallHierarchyTreeWidget> {
|
|
|
|
@inject(CurrentEditorAccess) protected readonly editorAccess: CurrentEditorAccess;
|
|
@inject(EditorManager) protected readonly editorManager: EditorManager;
|
|
@inject(CallHierarchyServiceProvider) protected readonly callHierarchyServiceProvider: CallHierarchyServiceProvider;
|
|
@inject(ContextKeyService) protected readonly contextKeyService: ContextKeyService;
|
|
|
|
protected editorHasCallHierarchyProvider!: ContextKey<boolean>;
|
|
|
|
constructor() {
|
|
super({
|
|
widgetId: CALLHIERARCHY_ID,
|
|
widgetName: CALL_HIERARCHY_LABEL,
|
|
defaultWidgetOptions: {
|
|
area: 'bottom'
|
|
},
|
|
toggleCommandId: CALL_HIERARCHY_TOGGLE_COMMAND_ID,
|
|
toggleKeybinding: 'ctrlcmd+shift+f1'
|
|
});
|
|
}
|
|
|
|
@postConstruct()
|
|
protected init(): void {
|
|
this.editorHasCallHierarchyProvider = this.contextKeyService.createKey('editorHasCallHierarchyProvider', false);
|
|
this.editorManager.onCurrentEditorChanged(() => this.editorHasCallHierarchyProvider.set(this.isCallHierarchyAvailable()));
|
|
this.callHierarchyServiceProvider.onDidChange(() => this.editorHasCallHierarchyProvider.set(this.isCallHierarchyAvailable()));
|
|
}
|
|
|
|
protected isCallHierarchyAvailable(): boolean {
|
|
const { selection, languageId } = this.editorAccess;
|
|
return !!selection && !!languageId && !!this.callHierarchyServiceProvider.get(languageId, new URI(selection.uri));
|
|
}
|
|
|
|
override async openView(args?: Partial<OpenViewArguments>): Promise<CallHierarchyTreeWidget> {
|
|
const widget = await super.openView(args);
|
|
const { selection, languageId } = this.editorAccess;
|
|
widget.initializeModel(selection, languageId);
|
|
return widget;
|
|
}
|
|
|
|
override registerCommands(commands: CommandRegistry): void {
|
|
commands.registerCommand(CallHierarchyCommands.OPEN, {
|
|
execute: () => this.openView({
|
|
toggle: false,
|
|
activate: true
|
|
}),
|
|
isEnabled: this.isCallHierarchyAvailable.bind(this)
|
|
});
|
|
super.registerCommands(commands);
|
|
}
|
|
|
|
override registerMenus(menus: MenuModelRegistry): void {
|
|
const menuPath = [...EDITOR_CONTEXT_MENU, 'navigation'];
|
|
menus.registerMenuAction(menuPath, {
|
|
commandId: CallHierarchyCommands.OPEN.id,
|
|
label: CALL_HIERARCHY_LABEL
|
|
});
|
|
super.registerMenus(menus);
|
|
}
|
|
|
|
override registerKeybindings(keybindings: KeybindingRegistry): void {
|
|
super.registerKeybindings(keybindings);
|
|
keybindings.registerKeybinding({
|
|
command: CallHierarchyCommands.OPEN.id,
|
|
keybinding: 'ctrlcmd+f1'
|
|
});
|
|
}
|
|
}
|