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: , ,


  • Tipikus ASP.NET hozzáférési szintek

    Dávid Zoltán Az ASP.NET-es erőforrások (például aspx oldalak) a kezdetek óta védhetőek web.config-ban elhelyezett deklaratív bejegyzésekkel. Az IIS7 megjelenése óta az ilyen jellegű deklaratív védelem minden webes erőforrásnak (például PNG állományoknak) is alapértelmezetten kijár. Tovább »
  • Ajaxos fájl feltöltés

    Balássy György (MS RD, ASP.NET MVP, MCTS) Időnként felmerül, hogy jó lenne úgy feltölteni egy fájlt, hogy közben az oldal többi része nem változik, magyarul Ajaxosan. Rossz hírem van, az XMLHttpRequest objektum Level 1 változata ezt nem tudja, tehát ha régebbi böngészőkre is tekintettel kell lennünk, akkor nincs mese trükközni kell. 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