@eclipse-glsp/theia-integration
Version:
Glue code to integrate GLSP clients into Eclipse Theia
51 lines (47 loc) • 2.37 kB
text/typescript
/********************************************************************************
* Copyright (c) 2020-2026 EclipseSource 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 WITH Classpath-exception-2.0
********************************************************************************/
import { Action, Args, IActionHandler, NavigateToExternalTargetAction } from '@eclipse-glsp/client/lib';
import { URI } from '@theia/core';
import { OpenerService, open } from '@theia/core/lib/browser/opener-service';
import { inject, injectable } from '@theia/core/shared/inversify';
/**
* Default {@link IActionHandler} for {@link NavigateToExternalTargetAction}s in Theia
*
* (bound in Diagram child DI container)
*/
@injectable()
export class TheiaNavigateToExternalTargetHandler implements IActionHandler {
static JSON_OPENER_OPTIONS = 'jsonOpenerOptions';
constructor(@inject(OpenerService) protected readonly openerService: OpenerService) {}
handle(action: Action): void {
if (NavigateToExternalTargetAction.is(action)) {
this.navigateTo(action.target.uri, action.target.args);
}
}
/**
* Opens the specified URI in Theia using Theia's opener service.
*
* If `args` contain a property `jsonOpenerOptions`, the string of this property will be parsed as JSON
* and merged into the opener options. This allows GLSP servers to pass additional opener options, such
* as a selection, etc.
*/
async navigateTo(uri: string, args?: Args): Promise<void> {
if (args && args[TheiaNavigateToExternalTargetHandler.JSON_OPENER_OPTIONS]) {
args = { args, ...JSON.parse(args[TheiaNavigateToExternalTargetHandler.JSON_OPENER_OPTIONS].toString()) };
}
await open(this.openerService, new URI(uri), { ...args });
}
}