Windows2003-3790/termsrv/license/licmgr/ltview.cpp
2020-09-30 16:53:55 +02:00

1187 lines
33 KiB
C++

//Copyright (c) 1998 - 1999 Microsoft Corporation
/*++
Module Name:
LtView.cpp
Abstract:
This Module contains the implementation of CLicMgrLeftView class
(The View class used for the Left pane of the splitter)
Author:
Arathi Kundapur (v-akunda) 11-Feb-1998
Revision History:
--*/
#include "stdafx.h"
#include "LicMgr.h"
#include "defines.h"
#include "LSMgrDoc.h"
#include "LtView.h"
#include "TreeNode.h"
#include "LSServer.h"
#include "mainfrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLicMgrLeftView
IMPLEMENT_DYNCREATE(CLicMgrLeftView, CTreeView)
BEGIN_MESSAGE_MAP(CLicMgrLeftView, CTreeView)
//{{AFX_MSG_MAP(CLicMgrLeftView)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
ON_NOTIFY_REFLECT(NM_RCLICK , OnRightClick )
ON_NOTIFY_REFLECT(NM_CLICK , OnLeftClick )
ON_WM_DESTROY()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
ON_MESSAGE(WM_ADD_SERVER, OnAddServer)
ON_MESSAGE(WM_DELETE_SERVER, OnDeleteServer)
ON_MESSAGE(WM_UPDATE_SERVER, OnUpdateServer)
ON_MESSAGE(WM_ADD_ALL_SERVERS, OnAddAllServers)
// all server menus
ON_WM_CONTEXTMENU( )
ON_COMMAND( ID_ALLSVR_CONNECT , OnServerConnect )
ON_COMMAND( ID_ALLSVR_REFRESHALL , OnRefreshAllServers )
ON_COMMAND( ID_ALLSVR_HELP , OnGeneralHelp )
// server menuitems
// ON_COMMAND( ID_LPK_CONNECT , OnServerConnect )
ON_COMMAND( ID_LPK_REFRESH , OnRefreshServer )
ON_COMMAND( ID_LPK_REFRESHALL , OnRefreshAllServers )
ON_COMMAND( ID_LPK_DOWNLOADLICENSES , OnDownloadKeepPack )
ON_COMMAND( ID_SVR_ACTIVATESERVER , OnRegisterServer )
ON_COMMAND( ID_LPK_ADVANCED_REPEATLASTDOWNLOAD , OnRepeatLastDownload )
ON_COMMAND( ID_LPK_ADVANCED_REACTIVATESERVER , OnReactivateServer )
ON_COMMAND( ID_LPK_ADVANCED_DEACTIVATESERVER , OnDeactivateServer )
ON_COMMAND( ID_LPK_PROPERTIES , OnServerProperties )
ON_COMMAND( ID_LPK_HELP , OnGeneralHelp )
// license pak items
// ON_COMMAND( ID_LICPAK_CONNECT , OnServerConnect )
ON_COMMAND( ID_LICPAK_REFRESH , OnRefreshServer )
// ON_COMMAND( ID_LICPAK_REFRESHALL , OnRefreshAllServers )
ON_COMMAND( ID_LICPAK_DOWNLOADLICENSES , OnDownloadKeepPack )
ON_COMMAND( ID_LICPAK_REPEATDOWNLOAD , OnRepeatLastDownload )
ON_COMMAND( ID_LICPAK_HELP , OnGeneralHelp )
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLicMgrLeftView construction/destruction
CLicMgrLeftView::CLicMgrLeftView()
{
// TODO: add construction code here
m_ht = ( HTREEITEM )NULL;
}
CLicMgrLeftView::~CLicMgrLeftView()
{
}
BOOL CLicMgrLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CTreeView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLicMgrLeftView drawing
void CLicMgrLeftView::OnDraw(CDC* pDC)
{
CLicMgrDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CLicMgrLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
GetTreeCtrl().ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS);
BuildImageList();
// TODO: You may populate your TreeView with items by directly accessing
// its tree control through a call to GetTreeCtrl().
}
/////////////////////////////////////////////////////////////////////////////
// CLicMgrLeftView printing
BOOL CLicMgrLeftView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLicMgrLeftView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLicMgrLeftView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CLicMgrLeftView diagnostics
#ifdef _DEBUG
void CLicMgrLeftView::AssertValid() const
{
CTreeView::AssertValid();
}
void CLicMgrLeftView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CLicMgrDoc* CLicMgrLeftView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLicMgrDoc)));
return (CLicMgrDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLicMgrLeftView message handlers
HTREEITEM CLicMgrLeftView::AddItemToTree(HTREEITEM hParent, CString Text, HTREEITEM hInsAfter, int iImage, LPARAM lParam)
{
HTREEITEM hItem = NULL;
TV_ITEM tvItem = {0};
TV_INSERTSTRUCT tvInsert;
ASSERT(lParam);
if(NULL == lParam)
return hItem;
tvItem.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
tvItem.pszText = Text.GetBuffer(Text.GetLength());
tvItem.cchTextMax = Text.GetLength();
tvItem.iImage = iImage;
tvItem.iSelectedImage = iImage;
tvItem.lParam = lParam;
tvInsert.item = tvItem;
tvInsert.hInsertAfter = hInsAfter;
tvInsert.hParent = hParent;
hItem = GetTreeCtrl().InsertItem(&tvInsert);
// GetTreeCtrl().Expand(GetTreeCtrl().GetRootItem(), TVE_EXPAND);
return hItem;
}
LRESULT CLicMgrLeftView::OnAddServer(WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
ASSERT(pDoc);
if(NULL == pDoc)
return lResult;
CLicServer *pServer = (CLicServer*)lParam;
ASSERT(pServer);
if(NULL == pServer)
return lResult;
HTREEITEM hServer = NULL;
HTREEITEM hItem = NULL;
CTreeNode* pNode = NULL;
HTREEITEM hRoot = GetTreeCtrl().GetRootItem();
if(!hRoot)
goto cleanup;
// First make sure the server isn't already in the tree
// Get the first server under the domain
hItem = GetTreeCtrl().GetNextItem(hRoot, TVGN_CHILD);
while(hItem) {
// Get the data attached to the tree item
CTreeNode *node = (CTreeNode*)GetTreeCtrl().GetItemData(hItem);
if(node) {
// Is this the server we want to add
CLicServer *pServer = (CLicServer*)node->GetTreeObject();
if(pServer == (CLicServer*)lParam) return 0;
}
hItem = GetTreeCtrl().GetNextItem(hItem, TVGN_NEXT);
}
// Add the server to the tree
// Create a CTreeNode object with info about this tree node
pNode = new CTreeNode(NODE_SERVER, pServer);
if(pNode)
{
int iImage = 0;
if( pServer->GetServerType() == SERVER_TS5_ENFORCED )
{
DWORD dwStatus = pServer->GetServerRegistrationStatus();
if( dwStatus == LSERVERSTATUS_REGISTER_INTERNET || dwStatus == LSERVERSTATUS_REGISTER_OTHER )
{
iImage = 3;
}
else if( dwStatus == LSERVERSTATUS_WAITFORPIN )
{
iImage = 4;
}
else if( dwStatus == LSERVERSTATUS_UNREGISTER )
{
iImage = 5;
}
else
{
iImage = 6;
}
}
hServer = AddItemToTree(hRoot, pServer->GetDisplayName(), TVI_SORT, iImage , (LPARAM)pNode);
if(!hServer) delete pNode;
// The server wants to know his tree item handle
pServer->SetTreeItem(hServer);
}
cleanup:
return lResult;
} // OnAddServer
LRESULT CLicMgrLeftView::OnAddKeyPack(WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
ASSERT(pDoc);
if(NULL == pDoc)
return lResult;
CLicServer *pServer = (CLicServer*)wParam;
ASSERT(pServer);
if(NULL == pServer)
return lResult;
CKeyPack *pKeyPack = (CKeyPack*)lParam;
ASSERT(pKeyPack);
if(NULL == pKeyPack)
return lResult;
HTREEITEM hKeyPackItem = NULL;
TV_ITEM Item;
memset((void *)&Item,0,sizeof(Item));
Item.mask = TVIF_HANDLE;
HTREEITEM hServer = pServer->GetTreeItem();
if(NULL == hServer)
return lResult;
Item.hItem = hServer;
if(FALSE == GetTreeCtrl().GetItem(&Item))
return lResult;
if(Item.state & TVIS_EXPANDED)
{
CTreeNode *pNode = new CTreeNode(NODE_KEYPACK, pKeyPack);
if(pNode)
{
hKeyPackItem = AddItemToTree(hServer, (LPCTSTR)pKeyPack->GetDisplayName(), hServer, 2, (LPARAM)pNode);
if(!hKeyPackItem)
delete pNode;
}
pKeyPack->SetTreeItem(hKeyPackItem);
}
return lResult;
} // OnAddKeyPack
LRESULT CLicMgrLeftView::OnAddAllServers(WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
HTREEITEM hItem = NULL;
CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
ASSERT(pDoc);
if(NULL == pDoc)
return lResult;
CTreeNode* pNode = NULL;
CAllServers *pAllServer = (CAllServers*)lParam;
if(!pAllServer)
goto cleanup ;
hItem = pAllServer->GetTreeItem();
if(NULL != hItem)
goto cleanup;
// Create a CTreeNode object with info about this tree node
pNode = new CTreeNode(NODE_ALL_SERVERS, pAllServer);
if(pNode)
{
HTREEITEM hAllServers = AddItemToTree(NULL, pAllServer->GetName(), TVI_SORT,0 , (LPARAM)pNode);
if(!hAllServers) delete pNode;
// The server wants to know his tree item handle
pAllServer->SetTreeItem(hAllServers);
//Set the Selection to this item
GetTreeCtrl().SelectItem(hAllServers);
}
GetTreeCtrl().Expand(GetTreeCtrl().GetRootItem(), TVE_EXPAND);
cleanup:
return lResult ;
} // OnAddAllServers
void CLicMgrLeftView::AddServerKeyPacks(CLicServer *pServer)
{
CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
ASSERT(pDoc);
if(NULL == pDoc)
return;
POSITION pos;
KeyPackList *pKeyPackList = NULL;
HTREEITEM hLastNode = NULL;
ASSERT(pServer);
if(NULL == pServer)
return;
HTREEITEM hServer = pServer->GetTreeItem();
if(NULL == hServer)
goto cleanup; //Server Not in the Tree.
hLastNode= hServer;
// Get a pointer to the server's list of installed KeyPacks
pKeyPackList = pServer->GetKeyPackList();
// Iterate through the KeyPack list
pos = pKeyPackList->GetHeadPosition();
while(pos)
{
CKeyPack *pKeyPack = (CKeyPack *)pKeyPackList->GetNext(pos);
CTreeNode *pNode = new CTreeNode(NODE_KEYPACK, pKeyPack);
if(pNode)
{
hLastNode = AddItemToTree(hServer, (LPCTSTR)pKeyPack->GetDisplayName(), hLastNode, 2, (LPARAM)pNode);
if(!hLastNode)
delete pNode;
}
pKeyPack->SetTreeItem(hLastNode);
}
cleanup:
return;
} // end AddKeyPacks
void CLicMgrLeftView::BuildImageList()
{
m_ImageList.Create(16, 16, TRUE, 18, 0);
AddIconToImageList(IDI_ALL_SERVERS);
AddIconToImageList(IDI_SERVER);
AddIconToImageList(IDI_KEYPACK);
AddIconToImageList(IDI_SERVERREG );
AddIconToImageList(IDI_SERVERM );
AddIconToImageList(IDI_SERVERX );
AddIconToImageList(IDI_SERVERQ );
GetTreeCtrl().SetImageList(&m_ImageList, TVSIL_NORMAL);
} // end BuildImageList
int CLicMgrLeftView::AddIconToImageList(int iconID)
{
HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(iconID));
return m_ImageList.Add(hIcon);
}
void CLicMgrLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
//Check if the node selected is All-Servers,Server or the KeyPack.
//Accordingly change the right pane view.
CTreeCtrl& TreeCtrl = GetTreeCtrl();
HTREEITEM hCurr = TreeCtrl.GetSelectedItem();
if(NULL == hCurr)
{
return;
}
CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(hCurr);
if(NULL == pNode)
{
return;
}
CLicServer *pLicServer = NULL;
CKeyPack * pKeyPack = NULL;
CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
ASSERT(pDoc);
if(NULL == pDoc)
return;
switch(pNode->GetNodeType())
{
case NODE_ALL_SERVERS:
AfxGetMainWnd()->SendMessage(WM_SEL_CHANGE,NODE_ALL_SERVERS,NULL);
break;
case NODE_SERVER:
pLicServer = (CLicServer *)pNode->GetTreeObject();
if(NULL == pLicServer)
break;
if(FALSE == pLicServer->IsExpanded())
{
SetCursor(LoadCursor(NULL,IDC_WAIT));
HRESULT hResult = pDoc->EnumerateKeyPacks(pLicServer,LSKEYPACK_SEARCH_LANGID, TRUE);
if(hResult != S_OK)
{
((CMainFrame *)AfxGetMainWnd())->EnumFailed(hResult,pLicServer);
if(pLicServer && pLicServer->GetTreeItem())
{
TreeCtrl.SelectItem(TreeCtrl.GetParentItem(pLicServer->GetTreeItem()));
}
break;
}
AddServerKeyPacks(pLicServer);
}
else
{
if(!pLicServer->GetKeyPackList()->IsEmpty())
{
if(!TreeCtrl.ItemHasChildren(hCurr))
AddServerKeyPacks(pLicServer);
}
}
AfxGetMainWnd()->SendMessage(WM_SEL_CHANGE,NODE_SERVER,(LPARAM)pLicServer);
break;
case NODE_KEYPACK:
pKeyPack = (CKeyPack *)pNode->GetTreeObject();
ASSERT(pKeyPack);
if(NULL == pKeyPack)
break;
if(FALSE == pKeyPack->IsExpanded())
{
SetCursor(LoadCursor(NULL,IDC_WAIT));
HRESULT hResult = pDoc->EnumerateLicenses(pKeyPack,LSLICENSE_SEARCH_KEYPACKID, TRUE);
if(hResult != S_OK)
{
((CMainFrame *)AfxGetMainWnd())->EnumFailed(hResult,pKeyPack->GetServer());
if(pKeyPack && pKeyPack->GetTreeItem())
{
TreeCtrl.SelectItem(TreeCtrl.GetParentItem(pKeyPack->GetTreeItem()));
}
break;
}
}
AfxGetMainWnd()->SendMessage(WM_SEL_CHANGE,NODE_KEYPACK,(LPARAM)pNode->GetTreeObject());
break;
}
*pResult = 0;
}
void CLicMgrLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CLicMgrLeftView::OnDestroy()
{
//Get the Root Item
HTREEITEM hRoot = GetTreeCtrl().GetRootItem();
if(!hRoot)
return;
HTREEITEM hServerItem = GetTreeCtrl().GetNextItem(hRoot,TVGN_CHILD);
while(hServerItem)
{
// Get the data attached to the tree item
CTreeNode *pServerNode = (CTreeNode*)GetTreeCtrl().GetItemData(hServerItem);
if(pServerNode)
{
// Is this the server we want to add
HTREEITEM hKeyPackItem = GetTreeCtrl().GetNextItem(hServerItem,TVGN_CHILD);
while(hKeyPackItem)
{
CTreeNode *pKeyPackNode = (CTreeNode*)GetTreeCtrl().GetItemData(hKeyPackItem);
if(pKeyPackNode)
delete pKeyPackNode;
hKeyPackItem = GetTreeCtrl().GetNextItem(hKeyPackItem,TVGN_NEXT);
}
delete pServerNode;
}
hServerItem = GetTreeCtrl().GetNextItem(hServerItem, TVGN_NEXT);
}
CTreeNode * pRootNode = (CTreeNode*)GetTreeCtrl().GetItemData(hRoot);
if(pRootNode)
delete pRootNode;
return;
}
LRESULT CLicMgrLeftView::OnDeleteServer(WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
ASSERT(pDoc);
if(NULL == pDoc)
return lResult;
CLicServer *pServer = (CLicServer*)lParam;
ASSERT(pServer);
if(NULL == pServer)
return lResult;
HTREEITEM hServer = pServer->GetTreeItem();
DBGMSG( L"CLicMgrLeftView_OnDeleteServer GetTreeItem ret 0x%x\n" , hServer );
if(hServer == NULL)
return lResult;
CTreeNode *pNode = (CTreeNode*)GetTreeCtrl().GetItemData(hServer);
DBGMSG( L"CLicMgrLeftView_OnDeleteServer GetItemData ret 0x%x\n" , pNode );
if(pNode)
delete pNode;
GetTreeCtrl().DeleteItem(hServer);
return lResult;
} // OnDeleteServer
LRESULT CLicMgrLeftView::OnUpdateServer(WPARAM wParam, LPARAM lParam)
{
LRESULT lResult = 0;
CLicMgrDoc * pDoc =(CLicMgrDoc *)GetDocument();
ASSERT(pDoc);
if(NULL == pDoc)
return lResult;
BOOL bIsExpanded = FALSE;
BOOL bIsSelected = FALSE;
BOOL bIsChild = FALSE;
HTREEITEM hSelectedItem = NULL;
CKeyPack * pSelectedPack = NULL;
CLicServer *pServer = (CLicServer*)lParam;
ASSERT(pServer);
if(NULL == pServer)
return lResult;
HTREEITEM hServer = pServer->GetTreeItem();
if(hServer == NULL)
return lResult;
// check to see if we need to remove any keypacks
// Get a pointer to the server's list of installed KeyPacks
// Get the data attached to the tree item
CTreeNode *pServerNode = (CTreeNode*)GetTreeCtrl().GetItemData(hServer);
if( pServerNode != NULL )
{
HTREEITEM hKeyPackItem = GetTreeCtrl().GetNextItem(hServer,TVGN_CHILD);
while( hKeyPackItem != NULL )
{
CTreeNode *pKeyPackNode = (CTreeNode*)GetTreeCtrl().GetItemData(hKeyPackItem);
if( pKeyPackNode != NULL )
{
DBGMSG( L"CLicMgrLeftView!OnUpdateServer removing a licpak\n" , 0 );
delete pKeyPackNode;
}
hKeyPackItem = GetTreeCtrl().GetNextItem(hKeyPackItem,TVGN_NEXT);
}
delete pServerNode;
}
TV_ITEM Item;
memset((void *)&Item,0,sizeof(Item));
Item.mask = TVIF_HANDLE | TVIF_STATE;
Item.hItem = hServer;
if(FALSE == GetTreeCtrl().GetItem(&Item))
return lResult;
if(Item.state & TVIS_EXPANDED)
bIsExpanded = TRUE;
if(Item.state & TVIS_SELECTED)
bIsSelected = TRUE;
else
hSelectedItem = GetTreeCtrl().GetSelectedItem();
if(hSelectedItem)
{
if(hServer == GetTreeCtrl().GetParentItem(hSelectedItem))
{
CString ProdDesc = GetTreeCtrl().GetItemText(hSelectedItem);
KeyPackList * pkeyPackList = pServer->GetKeyPackList();
POSITION pos = pkeyPackList->GetHeadPosition();
while(pos)
{
CKeyPack * pKeyPack = (CKeyPack *)pkeyPackList->GetNext(pos);
if(NULL == pKeyPack)
{
continue;
}
LSKeyPack sKeyPack = pKeyPack->GetKeyPackStruct();
if(0 == ProdDesc.CompareNoCase(sKeyPack.szProductDesc))
{
pSelectedPack = pKeyPack;
break;
}
}
bIsChild = TRUE;
}
}
GetTreeCtrl().DeleteItem(hServer);
SendMessage(WM_ADD_SERVER,0,(LPARAM)pServer);
AddServerKeyPacks(pServer);
hServer = pServer->GetTreeItem();
if(bIsExpanded)
GetTreeCtrl().Expand(hServer, TVE_EXPAND);
if(bIsSelected)
GetTreeCtrl().SelectItem(hServer);
else
{
//Not good, find an alternative for this....
if(bIsChild)
{
if(pSelectedPack)
GetTreeCtrl().SelectItem(pSelectedPack->GetTreeItem());
else
{
hSelectedItem = GetTreeCtrl().GetChildItem(hServer);
if(hSelectedItem)
GetTreeCtrl().SelectItem(hSelectedItem);
}
}
}
return lResult;
} // OnUpdateServer
void CLicMgrLeftView::SetSelection(LPARAM lParam,NODETYPE NodeType)
{
if(NULL == lParam)
return;
HTREEITEM hItem = NULL;
if(NODE_ALL_SERVERS == NodeType)
hItem = ((CAllServers *)lParam)->GetTreeItem();
else if(NODE_SERVER == NodeType)
hItem = ((CLicServer *)lParam)->GetTreeItem();
else if(NODE_KEYPACK == NodeType)
hItem = ((CKeyPack *)lParam)->GetTreeItem();
if(hItem)
GetTreeCtrl().SelectItem(hItem);
return;
}
void CLicMgrLeftView::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDown = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
if(pLVKeyDown->wVKey == VK_TAB)
{
CMainFrame * pMainFrame = ((CMainFrame *)AfxGetMainWnd());
pMainFrame->SelectView(LISTVIEW);
}
*pResult = 0;
}
//-----------------------------------------------------------------------------------------
afx_msg void CLicMgrLeftView::OnLeftClick(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint pt;
GetCursorPos( &pt );
ScreenToClient( &pt );
DBGMSG( L"LICMGR@CLicMgrLeftView::OnLeftClick\n" , 0 );
HTREEITEM hTreeItem = GetTreeCtrl( ).GetSelectedItem( ); //GetTreeCtrl().HitTest( pt , &flag );
if( hTreeItem != NULL )
{
CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(hTreeItem);
if(NULL == pNode)
{
return;
}
ClientToScreen( &pt );
NODETYPE nt = pNode->GetNodeType();
if(NODE_SERVER == nt )
{
DBGMSG( L"\tServer Node selected\n", 0 );
SetActiveServer( static_cast< CLicServer * >( pNode->GetTreeObject() ) );
}
else if( nt == NODE_KEYPACK )
{
CKeyPack *pKeyPack = static_cast< CKeyPack *>( pNode->GetTreeObject() );
if( pKeyPack != NULL )
{
SetActiveServer( pKeyPack->GetServer( ) );
}
}
else
{
#ifdef DBG
if( NODE_ALL_SERVERS == nt )
{
DBGMSG( L"\tAll servers selected\n" , 0 );
}
#endif
SetActiveServer( NULL );
}
}
else
{
DBGMSG( L"\tTreeview item returned NULL\n" , 0 );
SetActiveServer( NULL );
}
}
//-----------------------------------------------------------------------------------------
afx_msg void CLicMgrLeftView::OnContextMenu( CWnd* pWnd, CPoint pt )
{
CMenu menu;
CMenu *pContextmenu = NULL;
DBGMSG( L"LICMGR@CLicMgrLeftView::OnContextMenu\n" , 0 );
DBGMSG( L"\tpoint x = %d " , pt.x );
DBGMSG( L"y = %d\n" , pt.y );
UINT flag;
HTREEITEM hTreeItem;
CTreeCtrl& treectrl = GetTreeCtrl();
// maybe keyboard selected this item
if(pt.x == -1 && pt.y == -1)
{
hTreeItem = treectrl.GetSelectedItem( );
if( hTreeItem != NULL )
{
RECT rect;
treectrl.GetItemRect( hTreeItem , &rect , FALSE );
pt.x = rect.left + (rect.right - rect.left)/2;
pt.y = rect.top + (rect.bottom - rect.top)/2;
}
}
else
{
// otherwise we're invoked by the mouse
ScreenToClient( &pt );
hTreeItem = treectrl.HitTest( pt , &flag );
}
if( hTreeItem != NULL )
{
CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(hTreeItem);
if(NULL == pNode)
{
return;
}
SetRightClickedItem( hTreeItem );
ClientToScreen( &pt );
// GetTreeCtrl().SelectItem( hTreeItem );
NODETYPE nt = pNode->GetNodeType();
if(NODE_SERVER == nt )
{
DBGMSG( L"\tServer Node selected\n", 0 );
menu.LoadMenu( IDR_MENU_LPK );
pContextmenu = menu.GetSubMenu( 0 );
}
else if( NODE_KEYPACK == nt )
{
DBGMSG( L"\tLicense pack selected\n" , 0 );
menu.LoadMenu( IDR_MENU_LPK );
pContextmenu = menu.GetSubMenu( 1 );
}
else if( NODE_ALL_SERVERS == nt )
{
DBGMSG( L"\tAll servers selected\n" , 0 );
menu.LoadMenu( IDR_MENU_LPK );
pContextmenu = menu.GetSubMenu( 3 );
}
else
{
DBGMSG( L"\tIn left pane no item selected\n" , 0 );
return;
}
UI_initmenu( pContextmenu , nt );
if( pContextmenu != NULL )
{
pContextmenu->TrackPopupMenu( TPM_LEFTALIGN , pt.x , pt.y , this );
}
}
else
{
hTreeItem = GetTreeCtrl( ).GetSelectedItem( );
SetRightClickedItem( hTreeItem );
}
}
//-----------------------------------------------------------------------------------------
afx_msg void CLicMgrLeftView::OnRightClick(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint pt;
CMenu menu;
CMenu *pContextmenu = NULL;
GetCursorPos( &pt );
OnContextMenu( NULL , pt );
return;
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::UI_initmenu( CMenu *pMenu , NODETYPE nt )
{
CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
if( pMainFrame != NULL )
{
pMainFrame->UI_initmenu( pMenu , nt );
}
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnServerConnect( )
{
CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
if( pMainFrame != NULL )
{
pMainFrame->ConnectServer( );
}
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnRefreshAllServers( )
{
CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
if( pMainFrame != NULL )
{
pMainFrame->OnRefresh( );
}
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnRefreshServer( )
{
CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
CLicServer *pServer = NULL;
if( pMainFrame != NULL )
{
CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData( GetRightClickedItem() );
if( pNode == NULL )
{
return;
}
if( pNode->GetNodeType() == NODE_SERVER )
{
pServer = static_cast< CLicServer * >( pNode->GetTreeObject() );
}
else if( pNode->GetNodeType() == NODE_KEYPACK )
{
CKeyPack *pKeyPack = static_cast< CKeyPack *>( pNode->GetTreeObject() );
if( pKeyPack != NULL )
{
pServer = pKeyPack->GetServer( );
}
}
if( pServer != NULL )
{
pMainFrame->RefreshServer( pServer );
}
}
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnDownloadKeepPack()
{
BOOL bRefresh = FALSE;
DWORD dwStatus = WizardActionOnServer( WIZACTION_DOWNLOADLKP , &bRefresh );
//This call to RefreshServer causes problems because it tries to use
//a pointer to the selected node on the right side. Of course, the
//focus is on the left so there's nothing selected on the right...
//if( bRefresh )
//{
// need to review this
// OnRefreshServer( );
//}
DBGMSG( L"LICMGR : CLicMgrLeftView::OnDownloadKeepPack StartWizard returned 0x%x\n" , dwStatus );
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnRegisterServer()
{
BOOL bRefresh;
DWORD dwStatus = WizardActionOnServer( WIZACTION_REGISTERLS , &bRefresh );
DBGMSG( L"LICMGR : CLicMgrLeftView::OnRegisterServer StartWizard returned 0x%x\n" , dwStatus );
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnRepeatLastDownload()
{
BOOL bRefresh;
DWORD dwStatus = WizardActionOnServer( WIZACTION_DOWNLOADLASTLKP , &bRefresh );
DBGMSG( L"LICMGR : CLicMgrLeftView::OnRepeatLastDownload StartWizard returned 0x%x\n" , dwStatus );
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnReactivateServer( )
{
BOOL bRefresh;
DWORD dwStatus = WizardActionOnServer( WIZACTION_REREGISTERLS , &bRefresh );
DBGMSG( L"LICMGR : CLicMgrLeftView::OnReactivateServer StartWizard returned 0x%x\n" , dwStatus );
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnDeactivateServer( )
{
BOOL bRefresh;
DWORD dwStatus = WizardActionOnServer( WIZACTION_UNREGISTERLS , &bRefresh );
DBGMSG( L"LICMGR : CLicMgrLeftView::OnDeactivateServer StartWizard returned 0x%x\n" , dwStatus );
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnServerProperties( )
{
BOOL bRefresh;
DWORD dwStatus = WizardActionOnServer( WIZACTION_SHOWPROPERTIES , &bRefresh );
DBGMSG( L"LICMGR : CLicMgrLeftView::OnServerProperties StartWizard returned 0x%x\n" , dwStatus );
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::OnGeneralHelp( )
{
CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
if( pMainFrame != NULL )
{
pMainFrame->OnHelp( );
}
}
//-----------------------------------------------------------------------------------------
DWORD CLicMgrLeftView::WizardActionOnServer( WIZACTION wa , PBOOL pbRefresh )
{
CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
if( pMainFrame != NULL )
{
return pMainFrame->WizardActionOnServer( wa , pbRefresh , TREEVIEW );
}
return ERROR_INVALID_PARAMETER;
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::SetActiveServer( CLicServer *pServer )
{
CMainFrame *pMainFrame = static_cast< CMainFrame * >( AfxGetMainWnd() );
#ifdef DBG
if( pServer != NULL )
{
DBGMSG( L"CLicMgrLeftView::SetActiveServer %s\n" , (LPCTSTR)pServer->GetName( ) );
}
#endif
if( pMainFrame != NULL )
{
pMainFrame->SetActiveServer( pServer );
}
}
//-----------------------------------------------------------------------------------------
void CLicMgrLeftView::SetRightClickedItem( HTREEITEM ht )
{
m_ht = ht;
CTreeNode *pNode = (CTreeNode *)GetTreeCtrl().GetItemData(ht);
if(NULL == pNode)
{
SetActiveServer( NULL );
return;
}
NODETYPE nt = pNode->GetNodeType();
if(NODE_SERVER == nt )
{
SetActiveServer( static_cast< CLicServer * >( pNode->GetTreeObject() ) );
}
else if( nt == NODE_KEYPACK )
{
CKeyPack *pKeyPack = static_cast< CKeyPack *>( pNode->GetTreeObject() );
if( pKeyPack != NULL )
{
SetActiveServer( pKeyPack->GetServer( ) );
}
}
else
{
SetActiveServer( NULL );
}
}