Inhaltsverzeichnis
Toolbar, QuickBar & ActionBar
Die Shell stellt mehrere Leistentypen bereit, in die Add-ins Buttons einbringen können. Jede Leiste hat einen eigenen Zweck und ein eigenes Merge-Verhalten, aber alle verwenden dasselbe Grundprinzip: Ein Button verweist auf einen Command, der Host ordnet die Buttons nach Gruppe und Priorität an, und when-Ausdrücke steuern die Sichtbarkeit.
Zurück zur Contributions-Übersicht oder zur Hauptübersicht.
Die drei Leistentypen
Haupt-Toolbar
Die Haupt-Toolbar ist die primäre Leiste unterhalb der Menüleiste. Sie enthält die am häufigsten verwendeten Aktionen. Add-ins platzieren Buttons hier über die toolbarId „main“.
Die Haupt-Toolbar ist für globale, kontextunabhängige Aktionen gedacht: Dokument öffnen, Speichern, Rückgängig. Aktionen, die nur in bestimmten Kontexten relevant sind, sollten stattdessen in der ActionBar oder in der View-Titelleiste platziert werden.
QuickBar (Quick Access Bar)
Die QuickBar ist eine schmale Leiste mit häufig genutzten Schnellzugriffen. Sie enthält typischerweise kompaktere Buttons ohne Text — nur Icons. Add-ins platzieren Buttons hier über toolbarId „quickbar“.
Der Benutzer kann die QuickBar anpassen: Buttons hinzufügen, entfernen und umsortieren. Der Host speichert diese Anpassungen in den Benutzer-Einstellungen. Die vom Add-in deklarierten Buttons sind die Standardvorgabe, die der Benutzer überschreiben kann.
ActionBar
Die ActionBar erscheint kontextabhängig, typischerweise am oberen Rand eines Dokument-Tabs oder einer View. Sie zeigt Aktionen, die zum gerade aktiven Inhalt passen. Add-ins platzieren Buttons hier über toolbarId „actionbar“.
Der Vorteil der ActionBar gegenüber der Haupt-Toolbar: Buttons in der ActionBar erscheinen nur, wenn ihr Kontext aktiv ist. Das hält die Oberfläche aufgeräumt. Wenn der Benutzer zu einem anderen Dokumenttyp wechselt, verschwinden die ActionBar-Buttons des vorherigen Typs und die des neuen erscheinen.
Manifest-Deklaration
"contributes": { "toolbar": [ { "toolbarId": "main", "command": "assets.list", "icon": "media/asset-list.svg", "tooltip": "Anlageliste öffnen", "when": "" }, { "toolbarId": "quickbar", "command": "assets.open", "icon": "media/asset-open.svg", "tooltip": "Anlage öffnen", "when": "" }, { "toolbarId": "actionbar", "command": "assets.save", "icon": "media/save.svg", "tooltip": "Anlage speichern", "when": "activeDocument == assets.editor" } ] }
| Feld | Pflicht | Beschreibung |
toolbarId | ja | Zielleiste: „main“, „quickbar“, „actionbar“ oder eine benutzerdefinierte Id. |
command | ja | Referenz auf einen deklarierten Command. Der Button löst diesen Command aus. |
icon | ja | Relativer Pfad zum Button-Icon (SVG oder PNG). Toolbar-Buttons zeigen in der Regel nur das Icon, keinen Text. |
tooltip | nein | Tooltip-Text, der beim Überfahren mit der Maus erscheint. Wenn das Feld fehlt, verwendet der Host den Command-Titel. |
when | nein | Kontextausdruck für bedingte Sichtbarkeit. Leerer String oder fehlendes Feld bedeutet: immer sichtbar. |
Merge-Verfahren
Der Host sammelt alle Toolbar-Contributions aus allen installierten Add-ins und gruppiert sie nach toolbarId. Innerhalb jeder Toolbar werden die Buttons nach denselben Regeln sortiert wie Menüpunkte:
- Buttons mit
group-Angabe werden gruppiert (alphabetisch nach Gruppenname) - Innerhalb der Gruppe sortiert nach
order(numerisch aufsteigend) - Zwischen Gruppen fügt der Host einen visuellen Trenner ein (schmaler Strich oder Abstand)
Wenn kein group-Feld angegeben ist, verwendet der Host eine Standardgruppe. Buttons ohne explizite Gruppe landen alle in derselben Sektion.
Beispiel: Merge aus drei Add-ins
Add-in A (Assets):
"toolbar": [ { "toolbarId": "main", "command": "assets.list", "icon": "...", "group": "modules", "order": 1 } ]
Add-in B (Berichte):
"toolbar": [ { "toolbarId": "main", "command": "reports.dashboard", "icon": "...", "group": "modules", "order": 2 } ]
Add-in C (Export):
"toolbar": [ { "toolbarId": "main", "command": "export.pdf", "icon": "...", "group": "actions", "order": 1 } ]
Das Ergebnis in der Haupt-Toolbar:
[ Export-PDF ] | [ Assets-Liste ] [ Berichte-Dashboard ] (actions) | (modules)
Die actions-Gruppe steht vor modules (alphabetisch). Innerhalb der modules-Gruppe stehen Assets vor Berichte (order 1 < 2). Der vertikale Strich ist der Gruppentrenner.
Kontextabhängige Buttons
Die ActionBar ist besonders nützlich für kontextabhängige Aktionen. Der when-Ausdruck stellt sicher, dass Buttons nur erscheinen, wenn ihr Kontext aktiv ist:
"toolbar": [ { "toolbarId": "actionbar", "command": "assets.save", "icon": "media/save.svg", "when": "activeDocument == assets.editor && isDirty" }, { "toolbarId": "actionbar", "command": "assets.print", "icon": "media/print.svg", "when": "activeDocument == assets.editor" } ]
In diesem Beispiel erscheint der Speichern-Button nur, wenn ein Asset-Editor aktiv ist und ungespeicherte Änderungen vorliegen. Der Drucken-Button erscheint immer, wenn ein Asset-Editor aktiv ist. Wechselt der Benutzer zu einem anderen Dokumenttyp, verschwinden beide Buttons.
Dynamische Re-Evaluation
Der Host wertet when-Ausdrücke auf Toolbar-Buttons dynamisch aus — genau wie bei Menüpunkten. Sobald sich ein Kontextwert ändert (z.B. beim Tab-Wechsel), durchläuft der Host alle Toolbar-Buttons mit when-Klausel und aktualisiert deren Sichtbarkeit sofort. Buttons ohne when-Klausel bleiben immer sichtbar.
Das bedeutet: Wenn zwei Add-ins Toolbar-Buttons für verschiedene Dokumenttypen deklarieren, sieht der Benutzer nur die Buttons, die zum gerade aktiven Dokument passen. Beim Tab-Wechsel verschwinden die Buttons des vorherigen Typs und die des neuen erscheinen — ohne Flackern und ohne dass das Add-in aktiv eingreifen muss.
Die Kette ist:
DoActivateim Frame setzt den Kontextwert (z.B.activeDocument)- Der Host erkennt die Änderung über
IContextKeyService ReEvaluateToolbarVisibilitywertet allewhen-Klauseln neu aus- Buttons mit
Visible := Falsewerden ausgeblendet, das Layout wird aktualisiert
Das Add-in muss dafür den Kontextwert activeDocument setzen. Das geschieht typischerweise in der DoActivate-Methode des TWvdSDocumentFrame:
procedure TAssetEditorFrame.DoActivate; begin FHost.Context.SetContext('activeDocument', 'assets.editor'); end; procedure TAssetEditorFrame.DoDeactivate; begin FHost.Context.SetContext('activeDocument', ''); end;
Programmatische Registrierung
Für dynamische Szenarien bietet IToolbarService die Laufzeit-Registrierung:
AContext.Subscribe( FHost.Toolbar.AddToolbarItem('actionbar', 'assets.custom-action', 'media/custom.svg', 'Benutzerdefinierte Aktion', 'activeDocument == assets.editor') );
Dynamisch registrierte Buttons werden identisch zu statischen gemergt und dargestellt.
Weiter zu Sidebar-Views oder zurück zur Contributions-Übersicht.