Managed Code Modell für Smart Tags

Die Tatsache, daß es Visual Studio Tools für Office gibt, ist ja nun nicht mehr so neu. Und daß Version 2.0 mit vielen Verbesserungen (u.a. sehr einfach zu programmierndes ActionsPane Modell) in Visual Studio 2005 kommt, wissen auch schon die meisten. Aber es gibt noch mehr, nämlich Support für Smart Tags. Smart Tags, das sind diese Dinger, die in Office (ab XP) irgendwelche Aktionen an x-beliebige Stellen im Text bringen können - abhängig vom Inhalt des Dokuments und nicht von der Position. Um diese zu programmieren, mußte man in der Vergangenheit mit COM-Schnittstellen arbeiten (ISmartTagRecognizer, ISmartTagAction). Nun ist diese Art der Programmierung aber in Zeiten von .NET etwas aus der Mode gekommen. Außerdem - wer es schon mal gemacht hat, wird mir zustimmen - auch nicht gerade intuitiv. VSTO hat nun mit Beta 2 so ganz heimlich auch Unterstützung für Smart Tags für .NET Entwickler gebracht. Wie das funktioniert, will ich hier einmal kurz zeigen:

Wenn wir ein komplett neues VSTO-Projekt für Word anlegen, so sieht der Code in der Klasse ThisDocument folgendermaßen aus:

Public Class ThisDocument

  Private Sub ThisDocument_StartUp(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.StartUp

  End Sub

 

Private Sub ThisDocument_ShutDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ShutDown

End Sub

End Class

Das wollen wir hier einmal etwas erweitern, so daß wir einen Smart Tag bauen, welcher ISBNs erkennen kann. Wer auf einem meiner Office-Development-Veranstaltungen war, kennt das Beispiel, damals allerdings noch über die COM-Interfaces realisiert.

Als erstes brauchen wir mal 2 Imports, um die Funktionalität von Word bzw. Regular Expressions nutzen zu können:

Imports Microsoft.Office.Tools.Word

Imports System.Text.RegularExpressions

 

Dann gibt es jetzt neue Typen bzw. Klassen, wie z.B. Action und SmartTag im Namespace Microsoft.Office.Tools.Word, mit deren Hilfe wir mit ein paar Zeilen Code einen SmartTag hervorzaubern:

 

' Actions definieren:

Private WithEvents actDetails, actTitle, actGoogleSearch As Action

Private Sub ThisDocument_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

' Neuen Smart Tag erzeugen:

  Dim ISBN_ST As New SmartTag("SmartTags.jensha.net/ISBN_ST#ISBNSmartTagSample", "ISBN SmartTag Sample")

 

  ' Regulären Ausdruck zum Erkennen von ISBNs hinzufügen:

  ISBN_ST.Expressions.Add(New Regex("(\d{9}([0-9]|X))|(\d{1}-\d{3}-\d{5}-([0-9]|X))"))

 

  ' Action-Titel festlegen:

  actDetails = New Action("Retrieve Details from Amazon")

  actTitle = New Action("Titel zu ISBN einfügen")

  actGoogleSearch = New Action("ISBN in Google suchen")

' Actions an den Smart Tag hängen:

  ISBN_ST.Actions = New Action() {actDetails, actTitle, actGoogleSearch}

' Smart Tag der ´Dokument-SmartTag-Collection hinzufügen:

  VstoSmartTags.Add(ISBN_ST)

End Sub

Jetzt können wir noch die Eventhandler zu den 3 Actions befüllen. Durch die Withevents-Deklaration können wir den jeweiligen Handler durch Mausklick erzeugen und mit dem gewünschten Code befüllen. War doch nicht schwer, oder?

Es gibt allerdings doch einen Unterschied in der Funktionalität, den ich fairerweise erwähnen muß: Solche Smart Tags sind dokumentzentrisch! Also, ebenso wie eine VSTO-Solution nur für ein bestimmtes Dokument gilt, funktionieren die so erzeugten Smart Tags auch nur für ein bestimmtes Dokument. Oder eben die Dokumentvorlage, auf deren Basis das Dokument erzeugt worden ist. COM-Smart Tags funktionieren sogar Applikations-übergreifend, wenn man die Aktionen entsprechend allgemein hält oder auf die jeweilige Host-Applikation Rücksicht nimmt.

Das soll aber kein Nachteil sein, kann man doch so die Mustererkennung sehr aggressiv ansetzen, da der Scope sehr beschränkt ist. Eine 4-stellige Nummer kann normelerweise alles mögliche bedeuten, im Kontext eines bestimmten Dokuments jedoch z.B. Teilenummern von Maschinen. Zusammen mit Smart Documents (basierend auf VSTO 2.0 und nicht ISmartDocument) können hier sehr schnell sehr mächtige Dokumente erstellt werden.