@theia/core
Version:
Theia is a cloud & desktop IDE framework implemented in TypeScript.
454 lines (391 loc) • 23.4 kB
text/typescript
// *****************************************************************************
// Copyright (C) 2017 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 '../../src/browser/style/index.css';
require('../../src/browser/style/materialcolors.css').use();
import 'font-awesome/css/font-awesome.min.css';
import 'file-icons-js/css/style.css';
import '@vscode/codicons/dist/codicon.css';
import { ContainerModule } from 'inversify';
import {
bindContributionProvider,
SelectionService,
ResourceResolver,
CommandContribution, CommandRegistry, CommandService, commandServicePath,
MenuModelRegistry, MenuContribution,
MessageClient,
InMemoryResources,
messageServicePath,
InMemoryTextResourceResolver,
UntitledResourceResolver,
MenuCommandAdapterRegistry,
MenuCommandExecutor,
MenuCommandAdapterRegistryImpl,
MenuCommandExecutorImpl
} from '../common';
import { KeybindingRegistry, KeybindingContext, KeybindingContribution } from './keybinding';
import { FrontendApplication } from './frontend-application';
import { FrontendApplicationContribution, DefaultFrontendApplicationContribution } from './frontend-application-contribution';
import { DefaultOpenerService, OpenerService, OpenHandler } from './opener-service';
import { HttpOpenHandler } from './http-open-handler';
import { CommonFrontendContribution } from './common-frontend-contribution';
import { LocalStorageService, StorageService } from './storage-service';
import { WidgetFactory, WidgetManager } from './widget-manager';
import {
ApplicationShell, ApplicationShellOptions, DockPanelRenderer, TabBarRenderer,
TabBarRendererFactory, ShellLayoutRestorer,
SidePanelHandler, SidePanelHandlerFactory,
SidebarMenuWidget, SidebarTopMenuWidgetFactory,
SplitPositionHandler, DockPanelRendererFactory, ApplicationShellLayoutMigration, ApplicationShellLayoutMigrationError, SidebarBottomMenuWidgetFactory
} from './shell';
import { LabelParser } from './label-parser';
import { LabelProvider, LabelProviderContribution, DefaultUriLabelProviderContribution } from './label-provider';
import { PreferenceService } from './preferences';
import { ContextMenuRenderer, Coordinate } from './context-menu-renderer';
import { ThemeService } from './theming';
import { ConnectionStatusService, FrontendConnectionStatusService, ApplicationConnectionStatusContribution, PingService } from './connection-status-service';
import { DiffUriLabelProviderContribution } from './diff-uris';
import { ApplicationServer, applicationPath } from '../common/application-protocol';
import { WebSocketConnectionProvider } from './messaging';
import { AboutDialog, AboutDialogProps } from './about-dialog';
import { EnvVariablesServer, envVariablesPath, EnvVariable } from './../common/env-variables';
import { FrontendApplicationStateService } from './frontend-application-state';
import { JsonSchemaStore, JsonSchemaContribution, DefaultJsonSchemaContribution } from './json-schema-store';
import { TabBarToolbarRegistry, TabBarToolbarContribution, TabBarToolbarFactory, TabBarToolbar } from './shell/tab-bar-toolbar';
import { bindCorePreferences, CorePreferences } from './core-preferences';
import { ContextKeyService, ContextKeyServiceDummyImpl } from './context-key-service';
import { ResourceContextKey } from './resource-context-key';
import { KeyboardLayoutService } from './keyboard/keyboard-layout-service';
import { MimeService } from './mime-service';
import { ApplicationShellMouseTracker } from './shell/application-shell-mouse-tracker';
import { ViewContainer, ViewContainerIdentifier } from './view-container';
import { QuickViewService } from './quick-input/quick-view-service';
import { DialogOverlayService } from './dialogs';
import { ProgressLocationService } from './progress-location-service';
import { ProgressClient } from '../common/progress-service-protocol';
import { ProgressService } from '../common/progress-service';
import { DispatchingProgressClient } from './progress-client';
import { ProgressStatusBarItem } from './progress-status-bar-item';
import { TabBarDecoratorService, TabBarDecorator } from './shell/tab-bar-decorator';
import { ContextMenuContext } from './menu/context-menu-context';
import { bindResourceProvider, bindMessageService, bindPreferenceService } from './frontend-application-bindings';
import { ColorRegistry } from './color-registry';
import { ColorContribution, ColorApplicationContribution } from './color-application-contribution';
import { ExternalUriService } from './external-uri-service';
import { IconThemeService, NoneIconTheme } from './icon-theme-service';
import { IconThemeApplicationContribution, IconThemeContribution, DefaultFileIconThemeContribution } from './icon-theme-contribution';
import { TreeLabelProvider } from './tree/tree-label-provider';
import { ProgressBar } from './progress-bar';
import { ProgressBarFactory, ProgressBarOptions } from './progress-bar-factory';
import { CommandOpenHandler } from './command-open-handler';
import { LanguageService } from './language-service';
import { EncodingRegistry } from './encoding-registry';
import { EncodingService } from '../common/encoding-service';
import { AuthenticationService, AuthenticationServiceImpl } from '../browser/authentication-service';
import { DecorationsService, DecorationsServiceImpl } from './decorations-service';
import { keyStoreServicePath, KeyStoreService } from '../common/key-store';
import { CredentialsService, CredentialsServiceImpl } from './credentials-service';
import { ContributionFilterRegistry, ContributionFilterRegistryImpl } from '../common/contribution-filter';
import { QuickCommandFrontendContribution } from './quick-input/quick-command-frontend-contribution';
import { QuickPickService, quickPickServicePath } from '../common/quick-pick-service';
import {
QuickPickServiceImpl,
QuickInputFrontendContribution,
QuickAccessContribution,
QuickCommandService,
QuickHelpService
} from './quick-input';
import { SidebarBottomMenuWidget } from './shell/sidebar-bottom-menu-widget';
import { WindowContribution } from './window-contribution';
import {
BreadcrumbID,
BreadcrumbPopupContainer,
BreadcrumbPopupContainerFactory,
BreadcrumbRenderer,
BreadcrumbsContribution,
BreadcrumbsRenderer,
BreadcrumbsRendererFactory,
BreadcrumbsService,
DefaultBreadcrumbRenderer,
} from './breadcrumbs';
import { DockPanel, RendererHost } from './widgets';
import { TooltipService, TooltipServiceImpl } from './tooltip-service';
import { BackendRequestService, RequestService, REQUEST_SERVICE_PATH } from '@theia/request';
import { bindFrontendStopwatch, bindBackendStopwatch } from './performance';
import { SaveResourceService } from './save-resource-service';
import { SecondaryWindowHandler } from './secondary-window-handler';
import { UserWorkingDirectoryProvider } from './user-working-directory-provider';
import { WindowTitleService } from './window/window-title-service';
import { WindowTitleUpdater } from './window/window-title-updater';
import { TheiaDockPanel } from './shell/theia-dock-panel';
import { bindStatusBar } from './status-bar';
import { MarkdownRenderer, MarkdownRendererFactory, MarkdownRendererImpl } from './markdown-rendering/markdown-renderer';
import { StylingParticipant, StylingService } from './styling-service';
import { bindCommonStylingParticipants } from './common-styling-participants';
import { HoverService } from './hover-service';
import { AdditionalViewsMenuWidget, AdditionalViewsMenuWidgetFactory } from './shell/additional-views-menu-widget';
export { bindResourceProvider, bindMessageService, bindPreferenceService };
export const frontendApplicationModule = new ContainerModule((bind, _unbind, _isBound, _rebind) => {
bind(NoneIconTheme).toSelf().inSingletonScope();
bind(LabelProviderContribution).toService(NoneIconTheme);
bind(IconThemeService).toSelf().inSingletonScope();
bindContributionProvider(bind, IconThemeContribution);
bind(DefaultFileIconThemeContribution).toSelf().inSingletonScope();
bind(IconThemeContribution).toService(DefaultFileIconThemeContribution);
bind(IconThemeApplicationContribution).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(IconThemeApplicationContribution);
bind(ColorRegistry).toSelf().inSingletonScope();
bindContributionProvider(bind, ColorContribution);
bind(ColorApplicationContribution).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(ColorApplicationContribution);
bind(FrontendApplication).toSelf().inSingletonScope();
bind(FrontendApplicationStateService).toSelf().inSingletonScope();
bind(DefaultFrontendApplicationContribution).toSelf();
bindContributionProvider(bind, FrontendApplicationContribution);
bind(ApplicationShellOptions).toConstantValue({});
bind(ApplicationShell).toSelf().inSingletonScope();
bind(SidePanelHandlerFactory).toAutoFactory(SidePanelHandler);
bind(SidePanelHandler).toSelf();
bind(SidebarTopMenuWidgetFactory).toAutoFactory(SidebarMenuWidget);
bind(SidebarMenuWidget).toSelf();
bind(SidebarBottomMenuWidget).toSelf();
bind(SidebarBottomMenuWidgetFactory).toAutoFactory(SidebarBottomMenuWidget);
bind(AdditionalViewsMenuWidget).toSelf();
bind(AdditionalViewsMenuWidgetFactory).toFactory(ctx => (side: 'left' | 'right') => {
const widget = ctx.container.resolve(AdditionalViewsMenuWidget);
widget.side = side;
return widget;
});
bind(SplitPositionHandler).toSelf().inSingletonScope();
bindContributionProvider(bind, TabBarToolbarContribution);
bind(TabBarToolbarRegistry).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(TabBarToolbarRegistry);
bind(TabBarToolbarFactory).toFactory(context => () => {
const container = context.container.createChild();
container.bind(TabBarToolbar).toSelf().inSingletonScope();
return container.get(TabBarToolbar);
});
bind(DockPanelRendererFactory).toFactory(context => () => context.container.get(DockPanelRenderer));
bind(DockPanelRenderer).toSelf();
bind(TabBarRendererFactory).toFactory(({ container }) => () => {
const contextMenuRenderer = container.get(ContextMenuRenderer);
const tabBarDecoratorService = container.get(TabBarDecoratorService);
const iconThemeService = container.get(IconThemeService);
const selectionService = container.get(SelectionService);
const commandService = container.get<CommandService>(CommandService);
const corePreferences = container.get<CorePreferences>(CorePreferences);
const hoverService = container.get(HoverService);
return new TabBarRenderer(contextMenuRenderer, tabBarDecoratorService, iconThemeService, selectionService, commandService, corePreferences, hoverService);
});
bind(TheiaDockPanel.Factory).toFactory(({ container }) => (options?: DockPanel.IOptions) => {
const corePreferences = container.get<CorePreferences>(CorePreferences);
return new TheiaDockPanel(options, corePreferences);
});
bindContributionProvider(bind, TabBarDecorator);
bind(TabBarDecoratorService).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(TabBarDecoratorService);
bindContributionProvider(bind, OpenHandler);
bind(DefaultOpenerService).toSelf().inSingletonScope();
bind(OpenerService).toService(DefaultOpenerService);
bind(ExternalUriService).toSelf().inSingletonScope();
bind(HttpOpenHandler).toSelf().inSingletonScope();
bind(OpenHandler).toService(HttpOpenHandler);
bind(CommandOpenHandler).toSelf().inSingletonScope();
bind(OpenHandler).toService(CommandOpenHandler);
bind(TooltipServiceImpl).toSelf().inSingletonScope();
bind(TooltipService).toService(TooltipServiceImpl);
bindContributionProvider(bind, ApplicationShellLayoutMigration);
bind<ApplicationShellLayoutMigration>(ApplicationShellLayoutMigration).toConstantValue({
layoutVersion: 2.0,
onWillInflateLayout({ layoutVersion }): void {
throw ApplicationShellLayoutMigrationError.create(
`It is not possible to migrate layout of version ${layoutVersion} to version ${this.layoutVersion}.`
);
}
});
bindContributionProvider(bind, WidgetFactory);
bind(WidgetManager).toSelf().inSingletonScope();
bind(ShellLayoutRestorer).toSelf().inSingletonScope();
bind(CommandContribution).toService(ShellLayoutRestorer);
bindResourceProvider(bind);
bind(InMemoryResources).toSelf().inSingletonScope();
bind(ResourceResolver).toService(InMemoryResources);
bind(InMemoryTextResourceResolver).toSelf().inSingletonScope();
bind(ResourceResolver).toService(InMemoryTextResourceResolver);
bind(UntitledResourceResolver).toSelf().inSingletonScope();
bind(ResourceResolver).toService(UntitledResourceResolver);
bind(SelectionService).toSelf().inSingletonScope();
bind(CommandRegistry).toSelf().inSingletonScope().onActivation(({ container }, registry) => {
WebSocketConnectionProvider.createHandler(container, commandServicePath, registry);
return registry;
});
bind(CommandService).toService(CommandRegistry);
bindContributionProvider(bind, CommandContribution);
bind(ContextKeyService).to(ContextKeyServiceDummyImpl).inSingletonScope();
bind(MenuModelRegistry).toSelf().inSingletonScope();
bindContributionProvider(bind, MenuContribution);
bind(MenuCommandAdapterRegistry).to(MenuCommandAdapterRegistryImpl).inSingletonScope();
bind(MenuCommandExecutor).to(MenuCommandExecutorImpl).inSingletonScope();
bind(KeyboardLayoutService).toSelf().inSingletonScope();
bind(KeybindingRegistry).toSelf().inSingletonScope();
bindContributionProvider(bind, KeybindingContext);
bindContributionProvider(bind, KeybindingContribution);
bindMessageService(bind).onActivation(({ container }, messages) => {
const client = container.get(MessageClient);
WebSocketConnectionProvider.createHandler(container, messageServicePath, client);
return messages;
});
bind(LanguageService).toSelf().inSingletonScope();
bind(EncodingService).toSelf().inSingletonScope();
bind(EncodingRegistry).toSelf().inSingletonScope();
bind(ResourceContextKey).toSelf().inSingletonScope();
bind(CommonFrontendContribution).toSelf().inSingletonScope();
[FrontendApplicationContribution, CommandContribution, KeybindingContribution, MenuContribution, ColorContribution].forEach(serviceIdentifier =>
bind(serviceIdentifier).toService(CommonFrontendContribution)
);
bindCommonStylingParticipants(bind);
bind(QuickCommandFrontendContribution).toSelf().inSingletonScope();
[CommandContribution, KeybindingContribution, MenuContribution].forEach(serviceIdentifier =>
bind(serviceIdentifier).toService(QuickCommandFrontendContribution)
);
bind(QuickCommandService).toSelf().inSingletonScope();
bind(QuickAccessContribution).toService(QuickCommandService);
bind(QuickHelpService).toSelf().inSingletonScope();
bind(QuickAccessContribution).toService(QuickHelpService);
bind(QuickPickService).to(QuickPickServiceImpl).inSingletonScope().onActivation(({ container }, quickPickService: QuickPickService) => {
WebSocketConnectionProvider.createHandler(container, quickPickServicePath, quickPickService);
return quickPickService;
});
bind(MarkdownRenderer).to(MarkdownRendererImpl).inSingletonScope();
bind(MarkdownRendererFactory).toFactory(({ container }) => () => container.get(MarkdownRenderer));
bindContributionProvider(bind, QuickAccessContribution);
bind(QuickInputFrontendContribution).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(QuickInputFrontendContribution);
bind(LocalStorageService).toSelf().inSingletonScope();
bind(StorageService).toService(LocalStorageService);
bindStatusBar(bind);
bind(LabelParser).toSelf().inSingletonScope();
bindContributionProvider(bind, LabelProviderContribution);
bind(LabelProvider).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(LabelProvider);
bind(DefaultUriLabelProviderContribution).toSelf().inSingletonScope();
bind(LabelProviderContribution).toService(DefaultUriLabelProviderContribution);
bind(LabelProviderContribution).to(DiffUriLabelProviderContribution).inSingletonScope();
bind(TreeLabelProvider).toSelf().inSingletonScope();
bind(LabelProviderContribution).toService(TreeLabelProvider);
bindPreferenceService(bind);
bind(FrontendApplicationContribution).toService(PreferenceService);
bindContributionProvider(bind, JsonSchemaContribution);
bind(JsonSchemaStore).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(JsonSchemaStore);
bind(DefaultJsonSchemaContribution).toSelf().inSingletonScope();
bind(JsonSchemaContribution).toService(DefaultJsonSchemaContribution);
bind(PingService).toDynamicValue(ctx => {
// let's reuse a simple and cheap service from this package
const envServer: EnvVariablesServer = ctx.container.get(EnvVariablesServer);
return {
ping(): Promise<EnvVariable | undefined> {
return envServer.getValue('does_not_matter');
}
};
});
bind(FrontendConnectionStatusService).toSelf().inSingletonScope();
bind(ConnectionStatusService).toService(FrontendConnectionStatusService);
bind(FrontendApplicationContribution).toService(FrontendConnectionStatusService);
bind(ApplicationConnectionStatusContribution).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(ApplicationConnectionStatusContribution);
bind(ApplicationServer).toDynamicValue(ctx => {
const provider = ctx.container.get(WebSocketConnectionProvider);
return provider.createProxy<ApplicationServer>(applicationPath);
}).inSingletonScope();
bind(AboutDialog).toSelf().inSingletonScope();
bind(AboutDialogProps).toConstantValue({ title: 'Theia' });
bind(EnvVariablesServer).toDynamicValue(ctx => {
const connection = ctx.container.get(WebSocketConnectionProvider);
return connection.createProxy<EnvVariablesServer>(envVariablesPath);
}).inSingletonScope();
bind(ThemeService).toSelf().inSingletonScope();
bindCorePreferences(bind);
bind(MimeService).toSelf().inSingletonScope();
bind(ApplicationShellMouseTracker).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(ApplicationShellMouseTracker);
bind(ViewContainer.Factory).toFactory(context => (options: ViewContainerIdentifier) => {
const container = context.container.createChild();
container.bind(ViewContainerIdentifier).toConstantValue(options);
container.bind(ViewContainer).toSelf().inSingletonScope();
return container.get(ViewContainer);
});
bind(QuickViewService).toSelf().inSingletonScope();
bind(QuickAccessContribution).toService(QuickViewService);
bind(DialogOverlayService).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(DialogOverlayService);
bind(DispatchingProgressClient).toSelf().inSingletonScope();
bind(ProgressLocationService).toSelf().inSingletonScope();
bind(ProgressStatusBarItem).toSelf().inSingletonScope();
bind(ProgressClient).toService(DispatchingProgressClient);
bind(ProgressService).toSelf().inSingletonScope();
bind(ProgressBarFactory).toFactory(context => (options: ProgressBarOptions) => {
const childContainer = context.container.createChild();
childContainer.bind(ProgressBarOptions).toConstantValue(options);
childContainer.bind(ProgressBar).toSelf().inSingletonScope();
return childContainer.get(ProgressBar);
});
bind(ContextMenuContext).toSelf().inSingletonScope();
bind(AuthenticationService).to(AuthenticationServiceImpl).inSingletonScope();
bind(DecorationsService).to(DecorationsServiceImpl).inSingletonScope();
bind(KeyStoreService).toDynamicValue(ctx => {
const connection = ctx.container.get(WebSocketConnectionProvider);
return connection.createProxy<KeyStoreService>(keyStoreServicePath);
}).inSingletonScope();
bind(CredentialsService).to(CredentialsServiceImpl);
bind(ContributionFilterRegistry).to(ContributionFilterRegistryImpl).inSingletonScope();
bind(WindowContribution).toSelf().inSingletonScope();
for (const contribution of [CommandContribution, KeybindingContribution, MenuContribution]) {
bind(contribution).toService(WindowContribution);
}
bind(WindowTitleService).toSelf().inSingletonScope();
bind(WindowTitleUpdater).toSelf().inSingletonScope();
bind(FrontendApplicationContribution).toService(WindowTitleUpdater);
bindContributionProvider(bind, BreadcrumbsContribution);
bind(BreadcrumbsService).toSelf().inSingletonScope();
bind(BreadcrumbsRenderer).toSelf();
bind(BreadcrumbsRendererFactory).toFactory(ctx =>
() => {
const childContainer = ctx.container.createChild();
childContainer.bind(BreadcrumbRenderer).to(DefaultBreadcrumbRenderer).inSingletonScope();
return childContainer.get(BreadcrumbsRenderer);
}
);
bind(BreadcrumbPopupContainer).toSelf();
bind(BreadcrumbPopupContainerFactory).toFactory(({ container }) => (parent: HTMLElement, breadcrumbId: string, position: Coordinate): BreadcrumbPopupContainer => {
const child = container.createChild();
child.bind(RendererHost).toConstantValue(parent);
child.bind(BreadcrumbID).toConstantValue(breadcrumbId);
child.bind(Coordinate).toConstantValue(position);
return child.get(BreadcrumbPopupContainer);
});
bind(BackendRequestService).toDynamicValue(ctx =>
WebSocketConnectionProvider.createProxy<RequestService>(ctx.container, REQUEST_SERVICE_PATH)
).inSingletonScope();
bindFrontendStopwatch(bind);
bindBackendStopwatch(bind);
bind(SaveResourceService).toSelf().inSingletonScope();
bind(UserWorkingDirectoryProvider).toSelf().inSingletonScope();
bind(HoverService).toSelf().inSingletonScope();
bind(StylingService).toSelf().inSingletonScope();
bindContributionProvider(bind, StylingParticipant);
bind(FrontendApplicationContribution).toService(StylingService);
bind(SecondaryWindowHandler).toSelf().inSingletonScope();
});