Skip to content

Commit daedae1

Browse files
author
Akos Kitta
committed
PROEDITOR-50: Customized the editor for built-ins
- From now on, sources from the `dataDir` opened in a read-only editor. - Disabled the tab-bar decoration for built-ins. - No problem markers for the built-ins. Signed-off-by: Akos Kitta <[email protected]>
1 parent ac4e877 commit daedae1

File tree

4 files changed

+115
-0
lines changed

4 files changed

+115
-0
lines changed

Diff for: arduino-ide-extension/src/browser/arduino-frontend-module.ts

+21
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ import { MonitorWidget } from './monitor/monitor-widget';
6363
import { MonitorViewContribution } from './monitor/monitor-view-contribution';
6464
import { MonitorConnection } from './monitor/monitor-connection';
6565
import { MonitorModel } from './monitor/monitor-model';
66+
import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider';
67+
import { ArduinoMonacoEditorProvider } from './editor/arduino-monaco-editor-provider';
68+
import { TabBarDecoratorService } from '@theia/core/lib/browser/shell/tab-bar-decorator';
69+
import { ArduinoTabBarDecoratorService } from './shell/arduino-tab-bar-decorator';
70+
import { ProblemManager } from '@theia/markers/lib/browser';
71+
import { ArduinoProblemManager } from './markers/arduino-problem-manager';
6672
const ElementQueries = require('css-element-queries/src/ElementQueries');
6773

6874
export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => {
@@ -213,4 +219,19 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un
213219
}
214220
unbind(FrontendApplication);
215221
bind(FrontendApplication).to(CustomFrontendApplication).inSingletonScope();
222+
223+
// monaco customizations
224+
unbind(MonacoEditorProvider);
225+
bind(ArduinoMonacoEditorProvider).toSelf().inSingletonScope();
226+
bind(MonacoEditorProvider).toService(ArduinoMonacoEditorProvider);
227+
228+
// decorator customizations
229+
unbind(TabBarDecoratorService);
230+
bind(ArduinoTabBarDecoratorService).toSelf().inSingletonScope();
231+
bind(TabBarDecoratorService).toService(ArduinoTabBarDecoratorService);
232+
233+
// problem markers
234+
unbind(ProblemManager);
235+
bind(ArduinoProblemManager).toSelf().inSingletonScope();
236+
bind(ProblemManager).toService(ArduinoProblemManager);
216237
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { inject, injectable } from 'inversify';
2+
import URI from '@theia/core/lib/common/uri';
3+
import { DisposableCollection } from '@theia/core/lib/common/disposable';
4+
import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
5+
import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model';
6+
import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider';
7+
import { ConfigService } from '../../common/protocol/config-service';
8+
9+
@injectable()
10+
export class ArduinoMonacoEditorProvider extends MonacoEditorProvider {
11+
12+
@inject(ConfigService)
13+
protected readonly configService: ConfigService;
14+
protected dataDirUri: string | undefined;
15+
16+
protected async getModel(uri: URI, toDispose: DisposableCollection): Promise<MonacoEditorModel> {
17+
// `createMonacoEditorOptions` is not `async` so we ask the `dataDirUri` here.
18+
// https://github.com/eclipse-theia/theia/issues/6234
19+
const { dataDirUri } = await this.configService.getConfiguration()
20+
this.dataDirUri = dataDirUri;
21+
return super.getModel(uri, toDispose);
22+
}
23+
24+
protected createMonacoEditorOptions(model: MonacoEditorModel): MonacoEditor.IOptions {
25+
const options = this.createOptions(this.preferencePrefixes, model.uri, model.languageId);
26+
options.model = model.textEditorModel;
27+
options.readOnly = model.readOnly;
28+
if (this.dataDirUri) {
29+
options.readOnly = new URI(this.dataDirUri).isEqualOrParent(new URI(model.uri));
30+
}
31+
return options;
32+
}
33+
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { inject, injectable, postConstruct } from 'inversify';
2+
import { Diagnostic } from 'vscode-languageserver-types';
3+
import URI from '@theia/core/lib/common/uri';
4+
import { Marker } from '@theia/markers/lib/common/marker';
5+
import { ProblemManager } from '@theia/markers/lib/browser/problem/problem-manager';
6+
import { ConfigService } from '../../common/protocol/config-service';
7+
8+
@injectable()
9+
export class ArduinoProblemManager extends ProblemManager {
10+
11+
@inject(ConfigService)
12+
protected readonly configService: ConfigService;
13+
protected dataDirUri: URI | undefined;
14+
15+
@postConstruct()
16+
protected init(): void {
17+
super.init();
18+
this.configService.getConfiguration().then(({ dataDirUri }) => this.dataDirUri = new URI(dataDirUri));
19+
}
20+
21+
setMarkers(uri: URI, owner: string, data: Diagnostic[]): Marker<Diagnostic>[] {
22+
if (this.dataDirUri && this.dataDirUri.isEqualOrParent(uri)) {
23+
return [];
24+
}
25+
return super.setMarkers(uri, owner, data);
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { inject, injectable, postConstruct } from 'inversify';
2+
import URI from '@theia/core/lib/common/uri';
3+
import { Title, Widget } from '@phosphor/widgets';
4+
import { WidgetDecoration } from '@theia/core/lib/browser/widget-decoration';
5+
import { TabBarDecoratorService } from '@theia/core/lib/browser/shell/tab-bar-decorator';
6+
import { ConfigService } from '../../common/protocol/config-service';
7+
import { EditorWidget } from '@theia/editor/lib/browser';
8+
9+
@injectable()
10+
export class ArduinoTabBarDecoratorService extends TabBarDecoratorService {
11+
12+
@inject(ConfigService)
13+
protected readonly configService: ConfigService;
14+
protected dataDirUri: URI | undefined;
15+
16+
@postConstruct()
17+
protected init(): void {
18+
super.init();
19+
this.configService.getConfiguration().then(({ dataDirUri }) => this.dataDirUri = new URI(dataDirUri));
20+
}
21+
22+
getDecorations(title: Title<Widget>): WidgetDecoration.Data[] {
23+
if (title.owner instanceof EditorWidget) {
24+
const editor = title.owner.editor;
25+
if (this.dataDirUri && this.dataDirUri.isEqualOrParent(editor.uri)) {
26+
return [];
27+
}
28+
}
29+
return super.getDecorations(title);
30+
}
31+
32+
}

0 commit comments

Comments
 (0)