diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 54d000d1..3e8bebf9 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -16,6 +16,7 @@ "@theia/monaco": "next", "@theia/outline-view": "next", "@theia/workspace": "next", + "@theia/navigator": "next", "p-queue": "^5.0.0" }, "scripts": { @@ -44,6 +45,10 @@ { "backend": "lib/node/arduino-backend-module", "frontend": "lib/browser/arduino-frontend-module" + }, + { + "frontend": "lib/browser/menu/browser-arduino-menu-module", + "frontendElectron": "lib/electron-browser/electron-arduino-menu-module" } ] } diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 1577b614..9389324e 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -19,6 +19,8 @@ import { WorkspaceRootUriAwareCommandHandler } from '@theia/workspace/lib/browse import { SelectionService } from '@theia/core'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { SketchFactory } from './sketch-factory'; +import { ArduinoToolbar } from './toolbar/arduino-toolbar'; +import { EditorManager } from '@theia/editor/lib/browser'; @injectable() export class ArduinoFrontendContribution extends DefaultFrontendApplicationContribution implements TabBarToolbarContribution, CommandContribution { @@ -56,6 +58,8 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr @inject(SketchFactory) protected readonly sketchFactory: SketchFactory; + @inject(EditorManager) + protected readonly editorManager: EditorManager; @postConstruct() protected async init(): Promise { @@ -86,15 +90,16 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr quickPickService={this.quickPickService} onNoBoardsInstalled={this.onNoBoardsInstalled.bind(this)} onUnknownBoard={this.onUnknownBoard.bind(this)} />, - isVisible: widget => this.isArduinoEditor(widget) + isVisible: widget => this.isArduinoToolbar(widget) }) } registerCommands(registry: CommandRegistry): void { registry.registerCommand(ArduinoCommands.VERIFY, { - isVisible: widget => this.isArduinoEditor(widget), - isEnabled: widget => this.isArduinoEditor(widget), - execute: async widget => { + isVisible: widget => this.isArduinoToolbar(widget), + isEnabled: widget => this.isArduinoToolbar(widget), + execute: async () => { + const widget = this.getCurrentWidget(); if (widget instanceof EditorWidget) { await widget.saveable.save(); } @@ -112,9 +117,10 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr } }); registry.registerCommand(ArduinoCommands.UPLOAD, { - isVisible: widget => this.isArduinoEditor(widget), - isEnabled: widget => this.isArduinoEditor(widget), - execute: async widget => { + isVisible: widget => this.isArduinoToolbar(widget), + isEnabled: widget => this.isArduinoToolbar(widget), + execute: async () => { + const widget = this.getCurrentWidget(); if (widget instanceof EditorWidget) { await widget.saveable.save(); } @@ -142,7 +148,7 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr await this.sketchFactory.createNewSketch(uri); } catch (e) { await this.messageService.error(e.toString()); - } + } } })); registry.registerCommand(ArduinoCommands.REFRESH_BOARDS, { @@ -151,13 +157,24 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr }) } + protected getCurrentWidget(): EditorWidget | undefined { + let widget = this.editorManager.currentEditor; + if (!widget) { + const visibleWidgets = this.editorManager.all.filter(w => w.isVisible); + if (visibleWidgets.length > 0) { + widget = visibleWidgets[0]; + } + } + return widget; + } + private async onNoBoardsInstalled() { const action = await this.messageService.info("You have no boards installed. Use the boards mangager to install one.", "Open Boards Manager"); if (!action) { return; } - this.boardsListWidgetFrontendContribution.openView({reveal: true}); + this.boardsListWidgetFrontendContribution.openView({ reveal: true }); } private async onUnknownBoard() { @@ -167,12 +184,12 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr return; } - this.boardsListWidgetFrontendContribution.openView({reveal: true}); + this.boardsListWidgetFrontendContribution.openView({ reveal: true }); } - private isArduinoEditor(maybeEditorWidget: any): boolean { - if (maybeEditorWidget instanceof EditorWidget) { - return maybeEditorWidget.editor.uri.toString().endsWith('.ino'); + private isArduinoToolbar(maybeToolbarWidget: any): boolean { + if (maybeToolbarWidget instanceof ArduinoToolbar) { + return true; } return false; } diff --git a/arduino-ide-extension/src/browser/arduino-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-frontend-module.ts index f91d6b31..1233defe 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-frontend-module.ts @@ -33,6 +33,17 @@ import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline import { SilentOutlineViewContribution } from './customization/silent-outline-contribution'; import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution'; import { SilentProblemContribution } from './customization/silent-problem-contribution'; +import { SilentNavigatorContribution } from './customization/silent-navigator-contribution'; +import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution'; +import { ArduinoToolbarContribution } from './toolbar/arduino-toolbar-contribution'; +import { OutputToolbarContribution } from '@theia/output/lib/browser/output-toolbar-contribution'; +import { ArduinoOutputToolContribution } from './customization/silent-output-tool-contribution'; +import { EditorContribution } from '@theia/editor/lib/browser/editor-contribution'; +import { SilentEditorContribution } from './customization/silent-editor-contribution'; +import { MonacoStatusBarContribution } from '@theia/monaco/lib/browser/monaco-status-bar-contribution'; +import { SilentMonacoStatusBarContribution } from './customization/silent-monaco-status-bar-contribution'; +import { ApplicationShell } from '@theia/core/lib/browser'; +import { CustomApplicationShell } from './customization/custom-application-shell'; export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => { // Commands and toolbar items @@ -41,6 +52,9 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un bind(TabBarToolbarContribution).toService(ArduinoFrontendContribution); bind(MenuContribution).to(ArduinoFileMenuContribution).inSingletonScope(); + bind(ArduinoToolbarContribution).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(ArduinoToolbarContribution); + // `ino` TextMate grammar bind(LanguageGrammarDefinitionContribution).to(ArduinoLanguageGrammarContribution).inSingletonScope(); @@ -106,4 +120,15 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un bind(OutlineViewContribution).to(SilentOutlineViewContribution).inSingletonScope(); unbind(ProblemContribution); bind(ProblemContribution).to(SilentProblemContribution).inSingletonScope(); + + unbind(FileNavigatorContribution); + bind(FileNavigatorContribution).to(SilentNavigatorContribution).inSingletonScope(); + unbind(OutputToolbarContribution); + bind(OutputToolbarContribution).to(ArduinoOutputToolContribution).inSingletonScope(); + unbind(EditorContribution); + bind(EditorContribution).to(SilentEditorContribution).inSingletonScope(); + unbind(MonacoStatusBarContribution); + bind(MonacoStatusBarContribution).to(SilentMonacoStatusBarContribution).inSingletonScope(); + unbind(ApplicationShell); + bind(ApplicationShell).to(CustomApplicationShell).inSingletonScope(); }); diff --git a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts index d0406ecc..703dd0ad 100644 --- a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts @@ -8,7 +8,7 @@ import { BoardsListWidget } from './boards-list-widget'; export abstract class ListWidgetFrontendContribution extends AbstractViewContribution implements FrontendApplicationContribution { async initializeLayout(): Promise { - await this.openView(); + // await this.openView(); } } diff --git a/arduino-ide-extension/src/browser/components/connected-boards.tsx b/arduino-ide-extension/src/browser/components/connected-boards.tsx index 163e2e72..e90163e4 100644 --- a/arduino-ide-extension/src/browser/components/connected-boards.tsx +++ b/arduino-ide-extension/src/browser/components/connected-boards.tsx @@ -3,6 +3,7 @@ import { BoardsService, Board } from '../../common/protocol/boards-service'; // import { SelectBoardDialog } from './select-board-dialog'; import { QuickPickService } from '@theia/core/lib/common/quick-pick-service'; import { BoardsNotificationService } from '../boards-notification-service'; +import { ARDUINO_TOOLBAR_ITEM_CLASS } from '../toolbar/arduino-toolbar'; export class ConnectedBoards extends React.Component { static TOOLBAR_ID: 'connected-boards-toolbar'; @@ -28,7 +29,7 @@ export class ConnectedBoards extends React.Component{label} ]; } - return
+ return