UNPKG

@eclipse-glsp/theia-integration

Version:

Glue code to integrate GLSP clients into Eclipse Theia

69 lines (61 loc) 2.98 kB
/******************************************************************************** * Copyright (c) 2023-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 { EditorContextService, ExportResultAction, IActionHandler, MaybePromise } from '@eclipse-glsp/client'; import { MessageService, URI } from '@theia/core'; import { inject, injectable } from '@theia/core/shared/inversify'; import { FileDialogService } from '@theia/filesystem/lib/browser/file-dialog/file-dialog-service'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { FileStat } from '@theia/filesystem/lib/common/files'; /** * Default {@link IActionHandler} for SVG {@link ExportResultAction}s in Theia * (bound in Diagram child DI container). Other export formats are ignored so binary * payloads (e.g. base64-encoded PNG) are not text-written to disk by accident. */ @injectable() export class TheiaExportSvgActionHandler implements IActionHandler { @inject(FileService) protected fileService: FileService; @inject(FileDialogService) protected fileDialogService: FileDialogService; @inject(MessageService) protected messageService: MessageService; @inject(EditorContextService) protected editorContextService: EditorContextService; handle(action: ExportResultAction): void { if (action.format === 'svg') { this.export(action); } } async export(action: ExportResultAction): Promise<void> { const folder = await this.getExportFolder(); let file = await this.fileDialogService.showSaveDialog({ title: 'Export Diagram', filters: { 'Images (*.svg)': ['svg'] } }, folder); if (file) { try { if (!file.path.ext) { file = new URI(file.path.fsPath() + '.svg'); } await this.fileService.write(file, action.data); this.messageService.info(`Diagram exported to '${file.path.name}'`); } catch (error) { this.messageService.info(`Error exporting diagram '${error}'`); } } } protected getExportFolder(): MaybePromise<FileStat> { const uri = this.editorContextService.sourceUri; return this.fileService.resolve(new URI(uri)); } }