package ribbonx.outlook14.addin; import java.io.IOException; import com.wilutions.com.CoClass; import com.wilutions.com.ComException; import com.wilutions.com.Dispatch; import com.wilutions.com.IDispatch; import com.wilutions.joa.DeclAddin; import com.wilutions.joa.LoadBehavior; import com.wilutions.joa.OfficeAddinUtil; import com.wilutions.joa.OfficeApplication; import com.wilutions.joa.fx.MessageBox; import com.wilutions.mslib.office.IMsoContactCard; import com.wilutions.mslib.office.IRibbonControl; import com.wilutions.mslib.office.IRibbonUI; import com.wilutions.mslib.office.MsoContactCardAddressType; import com.wilutions.mslib.office.impl.IMsoContactCardImpl; import com.wilutions.mslib.outlook.AddressEntry; import com.wilutions.mslib.outlook.Application; import com.wilutions.mslib.outlook.Attachment; import com.wilutions.mslib.outlook.AttachmentSelection; import com.wilutions.mslib.outlook.ContactItem; import com.wilutions.mslib.outlook.Explorer; import com.wilutions.mslib.outlook.Folder; import com.wilutions.mslib.outlook.Inspector; import com.wilutions.mslib.outlook.MailItem; import com.wilutions.mslib.outlook.NavigationGroup; import com.wilutions.mslib.outlook.NavigationModule; import com.wilutions.mslib.outlook.OutlookBarShortcut; import com.wilutions.mslib.outlook.Selection; import com.wilutions.mslib.outlook.Store; import com.wilutions.mslib.outlook.View; import com.wilutions.mslib.outlook._AttachmentSelection; import com.wilutions.mslib.outlook.impl.OutlookBarShortcutImpl; import com.wilutions.mslib.outlook.impl.ViewImpl; /** * Transformation of MSDN article * "Extending the User Interface in Outlook 2010". In a C# VSTO project, the * Add-in and Ribbon functionality is separated into different classes. The * Add-in class implements the ApplicationEvents_11 and the Ribbon class * implements IRibbonExtensibility. With JOA, both functionality must be * implemented in a single class. This is why the class RibbonXAddin is derived * from ThisAddin. * * @see http://msdn.microsoft.com/en-us/library/ee692172(office.14).aspx */ @CoClass(progId = "RibbonXOutlook14Addin.Class", guid = "{f886dd17-3bd7-498c-b1ec-f2b4ec8d477f}") @DeclAddin(application = OfficeApplication.Outlook, loadBehavior = LoadBehavior.LoadOnStart, friendlyName = "RibbonXOutlook14Addin", description = "Transformation of the .NET example RibbonXOutlook14Addin") public class RibbonXAddin extends ThisAddin { // private IRibbonUI ribbon; already defined in superclass. private Application olApplication; public RibbonXAddin() { } @Override public void onStartup() throws ComException { super.onStartup(); olApplication = m_Application; } @Override public String GetCustomUI(String ribbonID) { // The superclass can find the XML data in // files named "Ribbon." + ribbonId in the // package of this.getClass(). In order to // closely follow the C# code, this function // reads the XML data itself. String customUI = ""; // Return the appropriate Ribbon XML for ribbonID switch (ribbonID) { case "Microsoft.Outlook.Explorer": customUI = GetResourceText("Explorer.xml"); return customUI; case "Microsoft.Outlook.Mail.Read": customUI = GetResourceText("ReadMail.xml"); return customUI; case "Microsoft.Mso.IMLayerUI": customUI = GetResourceText("ContactCard.xml"); return customUI; default: return ""; } } public void Ribbon_Load(IRibbonUI ribbonUI) { super.m_Ribbon = ribbonUI; } // Only show MyTab when Explorer Selection is // a received mail or when Inspector is a read note public boolean MyTab_GetVisible(IRibbonControl control) { try { IDispatch context = control.getContext(); if (context.is(Explorer.class)) { Explorer explorer = context.as(Explorer.class); try { // explorer.getSelection throws an exception 80020009 // when this function is called at startup. // Cannot verify whether this is the same with a VSTO Add-in, // because the example cannot be compiled with VS 2012. Selection selection = explorer.getSelection(); if (selection.getCount() == 1) { IDispatch item = selection.Item(1); if (item.is(MailItem.class)) { MailItem oMail = item.as(MailItem.class); return oMail.getSent(); } else { return false; } } else { return false; } } catch (ComException e) { return false; } } else if (context.is(Inspector.class)) { Inspector oInsp = context.as(Inspector.class); IDispatch item = oInsp.getCurrentItem(); if (item.is(MailItem.class)) { MailItem oMail = item.as(MailItem.class); return oMail.getSent(); } else { return false; } } else { return true; } } catch (ComException e) { e.printStackTrace(); return false; } } public boolean MyTabInspector_GetVisible(IRibbonControl control) { try { IDispatch context = control.getContext(); if (context.is(Inspector.class)) { Inspector oInsp = context.as(Inspector.class); IDispatch item = oInsp.getCurrentItem(); if (item != null && item.is(MailItem.class)) { MailItem oMail = item.as(MailItem.class); return oMail.getSent(); } else { return false; } } else { return true; } } catch (ComException e) { e.printStackTrace(); return false; } } // MyBackstageTab_GetVisible hides the place in an Inspector window public boolean MyBackstageTab_GetVisible(IRibbonControl control) { return control.getContext().is(Explorer.class); } public Dispatch GetCurrentUserImage(IRibbonControl control) { return m_pictdisp; } // OnMyButtonClick routine handles all button click events // and displays IRibbonControl.Context in message box public void OnMyButtonClick(IRibbonControl control) { final IDispatch context = control.getContext(); if (context == null) return; try { String msg = ""; if (context.is(AttachmentSelection.class)) { msg = "Context=AttachmentSelection" + "\n"; AttachmentSelection attachSel = context.as(AttachmentSelection.class); int n = attachSel.getCount(); for (int i = 1; i <= n; i++) { Attachment attach = attachSel.Item(i); msg = msg + attach.getDisplayName() + "\n"; } } else if (context.is(Folder.class)) { msg = "Context=Folder" + "\n"; Folder folder = context.as(Folder.class); msg = msg + folder.getName(); } else if (context.is(Selection.class)) { msg = "Context=Selection" + "\n"; Selection selection = context.as(Selection.class); if (selection.getCount() == 1) { OutlookItem olItem = new OutlookItem(selection.Item(1)); msg = msg + olItem.getSubject() + "\n" + olItem.getLastModificationTime(); } else { msg = msg + "Multiple Selection Count=" + selection.getCount(); } } else if (context.is(OutlookBarShortcut.class)) { msg = "Context=OutlookBarShortcut" + "\n"; OutlookBarShortcut shortcut = context.as(OutlookBarShortcutImpl.class); msg = msg + shortcut.getName(); } else if (context.is(Store.class)) { msg = "Context=Store" + "\n"; Store store = context.as(Store.class); msg = msg + store.getDisplayName(); } else if (context.is(View.class)) { msg = "Context=View" + "\n"; View view = context.as(ViewImpl.class); msg = msg + view.getName(); } else if (context.is(Inspector.class)) { msg = "Context=Inspector" + "\n"; Inspector insp = context.as(Inspector.class); if (insp.getAttachmentSelection().getCount() >= 1) { _AttachmentSelection attachSel = insp.getAttachmentSelection(); int n = attachSel.getCount(); for (int i = 1; i <= n; i++) { Attachment attach = attachSel.Item(i); msg = msg + attach.getDisplayName() + "\n"; } } else { OutlookItem olItem = new OutlookItem(insp.getCurrentItem()); msg = msg + olItem.getSubject(); } } else if (context.is(Explorer.class)) { msg = "Context=Explorer" + "\n"; Explorer explorer = context.as(Explorer.class); boolean hasAttachments = false; // Reading the property AttachmentSelection always results // in an // error inside Outlook. This applies for a VBS script and a // VBA macro too, // see /vbscript/ExplorerAttachmentSelectionFails.vbs. // int n1 = // getApplication().ActiveExplorer().getAttachmentSelection().getCount(); // int n2 = explorer.getAttachmentSelection().getCount(); // hasAttachments = n2 >= 1; if (hasAttachments) { _AttachmentSelection attachSel = explorer.getAttachmentSelection(); int n = attachSel.getCount(); for (int i = 1; i <= n; i++) { Attachment attach = attachSel.Item(i); msg = msg + attach.getDisplayName() + "\n"; } } else { Selection selection = explorer.getSelection(); if (selection.getCount() == 1) { OutlookItem olItem = new OutlookItem(selection.Item(1)); msg = msg + olItem.getSubject() + "\n" + olItem.getLastModificationTime(); } else { msg = msg + "Multiple Selection Count=" + selection.getCount(); } } } else if (context.is(NavigationGroup.class)) { msg = "Context=NavigationGroup" + "\n"; NavigationGroup navGroup = context.as(NavigationGroup.class); msg = msg + navGroup.getName(); } else if (context.is(IMsoContactCard.class)) { msg = "Context=IMsoContactCard" + "\n"; IMsoContactCard card = context.as(IMsoContactCardImpl.class); if (card.getAddressType() == MsoContactCardAddressType.msoContactCardAddressTypeOutlook) { // IMSOContactCard.Address is AddressEntry.ID AddressEntry addr = olApplication.getSession().GetAddressEntryFromID(card.getAddress()); if (addr != null) { msg = msg + addr.getName(); } } } else if (context.is(NavigationModule.class)) { msg = "Context=NavigationModule"; // } else if (control.getContext() == null) { // msg = "Context=Null"; } else if (context.is(ContactItem.class)) { msg = "Context=ContactItem"; } else { msg = "Context=Unknown " + new OutlookItem(context).getClass_(); } Object owner = getApplication().ActiveWindow(); MessageBox.show(owner, "RibbonXOutlook14Addin", msg, null); // Misuse NoteItem as message box // NoteItem noteItem = // olApplication.CreateItem(OlItemType.olNoteItem).as(NoteItem.class); // noteItem.setBody("RibbonXOutlook14AddinCS\n" + msg); // noteItem.Display(true); // noteItem.Delete(); } catch (ComException e) { e.printStackTrace(); } } private String GetResourceText(String resourceName) { String ret = ""; try { ret = OfficeAddinUtil.getResourceAsString(this.getClass(), resourceName); } catch (IOException e) { e.printStackTrace(); } return ret; } }