Alterar a Ribbon com (COM Addin)

Download Exemplo: Aqui...

Aplica-se a:

Outlook

Excel

Word

PowerPoint

 

Neste artigo vamos abordar como alterar a Ribbon através de um COM Addin. Quando se altera a Ribbon através de um COM Addin é chamada alteração por "Application Level" porque corre ao nível da Aplicação.

Vou utilizar o Visual Studio 2005 e as Visual Studio Tools for Office (Second Edition) e um Shared Addin Outlook para ilustrar este artigo. Os procedimentos seguintes só são delegados quando se cria uma nova mensagem de mail.

A Segunda Edição do VSTO à altura deste artigo ainda está como BETA

  1. Criar o nosso projecto de Addin

  1. Vamos fazer o overide do RequestService para podermos utilizar o nosso Ribbon Support. Vamos retirar os comentários seguintes:

  1. Toda a estrutura da Ribbon é baseada em XML. Quando inserimos um Ribbon Control aparece o ficheiro XML, é ai que vamos criar os nossos itens neste exemplo. Podes passar o XML no código para algo simples, mas sugere-se para Ribbons com muitos controlos passa-los no XML File. Podemos também alterar dinamicamente o XML, irei produzir em breve um artigo de como o fazer. Vamos então inserir o nosso controlo, clicando no PROJECTO - ADD NEW ITEM - RIBBON SUPPORT, dar o nome de Ribbon1

 

  1. O Nome do XML File vai ser igual ao nome do Ribbon Support. Vamos então abordar o XML e alterar o mesmo para que possamos abordar a estrutura do mesmo. Abre o Ribbon1.xml.

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" _
onLoad="OnLoad">
  <ribbon>
    <tabs>
      <tab id="MyTab"
           label="My Tab">
        <group id="MyGroup"
               label="My Group">
          <toggleButton id="toggleButton1" 
                        size="large"
                        label="My Button"
                        screentip="My Button Screentip"
                        onAction="OnToggleButton1" 
                        imageMso="HappyFace" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Existem muitas mais opções, mas vamos ficar apenas pela TAB, GROUP E BUTTON. Se quiseres aprofundar melhor os níveis e suas propriedades faz o download dos "List of Controls IDs" aqui... . Por defeito o Button é criado como toggle, podes alterar para button, vamos deixar como toggle. Copia o XML seguinte, vamos criar 2 Toggles.

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" _ 
onLoad="OnLoad">
  <ribbon>
    <tabs>
      <tab id="InserirAssinaturas"
           label="Ferramentas - Joao Livio">
        <group id="MyGroupInserirAssinaturas"
               label="Assinaturas">
          <toggleButton id="toggleButtonGestaoAssinaturas" 
                        size="large"
                        label="Gestão Assinaturas"
                        screentip="Gere Assinaturas Personalizadas"
                        onAction="toggleButtonGestaoAssinaturas" 
                        imageMso="PropertySheet" />
          <toggleButton id="toggleButtonInserirAssinaturas"
                        size="large"
                        label="Inserir Assinaturas"
                        screentip="Insere Assinaturas Personalizadas"
                        onAction="toggleButtonCriarAssinatura"
                        imageMso="BevelTextGallery" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Por comparação podes verificar o que mudou em cima, apenas mudei os nomes para delegar-mos depois mais facilmente quando se clica NOVA MENSSAGEM, e inseri outro toggle.

Seguidamente vamos criar e inserir uma Função para passar-mos o ID do nosso Ribbon Support, copia para o final da Classe.

Public Function GetCustomUI(ByVal ribbonID As String) As _ 
String Implements Office.IRibbonExtensibility.GetCustomUI
        Return GetResourceText("OutlookAddInJoaoLivioPK.Ribbon1.xml")
End Function

 

Vamos copiar o seguinte código para Ribbon1.vb

 

Imports System
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.IO
Imports System.Text
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports Office = Microsoft.Office.Core

' TODO:
' This is an override of the RequestService method in the ThisAddIn class.
' To hook up your custom ribbon uncomment this code.
Partial Public Class ThisAddIn

    Private ribbon As Ribbon1

    Protected Overrides Function RequestService(ByVal serviceGuid As Guid) As Object
        If serviceGuid = GetType(Office.IRibbonExtensibility).GUID Then
            If ribbon Is Nothing Then
                ribbon = New Ribbon1()
            End If
            Return ribbon
        End If

        Return MyBase.RequestService(serviceGuid)
    End Function

End Class

<ComVisible(True)> _
    Public Class Ribbon1
    Implements Office.IRibbonExtensibility

    Private ribbon As Office.IRibbonUI

    Public Sub New()
    End Sub

    Public Function GetCustomUI(ByVal ribbonID As String) As String _
    Implements Office.IRibbonExtensibility.GetCustomUI
        Return GetResourceText("OutlookAddInJoaoLivioPK.Ribbon1.xml")
    End Function

#Region "Ribbon Callbacks"

    Public Sub OnLoad(ByVal ribbonUI As Office.IRibbonUI)
        Me.ribbon = ribbonUI
    End Sub

    Public Sub toggleButton1(ByVal control As Office.IRibbonControl, _
                                              ByVal isPressed As Boolean)
        If isPressed Then
            MessageBox.Show("Primido")
        Else
            MessageBox.Show("Levantou")
        End If
    End Sub

#End Region

#Region "Helpers"

    Private Shared Function GetResourceText(ByVal resourceName As String) _
      As String
        Dim asm As Assembly = Assembly.GetExecutingAssembly()
        Dim resourceNames() As String = asm.GetManifestResourceNames()
        For i As Integer = 0 To resourceNames.Length - 1
            If String.Compare(resourceName, resourceNames(i), _
               StringComparison.OrdinalIgnoreCase) = 0 Then
                Using resourceReader As StreamReader = _
                New StreamReader(asm.GetManifestResourceStream(resourceNames(i)))
                    If resourceReader IsNot Nothing Then
                        Return resourceReader.ReadToEnd()
                    End If
                End Using
            End If
        Next
        Return Nothing
    End Function

#End Region
End Class

 

Subscreve o código completo pelo em cima por forma a delegarmos a Ribbon1 através da Public Sub toggleButton1

Vamos correr o projecto e criar uma nova mensagem de Mail e verifica a Tab "Joao Livio - Ferramentas" a amarelo em baixo, clica na mesma.

A nossa Ribbon1 vai aparecer, bem como os nossos Toggles Buttons.

Clica em "Inserir Assinaturas"

Conclusão: tens aqui um bom exemplo do porquê passar a utilizar Framework Projects com interacção com o Office 2007, fica mais fácil e rápido de manipular, sugiro vivamente se ainda não começastes comeces a familiariza-te com a linguagem VB.NET e C#, no entanto podes também utilizar VBA, VB com o Visual Studio 2005, é compatível mas vais escrever muito código para realizar operações simples.

(c) Joao Livio, Agosto 2007

Microsoft MVP Office Systems

http://officept.mvps.org