...
Code Block |
---|
static NavigationItemUIInterface notificationInterface;
void SetupNotificationInterface()
{
// Set up our notification interface so we can receive messages relating to the the navigation item we will insert into the tree
memset(&gDataUI,0,sizeof(NavigationItemUIInterface));
notificationInterface.dwSize = sizeof(NavigationItemUIInterface);
notificationInterface.NavItemCreateWindow = NavItemCreateWindow; // Called when the framework wants a window from us
notificationInterface.NavItemDrawItem = NULL;
notificationInterface.NavItemNotify = NavItemNotify; // For receiving general messages
notificationInterface.NavItemGetHelpContent = NavItemGetHelpContent; // For dynamic help content in the help pane of the UI
notificationInterface.NavItemFreeHelpContent = NavItemFreeHelpContent;
notificationInterface.NavItemShowContextHelp = NavItemShowContextHelp; // For F1 help
notificationInterface.NavItemKeyboardNavigate = NavItemKeyboardNavigate; // To handle custom keyboard navigation within our panel. (optional)
}
// Called below
NavHandle CreateTreeItem()
{
// Get the correct location to insert our new item under. In this case it will be the "Control Panel" node. This has a well known alias that we can use.
NAVSETITEM controlPanelItem;
if ( !NavGetItem(_T("{ControlPanel}"), &controlPanelItem) )
{
return NULL; // Couldn't find it, so we won't go any further
}
NAVSETITEM treeItem;
memset(&treeItem, 0, treeItem);
treeItem.size = sizeof(NAVSETITEM);
treeItem.flags = NI_FLAG_CUSTOMCONTAINER; // This is a custom container where we control the panel.
treeItem.lParam = NULL; // Set any special context data that you want to be sent with messages to the notificationInterface
treeItem.strLabel = L"Ad Blocker";
treeItem.strDescription = L"This component adds an HTTP Filter that blocks advertising";
treeItem.hModule = AfxGetResourceHandle(); // Where to get resources from
treeItem.nIconId = iconResourceId; // Some resource id of the icon to display in the navigation tree
treeItem.EventMask = 0; // No special events. NI_EVENT_ACTIVATE, NI_EVENT_DEACTIVATE are always sent. See NavInsertItem for more information
treeItem.pInterface = notificationInterface; // The interface we are wanting to use to handle events from this item
treeItem.strAlias = L"{MyCompanyAdBlocker}"; // Adds an alias. Makes it easier to find and compare navigation items later.
if ( !NavInsertItem(controlPanelItem.hItem, L"MyCompanyAdBlockerPath", &treeItem) ) // The path "MyCompanyAdBlockerPath" is an internal name the user never sees but must be unique under a particular root.
{
return NULL;
}
return treeItem.hItem; // NavInsertItem sets hItem if successful
}
std::wstring GetFQNOfTreeItem(NavHandle treeItem)
{
NAVSETITEM itemData;
NavGetItemEx(treeItem, &itemData);
return itemData.strFQN;
}
NavHandle GetHelpRoot()
{
NAVSETITEM item;
if(NavGetItem(_T("HELP"), &item))
{
return item.hItem;
}
return 0;
}
void SetUpNavigationItems()
{
SetupNotificationInterface();
NavHandle treeItem = CreateTreeItem();
std::wstring treeItemFqn = GetFQNOfTreeItem(treeItem);
NavHandle helpRoot = GetHelpRoot();
NAVSETITEM helpItem;
memset(&helpItem, 0, helpItem);
helpItem.size = sizeof(NAVSETITEM);
helpItem.strLabel = L"My help label";
helpItem.strDescription = L"Help for my component";
helpItem.flags = NI_FLAG_DYNAMICHELP; // We want to be called dynamically.
helpItem.EventMask = NI_EVENT_NOTIFY; // Need to set this so our callback for dynamic help is processed
helpItem.pInterface = ¬ificationInterface; // Interface to handle callbacks to ask for dynamic help
NavInsertItem(helpRoot, treeItemFqn.c_str(), helpItem); // Insert the item as a child of HELP, with the same path as the tree item
}
|
...