//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: L A N W I Z . C P P // // Contents: Implementation of the LAN wizard page // // Notes: // // Author: tongl 16 Oct 1997 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "devdatatip.h" #include "lanwiz.h" #include "ncsetup.h" #include "util.h" #include "ncui.h" // Constructor and Destructor CLanWizPage::CLanWizPage(IUnknown * punk) { Assert(punk); m_punk = punk; m_pnc = NULL; m_pnccAdapter = NULL; m_hwndList = NULL; m_hilCheckIcons = NULL; m_fReadOnly = FALSE; m_hwndDataTip = NULL; } // Methods that set the Netcfg interfaces the dialog needs. // Should be only by INetLanConnectionWizardUi->SetDeviceComponent // and right before initializing the wizard dialog each time HRESULT CLanWizPage::SetNetcfg(INetCfg * pnc) { Assert(pnc); if (m_pnc) { // Release it ReleaseObj(m_pnc); } m_pnc = pnc; AddRefObj(pnc); return S_OK; } HRESULT CLanWizPage::SetAdapter(INetCfgComponent * pnccAdapter) { Assert(pnccAdapter); if (m_pnccAdapter) { // Release it ReleaseObj(m_pnccAdapter); } m_pnccAdapter = pnccAdapter; AddRefObj(pnccAdapter); return S_OK; } // Initialize dialog LRESULT CLanWizPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { m_hwndList = GetDlgItem(IDC_LVW_COMPLIST); m_Handles.m_hList = m_hwndList; m_Handles.m_hAdd = GetDlgItem(IDC_PSH_ADD); m_Handles.m_hRemove = GetDlgItem(IDC_PSH_REMOVE); m_Handles.m_hProperty = GetDlgItem(IDC_PSH_PROPERTIES); m_Handles.m_hDescription = GetDlgItem(IDC_TXT_COMPDESC); // set the font of the device description: IDC_DEVICE_DESC to bold HFONT hCurFont = (HFONT)::SendMessage(GetDlgItem(IDC_DEVICE_DESC), WM_GETFONT, 0,0); if (hCurFont) // if not using system font { int cbBuffer; cbBuffer = GetObject(hCurFont, 0, NULL); if (cbBuffer) { void * lpvObject = new BYTE[cbBuffer]; if (lpvObject) { int nRet = GetObject(hCurFont, cbBuffer, lpvObject); if (nRet) { LOGFONT * pLogFont = reinterpret_cast(lpvObject); pLogFont->lfWeight = FW_BOLD; HFONT hNewFont = CreateFontIndirect(pLogFont); if (hNewFont) { ::SendMessage(GetDlgItem(IDC_DEVICE_DESC), WM_SETFONT, (WPARAM)hNewFont, TRUE); } } delete[] lpvObject; } } } return 0; } // Destroy dialog LRESULT CLanWizPage::OnDestroyDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { // Release netcfg interfaces, they should be reinitialized // the next time the dialog is brought up ReleaseObj(m_pnc); ReleaseObj(m_pnccAdapter); UninitListView(m_hwndList); // Destroy our check icons if (m_hilCheckIcons) { ImageList_Destroy(m_hilCheckIcons); } // release binding path objects and component objects we kept ReleaseAll(m_hwndList, &m_listBindingPaths); return 0; } // Wizard page notification handlers LRESULT CLanWizPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { HRESULT hr = S_OK; // Fill in the adapter description AssertSz(m_pnccAdapter, "We don't have a valid adapter!"); if (m_pnccAdapter) { PWSTR pszwDeviceName; hr = m_pnccAdapter->GetDisplayName(&pszwDeviceName); if (SUCCEEDED(hr)) { SetDlgItemText(IDC_DEVICE_DESC, pszwDeviceName); CoTaskMemFree(pszwDeviceName); } // Create a data tip for the device to display location // info and MAc address. // PWSTR pszDevNodeId = NULL; PWSTR pszBindName = NULL; // Get the pnp instance id of the device. (VOID) m_pnccAdapter->GetPnpDevNodeId (&pszDevNodeId); // Get the device's bind name (VOID) m_pnccAdapter->GetBindName (&pszBindName); // Create the tip and associate it with the description control. // Note if the tip was already created, then only the text // will be modified. // CreateDeviceDataTip (m_hWnd, &m_hwndDataTip, IDC_DEVICE_DESC, pszDevNodeId, pszBindName); CoTaskMemFree (pszDevNodeId); CoTaskMemFree (pszBindName); } // refresh the listview for the new adapter // Now setup the BindingPathObj collection and List view hr = HrInitListView(m_hwndList, m_pnc, m_pnccAdapter, &m_listBindingPaths, &m_hilCheckIcons); // now set the buttons LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk); ::PostMessage(::GetParent(m_hWnd), PSM_SETWIZBUTTONS, (WPARAM)0, (LPARAM)(PSWIZB_BACK | PSWIZB_NEXT)); return 0; } LRESULT CLanWizPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { BOOL fError; fError = FValidatePageContents( m_hWnd, m_Handles.m_hList, m_pnc, m_pnccAdapter, &m_listBindingPaths ); ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, fError); return fError; } // Push button handlers LRESULT CLanWizPage::OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { HRESULT hr = S_OK; // $REVIEW(tongl 1/7/99): We can't let user do anything till this // is returned (Raid #258690) // disable all buttons on this dialog static const int nrgIdc[] = {IDC_PSB_Add, IDC_PSB_Remove, IDC_PSB_Properties}; EnableOrDisableDialogControls(m_hWnd, celems(nrgIdc), nrgIdc, FALSE); // disable wizard buttons till we are done ::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, 0); hr = HrLvAdd(m_hwndList, m_hWnd, m_pnc, m_pnccAdapter, &m_listBindingPaths); // Reset the buttons and the description text based on the changed selection LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk); ::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, (LPARAM)(PSWIZB_NEXT | PSWIZB_BACK)); TraceError("CLanWizPage::OnAdd", hr); return 0; } LRESULT CLanWizPage::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { HRESULT hr = S_OK; // $REVIEW(tongl 1/7/99): We can't let user do anything till this // is returned (Raid #258690) // disable all buttons on this dialog static const int nrgIdc[] = {IDC_PSB_Add, IDC_PSB_Remove, IDC_PSB_Properties}; EnableOrDisableDialogControls(m_hWnd, celems(nrgIdc), nrgIdc, FALSE); hr = HrLvRemove(m_hwndList, m_hWnd, m_pnc, m_pnccAdapter, &m_listBindingPaths); if (NETCFG_S_REBOOT == hr) { // tell the user the component they removed cannot be re-added until // setup completes //$REVIEW - scottbri - Notifing the user maybe optional, //$REVIEW as little can be done on their part } // Reset the buttons and the description text based on the changed selection LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk); TraceError("CLanWizPage::OnRemove", hr); return 0; } LRESULT CLanWizPage::OnProperties(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) { HRESULT hr = S_OK; // $REVIEW(tongl 1/7/99): We can't let user do anything till this // is returned (Raid #258690) // disable all buttons on this dialog static const int nrgIdc[] = {IDC_PSB_Add, IDC_PSB_Remove, IDC_PSB_Properties}; EnableOrDisableDialogControls(m_hWnd, celems(nrgIdc), nrgIdc, FALSE); // disable wizard buttons till we are done ::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, 0); hr = HrLvProperties(m_hwndList, m_hWnd, m_pnc, m_punk, m_pnccAdapter, &m_listBindingPaths, NULL); // Reset the buttons and the description text based on the changed selection LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk); ::SendMessage(GetParent(), PSM_SETWIZBUTTONS, 0, (LPARAM)(PSWIZB_NEXT | PSWIZB_BACK)); TraceError("CLanWizPage::OnProperties", hr); return 0; } // List view handlers LRESULT CLanWizPage::OnClick(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { if (idCtrl == IDC_LVW_COMPLIST) { OnListClick(m_hwndList, m_hWnd, m_pnc, m_punk, m_pnccAdapter, &m_listBindingPaths, FALSE); } return 0; } LRESULT CLanWizPage::OnDbClick(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { if (idCtrl == IDC_LVW_COMPLIST) { // If we're in read-only mode, treat a double click as a single click // OnListClick(m_hwndList, m_hWnd, m_pnc, m_punk, m_pnccAdapter, &m_listBindingPaths, !m_fReadOnly); } return 0; } LRESULT CLanWizPage::OnKeyDown(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { if (idCtrl == IDC_LVW_COMPLIST) { LV_KEYDOWN* plvkd = (LV_KEYDOWN*)pnmh; OnListKeyDown(m_hwndList, &m_listBindingPaths, plvkd->wVKey); } return 0; } LRESULT CLanWizPage::OnItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { // Reset the buttons and the description text based on the changed selection LvSetButtons(m_hWnd, m_Handles, m_fReadOnly, m_punk); return 0; } LRESULT CLanWizPage::OnDeleteItem(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { NM_LISTVIEW * pnmlv = reinterpret_cast(pnmh); LvDeleteItem(m_hwndList, pnmlv->iItem); return 0; }