Unmanaged Visio

28 August 2009

Making the Visio ribbon tab document-dependent

This post explains how to make a ribbon tab in Visio 2010 ribbon document-specific. Means, activate a custom ribbon tab only for a specific document.

Download C# sample project (VS2008)

Download C++/ATL sample project (VS2008)

This article discusses the implementation of a document-specific tab in a COM add-in; also, it focuses on nasty details you might be interested in if you e.g. program unmanaged C++. Note that you could do this thing by other means, e.g. by embedding your custom interface in a document template using new Visio 2010 property Document.CustomUI.

Nevertheless, one of the ways to it is:

  1. Create a Visio add-in that supports ribbon (as described in previous post)
  2. Add onLoad event to the ribbon XML. This will allow you to obtain the ribbon manager.
    <customUI onLoad="OnLoad" ...>
  3. In the event handler for the onLoad event, save passed-in ribbon manager. This is needed to force update of the ribbon.
            // this function provides us with IRibbonUI object, called when XML is loaded
           public void OnLoad(object obj)
           {
               vsoRibbonUI = (Office.IRibbonUI) obj;
           }
     
  4. For the custom tab, add visibility callback function. This callback is called when Visio
  5. decides if the tab shall be shown or not. In the XML this looks like:
    <tab id="Tab1" label="MyAddin" getVisible="IsMyTabVisible">
  6. Create a callback handler that returns if the tab shall be shown or not. In my case (for simplicity), I just check if the active document has a user-defined cell "User.IsMyDoc"
    // callback for the tab visibility, return if our tab shall be visible
    public bool IsMyTabVisible(object control)
    {
       Visio.Document activeDoc = vsoApplication.ActiveDocument;
    
       bool show =
           (activeDoc != null)
           && activeDoc.DocumentSheet.get_CellExists("User.IsMyDoc", 0) != 0;
    
       return show;
    }
  7. Add handlers to all events that might cause tab to show/hide. For a our document-dependent tab, these are "DocumentAdded", "DocumentOpened", "DocumentClosed", and “Window activated” (in case you want to show/hide your tab when user switches to another window). From each of these handlers, just trigger the refresh for the ribbon:
    void vsoApplication_DocumentCreated(Microsoft.Office.Interop.Visio.Document doc)
    {
       vsoRibbonUI.Invalidate();
    }

That's basically it; now, when a document that contains a cell named "User.IsMyDoc" is activated the tab is shown; otherwise this tab is hidden.

Labels: , , , ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]



<< Home