theia-sprotty
Version:
Glue code for sprotty diagrams in a Theia IDE
65 lines (53 loc) • 2.19 kB
text/typescript
/*
* Copyright (C) 2017 TypeFox and others.
*
* Licensed under the Apache License, Version 2.0 (the "License") you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/
import { injectable } from "inversify"
import URI from "@theia/core/lib/common/uri"
import { Emitter, Event, MaybePromise } from "@theia/core/lib/common"
import { Widget } from "@phosphor/widgets"
import { DiagramWidget } from './diagram-widget'
()
export class DiagramWidgetRegistry {
protected idSequence = 0
protected readonly widgets = new Map<string, MaybePromise<DiagramWidget>>()
protected readonly widgetsById = new Map<string, DiagramWidget>()
protected readonly onWidgetsChangedEmitter = new Emitter<void>()
onWidgetsChanged(): Event<void> {
return this.onWidgetsChangedEmitter.event
}
getWidgetCount(): number {
return this.widgets.size
}
getOpenedWidgets(): Widget[] {
return Array.from(this.widgets.values()).filter(widget => widget instanceof Widget) as Widget[]
}
getWidget(uri: URI, diagramType: string): Promise<DiagramWidget | undefined> {
const widget = this.widgets.get(this.getKey(uri, diagramType))
if (widget)
return Promise.resolve(widget || undefined)
else
return Promise.resolve(undefined)
}
getWidgetById(widgetId: string): DiagramWidget | undefined {
return this.widgetsById.get(widgetId)
}
addWidget(uri: URI, diagramType: string, widget: DiagramWidget): void {
this.widgets.set(this.getKey(uri, diagramType), widget)
this.widgetsById.set(widget.id, widget)
this.onWidgetsChangedEmitter.fire(undefined)
}
removeWidget(uri: URI, diagramType: string): void {
if (this.widgets.delete(this.getKey(uri, diagramType))) {
this.onWidgetsChangedEmitter.fire(undefined)
}
}
protected getKey(uri: URI, diagramType: string): string {
return uri.toString(true) + '#' + diagramType
}
public nextId(): string {
return `widget-${this.idSequence++}`
}
}