Using Ribbon in Inspector window

  • Thread starter Thread starter tnemec78
  • Start date Start date
T

tnemec78

Hi,
Firstly let me thank you for your feedback in this group thus far. I
really appreciate it.
I managed to write a COM Add-in in C++ that has a toolbar with buttons
in every Explorer/Inspector window.

My architecture is as follows:

CAddin - implements _IDTExtensibility2, has handlers for
OnNewExplorer, OnNewInspector
CExplorerWrapper - wrapper class for explorer events
(OnSelectionChange, OnClose, ...)
CInspectorWrapper - wrapper class for inspector events (OnActivate,
OnClose)
CToolbarWrapper - wrapper class for the toolbar buttons
(OnButton1Click, SetEnabled, SetVisible, ...)

Now I decided to use ribbons for 2007+ versions of outlook.
Unfortunately I had to break my OO design here...

My CAddin class newly implements IRibbonExtensibility.
GetCustomUI gets fired and returns XML for the
"Microsoft.Outlook.Mail.Read" Inspector window.

So far so good. I had to implement the OnRibbonButtonClick events
inside my CAddin (don't know how to do this inside CInspectorWrapper)
- this is a pain as it breaks my OO concept, but it works. I simply
cast the RibbonControl->GetContext() to Inspector type. If someone
knew how to do it inside the CInspectorWrapper then please advise - I
can post source code extracts if necessary.

But I don't know how to set the state of the ribbon buttons (enabled/
disabled) inside CInspector::OnActivate. The state of these buttons
can differ in every CInspectorWrapper instance - is there a special
event callback I need to implement or can I do it somehow using my
IRibbonUI pointer that I got from OnLoad handler?
 
I think I might have figured it out already ... The only think I am
really not happy about is the fact that all of the ribbon stuff gets
handled inside my CAddin class. It should really be the job of the
individual CInspectorWrappers. Is it possible to do it that way? Right
now I seem to have quite a lot of unnecessary nearly duplicate code
around in separate classes (once for toolbars and the other time for
ribbons) This could one day be a debugger's nightmare ...
 
The requirement from MS is that the interface handling and callbacks for the
ribbon must be in the same class as the class that implements the
IDTExtensibility interface. So OO design or not that's what you have to do.

What I do is implement a RibbonClicker() method in the Inspector wrapper
class. I call that method in the wrapper class to handle anything that is
specific to that Inspector, such as the states of toggle controls. In the
ribbon callback I identify which Inspector matches the Inspector in the
wrapper class and then I know which wrapper class to call to. Luckily
Outlook 2007 Inspectors can be compared directly using an equality test (==
or for VB using the Is operator), so finding the correct wrapper class is
easy.

I pass in any needed arguments from the ribbon callbacks to my
RibbonClicker() methods, so anything they need in the way of information is
available to them.
 
Back
Top