@difizen/mana-core
Version:
78 lines (66 loc) • 2.57 kB
text/typescript
import { Emitter } from '@difizen/mana-common';
import { prop } from '@difizen/mana-observable';
import type { Contribution } from '@difizen/mana-syringe';
import { contrib, inject, singleton, Syringe } from '@difizen/mana-syringe';
import { ApplicationContribution } from '../application';
import type { ToolbarNode } from './toolbar-protocol';
import { ToolbarItem, ToolbarItemFactory } from './toolbar-protocol';
/**
* Clients should implement this interface if they want to contribute to the toolbar.
*/
export const ToolbarContribution = Syringe.defineToken('ToolbarContribution');
export type ToolbarContribution = {
/**
* Registers toolbar items.
* @param registry the toolbar registry.
*/
registerToolbarItems: (registry: ToolbarRegistry) => void;
};
/**
* Main, shared registry for tab-bar toolbar items.
*/
({ contrib: ApplicationContribution })
export class ToolbarRegistry implements ApplicationContribution {
()
items: Map<string, ToolbarItem> = new Map();
protected readonly toolbarItemFactory: ToolbarItemFactory;
protected readonly contributionProvider: Contribution.Provider<ToolbarContribution>;
constructor(
(ToolbarItemFactory)
toolbarItemFactory: ToolbarItemFactory,
(ToolbarContribution)
contributionProvider: Contribution.Provider<ToolbarContribution>,
) {
this.toolbarItemFactory = toolbarItemFactory;
this.contributionProvider = contributionProvider;
}
protected readonly onDidChangeEmitter = new Emitter<void>();
onStart(): void {
const contributions = this.contributionProvider.getContributions();
for (const contribution of contributions) {
contribution.registerToolbarItems(this);
}
}
/**
* Registers the given item. Throws an error, if the corresponding command cannot be found or an item has been already registered for the desired command.
*
* @param item the item to register.
*/
registerItem(def: ToolbarNode): ToolbarItem {
const { id } = def;
if (this.items.has(id)) {
throw new Error(`A toolbar item is already registered with the '${id}' ID.`);
}
const item = ToolbarItem.is(def) ? def : this.toolbarItemFactory(def);
this.items.set(id, item);
item.onDisposed(() => this.items.delete(id));
return item;
}
getToolbarItem(id: string): ToolbarItem | undefined {
return this.items.get(id);
}
unregisterItem(itemOrId: ToolbarNode | string): void {
const id = typeof itemOrId === 'string' ? itemOrId : itemOrId.id;
this.items.delete(id);
}
}