Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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(&notificationInterface, 0, sizeof(notificationInterface));
    notificationInterface.dwSize                    = sizeof(notificationInterface);
    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, sizeof(treeItem));
    treeItem.size = sizeof(treeItem);
    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 given parent.
    {
        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(L"HELP", &item))
	{
		return item.hItem;
	}
	return NULL;
} 

// Error checking removed for brevity
void SetUpNavigationItems()
{
	SetupNotificationInterface();
	NavHandle treeItem = CreateTreeItem();
	std::wstring treeItemFqn = GetFQNOfTreeItem(treeItem);
 
	NavHandle helpRoot = GetHelpRoot();
	
	NAVSETITEM helpItem;
	memset(&helpItem, 0, sizeof(helpItem));
	helpItem.size = sizeof(helpItem);
	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 = &notificationInterface;				// Interface to handle callbacks to ask for dynamic help
	NavInsertItem(helpRoot, (treeItemFqn + L"\\Main").c_str(), helpItem);				// Insert the item as a child of HELP, with the same path as the tree item for the Main section
}

Help Hierarchy

Navigation help

...