OBA "state of the art": addin, ribbon, task pane - Site Source

Múlt héten egy barátom jóvoltából (ezúton is köszönet érte) kezembe akadt a 6 Microsoft® Office Business Applications for Office SharePoint® Server 2007 című MS Press könyv. Bevallom elsőre vegyes érzelmeim voltak a könyvvel kapcsolatban, mert bár a SharePoint programozás érdekel, az "OBA" hallatán feláll a szőr a hátamon.

Először is: Gondolt már valaki arra, micsoda nyelvi környezetszennyezést okoz az, ha egy ilyen mondat kerül a címlapra: "Practical OBAs for working developers"?

Másodszor pedig: Az Office szerencsére már nagyon régóta programozható platform mind szerver, mind pedig kliens oldalon és az én meglátásom szerint az OBA-hullám nem más, mint ennek egy új marketinges megközelítése, ahol minden "super-easy". Ettől még számomra továbbra is kliens és szerver oldali, részben burkolt COM és felügyelt interfészek összekalapálásáról van szó. Úgy látszik a könyv borító tervezője egyetérthet velem, mert szögeket rajzolt a címlapra :)

Azt belátom, hogy most már kezd az Office eljutni oda, hogy a felügyelt interfészeknek és a Visual Studio támogatásnak köszönhetően valóban lehet alkalmazás hosztként is használni, ez igaz. Legalábbis ezt mondják és a könyvbe beleolvasva én is hinni kezdtem a dologban...

Lassan másfél éve, hogy utoljára Office kliens programozással bajlódtam, akkor még keményen ott volt benne a COM és az ActiveX, nem volt viszont designer támogatás, helyette lehetett XML-t írni IntelliSense nélkül. A könyvet olvasva elhatároztam, hogy kipróbálom, milyen érzés mostanában egy Word addint írni.

Feladatként a következőt tűztem ki: írok egy olyan Word 2007 addint, ami kiegészíti a ribbont, ahol egy saját gombra kattintva megjelenik egy saját task pane. Ebben a saját task pane-ben el lehet navigálni egy SharePoint listára, a Wordben megjelennek a lista elemei, ahol az egyes mezők értékeit egyszerűen be lehet szúrni a dokumentumba. Mindezt azért, hogy ne kelljen annyit SharePoint listából Word doksikba copy paste-elnem és ALT-TAB-oznom, amitől jojózik a szemem egy idő után. Ha ehhez COM-ot vagy XML-t kell matatnom, megint másfél évre jegelem az Office programozást.

Fogtam tehát egy Visual Studio 2008-at és létrehoztam benne egy Word 2007 addin típusú projektet és elneveztem Site Source-nak. Plusz pont a VS teamnek, hogy már nincs külön VSTO, mindent megkapunk egy teljes Visual Studio 2008 telepítéssel:

New Project dialógusablak

A következő kellemes meglepetés akkor ért, amikor megláttam, hogy milyen tiszta kódvázat generál a Studio. Egyetlen osztály mindössze ennyi kóddal:

    namespace SiteSourceAddIn
    {
        public partial class ThisAddIn
        {
            private void ThisAddIn_Startup( object sender, System.EventArgs e )
            {
            }

            private void ThisAddIn_Shutdown( object sender, System.EventArgs e )
            {
            }

            #region VSTO generated code

            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InternalStartup()
            {
                this.Startup += new System.EventHandler( ThisAddIn_Startup );
                this.Shutdown += new System.EventHandler( ThisAddIn_Shutdown );
            }

            #endregion
        }
    }

Ennek fele se tréfa, dolgoztak a fiúk Redmondban. Nosza, alkossunk ribbont, tehát Solution Explorerben Add New Item és láss csodát, lehet ribbont létrehozni nemcsak XML-ben, hanem designer segítségével is:

New item templates

 

Be is húztam egy ToggleButton nevű vezérlőt a Toolboxról, ez fogja majd megjeleníteni a saját task pane-t és a szokásos módon generáltam hozzá eseménykezelőt:

