Creating toolbar in new Explorer

T

tnemec78

Hi,
I read through all the available information regarding creating of a
toolbar in new windows. I found out that when creating a new inspector
one should:

handle newinspector event and advise for the activate event

inside the inspectoractivate handler create the toolbar

inside the close event destroy the toolbar

Everything works fine. Each button is given a unique tag as Ken Slovak
suggested and so only the correct button click handler gets called. So
far so good.

My question is: how to do the same for the new explorer window? The
difference is that the exploreractivate event does not get called
until i deactivate and then reactivate the window, which means that I
am forced to create my GUI in inside the newexplorer event where all
the objects are not guaranteed to be initialized. Any solutions?

Thanks
 
K

Ken Slovak - [MVP - Outlook]

Any Explorer opened after the initial Explorer will fire NewExplorer().
Handle that for those Explorers and use that to get the Activate() event for
that Explorer. Use unique Tag values as you would with an Inspector.

For the initial Explorer Activate() won't fire in almost all cases normally.
So you use Explorer.BeforeFolderSwitch() and Explorer.SelectionChange(). I
add handlers for all 3 events for every Explorer that gets opened, and check
a _startup flag in those events to see if UI creation is needed. If so I
create the UI and then set _startup to False. You'll find that for that
first Explorer you will get the SelectionChange() event, and therefore your
UI will be created.

One other thing that you probably will need will be Inspector and Explorer
wrapper classes and collections. That allows you to individually handle
multiple open Inspectors or Explorers, and to handle individual button
states per window. For example, say you have a toggle button and want each
open window to maintain an individual state for each button instance.
Wrappers are the way to do that.

The wrapper class holds an instance of the Inspector/Explorer, a reference
to the current item or folder in that window, and a Key value that's unique
per window. Any event handlers and code specific to that window instance are
packaged in the wrapper class so that each handles any event individually
(thus the importance of unique Tag values).

I use a global Key integer and increment for any new Inspector or Explorer
that gets opened. That is then appended to my Tag GUID to make unique Tag
values per window. The Close() events, Send() or whatever else, including
BeforeFolderSwitch() and SelectionChange(), are handled in the classes.

Then I add each new wrapper class to an Explorer or Inspector
collection/list/whatever to ensure it stays alive and if using managed code
doesn't get garbage collected.

There are lots of examples of wrappers at www.outlookcode.com, and I have
addin templates with wrappers for C#, VB.NET and VB6 for Outlook 2007 on my
Web site at http://www.slovaktech.com/outlook_2007_templates.htm.
 
T

tnemec78

Any Explorer opened after the initial Explorer will fire NewExplorer().
Handle that for those Explorers and use that to get the Activate() event for
that Explorer. Use unique Tag values as you would with an Inspector.

For the initial Explorer Activate() won't fire in almost all cases normally.
So you use Explorer.BeforeFolderSwitch() and Explorer.SelectionChange(). I
add handlers for all 3 events for every Explorer that gets opened, and check
a _startup flag in those events to see if UI creation is needed. If so I
create the UI and then set _startup to False. You'll find that for that
first Explorer you will get the SelectionChange() event, and therefore your
UI will be created.

Here is what I did:
inside the OnNewExplorer handler I instantiate my ExplorerWrapper
class. Within its constructor I do:

m_spExplorer->Activate(); // <--- Does this ensure that all
objects get created by the time I hit the following lines?
CloseEvent::DispEventAdvise((IDispatch*)m_spExplorer);
ToolbarWrapper = new CToolbarWrapper(m_spExplorer);
m_spExplorer->get_CommandBars(&spCmdBars);
ToolbarWrapper->CreateGUI(spCmdBars);

Are there any errors in my logic? If so, then I will try going the
Activate/BeforeFolderSwitch/SelectionChange way, but I am not sure
that those handlers will be called soon enough (i.e. to ensure that
the toolbar is visible right after the explorer window pops up)
 
K

Ken Slovak - [MVP - Outlook]

The logic of what I explained works correctly and has for years. That first
Explorer will not fire Activate() for you by the time you can create an
object reference to it and set up event handlers, it will already have
fired. Unless the Explorer is deactivated and then activated again what you
propose will not work on that first Explorer. It will work on all others
opened later on.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top