From d6637c44e5e8efa4d620f0af03e2a804a3830857 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 8 Jul 2019 13:40:51 +0200 Subject: [PATCH] PROEDITOR-20: Restored the dirt flag in editor tab Signed-off-by: Akos Kitta --- .../src/browser/arduino-frontend-module.ts | 4 --- .../customization/custom-application-shell.ts | 30 +++++++++++++++++-- .../custom-editor-widget-factory.ts | 22 -------------- .../src/browser/style/editor.css | 13 ++++++++ .../src/browser/style/index.css | 1 + 5 files changed, 42 insertions(+), 28 deletions(-) delete mode 100644 arduino-ide-extension/src/browser/customization/custom-editor-widget-factory.ts create mode 100644 arduino-ide-extension/src/browser/style/editor.css diff --git a/arduino-ide-extension/src/browser/arduino-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-frontend-module.ts index 40bd8887..1f35ca9a 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-frontend-module.ts @@ -46,8 +46,6 @@ import { SilentMonacoStatusBarContribution } from './customization/silent-monaco import { ApplicationShell } from '@theia/core/lib/browser'; import { CustomApplicationShell } from './customization/custom-application-shell'; import { CustomFrontendApplication } from './customization/custom-frontend-application'; -import { EditorWidgetFactory } from '@theia/editor/lib/browser/editor-widget-factory'; -import { CustomEditorWidgetFactory } from './customization/custom-editor-widget-factory'; import { SelectBoardDialog, SelectBoardDialogProps } from './boards/select-board-dialog'; import { SelectBoardDialogWidget } from './boards/select-board-dialog-widget'; @@ -152,6 +150,4 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un bind(ApplicationShell).to(CustomApplicationShell).inSingletonScope(); unbind(FrontendApplication); bind(FrontendApplication).to(CustomFrontendApplication).inSingletonScope(); - unbind(EditorWidgetFactory); - bind(EditorWidgetFactory).to(CustomEditorWidgetFactory).inSingletonScope(); }); diff --git a/arduino-ide-extension/src/browser/customization/custom-application-shell.ts b/arduino-ide-extension/src/browser/customization/custom-application-shell.ts index f88468f6..8813d6e9 100644 --- a/arduino-ide-extension/src/browser/customization/custom-application-shell.ts +++ b/arduino-ide-extension/src/browser/customization/custom-application-shell.ts @@ -1,7 +1,33 @@ -import { ApplicationShell } from "@theia/core/lib/browser"; +import { ApplicationShell, Widget, Saveable, FocusTracker, Message } from '@theia/core/lib/browser'; +import { EditorWidget } from '@theia/editor/lib/browser'; export class CustomApplicationShell extends ApplicationShell { + protected refreshBottomPanelToggleButton() { - } + + protected async track(widget: Widget): Promise { + const tracker = (this as any).tracker as FocusTracker; + tracker.add(widget); + this.disableClose(Saveable.apply(widget)); + if (ApplicationShell.TrackableWidgetProvider.is(widget)) { + for (const toTrack of await widget.getTrackableWidgets()) { + tracker.add(toTrack); + this.disableClose(Saveable.apply(toTrack)); + } + if (widget.onDidChangeTrackableWidgets) { + widget.onDidChangeTrackableWidgets(widgets => widgets.forEach(w => this.track(w))); + } + } + } + + private disableClose(widget: Widget | undefined): void { + if (widget instanceof EditorWidget) { + const onCloseRequest = (_: Message) => { + // NOOP + }; + (widget as any).onCloseRequest = onCloseRequest.bind(widget); + } + } + } \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/customization/custom-editor-widget-factory.ts b/arduino-ide-extension/src/browser/customization/custom-editor-widget-factory.ts deleted file mode 100644 index 15cfc473..00000000 --- a/arduino-ide-extension/src/browser/customization/custom-editor-widget-factory.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { injectable } from "inversify"; -import { EditorWidgetFactory } from "@theia/editor/lib/browser/editor-widget-factory"; -import URI from "@theia/core/lib/common/uri"; -import { EditorWidget } from "@theia/editor/lib/browser"; - -@injectable() -export class CustomEditorWidgetFactory extends EditorWidgetFactory { - - protected async createEditor(uri: URI): Promise { - const icon = await this.labelProvider.getIcon(uri); - return this.editorProvider(uri).then(textEditor => { - const newEditor = new EditorWidget(textEditor, this.selectionService); - newEditor.id = this.id + ':' + uri.toString(); - newEditor.title.closable = false; - newEditor.title.label = this.labelProvider.getName(uri); - newEditor.title.iconClass = icon + ' file-icon'; - newEditor.title.caption = this.labelProvider.getLongName(uri); - return newEditor; - }); - } - -} \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/style/editor.css b/arduino-ide-extension/src/browser/style/editor.css new file mode 100644 index 00000000..049c8acf --- /dev/null +++ b/arduino-ide-extension/src/browser/style/editor.css @@ -0,0 +1,13 @@ +/* Do not show the `close` icon for editor, but show the dirty state. */ +.p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable:hover > .p-TabBar-tabCloseIcon, +.p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-current > .p-TabBar-tabCloseIcon { + background-image: none; + cursor: pointer; +} + +.p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable.theia-mod-dirty:hover > .p-TabBar-tabCloseIcon, +.p-TabBar.theia-app-centers .p-TabBar-tab.p-mod-closable.theia-mod-dirty > .p-TabBar-tabCloseIcon:hover { + background-size: 10px; + background-image: var(--theia-icon-circle); + cursor: pointer; +} \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index e9e53b25..6b2b5dae 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -1,3 +1,4 @@ @import './list-widget.css'; @import './board-select-dialog.css'; @import './main.css'; +@import './editor.css'; \ No newline at end of file