diff --git a/.vscode/settings.json b/.vscode/settings.json index 55712c19..6b2540c1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,21 @@ { - "typescript.tsdk": "node_modules/typescript/lib" -} \ No newline at end of file + "tslint.enable": true, + "tslint.configFile": "./tslint.json", + "editor.formatOnSave": true, + "files.exclude": { + "**/lib": false + }, + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "[typescript]": { + "editor.tabSize": 4 + }, + "[json]": { + "editor.tabSize": 2 + }, + "[jsonc]": { + "editor.tabSize": 2 + }, + "files.insertFinalNewline": true, + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index c844a263..dc256750 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -46,7 +46,6 @@ import { ConfigService } from '../common/protocol/config-service'; import { MonitorConnection } from './monitor/monitor-connection'; import { MonitorViewContribution } from './monitor/monitor-view-contribution'; import { ArduinoWorkspaceService } from './arduino-workspace-service'; -import { OutputWidget } from '@theia/output/lib/browser/output-widget'; import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution'; import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution'; import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution'; @@ -54,6 +53,7 @@ import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution'; import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'; import { FileNavigatorCommands } from '@theia/navigator/lib/browser/navigator-contribution'; import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer'; +import { EditorMode } from './editor-mode'; export namespace ArduinoMenus { export const SKETCH = [...MAIN_MENU_BAR, '3_sketch']; @@ -67,14 +67,6 @@ export namespace ArduinoToolbarContextMenu { export const EXAMPLE_SKETCHES_GROUP: MenuPath = [...OPEN_SKETCH_PATH, '3_examples']; } -export namespace EditorMode { - export const PRO_MODE_KEY = 'arduino-advanced-mode'; - export const IN_PRO_MODE: boolean = (() => { - const value = window.localStorage.getItem(PRO_MODE_KEY); - return value === 'true'; - })(); -} - @injectable() export class ArduinoFrontendContribution implements FrontendApplicationContribution, TabBarToolbarContribution, CommandContribution, MenuContribution { @@ -174,6 +166,9 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut @inject(SearchInWorkspaceFrontendContribution) protected readonly siwContribution: SearchInWorkspaceFrontendContribution; + @inject(EditorMode) + protected readonly editorMode: EditorMode; + protected application: FrontendApplication; protected wsSketchCount: number = 0; // TODO: this does not belong here, does it? @@ -182,13 +177,6 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut // This is a hack. Otherwise, the backend services won't bind. await this.workspaceServiceExt.roots(); - if (!EditorMode.IN_PRO_MODE) { - const { ADD_FOLDER, REMOVE_FOLDER, SAVE_WORKSPACE_AS } = WorkspaceCommands; - for (const command of [ADD_FOLDER, REMOVE_FOLDER, SAVE_WORKSPACE_AS]) { - this.commandRegistry.unregisterCommand(command); - } - } - const updateStatusBar = (config: BoardsConfig.Config) => { this.statusBar.setElement('arduino-selected-board', { alignment: StatusBarAlignment.RIGHT, @@ -263,7 +251,7 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut id: ArduinoCommands.TOGGLE_ADVANCED_MODE.id, command: ArduinoCommands.TOGGLE_ADVANCED_MODE.id, tooltip: 'Toggle Advanced Mode', - text: (EditorMode.IN_PRO_MODE ? '$(toggle-on)' : '$(toggle-off)'), + text: (this.editorMode.proMode ? '$(toggle-on)' : '$(toggle-off)'), isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right' }); } @@ -392,29 +380,14 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut } }) registry.registerCommand(ArduinoCommands.TOGGLE_ADVANCED_MODE, { - execute: async () => { - const oldState = EditorMode.IN_PRO_MODE; - const inAdvancedMode = !oldState; - window.localStorage.setItem(EditorMode.PRO_MODE_KEY, String(inAdvancedMode)); - if (!inAdvancedMode) { - // Close all widget that is neither editor nor `Output`. - for (const area of ['left', 'right', 'bottom', 'main'] as Array) { - this.shell.closeTabs(area, ({ owner }) => !(owner instanceof EditorWidget || owner instanceof OutputWidget)); - } - } - // No `else`. We initialize the views (if required) in `this.onStart`. - // `storeLayout` is not invoked in electron when refreshing the browser window: https://github.com/eclipse-theia/theia/issues/6530 - // We store the state manually. - await this.layoutRestorer.storeLayoutAsync(this.application); - window.location.reload(true); - }, + execute: () => this.editorMode.toggle(), isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right', - isToggled: () => EditorMode.IN_PRO_MODE + isToggled: () => this.editorMode.proMode }) } registerMenus(registry: MenuModelRegistry) { - if (!EditorMode.IN_PRO_MODE) { + if (!this.editorMode.proMode) { // If are not in pro-mode, we have to disable the context menu for the tabs. // Such as `Close`, `Close All`, etc. for (const command of [ diff --git a/arduino-ide-extension/src/browser/arduino-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-frontend-module.ts index efcd14b7..7cfcd000 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-frontend-module.ts @@ -10,7 +10,7 @@ import { LanguageGrammarDefinitionContribution } from '@theia/monaco/lib/browser import { LanguageClientContribution } from '@theia/languages/lib/browser'; import { ArduinoLanguageClientContribution } from './language/arduino-language-client-contribution'; import { LibraryListWidget } from './library/library-list-widget'; -import { ArduinoFrontendContribution, EditorMode } from './arduino-frontend-contribution'; +import { ArduinoFrontendContribution } from './arduino-frontend-contribution'; import { ArduinoLanguageGrammarContribution } from './language/arduino-language-grammar-contribution'; import { LibraryService, LibraryServicePath } from '../common/protocol/library-service'; import { BoardsService, BoardsServicePath, BoardsServiceClient } from '../common/protocol/boards-service'; @@ -30,14 +30,14 @@ import { ThemeService } from '@theia/core/lib/browser/theming'; import { ArduinoTheme } from './arduino-theme'; import { MenuContribution } from '@theia/core'; import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution'; -import { SilentOutlineViewContribution } from './customization/silent-outline-contribution'; +import { ArduinoOutlineViewContribution } from './customization/arduino-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 { ArduinoProblemContribution } from './customization/arduino-problem-contribution'; +import { ArduinoNavigatorContribution } from './customization/arduino-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 { ArduinoOutputToolContribution } from './customization/arduino-output-tool-contribution'; import { EditorContribution } from '@theia/editor/lib/browser/editor-contribution'; import { ArduinoEditorContribution } from './customization/arduino-editor-contribution'; import { MonacoStatusBarContribution } from '@theia/monaco/lib/browser/monaco-status-bar-contribution'; @@ -48,9 +48,9 @@ import { ArduinoFrontendApplication } from './customization/arduino-frontend-app import { BoardsConfigDialog, BoardsConfigDialogProps } from './boards/boards-config-dialog'; import { BoardsConfigDialogWidget } from './boards/boards-config-dialog-widget'; import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution'; -import { SilentScmContribution } from './customization/silent-scm-contribution'; +import { ArduinoScmContribution } from './customization/arduino-scm-contribution'; import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'; -import { SilentSearchInWorkspaceContribution } from './customization/silent-search-in-workspace-contribution'; +import { ArduinoSearchInWorkspaceContribution } from './customization/arduino-search-in-workspace-contribution'; import { LibraryListWidgetFrontendContribution } from './library/library-widget-frontend-contribution'; import { LibraryItemRenderer } from './library/library-item-renderer'; import { BoardItemRenderer } from './boards/boards-item-renderer'; @@ -71,6 +71,7 @@ import { BoardsAutoInstaller } from './boards/boards-auto-installer'; import { AboutDialog } from '@theia/core/lib/browser/about-dialog'; import { ArduinoAboutDialog } from './customization/arduino-about-dialog'; import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer'; +import { EditorMode } from './editor-mode'; const ElementQueries = require('css-element-queries/src/ElementQueries'); export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => { @@ -199,55 +200,37 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un const themeService = ThemeService.get(); themeService.register(...ArduinoTheme.themes); - // Customizing default Theia layout - if (!EditorMode.IN_PRO_MODE) { - unbind(OutlineViewContribution); - 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(ArduinoEditorContribution).inSingletonScope(); - unbind(MonacoStatusBarContribution); - bind(MonacoStatusBarContribution).to(ArduinoMonacoStatusBarContribution).inSingletonScope(); - unbind(ApplicationShell); - bind(ApplicationShell).to(ArduinoApplicationShell).inSingletonScope(); - unbind(ScmContribution); - bind(ScmContribution).to(SilentScmContribution).inSingletonScope(); - unbind(SearchInWorkspaceFrontendContribution); - bind(SearchInWorkspaceFrontendContribution).to(SilentSearchInWorkspaceContribution).inSingletonScope(); - } else { - // We use this CSS class on the body to modify the visibility of the close button for the editors and views. - document.body.classList.add(EditorMode.PRO_MODE_KEY); - } - unbind(FrontendApplication); - bind(FrontendApplication).to(ArduinoFrontendApplication).inSingletonScope(); + // Customizing default Theia layout based on the editor mode: `pro-mode` or `classic`. + bind(EditorMode).toSelf().inSingletonScope(); + bind(FrontendApplicationContribution).toService(EditorMode); + rebind(OutlineViewContribution).to(ArduinoOutlineViewContribution).inSingletonScope(); + rebind(ProblemContribution).to(ArduinoProblemContribution).inSingletonScope(); + rebind(FileNavigatorContribution).to(ArduinoNavigatorContribution).inSingletonScope(); + rebind(OutputToolbarContribution).to(ArduinoOutputToolContribution).inSingletonScope(); + rebind(EditorContribution).to(ArduinoEditorContribution).inSingletonScope(); + rebind(MonacoStatusBarContribution).to(ArduinoMonacoStatusBarContribution).inSingletonScope(); + rebind(ApplicationShell).to(ArduinoApplicationShell).inSingletonScope(); + rebind(ScmContribution).to(ArduinoScmContribution).inSingletonScope(); + rebind(SearchInWorkspaceFrontendContribution).to(ArduinoSearchInWorkspaceContribution).inSingletonScope(); + rebind(FrontendApplication).to(ArduinoFrontendApplication).inSingletonScope(); // Monaco customizations - unbind(MonacoEditorProvider); bind(ArduinoMonacoEditorProvider).toSelf().inSingletonScope(); - bind(MonacoEditorProvider).toService(ArduinoMonacoEditorProvider); + rebind(MonacoEditorProvider).toService(ArduinoMonacoEditorProvider); // Decorator customizations - unbind(TabBarDecoratorService); bind(ArduinoTabBarDecoratorService).toSelf().inSingletonScope(); - bind(TabBarDecoratorService).toService(ArduinoTabBarDecoratorService); + rebind(TabBarDecoratorService).toService(ArduinoTabBarDecoratorService); // Problem markers - unbind(ProblemManager); bind(ArduinoProblemManager).toSelf().inSingletonScope(); - bind(ProblemManager).toService(ArduinoProblemManager); + rebind(ProblemManager).toService(ArduinoProblemManager); // About dialog to show the CLI version - unbind(AboutDialog); bind(ArduinoAboutDialog).toSelf().inSingletonScope(); - bind(AboutDialog).toService(ArduinoAboutDialog); + rebind(AboutDialog).toService(ArduinoAboutDialog); // Customized layout restorer that can restore the state in async way: https://github.com/eclipse-theia/theia/issues/6579 - unbind(ShellLayoutRestorer); bind(ArduinoShellLayoutRestorer).toSelf().inSingletonScope(); - bind(ShellLayoutRestorer).toService(ArduinoShellLayoutRestorer); + rebind(ShellLayoutRestorer).toService(ArduinoShellLayoutRestorer); }); diff --git a/arduino-ide-extension/src/browser/arduino-workspace-service.ts b/arduino-ide-extension/src/browser/arduino-workspace-service.ts index e2823cc7..80b04972 100644 --- a/arduino-ide-extension/src/browser/arduino-workspace-service.ts +++ b/arduino-ide-extension/src/browser/arduino-workspace-service.ts @@ -4,7 +4,7 @@ import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service import { ConfigService } from '../common/protocol/config-service'; import { SketchesService } from '../common/protocol/sketches-service'; import { ArduinoWorkspaceRootResolver } from './arduino-workspace-resolver'; -import { EditorMode as EditorMode } from './arduino-frontend-contribution'; +import { EditorMode } from './editor-mode'; @injectable() export class ArduinoWorkspaceService extends WorkspaceService { @@ -18,6 +18,9 @@ export class ArduinoWorkspaceService extends WorkspaceService { @inject(LabelProvider) protected readonly labelProvider: LabelProvider; + @inject(EditorMode) + protected readonly editorMode: EditorMode; + async getDefaultWorkspaceUri(): Promise { const [hash, recentWorkspaces, recentSketches] = await Promise.all([ window.location.hash, @@ -47,7 +50,7 @@ export class ArduinoWorkspaceService extends WorkspaceService { } // The workspace root location must exist. However, when opening a workspace root in pro-mode, // the workspace root must not be a sketch folder. It can be the default sketch directory, or any other directories, for instance. - if (EditorMode.IN_PRO_MODE) { + if (this.editorMode.proMode) { return true; } const sketchFolder = await this.sketchService.isSketchFolder(uri); diff --git a/arduino-ide-extension/src/browser/customization/arduino-frontend-application.ts b/arduino-ide-extension/src/browser/customization/arduino-frontend-application.ts index 362e1e78..4aaaf516 100644 --- a/arduino-ide-extension/src/browser/customization/arduino-frontend-application.ts +++ b/arduino-ide-extension/src/browser/customization/arduino-frontend-application.ts @@ -2,7 +2,8 @@ import { injectable, inject } from 'inversify'; import { FileSystem } from '@theia/filesystem/lib/common/filesystem'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; -import { ArduinoFrontendContribution, EditorMode } from '../arduino-frontend-contribution'; +import { EditorMode } from '../editor-mode'; +import { ArduinoFrontendContribution } from '../arduino-frontend-contribution'; @injectable() export class ArduinoFrontendApplication extends FrontendApplication { @@ -16,12 +17,15 @@ export class ArduinoFrontendApplication extends FrontendApplication { @inject(ArduinoFrontendContribution) protected readonly frontendContribution: ArduinoFrontendContribution; + @inject(EditorMode) + protected readonly editorMode: EditorMode; + protected async initializeLayout(): Promise { super.initializeLayout().then(() => { // If not in PRO mode, we open the sketch file with all the related files. // Otherwise, we reuse the workbench's restore functionality and we do not open anything at all. // TODO: check `otherwise`. Also, what if we check for opened editors, instead of blindly opening them? - if (!EditorMode.IN_PRO_MODE) { + if (!this.editorMode.proMode) { this.workspaceService.roots.then(roots => { for (const root of roots) { this.fileSystem.exists(root.uri).then(exists => { diff --git a/arduino-ide-extension/src/browser/customization/arduino-navigator-contribution.ts b/arduino-ide-extension/src/browser/customization/arduino-navigator-contribution.ts new file mode 100644 index 00000000..5fb3e83b --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/arduino-navigator-contribution.ts @@ -0,0 +1,18 @@ +import { injectable, inject } from 'inversify'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution'; +import { EditorMode } from '../editor-mode'; + +@injectable() +export class ArduinoNavigatorContribution extends FileNavigatorContribution { + + @inject(EditorMode) + protected readonly editorMode: EditorMode; + + async initializeLayout(app: FrontendApplication): Promise { + if (this.editorMode.proMode) { + return super.initializeLayout(app); + } + } + +} diff --git a/arduino-ide-extension/src/browser/customization/arduino-outline-contribution.ts b/arduino-ide-extension/src/browser/customization/arduino-outline-contribution.ts new file mode 100644 index 00000000..20081a5b --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/arduino-outline-contribution.ts @@ -0,0 +1,19 @@ +import { injectable, inject } from 'inversify'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution'; +import { EditorMode } from '../editor-mode'; + +@injectable() +export class ArduinoOutlineViewContribution extends OutlineViewContribution { + + @inject(EditorMode) + protected readonly editorMode: EditorMode; + + async initializeLayout(app: FrontendApplication): Promise { + if (this.editorMode.proMode) { + return super.initializeLayout(app); + } + } + +} + diff --git a/arduino-ide-extension/src/browser/customization/silent-output-tool-contribution.ts b/arduino-ide-extension/src/browser/customization/arduino-output-tool-contribution.ts similarity index 58% rename from arduino-ide-extension/src/browser/customization/silent-output-tool-contribution.ts rename to arduino-ide-extension/src/browser/customization/arduino-output-tool-contribution.ts index 1ca63fa8..9d98d4aa 100644 --- a/arduino-ide-extension/src/browser/customization/silent-output-tool-contribution.ts +++ b/arduino-ide-extension/src/browser/customization/arduino-output-tool-contribution.ts @@ -1,11 +1,18 @@ -import { OutputToolbarContribution } from '@theia/output/lib/browser/output-toolbar-contribution'; +import { inject, injectable } from 'inversify'; import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; -import { injectable } from 'inversify'; +import { OutputToolbarContribution } from '@theia/output/lib/browser/output-toolbar-contribution'; +import { EditorMode } from '../editor-mode'; @injectable() export class ArduinoOutputToolContribution extends OutputToolbarContribution { + @inject(EditorMode) + protected readonly editorMode: EditorMode; + async registerToolbarItems(toolbarRegistry: TabBarToolbarRegistry): Promise { + if (this.editorMode.proMode) { + super.registerToolbarItems(toolbarRegistry); + } } } diff --git a/arduino-ide-extension/src/browser/customization/arduino-problem-contribution.ts b/arduino-ide-extension/src/browser/customization/arduino-problem-contribution.ts new file mode 100644 index 00000000..6bc5be2b --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/arduino-problem-contribution.ts @@ -0,0 +1,25 @@ +import { inject, injectable } from 'inversify'; +import { ProblemStat } from '@theia/markers/lib/browser/problem/problem-manager'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution'; +import { EditorMode } from '../editor-mode'; + +@injectable() +export class ArduinoProblemContribution extends ProblemContribution { + + @inject(EditorMode) + protected readonly editorMode: EditorMode; + + async initializeLayout(app: FrontendApplication): Promise { + if (this.editorMode.proMode) { + return super.initializeLayout(app); + } + } + + protected setStatusBarElement(problemStat: ProblemStat): void { + if (this.editorMode.proMode) { + super.setStatusBarElement(problemStat); + } + } + +} diff --git a/arduino-ide-extension/src/browser/customization/arduino-scm-contribution.ts b/arduino-ide-extension/src/browser/customization/arduino-scm-contribution.ts new file mode 100644 index 00000000..f299c2c6 --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/arduino-scm-contribution.ts @@ -0,0 +1,24 @@ +import { inject, injectable } from 'inversify'; +import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution'; +import { StatusBarEntry } from '@theia/core/lib/browser/status-bar/status-bar'; +import { EditorMode } from '../editor-mode'; + +@injectable() +export class ArduinoScmContribution extends ScmContribution { + + @inject(EditorMode) + protected readonly editorMode: EditorMode; + + async initializeLayout(): Promise { + if (this.editorMode.proMode) { + return super.initializeLayout(); + } + } + + protected setStatusBarEntry(id: string, entry: StatusBarEntry): void { + if (this.editorMode.proMode) { + super.setStatusBarEntry(id, entry); + } + } + +} diff --git a/arduino-ide-extension/src/browser/customization/arduino-search-in-workspace-contribution.ts b/arduino-ide-extension/src/browser/customization/arduino-search-in-workspace-contribution.ts new file mode 100644 index 00000000..26677baa --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/arduino-search-in-workspace-contribution.ts @@ -0,0 +1,18 @@ +import { inject, injectable } from 'inversify'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'; +import { EditorMode } from '../editor-mode'; + +@injectable() +export class ArduinoSearchInWorkspaceContribution extends SearchInWorkspaceFrontendContribution { + + @inject(EditorMode) + protected readonly editorMode: EditorMode; + + async initializeLayout(app: FrontendApplication): Promise { + if (this.editorMode.proMode) { + return super.initializeLayout(app); + } + } + +} diff --git a/arduino-ide-extension/src/browser/customization/silent-navigator-contribution.ts b/arduino-ide-extension/src/browser/customization/silent-navigator-contribution.ts deleted file mode 100644 index 24ca3bdf..00000000 --- a/arduino-ide-extension/src/browser/customization/silent-navigator-contribution.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { injectable, postConstruct } from 'inversify'; -import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution'; -import { FrontendApplication } from '@theia/core/lib/browser'; - -@injectable() -export class SilentNavigatorContribution extends FileNavigatorContribution { - - @postConstruct() - protected async init(): Promise { - // @ts-ignore - delete this.toggleCommand; // The `Explorer` should not be accessible via command or keybinding. - return super.init(); - } - - async initializeLayout(app: FrontendApplication): Promise { - } - -} diff --git a/arduino-ide-extension/src/browser/customization/silent-outline-contribution.ts b/arduino-ide-extension/src/browser/customization/silent-outline-contribution.ts deleted file mode 100644 index 5563f757..00000000 --- a/arduino-ide-extension/src/browser/customization/silent-outline-contribution.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { injectable } from 'inversify'; -import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution'; -import { FrontendApplication } from '@theia/core/lib/browser'; - -@injectable() -export class SilentOutlineViewContribution extends OutlineViewContribution { - - async initializeLayout(app: FrontendApplication): Promise { - } - -} - diff --git a/arduino-ide-extension/src/browser/customization/silent-problem-contribution.ts b/arduino-ide-extension/src/browser/customization/silent-problem-contribution.ts deleted file mode 100644 index d90147f2..00000000 --- a/arduino-ide-extension/src/browser/customization/silent-problem-contribution.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { injectable } from 'inversify'; -import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution'; -import { ProblemStat } from '@theia/markers/lib/browser/problem/problem-manager'; -import { FrontendApplication } from '@theia/core/lib/browser'; - -@injectable() -export class SilentProblemContribution extends ProblemContribution { - - async initializeLayout(app: FrontendApplication): Promise { - } - - protected setStatusBarElement(problemStat: ProblemStat) { - } - -} diff --git a/arduino-ide-extension/src/browser/customization/silent-scm-contribution.ts b/arduino-ide-extension/src/browser/customization/silent-scm-contribution.ts deleted file mode 100644 index 0ad49f21..00000000 --- a/arduino-ide-extension/src/browser/customization/silent-scm-contribution.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { injectable } from 'inversify'; -import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution'; -import { StatusBarEntry } from '@theia/core/lib/browser'; - -@injectable() -export class SilentScmContribution extends ScmContribution { - - async initializeLayout(): Promise { - } - - protected setStatusBarEntry(id: string, entry: StatusBarEntry): void { - } - -} diff --git a/arduino-ide-extension/src/browser/customization/silent-search-in-workspace-contribution.ts b/arduino-ide-extension/src/browser/customization/silent-search-in-workspace-contribution.ts deleted file mode 100644 index 1d12dcaa..00000000 --- a/arduino-ide-extension/src/browser/customization/silent-search-in-workspace-contribution.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { injectable } from 'inversify'; -import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'; -import { FrontendApplication } from '@theia/core/lib/browser'; - -@injectable() -export class SilentSearchInWorkspaceContribution extends SearchInWorkspaceFrontendContribution { - - async initializeLayout(app: FrontendApplication): Promise { - } - -} diff --git a/arduino-ide-extension/src/browser/editor-mode.ts b/arduino-ide-extension/src/browser/editor-mode.ts new file mode 100644 index 00000000..2a3b0a7e --- /dev/null +++ b/arduino-ide-extension/src/browser/editor-mode.ts @@ -0,0 +1,50 @@ +import { injectable } from 'inversify'; +import { ApplicationShell, FrontendApplicationContribution, FrontendApplication } from '@theia/core/lib/browser'; +import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer'; +import { OutputWidget } from '@theia/output/lib/browser/output-widget'; +import { EditorWidget } from '@theia/editor/lib/browser'; + +@injectable() +export class EditorMode implements FrontendApplicationContribution { + + protected app: FrontendApplication; + + onStart(app: FrontendApplication): void { + this.app = app; + if (this.proMode) { + // We use this CSS class on the body to modify the visibility of the close button for the editors and views. + document.body.classList.add(EditorMode.PRO_MODE_KEY); + } + } + + get proMode(): boolean { + const value = window.localStorage.getItem(EditorMode.PRO_MODE_KEY); + return value === 'true'; + } + + async toggle(): Promise { + const oldState = this.proMode; + const inAdvancedMode = !oldState; + window.localStorage.setItem(EditorMode.PRO_MODE_KEY, String(inAdvancedMode)); + if (!inAdvancedMode) { + const { shell } = this.app; + // Close all widget that is neither editor nor `Output`. + for (const area of ['left', 'right', 'bottom', 'main'] as Array) { + shell.closeTabs(area, ({ owner }) => !(owner instanceof EditorWidget || owner instanceof OutputWidget)); + } + } + // No `else`. We initialize the views (if required) in `this.onStart`. + // `storeLayout` is not invoked in electron when refreshing the browser window: https://github.com/eclipse-theia/theia/issues/6530 + // We store the state manually. + // XXX: hack instead of injecting the `ArduinoShellLayoutRestorer` we have to retrieve it from the + // application to avoid DI cycle. + const layoutRestorer = (this.app as any).layoutRestorer as ArduinoShellLayoutRestorer + await layoutRestorer.storeLayoutAsync(this.app); + window.location.reload(true); + } + +} + +export namespace EditorMode { + export const PRO_MODE_KEY = 'arduino-advanced-mode'; +}