Ribbon Designer

Az eredmény a Forms világban jól megszokott osztály, ahogy annak lennie kell. Kiegészítettem a ThisAddIn osztályomat, hogy meg is jelenjen:

        protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
        {
            return new Ribbon.RibbonManager( new Ribbon.OfficeRibbon[] { new SiteSourceRibbon() } );
        }

Hozzáadtam a projekthez egy user controlt, ebből lesz a task pane. User controlhoz már régóta van designer támogatás, így nem okozott gondot felparaméterezni a vezérlőket és bekonfigurálni az adatkötést:

User Control

Újabb egy sor a ThisAddIn osztályba az addin betöltődésekor és még egy internal változó, hogy tudjak rá hivatkozni:

        internal OfficeTools.CustomTaskPane taskPane;

        private void ThisAddIn_Startup( object sender, System.EventArgs e )
        {
            this.taskPane = this.CustomTaskPanes.Add( new SiteSourceTaskPane(), "Site Source Tasks" );
        }

Ezek után már megírhattam a ribbon eseménykezelőjét, ami megjeleníti vagy elrejti ezt a task pane-t:

        private void tbtnDisplay_Click( object sender, RibbonControlEventArgs e )
        {
            Globals.ThisAddIn.taskPane.Visible = !Globals.ThisAddIn.taskPane.Visible;
        }

A task pane SharePoint webszolgáltatások segítségével kéri le a listák tartalmát és LINQ to XML segítségével dolgozza fel. Ha valakit érdekel írjon és megmutatom azt is. Az Office programozással kapcsolatban ami érdekes, hogy végül az eredményt hogyan lehet beszúrni a dokumentumba. Így:

    Globals.ThisAddIn.Application.Selection.Text = value;

Mindenkinek ajánlom figyelmébe a Globals.ThisAddIn.Application objektumot, sok okosság érhető el rajta keresztül, ráadásul bárhonnan. Íme az eredmény, ahogy Wordben látszik:

Site Source Wordben

Összességében nagyon pozitív kép alakult ki bennem ezekről az alap programozói feladatokról Office 2007 és Visual Studio 2008 környezetben. Persze ez még csak a kezdet egy komolyabb projekt esetén.

Miután így belejöttem, belepakoltam még a SharePoint webszolgáltatás híváshoz szükséges felhasználó nevek és jelszavak kezelését a Windows Credential Manager segítségével. Az a kódom már megvolt korábban, csak most átírtam .NET 3.5-re. Az új szintaktikának köszönhetően 600-ról 390-re ment le a kódsorok száma és persze olvashatóbb is lett a kód.

Érdekel valakit az addin vagy a forráskód, közzétegyem?

Kiegészítés (2008.03.24.): A  teljes forráskód megtalálható az MSDN Code Gallery SiteSource projektjében ezen a címen: http://code.msdn.microsoft.com/SiteSource
Minden visszajelzést szívesen veszek!



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2008.03.18. 12:08:46 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • Property BackupDirectory is not available - SQL Backup hiba

    Dávid Zoltán Szegény embert az ág is húzza: most éppen nem szeretnék backupolni, de nem is tudok, pedig kéne. Az ok, hogy SQL Server Management Studioban az alábbi hibaüzenet fogad, ha Jobbklikk –> Tasks –> Backupot nyomok: “Property BackupDirectory is not available for Settings 'Microsoft.SqlServer.Management.Smo.Settings'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.  (Microsoft.SqlServer.Express.Smo)” Tovább »
  • Calling GetProcAddress on ISAPI filter "aspnet_isapi" failed

    Balássy György (MS RD, ASP.NET MVP, MCTS) Épp egy ASP.NET 4-es alkalmazást próbáltunk IIS 7-en működésre bírni, amikor szembetaláltuk magunkat az alábbi sárga halállal. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások