
Het Lint aanpassenin Office 2007 Sessie B3 Floris M. Kleijne
Hoera voor het Lint!!!! • Mooier, beter, flexibeler, duidelijker • Weg met Events, hoera voor Callbacks! • Eindelijk eer van ons werk!
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Hoe nu verder • Vragen? Zodra je ze hebt!
De eerste stapjes • Deze lezing • Koop het boek! • Outlook? Koop ook het andere boek!(en Visual Studio) • Download de Custom UI Editor • Download XML Notepad • Of gebruik je eigen favoriete XML-editor • Aan het werk!
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Lint ontwerpen: XML • XML addin Lint • Lint en VBA: Callbacks • Lint en plaatjes • Dynamische keuzelijsten • Dynamische menu’s • Hoe nu verder
Lint ontwerpen: XML • customUI.xml: • Ontwerp van eigen ribbon gecodeerd in XML • Ribbon - Tabs - Groups - Controls • Objects Elements • Properties Attributes
Lint ontwerpen: XML <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui”> <ribbon startFromScratch=“false”> <tabs> <!-- hier de definitie van alle eigen en aangepaste tabs --> </tabs> </ribbon> </customUI>
Lint ontwerpen: XML <tab id="tabHuisstijl" label="Huisstijl ITeach" insertBeforeMso="TabReferences"> <group id="grpTemplates" label="Sjablonen"> <!-- hier alle Controls van de eerste Group --> </group> <group id="grpLogos" label="Logo's"> <!-- hier alle Controls van de tweede Group --> </group> <group id="grpAutoText" label="AutoText"> <!-- hier alle Controls van de derde Group --> </group> </tab>
Lint ontwerpen: XML <group id="grpTemplates" label="Sjablonen"> <button idMso="FileNew" label="Nieuw document" /> <dynamicMenu id="dmnTemplates“ label="Nieuw document..." getContent="dmnTemplates_GetContent" /> <!-- overige knoppen in deze groep, zie volgende slide --> <dialogBoxLauncher> <button idMso="FileLocations” /> </dialogBoxLauncher> </group>
Lint ontwerpen: XML <box id="boxDocuments" boxStyle="horizontal"> <box id="boxLeftButtons" boxStyle="vertical"> <button id=“Brief" label="Brief“ image="Brief“ onAction="MakeDoc" /> <button id=“Fax" label="Fax" image="Fax“ onAction="MakeDoc“ /> </box> <box id="boxRightButtons" boxStyle="vertical"> <button id=“Memo" label="Memo“ image="Memo“ onAction="MakeDoc“/> <button id=“Offerte" label="Offerte" image="Offerte“ onAction="MakeDoc“ /> </box> </box>
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Lint ontwerpen: XML • XML addin Lint • Lint en VBA: Callbacks • Lint en plaatjes • Dynamische keuzelijsten • Dynamische menu’s • Hoe nu verder
XML addin Lint customUI.xml invoegen hernoemen hernoemen Mijn sjabloon.dotm Mijn sjabloon.zip Mijn sjabloon.dotm
XML addin Lint • Handiger: tools • XML opbouwen • Ontwerp Lint • Bouw Lint-XML in XML Notepad • Kopiëren naar sjabloon • Open in (gewoon) Notepad en kopieer de XML • Open de addin in Custom UI Editor • Plak de XML-code • Werkt voor Word (dotm) en Excel (xlam)
XML addin Lint • Access • Tabel USysRibbons • Memo-veld voor XML • Database-eigenschappen lint kiezen • Of in run-time laden vanuit code • Outlook • Uitsluitend via COM-addin • Dus Visual Studio nodig
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Lint ontwerpen: XML • XML addin Lint • Lint en VBA: Callbacks • Lint en plaatjes • Dynamische keuzelijsten • Dynamische menu’s • Hoe nu verder
Lint en VBA: Callbacks • Callbacks zijn de nieuwe Events! • Gebruiker klikt op knop XML:<button id=“btnBrief" label="Brief“ image="Brief“ onAction="MakeDoc" /> VBA:Public Sub MakeDoc(control As IRibbonControl) ‘control is de geklikte knop End Sub • Gebruiker kiest in Combobox XML:<comboBox id=“cboAutoText“ onChange=“AutoTextGekozen" /> VBA:Public Sub cboAutoText_OnChange(control As IRibbonControl, _ text As String) ‘control is de ComboBox waarin de keuze is gemaakt ‘text is de gekozen optie End Sub
Lint en VBA: Callbacks • Callbacks zijn de nieuwe Properties! • Statische attributes (“Properties”): XML:<button id=“btnBrief" label="Brief“ enabled=“true” visible=“true” /> • Dynamische attributes (“Properties”): XML:<button id=“btnBrief" label="Brief“ getEnabled=“KnopAanOfUit” getVisible=“KnopTonenVerbergen” /> VBA:Public Sub KnopAanOfUit(control As IRibbonControl, ByRef returnedVal) ‘Stel de returnedVal op True of False om Enabled aan of uit te zetten End Sub Public Sub KnopTonenVerbergen(control As IRibbonControl, _ ByRef returnedVal) ‘Stel de returnedVal op True of False om Visible aan of uit te zette End Sub
Lint en VBA: Callbacks • Properties van Controls zijn nu (dynamische) Attributes van Elements • .Caption label / getLabel • .Enabled enabled / getEnabled • .Picture image / getImage • .Visible visible / getVisible • Callback Signature moet precies goed! • Net als bij Events • Gebruik Custom UI Editor voor de Callbacks!
Lint en VBA: Callbacks • Wanneer roept Office callbacks aan? • Bij opbouwen Lint • Zo nu en dan spontaan uit zichzelf • Niet altijd als het nodig is • Forceer aanroep van callbacks: XML:<ribbon onLoad=“Ribbon_Onload”> VBA:Public WithEvents goRibbon As IRibbonUI Public Sub Ribbon_OnLoad(ribbon As IRibbonUI) Set goRibbon = ribbon End Sub ‘Wanneer je btnBrief wil verversen: Call goRibbon.InvalidateControl(“btnBrief”)
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Lint ontwerpen: XML • XML addin Lint • Lint en VBA: Callbacks • Lint en plaatjes • Dynamische keuzelijsten • Dynamische menu’s • Hoe nu verder
Lint en plaatjes <button image=“Plaatje” (etc.)> • Plaatje invoegen met Custom UI Editor • Statisch, altijd hetzelfde plaatje <button getImage=“DynamischPlaatje” (etc.)> • Callback, plaatje in run-time geladen • Procedure “DynamischPlaatje” maakt gebruik van functie “LoadPicture” • InvalidateControl om plaatje te verversen
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Lint ontwerpen: XML • XML addin Lint • Lint en VBA: Callbacks • Lint en plaatjes • Dynamische keuzelijsten • Dynamische menu’s • Hoe nu verder
Dynamische keuzelijsten • Statische keuzelijst: <comboBox id=“…” label=“…” onChange=“…”> <item id=“Keuze1” label=“Eerste keus”> <item id=“Keuze2” label=“Tweede keus”> </comboBox> • Gefixeerde lijst, kan in run-time niet wijzigen
Dynamische keuzelijsten • Dynamische keuzelijst: <comboBox id=“…” label=“…” onChange=“…” getItemCount=“HaalAantalItems” getItemID=“HaalItemID” getItemLabel=“HaalItemLabel” /> • Office roept HaalAantalItems 1x aan weet aantal items • Office roept HaalItemID en HaalItemLabel zo vaak aan als nodig om lijst te vullen
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Lint ontwerpen: XML • XML addin Lint • Lint en VBA: Callbacks • Lint en plaatjes • Dynamische keuzelijsten • Dynamische menu’s • Hoe nu verder
Dynamische menu’s • Statisch menu 100% in XML <menu ...> <button ... /> <button ... /> </menu> • Dynamisch menu véél flexibeler <dynamicMenu id="dmnTemplates“ label="Nieuw document..." getContent="dmnTemplates_GetContent" /> • In procedure “dmnTemplates_GetContent wordt de XML opgebouwd van het menu: <menu xmlns="http://schemas.microsoft.com/office/2006/01/customui" > <menuSeparator id="sepUserTemplates" title="Gebruikerssjablonen" /> <button id="template01" label="Brief.dot" onAction="MakeDocument" /> <!-- etc --> </menu>
Onderwerpen • De eerste stapjes • Het Lint aanpassen • Hoe nu verder
Hoe verder • Koop het boek! • 978-0-470-19111-8 • Outlook? Koop ook het andere boek! • 978-0-470-16994-0 • Download de Custom UI Editor • http://openxmldeveloper.org/articles/customuieditor.aspx • Download XML Notepad • http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628