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:
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:
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:
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:
Ú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:
Ö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!