Erstellung eines AddIns für Word 2007 – Teil 6 (Anzeige der Ergebnisse in einem CustomTaskPane)
Sunday, November 16th, 2008Hallo,
im letzten Teil dieser Serie habe ich beschrieben wie man bestimmte Fragmente eines Dokumentes anhand der Formatvorlage (engl. “style”) findet. Eine genaue Beschreibung der Überprüfung der damit gefunden OCL-Fragmente ist im Rahmen von postings über Microsoft Office Programmierung weniger interessant.
Relevanter wird es wieder bei der Frage nach der Darstellung der Ergebnisse.
Hierfür gibt es in den von mir verwendeten OCL libraries bereits ein UserControl “ErrorList”, das im Rahmen des Office-AddIns wiederverwendet werden soll. Dieses control stellt Fehler tabellarisch dar und signalisiert einen Doppelklick auf einen Fehlereintrag mit einem event:
Um ein solches control mit einem Dokument zu assoziieren bietet sich eine CustomTaskPane an.
Eine solche CustomTaskPane ist ein container für ein UserControl der gleichzeitig zu dem Dokument angezeigt wird:
Die CustomTaskPane kann vom Anwender per drag and drop an jeder Seite des Dokumentes gedockt werden. Bei Bedarf kann man davon auch per event benachrichtigt werden um z.B. das Layout im gehosteten UserControl anzupassen.
Unser AddIn gibt dem Benutzer die Möglichkeit die CustomTaskPane mit den Ergebnisse des OCL checks unsichtbar oder sichtbar zu machen (mit der “Display check results” checkbox im “OCL” tab des ribbons – siehe obiges Bild).
Dadurch wird das handling nicht völlig trivial, weshalb ich im folgenden einen möglichen Ansatz für den Umgang mit der CustomTaskPane vorschlagen will. Eine Überlegung besteht darin, dass die Steuerung der Sichtbarkeit nicht in den Eventhandlern des ribbons erfolgen sollte, sondern in der Klasse “ThisAddIn” die die Steuerung des AddIns zentral implementieren sollte.
Um dies zu erreichen, wurde für die generierte Ribbon-Klasse ein neuer event “OnDisplayResultTaskPane” eingeführt. Falls nun die checkbox “Display check result” geclickt wird, erzeugt das ribbon lediglich einen entsprechenden event. Die ThisAddIn-Klasse meldet sich für diesen event an und reagiert dann entsprechend indem sie die CustomTaskPane sichtbar oder unsichtbar macht.
private void ThisAddIn_Startup(object sender, System.EventArgs e) { .... ribbonTabOcl.Instance.OnDisplayResultTaskPane += this.OnDisplayResultTaskPane; .... }
Das Erzeugen der CustomTaskPane ist so implementiert:
private ErrorList CreateCustomTaskPane() { if (this.CustomTaskPanes.Contains(m_checkResultsTaskPane)) { this.CustomTaskPanes.Remove(m_checkResultsTaskPane); } ErrorList el = new ErrorList(); el.OnErrorSelected += this.OnErrorSelected; m_checkResultsTaskPane = this.CustomTaskPanes.Add(el, "OCL check results"); m_checkResultsTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionBottom; m_checkResultsTaskPane.VisibleChanged += new EventHandler(m_checkResultsTaskPane_VisibleChanged); return (el); }
In Zeile 11 wird das CustomTaskPane-Objekt erzeugt. Im Konstruktor wird dabei das UserControl übergeben, das in der CustomTaskPane dargestellt werden soll. Es empfiehlt sich, das UserControl an den Aufrufer zurückzugeben, damit dieser dort Eventhandler registrieren kann und properties des UserControls setzen oder lesen kann.
Ich habe die Beobachtung gemacht, dass das managed CustomTaskPane-Objekt gelegentlich aufgrund der Benutzerinteraktionen sein natives Objekt “verliert” ohne das man dies durch einen event gemeldet bekommt. In einem solchen Fall gäbe es eine Exception beim Zugriff auf das CustomTaskPane-Objekt. Deshalb wird die Methode CreateCustomTaskPane() nach jedem click auf den “Check all expressions” button aufgerufen, obwohl dies streng genommen nicht nötig wäre.
Ein Schliessen der CustomTaskPane durch klicken auf ihren close button zerstört das Objekt nicht. In einem solchen Fall wird ein VisibleChanged event generiert den man benutzen kann um das GUI synchron zu halten (in unserem Fall die “Display check results” checkbox zu deselektieren).
Insgesamt bieten die CustomTaskPanes eine elegante Möglichkeit, beliebige controls mit einem Word-Dokument zu assoziieren.
Viele Grüße,
Andreas
Technorati Tags: Office 2007, Word 2007, AddIn, CustomTaskPane







