Archive

Articles taggués ‘Developpement Office’

Développement d’outils pour le calendrier Outlook

Aujourd’hui je vous propose de découvrir (ou redécouvrir) le développement d’outils pour la Suite Microsoft Office avec VS 2008.

Je ne vous proposerais pas (pas aujourd’hui en tout cas) de développer un outil permettant d’éviter les oublis de pièce jointes. Ce genre de tutoriel ayant été vu (et revu) sur quantité de forum. Nous verrons donc comment développer un Add-in qui nous permettra de compter le nombre d’heures de notre calendrier Outlook en fonction d’un libellé. De plus notre Add-in nous permettra de spécifier une fourchette pour limiter notre recherche entre deux dates. Enfin notre Add-in devra être accessible depuis la barre de menu d’Outlook.
Pour créer un nouveau projet de type Add-in Outlook :

Nouveau Projet AddIn Outlook

Une fois créé, vous pouvez ouvrir le fichier ThisAddIn.cs. Vous remarquerez qu’il contient déjà 3 méthodes :

     private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {

            // Création de la barre de menu
            MenuBar menu = new MenuBar(this.Application);
            menu.CheckIfMenuBarExists();
            menu.AddMenuBar();
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

Dans le but de rendre le code plus lisible nous utiliserons les usings :

using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;

Nous allons tout de suite créer une classe MenuBar qui contiendra un constructeur et trois méthodes :

class MenuBar
    {
        private Office.CommandBarButton menuCommand;
        private string menuTag = "A unique tag";

        private Outlook.Application App;

        public MenuBar(Outlook.Application app)
        {
            this.App = app;
        }

        public void AddMenuBar()
        {
            try
            {
                Office.CommandBarPopup cmdBarControl = null;
                Office.CommandBar menubar = (Office.CommandBar)Globals.ThisAddIn.Application.ActiveExplorer().CommandBars.ActiveMenuBar;
                int controlCount = menubar.Controls.Count;
                string menuCaption = "&Add In";

                // Ajout du menu.
                cmdBarControl = (Office.CommandBarPopup)menubar.Controls.Add(Office.MsoControlType.msoControlPopup, System.Type.Missing, System.Type.Missing, controlCount, true);

                if (cmdBarControl != null)
                {
                    cmdBarControl.Caption = menuCaption;

                    // Add new menu item
                    menuCommand = (Office.CommandBarButton)cmdBarControl.Controls.Add(Office.MsoControlType.msoControlButton, System.Type.Missing, System.Type.Missing, System.Type.Missing, true);

                    menuCommand.Caption = "&Compter mes heures";
                    menuCommand.Tag = "Tag";

                    menuCommand.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(functionToCall);
                }
            }
            catch (System.Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        // Si le menu existe déjà, on le supprime.
        public void CheckIfMenuBarExists()
        {
            try
            {
                Office.CommandBarPopup foundMenu = (Office.CommandBarPopup)
                    Globals.ThisAddIn.Application.ActiveExplorer().CommandBars.ActiveMenuBar.FindControl(
                    Office.MsoControlType.msoControlPopup, System.Type.Missing, menuTag, true, true);

                if (foundMenu != null)
                {
                    foundMenu.Delete(true);
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //Lors d'un click sur le menu on lance notre form
        private void functionToCall(object Item, ref bool Cancel)
        {
            CountForm f = new CountForm(App);
            f.Show();
        }
    }

L’interface de la fenêtre ressemblera à cela :

Form Recherche

Si la checkbox n’est pas coché la recherche s’effectuera sur le calendrier entier.

Et voici le code behind de notre form :

public partial class CountForm : Form
    {
        private Outlook.Application oApp;
        public CountForm(Outlook.Application app)
        {
            InitializeComponent();
            this.oApp = app;
        }

        //Evenement au click sur le bouton de recherche
        private void btn_search_Click(object sender, EventArgs e)
        {
            this.CountHours();
        }

        private void CountHours()
        {
            Outlook.NameSpace oNS = (Outlook.NameSpace)oApp.GetNamespace("MAPI");

            oNS.Logon(null, null, true, true);

            Outlook.MAPIFolder oCalendar = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);

            Outlook.Items oItems = (Outlook.Items)oCalendar.Items;

            oItems.Sort("[Start]", false);
            oItems.IncludeRecurrences = true;

            Outlook.AppointmentItem oAppt;

            int tot = 0;
            List returnList = new List();
            oAppt = (Outlook.AppointmentItem)oItems.GetFirst(); while (oAppt != null)
            {
                if (cb_date.Checked)
                {
                    if ((oAppt.Start > this.dtp_start.Value) && (oAppt.End < this.dtp_end.Value))                     {                         if (oAppt.Subject.IndexOf(this.tb_lib.Text) > -1) tot += oAppt.Duration;
                        returnList.Add(oAppt);
                    }
                }
                else
                {
                    if (oAppt.Subject.IndexOf(this.tb_lib.Text, StringComparison.InvariantCultureIgnoreCase) > -1) tot += oAppt.Duration;
                    returnList.Add(oAppt);
                }
                oAppt = (Outlook.AppointmentItem)oItems.GetNext();
            }
            tot = tot / 60;
            MessageBox.Show(String.Concat(tot.ToString(),
                " heures de programmées avec le libellé \"",
                this.tb_lib.Text, "\""));
            oNS.Logoff();
        }

        private void tb_lib_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) this.CountHours();
        }

        private void cb_date_CheckedChanged(object sender, EventArgs e)
        {
            if (this.cb_date.Checked == true)
            {
                this.dtp_start.Enabled = true;
                this.dtp_end.Enabled = true;
                this.cb_date.Text = "Supprimer le créneau";
            }
            else
            {
                this.dtp_start.Enabled = false;
                this.dtp_end.Enabled = false;
                this.cb_date.Text = "Choisir un créneau";
            }
        }
    }

Pour publier notre add-in et créer un installeur :
Publish
Un assistant se lance proposant deux ou trois réglages … L’installeur se trouvera par défaut dans le répertoire publish de votre solution.

En double cliquant sur le setup.exe, un assitant se lance et installe l’addin. Vous pouvez le voir et le désinstaller depuis l’interface « Programmes » dans le panneau de configuration.

Liste Programmes

Et le résultat dans Outlook :

Menu

Résultat

Categories: Non classé Tags: