/**** grppg.cpp User Manager group membership prop page implementation History: 09/23/98: dsheldon created ****/ #include "stdafx.h" #include "resource.h" #include "grppage.h" #include "misc.h" /** CGroupPageBase Implementation Functions common to both the group prop page and the group wizard page. **/ INT_PTR CGroupPageBase::HandleGroupMessage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_INITDIALOG, OnInitDialog); HANDLE_MSG(hwndDlg, WM_COMMAND, OnCommand); }; return FALSE; } void CGroupPageBase::InitializeLocalGroupCombo(HWND hwndCombo) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::InitializeLocalGroupCombo"); ComboBox_ResetContent(hwndCombo); // Add all of the groups in the list to the box for(int i = 0; i < m_pGroupList->GetPtrCount(); i ++) { CGroupInfo* pGroupInfo = m_pGroupList->GetPtr(i); int index = ComboBox_AddString(hwndCombo, pGroupInfo->m_szGroup); ComboBox_SetItemData(hwndCombo, index, pGroupInfo->m_szComment); } TCHAR szSelectGroup[MAX_GROUP + 1]; // Load a local group name from the resources to select by default LoadString(g_hInstance, IDS_USR_DEFAULTGROUP, szSelectGroup, ARRAYSIZE(szSelectGroup)); if (ComboBox_SelectString(hwndCombo, 0, szSelectGroup) == CB_ERR) { ComboBox_SetCurSel(hwndCombo, 0); } TraceLeaveVoid(); } void CGroupPageBase::SetGroupDescription(HWND hwndCombo, HWND hwndEdit) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::SetGroupDescription"); int iItem = ComboBox_GetCurSel(hwndCombo); TraceAssert(iItem != CB_ERR); TCHAR* pszDescription = (TCHAR*) ComboBox_GetItemData(hwndCombo, iItem); SetWindowText(hwndEdit, pszDescription); TraceLeaveVoid(); } BOOL CGroupPageBase::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::OnInitDialog"); // Fill in the local group combo box HWND hwndCombo = GetDlgItem(hwnd, IDC_GROUPS); InitializeLocalGroupCombo(hwndCombo); HWND hwndEdit = GetDlgItem(hwnd, IDC_GROUPDESC); if ((NULL != m_pUserInfo) && (m_pUserInfo->m_szGroups[0] != TEXT('\0'))) { // Select the local group corresponding to the first one in the user's groups // string TCHAR szSelect[MAX_GROUP + 1]; // Copy the string since we might shorten our copy lstrcpyn(szSelect, m_pUserInfo->m_szGroups, ARRAYSIZE(szSelect)); TCHAR* pchEndOfFirst = StrChr(szSelect, TEXT(';')); if (pchEndOfFirst) { // More than one group; we'll fix that! *pchEndOfFirst = TEXT('\0'); } SelectGroup(hwnd, szSelect); } else { // Select the power user group by default SendDlgItemMessage(hwnd, IDC_POWERUSERS, BM_SETCHECK, (WPARAM) BST_CHECKED, 0); OnRadioChanged(hwnd, IDC_POWERUSERS); } SetGroupDescription(hwndCombo, hwndEdit); // Bold the group names BoldGroupNames(hwnd); TraceLeaveValue(TRUE); } BOOL CGroupPageBase::GetSelectedGroup(HWND hwnd, LPTSTR pszGroupOut, DWORD cchGroup, CUserInfo::GROUPPSEUDONYM* pgsOut) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::GetSelectedGroup"); BOOL fSuccess = FALSE; *pgsOut = CUserInfo::USEGROUPNAME; UINT idString = 0; if (BST_CHECKED == Button_GetCheck(GetDlgItem(hwnd, IDC_POWERUSERS))) { idString = IDS_USR_POWERUSERS; *pgsOut = CUserInfo::STANDARD; } else if (BST_CHECKED == Button_GetCheck(GetDlgItem(hwnd, IDC_USERS))) { idString = IDS_USR_USERS; *pgsOut = CUserInfo::RESTRICTED; } if (0 != idString) { LoadString(g_hInstance, idString, pszGroupOut, cchGroup); // Success fSuccess = TRUE; } else { // 'other' must be selected; get the string from the dropdown GetWindowText(GetDlgItem(hwnd, IDC_GROUPS), pszGroupOut, cchGroup); } TraceLeaveValue(fSuccess); } // Returns IDC_OTHER if no radio button id corresponds to the group UINT CGroupPageBase::RadioIdForGroup(LPCTSTR pszGroup) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::RadioIdForGroup"); TCHAR szPowerUsers[MAX_GROUP + 1]; TCHAR szUsers[MAX_GROUP + 1]; LoadString(g_hInstance, IDS_USR_POWERUSERS, szPowerUsers, ARRAYSIZE(szPowerUsers)); LoadString(g_hInstance, IDS_USR_USERS, szUsers, ARRAYSIZE(szUsers)); // Assume IDC_OTHER to start UINT uiRadio = IDC_OTHER; if (0 == StrCmpI(pszGroup, szPowerUsers)) { uiRadio = IDC_POWERUSERS; } else if (0 == StrCmpI(pszGroup, szUsers)) { uiRadio = IDC_USERS; } TraceLeaveValue(uiRadio); } // Disable/update as appropriate when radio selection changes void CGroupPageBase::OnRadioChanged(HWND hwnd, UINT idRadio) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::OnRadioChanged"); BOOL fEnableGroupDropdown = (IDC_OTHER == idRadio); EnableWindow(GetDlgItem(hwnd, IDC_GROUPS), fEnableGroupDropdown); EnableWindow(GetDlgItem(hwnd, IDC_OTHER_STATIC), fEnableGroupDropdown); ShowWindow(GetDlgItem(hwnd, IDC_GROUPDESC), fEnableGroupDropdown ? SW_SHOW : SW_HIDE); TraceLeaveVoid(); } void CGroupPageBase::SelectGroup(HWND hwnd, LPCTSTR pszSelect) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::SelectGroup"); // Always select the group in the 'other' dropdown ComboBox_SelectString(GetDlgItem(hwnd, IDC_GROUPS), -1, pszSelect); // Check the appropriate radio button UINT idRadio = RadioIdForGroup(pszSelect); Button_SetCheck(GetDlgItem(hwnd, idRadio), BST_CHECKED); OnRadioChanged(hwnd, idRadio); TraceLeaveVoid(); } void CGroupPageBase::BoldGroupNames(HWND hwnd) { TraceEnter(TRACE_USR_CORE, "CCroupPageBase::BoldGroupNames"); HWND hwndPowerUsers = GetDlgItem(hwnd, IDC_POWERUSERS); HFONT hfont = (HFONT) SendMessage(hwndPowerUsers, WM_GETFONT, 0, 0); if (hfont) { LOGFONT lf; if (FALSE != GetObject((HGDIOBJ) hfont, sizeof(lf), &lf)) { lf.lfWeight = FW_BOLD; m_hBoldFont = CreateFontIndirect(&lf); if (NULL != m_hBoldFont) { // Set the font SendMessage(hwndPowerUsers, WM_SETFONT, (WPARAM) m_hBoldFont, 0); SendDlgItemMessage(hwnd, IDC_USERS, WM_SETFONT, (WPARAM) m_hBoldFont, 0); SendDlgItemMessage(hwnd, IDC_OTHER, WM_SETFONT, (WPARAM) m_hBoldFont, 0); } } } TraceLeaveVoid(); } BOOL CGroupPageBase::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { TraceEnter(TRACE_USR_CORE, "CGroupPageBase::OnCommand"); switch(codeNotify) { case CBN_SELCHANGE: SetGroupDescription(hwndCtl, GetDlgItem(hwnd, IDC_GROUPDESC)); PropSheet_Changed(GetParent(hwnd), hwnd); break; case BN_CLICKED: // Handle radio clicks switch (id) { case IDC_POWERUSERS: case IDC_USERS: case IDC_OTHER: PropSheet_Changed(GetParent(hwnd), hwnd); OnRadioChanged(hwnd, id); } break; } TraceLeaveValue(FALSE); } /** CGroupWizardPage Implementation **/ INT_PTR CGroupWizardPage::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_INITDIALOG, OnInitDialog); HANDLE_MSG(hwndDlg, WM_NOTIFY, OnNotify); HANDLE_MSG(hwndDlg, WM_COMMAND, OnCommand); } return FALSE; } BOOL CGroupWizardPage::OnNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh) { TraceEnter(TRACE_USR_CORE, "CGroupWizardPage::OnNotify"); switch (pnmh->code) { case PSN_SETACTIVE: PropSheet_SetWizButtons(pnmh->hwndFrom, PSWIZB_BACK | PSWIZB_FINISH); SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0); TraceLeaveValue(TRUE); case PSN_WIZFINISH: { // Read in the local group name CUserInfo::GROUPPSEUDONYM gs; GetSelectedGroup(hwnd, m_pUserInfo->m_szGroups, ARRAYSIZE(m_pUserInfo->m_szGroups), &gs); // Don't close wizard by default LONG_PTR finishResult = (LONG_PTR) hwnd; SetCursor(LoadCursor(NULL, IDC_WAIT)); if (SUCCEEDED(m_pUserInfo->Create(hwnd, gs))) { m_pUserInfo->m_fHaveExtraUserInfo = FALSE; // Close wizard finishResult = 0; } SetWindowLongPtr(hwnd, DWLP_MSGRESULT, finishResult); TraceLeaveValue(TRUE); } } TraceLeaveValue(FALSE); } /** CGroupPropertyPage Implementation **/ INT_PTR CGroupPropertyPage::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_INITDIALOG, OnInitDialog); HANDLE_MSG(hwndDlg, WM_NOTIFY, OnNotify); HANDLE_MSG(hwndDlg, WM_COMMAND, OnCommand); } return FALSE; } BOOL CGroupPropertyPage::OnNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh) { BOOL fReturn = FALSE; switch(pnmh->code) { case PSN_APPLY: { // Check to see if the group needs updating on Apply TCHAR szTemp[MAX_GROUP + 1]; // Read in the local group name CUserInfo::GROUPPSEUDONYM gs; GetSelectedGroup(hwnd, szTemp, ARRAYSIZE(szTemp), &gs); if (StrCmp(szTemp, m_pUserInfo->m_szGroups) != 0) { HRESULT hr = m_pUserInfo->UpdateGroup(hwnd, szTemp, gs); if (SUCCEEDED(hr)) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_NOERROR); } else { TCHAR szDomainUser[MAX_DOMAIN + MAX_USER + 2]; MakeDomainUserString(m_pUserInfo->m_szDomain, m_pUserInfo->m_szUsername, szDomainUser, ARRAYSIZE(szDomainUser)); ::DisplayFormatMessage(hwnd, IDS_USR_APPLET_CAPTION, IDS_USR_UPDATE_GROUP_ERROR, MB_ICONERROR | MB_OK, szDomainUser); SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); } } } fReturn = TRUE; break; default: fReturn = FALSE; break; } TraceLeaveValue(fReturn); }