|
|
// Commenting #define out - causing compiler error - not sure if needed, compiles
// okay without it.
//#define WINVER 0x0400
#include "precomp.h"
#include "afxtempl.h"
#include "resource.h"
#include "wbemidl.h"
#include <comdef.h>
//smart pointer
_COM_SMARTPTR_TYPEDEF(IWbemServices, IID_IWbemServices); _COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, IID_IEnumWbemClassObject); //_COM_SMARTPTR_TYPEDEF(IWbemContext, IID_IWbemContext );
_COM_SMARTPTR_TYPEDEF(IWbemLocator, IID_IWbemLocator);
#include "drdbdr.h"
#include "winnetwk.h"
#define NET_API_STATUS DWORD
#define NET_API_FUNCTION __stdcall
#include "lmwksta.h"
#include "Browse.h"
#include "dlgcback.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
CNetResourceList :: CNetResourceList(NETRESOURCE & nr, BOOL fNULL) { //Initialize
fUseGlobe = FALSE; fIsNULL = fNULL; pNext = NULL;
lpLocalName = NULL; lpRemoteName = NULL; lpComment = NULL; lpProvider = NULL;
//If it is not NULL
if (!fIsNULL) { dwScope = nr.dwScope; dwType = nr.dwType; dwDisplayType = nr.dwDisplayType; dwUsage = nr.dwUsage;
if (nr.lpLocalName) { lpLocalName = new char [strlen(nr.lpLocalName) + 1]; lpLocalName[0] = 0; strcpy(lpLocalName, nr.lpLocalName); } if (nr.lpRemoteName) { lpRemoteName = new char [strlen(nr.lpRemoteName) + 1]; lpRemoteName[0] = 0; strcpy(lpRemoteName, nr.lpRemoteName); } if (nr.lpComment) { lpComment = new char [strlen(nr.lpComment) + 1]; lpComment[0] = 0; strcpy(lpComment, nr.lpComment); } if (nr.lpProvider) { lpProvider = new char [strlen(nr.lpProvider) + 1]; lpProvider[0] = 0; strcpy(lpProvider, nr.lpProvider); } } }
CNetResourceList :: ~CNetResourceList() { //Tidy Up
// if (pNext)
// delete pNext;
if (!fIsNULL) { delete lpLocalName; delete lpRemoteName; delete lpComment; delete lpProvider; } }
/////////////////////////////////////////////////////////////////////////////
// CBrowseDialog dialog
CBrowseDialog::CBrowseDialog(CWnd* pParent /*=NULL*/) : CDialog(CBrowseDialog::IDD, pParent) { //{{AFX_DATA_INIT(CBrowseDialog)
//}}AFX_DATA_INIT
}
CBrowseDialog :: ~CBrowseDialog() { //Tidy Up
// delete pPrevList;
// delete pCurrentSelectionList;
if (pPrevList) { CNetResourceList* theNext = NULL; do { theNext = pPrevList->pNext; delete pPrevList; pPrevList = theNext; } while (pPrevList); }
if (pCurrentSelectionList) { CNetResourceList* theNext = NULL; do { theNext = pCurrentSelectionList->pNext; delete pCurrentSelectionList; pCurrentSelectionList = theNext; } while (pCurrentSelectionList); } }
void CBrowseDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBrowseDialog)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBrowseDialog, CDialog) //{{AFX_MSG_MAP(CBrowseDialog)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList1) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemchangedList3) ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnKeyDown) ON_BN_CLICKED(IDC_BACKBUTTON, OnBackbutton) ON_BN_CLICKED(IDC_LISTBUTTON, OnListbutton) ON_BN_CLICKED(IDC_DETAILBUTTON, OnDetailbutton) ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnNeedText) ON_WM_NCDESTROY() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBrowseDialog message handlers
//This is used to mimick the stucture in NETAPI32.LIB
typedef struct _WkstaInfo100 { DWORD wki100_platform_id; LPSTR wki100_computername; LPSTR wki100_langroup; DWORD wki100_ver_major; DWORD wki100_ver_minor; } WkstaInfo100, *PWkstaInfo100, *LPWkstaInfo100;
typedef NET_API_STATUS (CALLBACK *ULPRET)(LPSTR servername, DWORD level, LPBYTE* bufptr);
BOOL CBrowseDialog::OnInitDialog() { CDialog::OnInitDialog();
// subclass the window to circumvent a bug (?) in mfc
WNDPROC oldWindowProc = (WNDPROC):: SetWindowLong (m_hWnd, GWL_WNDPROC, (DWORD) MySubClassProc); CWindowInfo *pwindowInfo = new CWindowInfo (m_hWnd, oldWindowProc); windowMap.SetAt ((SHORT)((DWORD)m_hWnd & 0xffff), pwindowInfo);
// hook up controls
m_cancelButton.Attach (::GetDlgItem (m_hWnd, IDCANCEL)); m_okButton.Attach (::GetDlgItem (m_hWnd, IDOK)); m_list.Attach(::GetDlgItem (m_hWnd, IDC_LIST1)); // TODO: Add extra initialization here
pPrevList = NULL; pCurrentSelectionList = NULL; pCurrentItem = NULL; lpServerName[0] = 0; iSelectedItem = 0;
//Setup image list with icons
m_imageList.Create (16, 16, TRUE, 25, 0);
//The first icon (HMM_ICON_SERVER) is used to represent SERVERS
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1)); m_imageList.Add (hIcon);
//The second icon (HMM_ICON_GLOBE) is used to represent the entire network
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2)); m_imageList.Add (hIcon);
//The third icon (HMM_ICON_OTHER) is used to represent any other network resource
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON3)); m_imageList.Add (hIcon);
//The forth icon (HMM_ICON_NETWORK) is used to represent a link to the entire network
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON4)); m_imageList.Add (hIcon);
//Setup Bitmap pushbuttons
m_backBitmapButton.AutoLoad(IDC_BACKBUTTON, this); m_listBitmapButton.AutoLoad(IDC_LISTBUTTON, this); m_listBitmapButton.EnableWindow(FALSE); m_detailBitmapButton.AutoLoad(IDC_DETAILBUTTON, this);
//Enable tool tips for this dialog
EnableToolTips(TRUE);
//Setup column for report view
LV_COLUMN lvCol; lvCol.mask = LVCF_FMT | LVCF_WIDTH; lvCol.fmt = LVCFMT_LEFT; lvCol.cx = MAX_SERVER_NAME_LENGTH; m_list.InsertColumn(1, &lvCol);
m_list.SetImageList (&m_imageList, LVSIL_SMALL);
oldStyle = :: GetWindowLong(m_list.m_hWnd, GWL_STYLE);
:: SetWindowLong (m_list.m_hWnd, GWL_STYLE, oldStyle | LVS_LIST | LVS_SINGLESEL);
char buff [500 + 1]; buff[0] = 0;
//check if this is a Windows 95 machine
//This is a Windows 95 machine
//by getting the info from the registry
fIsWin95 = TRUE;
HKEY keyHandle = (HKEY)1; long fStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\VxD\\VNETSUP", 0, KEY_READ, &keyHandle);
if (fStatus == ERROR_SUCCESS) { DWORD sizebuff = 500; DWORD typeValue;
fStatus = RegQueryValueEx(keyHandle, "Workgroup", NULL, &typeValue, (LPBYTE)buff, &sizebuff);
}
if ( (fStatus != ERROR_SUCCESS) ) { fIsWin95 = FALSE;
buff[0] = 0; //Check if you can call NetWkstaGetInfo in the NETAPI32.DLL
ULPRET pProcAddr = NULL; HINSTANCE hNetApi = LoadLibrary("NETAPI32.DLL");
if (hNetApi) { pProcAddr = (ULPRET) GetProcAddress(hNetApi, "NetWkstaGetInfo"); }
if (hNetApi && pProcAddr) { //Use NetAPI32
LPBYTE buffer; ((*pProcAddr)(NULL, 100, &buffer)); LPWkstaInfo100 lpFred = (LPWkstaInfo100) buffer; wsprintf (buff, "%ws", lpFred->wki100_langroup); }
//Tidy up
if (hNetApi) FreeLibrary(hNetApi); }
buff[500] = 0;
NETRESOURCE nr; nr.dwScope = RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_ANY; nr.dwDisplayType = RESOURCEDISPLAYTYPE_DOMAIN; nr.dwUsage = RESOURCEUSAGE_CONTAINER; nr.lpLocalName = NULL; nr.lpRemoteName = buff; nr.lpComment = "";
//New stuff to get provider name
DWORD buffSize = 500; char provName [500];
DWORD dwResult = WNetGetProviderName(WNNC_NET_MSNET, provName, &buffSize);
if (dwResult != WN_SUCCESS) { dwResult = WNetGetProviderName(WNNC_NET_LANMAN, provName, &buffSize); }
if (dwResult != WN_SUCCESS) { ODBCTRACE ("\nWBEM ODBC Driver : Failed to get provider name\n"); } else { ODBCTRACE ("\nWBEM ODBC Driver : Provider name = "); ODBCTRACE (provName); ODBCTRACE ("\n"); }
nr.lpProvider = provName; //Add first entry in callback list (i.e. previous list)
pPrevList = new CNetResourceList(nr, FALSE); pPrevList->fUseGlobe = TRUE;
count = 0; EnumerateServers(&nr, pPrevList->fUseGlobe);
//Give Cancel pushbutton focus
m_cancelButton.SetFocus();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CBrowseDialog :: EnumerateServers(LPNETRESOURCE lpnr, BOOL fUseGlobe) { //Disable controls before enumeration
BeginWaitCursor(); m_okButton.EnableWindow(FALSE); m_backBitmapButton.EnableWindow(FALSE); HANDLE hEnum = NULL; DWORD dwResult = 0;
//check if this is Windows 95 asking for the Entire Network
NETRESOURCE nr95; if (fIsWin95 && !lpnr) { nr95.dwScope = RESOURCE_GLOBALNET; nr95.dwType = RESOURCETYPE_ANY; nr95.dwDisplayType = RESOURCEDISPLAYTYPE_NETWORK; nr95.dwUsage = RESOURCEUSAGE_CONTAINER; nr95.lpLocalName = NULL; nr95.lpRemoteName = NULL; nr95.lpComment = HMM_STR_MN; nr95.lpProvider = HMM_STR_MN;
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, &nr95, &hEnum); } else { dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpnr, &hEnum); } //Only disable cancel button after enumeration returned
m_cancelButton.EnableWindow(FALSE);
BOOL fUseBackArrow = FALSE; //can we go back to previous screen ?
if ( dwResult != NO_ERROR ) { EndWaitCursor(); m_cancelButton.EnableWindow(TRUE); m_backBitmapButton.EnableWindow(!fUseGlobe); return; }
DWORD dwResultEnum = 0;
DWORD cbBuffer = 16384; //16k is a reasonable size
DWORD cEntries = 0xFFFFFFFF; //get all entries
LPNETRESOURCE lpnrLocal = NULL;
//Check if you need to add a back arrow or globe
if ( fUseGlobe ) { //Add Globe
LV_ITEM tempItem1; tempItem1.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; tempItem1.iItem = count++; tempItem1.iSubItem = 0; tempItem1.pszText = HMM_STR_ENTIRE_NWORK; tempItem1.state = 0; tempItem1.stateMask = LVIS_FOCUSED | LVIS_SELECTED; tempItem1.iImage = HMM_ICON_GLOBE; tempItem1.lParam = (DWORD) NULL; m_list.InsertItem(&tempItem1);
//Disable the back arrow
fUseBackArrow = FALSE; } else { //Add Back Arrow
//Enable the back arrow
fUseBackArrow = TRUE;
if (lpnr) { //Add to head of current selection list for speedy clean up
pCurrentSelectionList = new CNetResourceList(*lpnr, FALSE); pCurrentItem = pCurrentSelectionList; } }
do { //Allocate memory for NETRESOURCE structures
//to retrieve from enumeration
lpnrLocal = (LPNETRESOURCE) GlobalAlloc (GPTR, cbBuffer);
if (lpnrLocal) { dwResultEnum = WNetEnumResource (hEnum, &cEntries, lpnrLocal, &cbBuffer);
if ( (dwResultEnum == NO_ERROR)) { for (DWORD i = 0; i < cEntries; i++) { //Display NETRESOURCE structure
NETRESOURCE fred = lpnrLocal[i];
if (fred.lpRemoteName) { //Insert into List View Control
LV_ITEM tempItem; tempItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; tempItem.iItem = count++; tempItem.iSubItem = 0; tempItem.pszText = fred.lpRemoteName; tempItem.state = 0; tempItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
//Work out which icon to use
if (lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER) tempItem.iImage = HMM_ICON_SERVER; else if (lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_NETWORK) tempItem.iImage = HMM_ICON_NETWORK; else if (lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_GENERIC) tempItem.iImage = HMM_ICON_NETWORK; else tempItem.iImage = HMM_ICON_OTHER;
//Add to end of current selection list for speedy clean up
CNetResourceList* pt = new CNetResourceList(fred, FALSE);
if (pCurrentSelectionList) { pCurrentItem->pNext = pt; pCurrentItem = pt; } else { pCurrentSelectionList = pt; pCurrentItem = pt; } tempItem.lParam = (DWORD) pt; m_list.InsertItem(&tempItem); } } }
//Tidy up
GlobalFree( (HGLOBAL) lpnrLocal); } else break;
} while (dwResultEnum != ERROR_NO_MORE_ITEMS);
WNetCloseEnum(hEnum);
//Re-enable pushbuttons
m_backBitmapButton.EnableWindow(fUseBackArrow); m_cancelButton.EnableWindow(TRUE); EndWaitCursor();
// if (m_list.GetSelectedCount())
// m_okButton.EnableWindow(TRUE);
}
void CBrowseDialog::OnDblclkList2(int index) { if ((index != -1)) { LV_ITEM tempItem; tempItem.mask = LVIF_IMAGE | LVIF_PARAM; tempItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; tempItem.iSubItem = 0; tempItem.iItem = index;
if ( m_list.GetItem(&tempItem) ) { //Check if you clicked on globe or arrow
if (tempItem.iImage == HMM_ICON_GLOBE) { //Remove current items in list view control
CleanUpListCtrl(); m_list.DeleteAllItems();
//Get Microsoft Network Info
count = 0;
//Add to start of previous list
CNetResourceList* pt = pPrevList; pPrevList = new CNetResourceList(dummy, TRUE); if (pt) pPrevList->pNext = pt;
EnumerateServers(NULL, pPrevList->fUseGlobe);
//Give Cancel pushbutton focus
m_cancelButton.SetFocus(); } else { CNetResourceList* pNR = (CNetResourceList*)tempItem.lParam;
if (pNR && pNR->dwDisplayType != RESOURCEDISPLAYTYPE_SERVER) { //Setup information for new enumeration
NETRESOURCE nr2; nr2.lpLocalName = NULL; nr2.lpRemoteName = NULL; nr2.lpComment = NULL; nr2.lpProvider = NULL;
BOOL fNULL = pNR->fIsNULL;
if (!fNULL) { Clone(nr2, pNR->dwScope, pNR->dwType, pNR->dwDisplayType, pNR->dwUsage, pNR->lpLocalName, pNR->lpRemoteName, pNR->lpComment, pNR->lpProvider); }
//Add item to front of list
CNetResourceList* pt = pPrevList; pPrevList = new CNetResourceList(nr2, fNULL); if (pt) pPrevList->pNext = pt;
//Remove current items in list view control
CleanUpListCtrl(); m_list.DeleteAllItems();
count = 0;
if (fNULL) EnumerateServers(NULL, pPrevList->fUseGlobe); else EnumerateServers(&nr2, pPrevList->fUseGlobe);
//Give Cancel pushbutton focus
m_cancelButton.SetFocus();
//Tidy up
delete nr2.lpLocalName; delete nr2.lpRemoteName; delete nr2.lpComment; delete nr2.lpProvider; } else { m_okButton.EnableWindow(TRUE); } } } } }
void CBrowseDialog::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here
*pResult = 0;
//Get current position of mouse cursor and perform
//a hit test on the tree control
POINT cursorPos; cursorPos.x = 0; cursorPos.y = 0; BOOL state = GetCursorPos(&cursorPos);
m_list.ScreenToClient(&cursorPos);
UINT fFlags = 0;
int index = m_list.HitTest(cursorPos, &fFlags);
if (fFlags & LVHT_ONITEM) { OnDblclkList2(index); } }
void CBrowseDialog :: CleanUpListCtrl() { //Disable back button (if applicable)
m_backBitmapButton.EnableWindow(FALSE);
if (pCurrentSelectionList) { CNetResourceList* theNext = NULL; do { theNext = pCurrentSelectionList->pNext; delete pCurrentSelectionList; pCurrentSelectionList = theNext; } while (pCurrentSelectionList); }
pCurrentSelectionList = NULL; pCurrentItem = NULL; }
void CBrowseDialog::OnBackbutton() { // TODO: Add your control notification handler code here
//Remove current items in list view control
CleanUpListCtrl(); m_list.DeleteAllItems();
//Remove item from front of list
CNetResourceList* pt = pPrevList->pNext; pPrevList->pNext = NULL; delete pPrevList; pPrevList = pt;
//Go back and get previous enumeration
NETRESOURCE temp; temp.lpLocalName = NULL; temp.lpRemoteName = NULL; temp.lpComment = NULL; temp.lpProvider = NULL;
BOOL fGlobe = pPrevList->fUseGlobe; BOOL fNULL = pPrevList->fIsNULL;
if ( ! fNULL) { Clone(temp, pPrevList->dwScope, pPrevList->dwType, pPrevList->dwDisplayType, pPrevList->dwUsage, pPrevList->lpLocalName, pPrevList->lpRemoteName, pPrevList->lpComment, pPrevList->lpProvider); }
count = 0;
if (fNULL) EnumerateServers(NULL, fGlobe); else EnumerateServers(&temp, fGlobe);
//Give Cancel pushbutton focus
m_cancelButton.SetFocus();
//Tidy Up
delete temp.lpLocalName; delete temp.lpRemoteName; delete temp.lpComment; delete temp.lpProvider; }
void CBrowseDialog::OnListbutton() { // TODO: Add your control notification handler code here
m_listBitmapButton.EnableWindow(FALSE); m_detailBitmapButton.EnableWindow(TRUE);
int cCount = m_list.GetItemCount();
:: SetWindowLong (m_list.m_hWnd, GWL_STYLE, oldStyle | LVS_LIST | LVS_SINGLESEL); m_list.RedrawItems(0, cCount - 1); UpdateWindow(); }
void CBrowseDialog::OnDetailbutton() { // TODO: Add your control notification handler code here
m_detailBitmapButton.EnableWindow(FALSE); m_listBitmapButton.EnableWindow(TRUE);
int cCount = m_list.GetItemCount();
:: SetWindowLong (m_list.m_hWnd, GWL_STYLE, oldStyle | LVS_NOCOLUMNHEADER | LVS_ICON | LVS_REPORT | LVS_SINGLESEL);
m_list.RedrawItems(0, cCount - 1); UpdateWindow(); }
BOOL CBrowseDialog::OnNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult) { TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR; UINT nID = pNMHDR->idFrom; if (pTTT->uFlags & TTF_IDISHWND) { //idFrom is actually the HWND of the tool
nID= :: GetDlgCtrlID((HWND)nID); switch (nID) { case IDC_BACKBUTTON: { pTTT->lpszText = MAKEINTRESOURCE(STR_PREVIOUS); pTTT->hinst = AfxGetResourceHandle(); return (TRUE); } break; case IDC_LISTBUTTON: { pTTT->lpszText = MAKEINTRESOURCE(STR_LIST_VIEW); pTTT->hinst = AfxGetResourceHandle(); return (TRUE); } break; case IDC_DETAILBUTTON: { pTTT->lpszText = MAKEINTRESOURCE(STR_REPORT_VIEW); pTTT->hinst = AfxGetResourceHandle(); return (TRUE); } break; default: break; } } return (FALSE); } void CBrowseDialog :: OnNcDestroy () { CWindowInfo *pwindowInfo = NULL; BOOL found = windowMap.Lookup ((SHORT) ((DWORD)m_hWnd & 0xffff), pwindowInfo); ASSERT (found); if (found) { :: SetWindowLong (m_hWnd, GWL_WNDPROC, (DWORD) pwindowInfo->m_oldWindowProc); windowMap.RemoveKey ((SHORT) ((DWORD)m_hWnd & 0xffff)); delete pwindowInfo; } m_cancelButton.Detach (); m_okButton.Detach (); m_list.Detach (); CDialog :: OnNcDestroy (); }
void CBrowseDialog::OnOK() { //Get name of selected item using selected item index
LV_ITEM tempItem; tempItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; tempItem.iItem = iSelectedItem; tempItem.iSubItem = 0; tempItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; tempItem.pszText = lpServerName; tempItem.cchTextMax = MAX_SERVER_NAME_LENGTH;
if ( m_list.GetItem(&tempItem) ) { //Copy name of network resource
// lpServerName[0] = 0;
// if (tempItem.pszText)
// {
// strncpy(lpServerName, tempItem.pszText, MAX_SERVER_NAME_LENGTH);
// lpServerName[MAX_SERVER_NAME_LENGTH] = 0;
// }
} CDialog::OnOK(); }
//Populates a NETRESOURCE structure with the input parameters
void CBrowseDialog :: Clone(NETRESOURCE &nrClone, DWORD nrScope, DWORD nrType, DWORD nrDisplayType, DWORD nrUsage, LPSTR lpLocalName, LPSTR lpRemoteName, LPSTR lpComment, LPSTR lpProvider) { nrClone.lpLocalName = NULL; nrClone.lpRemoteName = NULL; nrClone.lpComment = NULL; nrClone.lpProvider = NULL;
nrClone.dwScope = nrScope; nrClone.dwType = nrType; nrClone.dwDisplayType = nrDisplayType; nrClone.dwUsage = nrUsage; if (lpLocalName) { nrClone.lpLocalName = new char [strlen(lpLocalName) + 1]; nrClone.lpLocalName[0] = 0; strcpy(nrClone.lpLocalName, lpLocalName); }
if (lpRemoteName) { nrClone.lpRemoteName = new char [strlen(lpRemoteName) + 1]; nrClone.lpRemoteName[0] = 0; strcpy(nrClone.lpRemoteName, lpRemoteName); } if (lpComment) { nrClone.lpComment = new char [strlen(lpComment) + 1]; nrClone.lpComment[0] = 0; strcpy(nrClone.lpComment, lpComment); } if (lpProvider) { nrClone.lpProvider = new char [strlen(lpProvider) + 1]; nrClone.lpProvider[0] = 0; strcpy(nrClone.lpProvider, lpProvider); } }
// -1 if no selected index
int CBrowseDialog::GetSelectedIndex(DWORD &dwDisplayType) { //Check if one item is selected
int selecCount = m_list.GetSelectedCount(); int itemCount = m_list.GetItemCount();
if ( selecCount == 1 ) { int mySelIndex = m_list.GetNextItem ( -1 , LVNI_ALL | LVNI_SELECTED ) ;
if (mySelIndex != -1) { LV_ITEM myItem; myItem.mask = LVIF_STATE | LVIF_IMAGE | LVIF_PARAM; myItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; myItem.iItem = mySelIndex; myItem.iSubItem = 0;
//Find index to this item
if ( m_list.GetItem(&myItem) ) { CNetResourceList* pNR = (CNetResourceList*)myItem.lParam;
if (pNR) dwDisplayType = pNR->dwDisplayType;
return mySelIndex; //break out now
} } }
//No selected item found
return -1; }
void CBrowseDialog::OnItemchangedList3(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here
*pResult = 0;
ODBCTRACE ("\nCBrowseDialog::OnItemchangedList3\n");
DWORD dwDisplayType = 0; int mySelectedIndex = GetSelectedIndex(dwDisplayType); if ( mySelectedIndex != -1 ) { iSelectedItem = mySelectedIndex;
//check if selected item is a server
if (dwDisplayType == RESOURCEDISPLAYTYPE_SERVER) m_okButton.EnableWindow(TRUE); else m_okButton.EnableWindow(FALSE); } }
void CBrowseDialog::OnKeyDown(NMHDR* pNMHDR, LRESULT* pResult) { ODBCTRACE ("\nCBrowseDialog::OnKeyDown\n");
TV_KEYDOWN* lParam = (TV_KEYDOWN*)pNMHDR; // TODO: Add your control notification handler code here
*pResult = 0;
//Check if SPACE BAR is pressed (to expand node)
if ( lParam->wVKey == VK_SPACE ) { DWORD dwDisplayType = 0; int mySelectedIndex = GetSelectedIndex(dwDisplayType); OnDblclkList2(mySelectedIndex); } else if (lParam->wVKey == VK_BACK) { //BACKSPACE PRESSED (for Up One Level)
if ( m_backBitmapButton.IsWindowEnabled() ) { OnBackbutton(); } } else if (lParam->wVKey == 'L') { //L PRESSED (for List View)
OnListbutton(); } else if (lParam->wVKey == 'D') { //D PRESSED (for Details View)
OnDetailbutton(); } }
|