diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index 44c125e5..44812d95 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -96,6 +96,7 @@ import { SaveSketch } from './contributions/save-sketch'; import { VerifySketch } from './contributions/verify-sketch'; import { UploadSketch } from './contributions/upload-sketch'; import { CommonFrontendContribution } from './customization/core/common-frontend-contribution'; +import { CopyToForum } from './contributions/copy-to-forum'; const ElementQueries = require('css-element-queries/src/ElementQueries'); @@ -324,4 +325,5 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un Contribution.configure(bind, SaveAsSketch); Contribution.configure(bind, VerifySketch); Contribution.configure(bind, UploadSketch); + Contribution.configure(bind, CopyToForum); }); diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index 4b2cc2bf..1de1aab3 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -11,6 +11,8 @@ import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/li import { Command, CommandRegistry, CommandContribution, CommandService } from '@theia/core/lib/common/command'; import { SketchesService, ConfigService, FileSystemExt, Sketch } from '../../common/protocol'; import { EditorMode } from '../editor-mode'; +import { EditorManager } from '@theia/editor/lib/browser'; +import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; export { Command, CommandRegistry, MenuModelRegistry, KeybindingRegistry, TabBarToolbarRegistry, URI, Sketch }; @@ -74,6 +76,19 @@ export abstract class SketchContribution extends Contribution { } +@injectable() +export abstract class EditorContribution extends Contribution { + + @inject(EditorManager) + protected readonly editorManager: EditorManager; + + protected async current(): Promise { + const editor = this.editorManager.currentEditor?.editor; + return editor instanceof MonacoEditor ? editor : undefined; + } + +} + export namespace Contribution { export function configure(bind: interfaces.Bind, serviceIdentifier: interfaces.ServiceIdentifier): void { bind(serviceIdentifier).toSelf().inSingletonScope(); diff --git a/arduino-ide-extension/src/browser/contributions/copy-to-forum.ts b/arduino-ide-extension/src/browser/contributions/copy-to-forum.ts new file mode 100644 index 00000000..9754e260 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/copy-to-forum.ts @@ -0,0 +1,53 @@ +import { inject, injectable } from 'inversify'; +import { EditorContribution, Command, MenuModelRegistry, KeybindingRegistry, CommandRegistry } from './contribution'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; +import { ArduinoMenus } from '../menu/arduino-menus'; + +@injectable() +export class CopyToForum extends EditorContribution { + + @inject(ClipboardService) + protected readonly clipboardService: ClipboardService; + + registerCommands(registry: CommandRegistry): void { + registry.registerCommand(CopyToForum.Commands.COPY_TO_FORUM, { + execute: () => this.copyToForum() + }) + } + + registerMenus(registry: MenuModelRegistry): void { + registry.registerMenuAction(ArduinoMenus.EDIT__TEXT_CONTROL_GROUP, { + commandId: CopyToForum.Commands.COPY_TO_FORUM.id, + label: 'Copy to Forum', + order: '2' + }); + } + + registerKeybindings(registry: KeybindingRegistry): void { + registry.registerKeybinding({ + command: CopyToForum.Commands.COPY_TO_FORUM.id, + keybinding: 'CtrlCmd+Shift+C' + }); + } + + async copyToForum(): Promise { + const editor = await this.current(); + if (editor) { + const value = editor.getControl().getModel()?.getValue(); + if (value !== undefined) { + return this.clipboardService.writeText(`[code] +${value} +[/code]`); + } + } + } + +} + +export namespace CopyToForum { + export namespace Commands { + export const COPY_TO_FORUM: Command = { + id: 'arduino-copy-to-forum' + }; + } +} diff --git a/arduino-ide-extension/src/browser/menu/arduino-menus.ts b/arduino-ide-extension/src/browser/menu/arduino-menus.ts index da97f093..840b8ac5 100644 --- a/arduino-ide-extension/src/browser/menu/arduino-menus.ts +++ b/arduino-ide-extension/src/browser/menu/arduino-menus.ts @@ -8,6 +8,12 @@ export namespace ArduinoMenus { export const FILE__SKETCH_GROUP = [...CommonMenus.FILE, '0_sketch']; export const FILE__PRINT_GROUP = [...CommonMenus.FILE, '1_print']; + // Edit + export const EDIT__TEXT_CONTROL_GROUP = [...CommonMenus.EDIT, '1_text_control']; // `Copy`, `Copy to Forum`, `Paste`, etc. + export const EDIT__CODE_CONTROL_GROUP = [...CommonMenus.EDIT, '2_code_control']; // `Comment/Uncomment`, etc. + export const EDIT__FONT_CONTROL_GROUP = [...CommonMenus.EDIT, '3_font_control']; + export const EDIT__FIND_GROUP = [...CommonMenus.EDIT, '4_find']; + // Sketch export const SKETCH = [...MAIN_MENU_BAR, '3_sketch']; export const SKETCH__MAIN_GROUP = [...SKETCH, '0_main'];