Wie baue ich ein Plug‐in?
Nürnberg, 9.11.2010
I N H A L T
1. Was ist ein Plug‐in ?
fb i l i
2. Der Aufbau eines Plug‐in 3. Ein Beispiel
4. Live im Visual Studio
Was ist ein Plug‐in ?
Was ist ein Plug‐in
Ein Plug-in [ pl ʌ g ɪ n] (häufig auch Plugin; von engl. to plug in, „einstöpseln, anschließen“, deutsch etwa
E it d l“) i t i C t d i
„Erweiterungsmodul“) ist ein Computerprogramm, das in ein anderes Softwareprodukt „eingeklinkt“ wird und damit dessen Funktionalität erweitert
dessen Funktionalität erweitert.
Quelle: WikipediaWas ist ein Plug‐in
Die Vorteile eines Plug-In
Mit einem Plug‐in können
kundenspezifischen Erweiterungen in den Innovator nahtlos
g
kundenspezifischen Erweiterungen in den Innovator nahtlos eingebunden werden
neue Functions und Features unabhängig von festen Innovator neue Functions und Features unabhängig von festen Innovator Release ‐Zeitpunkten zur Verfügung gestellt werden
MID Insight 2010 5
© 2010 MID GmbH
Was ist ein Plug‐in
Die Engineerin‐Aktion Die Engineerin Aktion
C# / Java API Schnittstelle Engineering
Start
d Engineering Aktion Ende
Repository Server
Was ist ein Plug‐in
Ein Innovator‐Plug‐in
ist eine interaktive Komponente des Innovator‐Clients
ist eine interaktive Komponente des Innovator Clients
unterscheidet sich nicht von seinen Standardkomponenten
kann einfach in eine vorhandene Innovator‐Installation
kann einfach in eine vorhandene Innovator Installation integriert werden
MID Insight 2010 7
© 2010 MID GmbH
Was ist ein Plug‐in
Das Plug‐in Das Plug in
C# API
Schnittstelle Plug-In
Repository Server
C# Plug-in Schnittstelle Schnittstelle
Das Plug-in hat zwei Schnittstellen zur Interaktion!
Das Plug-in hat zwei Schnittstellen zur Interaktion!
Was ist ein Plug‐in
Einpluggen in den Client Einpluggen in den Client
Tool‐Window
Plug-In Document‐Window
Plug In
MID Insight 2010 9
© 2010 MID GmbH
Was ist ein Plug‐in
Einpluggen als Tool‐Window Einpluggen als Tool Window
Plug In Plug-In
Repository Server
Der Aufbau eines Plug‐in
Architektur und Kommunikation
Der Aufbau eines Plug‐in
Einbindung über Schnittstellen als DLL Einbindung über Schnittstellen als DLL
Ein Plug‐in realisiert eine vordefinierte Schnittstelle I t i DLL (D i Li k Lib )
Ist eine DLL (Dynamic Link Library)
Liegt im Plugin‐Verzeichnis von Innovator g g
Wird beim Start des Client auf diese Schnittstelle hin untersucht
Wird geladen und aktiviert falls es diese Schnittstelle realisiert
Der Aufbau eines Plug‐in
3 verschiedene Realisierungsmöglichkeiten
Für die Realisierung eines Plug‐ins gibt es 3 Möglichkeiten
3 verschiedene Realisierungsmöglichkeiten
g g g g
ohne eigenes Fenster
z.B. für unsichtbare Hintergrundaktionen bei Selektionswechsel
( )
als Tool‐Window (IPluginToolWindow)
Dockbare Fenster wie z.B. Eigenschaftsbereich, Diagrammübersicht
als Document‐Window (IPluginDocumentWindow) als Document Window (IPluginDocumentWindow)
Fenster im Dokumentenbereich wie z.B. Diagramme, Tabellen‐ und Spezifikationseditor
MID Insight 2010 13
© 2010 MID GmbH
Der Aufbau eines Plug‐in
Die Komponentenschnittstelle
Ein Plug‐in realisiert die Schnittstelle IPluginComponent Die Komponentenschnittstelle
public partial class MyPlugin : IPluginComponent
Identifier Name der das Plug‐in identifiziert Identifier Name der das Plug in identifiziert
Commands Plug‐in spezifische Kommandoliste
RequestHandler Bearbeitet die Nachrichten von Innovator
ModelContext ist der Kontext des aktuellen Modells
R i di I N h i h
Request ist die Innovator Nachricht
Der Aufbau eines Plug‐in
Der ModelContext Der ModelContext
Der ModelContext
ist der zentrale Ankerpunkt für alle Client‐Windows an einem Modell
ist der Kontext des Modells an dem man gerade angemeldet ist
wird dem Request‐Handler der Komponente übergeben
h h i T l d D Wi d l P b i
steht auch eine Tool‐ oder Document‐Window als Property bereit
liefert die globale Selektion
stellt Funktionalität z.B. zum Senden von Nachrichten zur Verfügung.
stellt Funktionalität z.B. zum Senden von Nachrichten zur Verfügung.
MID Insight 2010 15
© 2010 MID GmbH
Der Aufbau eines Plug‐in
Die Komponentenschnittstelle
Ein Plug‐in realisiert die Schnittstelle IPluginComponent Die Komponentenschnittstelle
public partial class MyPlugin : IPluginComponent
Identifier Name der das Plug‐in identifiziert Identifier Name der das Plug in identifiziert
Commands Plug‐in spezifische Kommandoliste
RequestHandler Bearbeitet die Nachrichten von Innovator
ModelContext ist der Kontext des aktuellen Modells
R i di I N h i h
Request ist die Innovator Nachricht
Der Aufbau eines Plug‐in
Der RequestHandler einer Komponente Der RequestHandler einer Komponente
Der Request‐Handler für die Bearbeitung von Innovator‐Nachrichten
void IPluginComponent.RequestHandler(ModelContext context, Requestreq) {
switch(req.Type) {{
caseRequestType.CreateComponent:
{
#regionHier wird das Tool-Window erzeugt
context.CreateToolWindow(„MyPlugin“, newMyToolWindow());
#endregion }}
break;
caseRequestType.CanExeCommand:
{{
}
break;
.
MID Insight 2010 17
© 2010 MID GmbH
. .
Der Aufbau eines Plug‐in
Die RequestTypes für Komponente Die RequestTypes für Komponente
RequestType.CreateComponent Die Komponente wird initalisiert Hier kann das ToolWindow erzeugt werden!
werden!
RequestType.OpenDocument Dokument öffnen
(nur bei Document‐Window Plug‐ins) RequestType.Reopen Dokument wieder öffnen
(nur bei Document‐Window Plug‐ins) RequestTypeCanExeCommand Vorbedingung für Innovator Kommandos RequestType.CanExeCommand Vorbedingung für Innovator Kommandos RequestType.ExecuteCommand Ausführung von Innovator Kommandos RequestType.ExpandRibbon Erweiterung der Ribbonbar mit eigenen
Kommandos
Der Aufbau eines Plug‐in
Die Tool‐Window Schnittstelle Die Tool Window Schnittstelle
Plug‐Ins mit eigenem Tool‐Window realisieren IPluginToolWindow
. .
caseRequestType.CreateComponent:
{
#regionHier wird das Tool-Window erzeugt
#regionHier wird das Tool-Window erzeugt
context.CreateToolWindow(„MyPlugin“, new MyToolWindow());
#endregion
#endregion }
. .
public partial class MyToolWindow: ContentControl, IPluginToolWindow {
. .
MID Insight 2010 19
© 2010 MID GmbH
Der Aufbau eines Plug‐in
Die IPluginToolWindow Schnittstelle Die IPluginToolWindow Schnittstelle
ComponentIdentifier Identifikator der Komponente Context Kontext des aktuellen
Modells
WorkingMode Modus bzgl. Selektion Selection Selektion im Tool‐Window MessageHandler Bearbeitet die Nachrichten
von Innovator
CanExeCmd Vorbedingung für Innovator Kommandos wenn Tool Kommandos wenn Tool‐
Window aktiv
ExecuteCmd Ausführung von Innovator Kommandos wenn Tool‐
Kommandos wenn Tool‐
Window aktiv
ToolWindowType Identifier zur Identifikation des Tool‐Windows
WorkingMode.SelectionDependence Reagiert auf Selektion WorkingMode.SelectionPropagation Setzt Selektion
des Tool‐Windows
Der Aufbau eines Plug‐in
Der Message‐Handler eines Tool‐Windows Der Message Handler eines Tool Windows
boolIPluginToolWindow.MessageHandler(WindowMessagemsg) {
switch(msg.Type) {{
caseWindowMessageType.SelectionChanged:
{
ELElementselectedElement = this.Context.Selection.GetSingleElement();
this.DoMyPluginWork(selectedElement);
returntrue;
returntrue;
} break;
caseWindowMessageType.Refresh:
{
RefreshWindowMessagermsg = msg asRefreshWindowMessage;
switch(rmsg.Mode) {{
caseRefreshMode.Delete:
break;
caseRefreshMode.Rename:
break;
break;
. . . }
MID Insight 2010 21
© 2010 MID GmbH
} break;
. .
Der Aufbau eines Plug‐in
Die WindowMessageTypes für Plug‐in Windows Die WindowMessageTypes für Plug in Windows
WindowMessageType.Activated Fenster wird aktiviert WindowMessageType Deactivated Fenster wird deaktiviert WindowMessageType.Deactivated Fenster wird deaktiviert
WindowMessageType.Refresh Fensterinhalt muss gemäß dem übergebenen RefreshMode aktualisiert werden
Wi d M T S l i Ch d S l k i d ä d
WindowMessageType.SelectionChanged Selektion wurde geändert WindowMessageType.Deleting Element wird gelöscht WindowMessageType.Unlocking Element wird entsperrt WindowMessageType.Unlocking Element wird entsperrt
WindowMessageType.Closing Fenster wird geschlossen (nur für DocumentWindows) WindowMessageType.LoggingOut Abmeldung vom Modell
Der Aufbau eines Plug‐in
RefreshMode für WindowMessageType.Refresh RefreshMode für WindowMessageType.Refresh
RefreshMode.Command Expliziter Refresh (Aktualisieren, F5) RefreshMode.Add Element wurde neu erstellt
RefreshMode.Delete Element wurde gelöscht RefreshMode.Rename Element wurde umbenannt
RefreshMode.ChangeStereoProperty Elementeigenschaften wurden geändert RefreshMode.ChangeLabel Labelwert wurde geändert
R f hM d Ch S ifi ti S ifik ti t t d ä d t
RefreshMode.ChangeSpecification Spezifikationstext wurde geändert RefreshMode.ChangeAccess Zugriffsrecht wurde geändert RefreshMode.ChangeLockg Sperrzustand wurde geändertp g
MID Insight 2010 23
© 2010 MID GmbH
Der Aufbau eines Plug‐in
Ein Beispiel für das Senden von Nachrichten Ein Beispiel für das Senden von Nachrichten
In einem Plug‐in wird ein Modellelement umbenannt
try {
stringnewName = null;
ELNamedElementrenameElement = null;
ELNamedElementrenameElement null;
boolsupressCheckConstraints = false;
#regionHier das Element und den neuen Namen bestimmen .
.
#endregion
if(renameElement != null&& newName != null) {
// Element im über Server C#-API im Repository umbenennen renameElement.Rename(newName, supressCheckConstraints );
// Refresh an alle Fenster, die zu diesem ModelContext gehören
this.Context.RefreshModel(RefreshMode.Rename,newElementSet(renameElement));
this.Context.RefreshModel(RefreshMode.Rename, newElementSet(renameElement));
} } catch {
// Fehlerbehandlung // Fehlerbehandlung
Ein Beispiel
Anzeige von Spezifikationstexten
Ein Beispiel
Anzeigen von Spezifikationstexten für ein selektiertes Modellelement
Die Anforderungen
Das Plug‐in soll auf die Selektion reagieren
Die Spezifikationstexte des selektierten Modellelements werden angezeigt
Die Spezifikationstexte des selektierten Modellelements werden angezeigt
Die Anzeige erfolgt in einem Tool‐Window
Verschiedene Texte werden über Expander‐Controls gruppiert
Zur Anzeige soll keine weitere Benutzeraktion mehr erforderlich sein g
Ein Beispiel
Das Klassenmodell von SpecViewer Das Klassenmodell von SpecViewer
MID Insight 2010 27
© 2010 MID GmbH
Ein Beispiel
Der gesamte Source‐Code des Plug‐in passt auf 2 Seiten ! Der gesamte Source Code des Plug in passt auf 2 Seiten !
Das Beispiel Live im Visual Studio
Hauptverwaltung Nürnberg Eibacher Hauptstraße 141
90451 Nürnberg
Niederlassung Stuttgart Silberburgstraße 187
70178 Stuttgart
Niederlassung Köln Ettore‐Bugatti‐Straße 6‐14
51144 Köln
Niederlassung München Keltenring 7 82041 Oberhaching Tel.: +49 (0)911 ‐968 36‐0
Fax: +49 (0)911 ‐968 36‐10
www mid de
Tel.: +49 (0)711 633859‐0 Fax: +49 (0)711 633859‐10
Tel.: +49 (0)2203 20271‐0 Fax: +49 (0)2203 20271‐10
Tel.: +49 (0)89 95476831‐0
Fax: +49 (0)89 95476831‐9