/**************************************************************************************** * NAME: EnumCondEdit.cpp * * CLASS: CEnumConditionEditor * * OVERVIEW * * Internet Authentication Server: * This dialog box is used to edit enum-typed editor * * e.x. attr = \| * * * Copyright (C) Microsoft Corporation, 1998 - 1999 . All Rights Reserved. * * History: * 1/27/98 Created by Byao (using ATL wizard) * *****************************************************************************************/ #include "precompiled.h" #include "EnumCondEdit.h" //+--------------------------------------------------------------------------- // // Function: CEnumConditionEditor // // Class: CEnumConditionEditor // // Synopsis: constructor for CEnumConditionEditor. // // Arguments: LPTSTR pszAttrName - The attribute that needs to be edited // // Returns: Nothing // // History: Created byao 1/30/98 6:14:32 PM // //+--------------------------------------------------------------------------- CEnumConditionEditor::CEnumConditionEditor() { } //+--------------------------------------------------------------------------- // // Function: OnInitDialog // // Class: CEnumConditionEditor // // Synopsis: initialize the dialog box // // Arguments: UINT uMsg - // WPARAM wParam - // LPARAM lParam - // BOOL& bHandled - // // Returns: LRESULT - // // History: Created Header 1/30/98 6:15:41 PM // //+--------------------------------------------------------------------------- LRESULT CEnumConditionEditor::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { TRACE_FUNCTION("CEnumConditionEditor::OnInitDialog"); LVCOLUMN lvCol; lvCol.mask = LVCF_FMT | LVCF_WIDTH ; lvCol.fmt = LVCFMT_LEFT; lvCol.cx = 200; // will readjust with later in the program SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_INSERTCOLUMN, 1, (LPARAM) &lvCol ); SendDlgItemMessage(IDC_LIST_ENUMCOND_SELECTION, LVM_INSERTCOLUMN, 1, (LPARAM) &lvCol ); // // populate the possible multiple selections // PopulateSelections(); // change the title to the name of the attribute SetWindowText(m_strAttrName); return 1; // Let the system set the focus } LRESULT CEnumConditionEditor::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { TRACE_FUNCTION("CEnumConditionEditor::OnOK"); m_pSelectedList->clear(); TCHAR buffer[MAX_PATH * 2]; // // get the current selection index in the source list box // // LVM_GETSELECTIONMARK int iTotal = SendDlgItemMessage(IDC_LIST_ENUMCOND_SELECTION, LVM_GETITEMCOUNT, 0, 0); // put the text into the list for( int i = 0; i < iTotal; i++) { LVITEM lvItem; lvItem.mask = 0; lvItem.iSubItem = 0; lvItem.iItem = i; lvItem.pszText = buffer; lvItem.cchTextMax = MAX_PATH * 2; if (SendDlgItemMessage(IDC_LIST_ENUMCOND_SELECTION, LVM_GETITEMTEXT, i, (LPARAM)&lvItem ) > 0) { try { CComBSTR bstrValue = buffer; m_pSelectedList->push_back( bstrValue ); } catch (...) { throw; } } } EndDialog(wID); return 0; } LRESULT CEnumConditionEditor::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { TRACE_FUNCTION("CEnumConditionEditor::OnCancel"); EndDialog(wID); return 0; } //+--------------------------------------------------------------------------- // // Function: OnAdd // // Class: CEnumConditionEditor // // Synopsis: Add a selected value from the "Choices" list to "Selection" list // // Arguments: WORD wNotifyCode - notify code for this WM_COMMAND msg // WORD wID - ID of the control // HWND hWndCtl - Window Handle for this msg // BOOL& bHandled - whether it's handled or not // // Returns: LRESULT - // S_FALSE: failure // 0: succeed // // History: Created byao 1/30/98 3:47:33 PM // //+--------------------------------------------------------------------------- LRESULT CEnumConditionEditor::OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { TRACE_FUNCTION("CEnumConditionEditor::OnAdd"); // // see if the current focus is in "Selection" listbox // return SwapSelection(IDC_LIST_ENUMCOND_CHOICE, IDC_LIST_ENUMCOND_SELECTION); } //+--------------------------------------------------------------------------- // // Function: OnDelete // // Class: CEnumConditionEditor // // Synopsis: Delete a selected value from the "Selection" list // and move it back to "Choices" list // // Arguments: WORD wNotifyCode - notify code for this WM_COMMAND msg // WORD wID - ID of the control // HWND hWndCtl - Window Handle for this msg // BOOL& bHandled - whether it's handled or not // // Returns: LRESULT - // S_FALSE: failure // 0: succeed // // History: Created byao 1/30/98 3:47:33 PM //+--------------------------------------------------------------------------- LRESULT CEnumConditionEditor::OnDelete(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { TRACE_FUNCTION("CEnumConditionEditor::OnDelete"); return SwapSelection(IDC_LIST_ENUMCOND_SELECTION, IDC_LIST_ENUMCOND_CHOICE); } //+--------------------------------------------------------------------------- // // Function: OnChoiceDblclk // // Class: CEnumConditionEditor // // Synopsis: Double click on the "Choice" list --> move it to selection list // // Arguments: WORD wNotifyCode - notify code for this WM_COMMAND msg // WORD wID - ID of the control // HWND hWndCtl - Window Handle for this msg // BOOL& bHandled - whether it's handled or not // // Returns: LRESULT - // S_FALSE: failure // 0: succeed // // History: Created byao 4/7/98 3:47:33 PM //+--------------------------------------------------------------------------- LRESULT CEnumConditionEditor::OnChoiceDblclk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { TRACE_FUNCTION("CEnumConditionEditor::OnChoiceDblclk"); return SwapSelection(IDC_LIST_ENUMCOND_CHOICE, IDC_LIST_ENUMCOND_SELECTION); } //+--------------------------------------------------------------------------- // // Function: OnSelectionDblclk // // Class: CEnumConditionEditor // // Synopsis: Double click on the "Selection" list --> move it back to choice list // // Arguments: WORD wNotifyCode - notify code for this WM_COMMAND msg // WORD wID - ID of the control // HWND hWndCtl - Window Handle for this msg // BOOL& bHandled - whether it's handled or not // // Returns: LRESULT - // S_FALSE: failure // 0: succeed // // History: Created byao 4/7/98 3:47:33 PM //+--------------------------------------------------------------------------- LRESULT CEnumConditionEditor::OnSelectionDblclk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { TRACE_FUNCTION("CEnumConditionEditor::OnSelectionDblclk"); return SwapSelection(IDC_LIST_ENUMCOND_SELECTION, IDC_LIST_ENUMCOND_CHOICE); } //+--------------------------------------------------------------------------- // // Function: PopulateSelections // // Class: CEnumConditionEditor // // Synopsis: Populate the multiple selection list // // Arguments: None // // Returns: BOOL - // // History: Created byao 1/30/98 3:24:22 PM // //+--------------------------------------------------------------------------- BOOL CEnumConditionEditor::PopulateSelections() { TRACE_FUNCTION("CEnumConditionEditor::PopulateSelections"); LONG lIndex; HRESULT hr; LONG lMaxWidth = 0; LONG tempSize; LVITEM lvItem; lvItem.mask = LVIF_TEXT | LVIF_PARAM; CComQIPtr< IIASEnumerableAttributeInfo, &IID_IIASEnumerableAttributeInfo > spEnumerableAttributeInfo( m_spAttributeInfo ); _ASSERTE( spEnumerableAttributeInfo ); LONG lSize; LONG lTotalChoices; hr = spEnumerableAttributeInfo->get_CountEnumerateDescription( &lSize ); lTotalChoices = lSize; _ASSERTE( SUCCEEDED( hr ) ); // set item count // LVM_SETITEMCOUNT SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_SETITEMCOUNT, lSize + 1, (LPARAM) 0 ); SendDlgItemMessage(IDC_LIST_ENUMCOND_SELECTION, LVM_SETITEMCOUNT, lSize + 1, (LPARAM) 0 ); for (lIndex=0; lIndex < lSize; lIndex++) { CComBSTR bstrDescription; hr = spEnumerableAttributeInfo->get_EnumerateDescription( lIndex, &bstrDescription ); _ASSERTE( SUCCEEDED( hr ) ); lvItem.mask = LVIF_PARAM; lvItem.pszText = bstrDescription; lvItem.lParam = lIndex; lvItem.iItem = lIndex; lvItem.iSubItem = 0; int lvItemIndex = SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_INSERTITEM, 0, (LPARAM) &lvItem ); lvItem.mask = LVIF_TEXT; lvItem.iItem = lvItemIndex; lvItem.iSubItem = 0; SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_SETITEMTEXT, lvItemIndex, (LPARAM) &lvItem ); tempSize = SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_GETSTRINGWIDTH, 0, (LPARAM) (BSTR)bstrDescription ); if(tempSize> lMaxWidth) lMaxWidth = tempSize; } lMaxWidth += 20; // set the width SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_SETCOLUMNWIDTH, 0, MAKELPARAM(lMaxWidth, 0) ); SendDlgItemMessage(IDC_LIST_ENUMCOND_SELECTION, LVM_SETCOLUMNWIDTH, 0, MAKELPARAM(lMaxWidth, 0) ); // now populate the pre-selected values; LVFINDINFO lvFindInfo; lvFindInfo.flags = LVFI_STRING; lvFindInfo.psz = NULL; for (lIndex=0; lIndex < m_pSelectedList->size(); lIndex++) { CComBSTR bstrTemp = m_pSelectedList->at(lIndex); lvItem.mask = LVIF_PARAM; lvItem.pszText = bstrTemp; lvItem.lParam = lIndex; lvItem.iItem = lIndex; lvItem.iSubItem = 0; int lvItemIndex = SendDlgItemMessage(IDC_LIST_ENUMCOND_SELECTION, LVM_INSERTITEM, 0, (LPARAM) &lvItem ); lvItem.mask = LVIF_TEXT; lvItem.iItem = lvItemIndex; lvItem.iSubItem = 0; SendDlgItemMessage(IDC_LIST_ENUMCOND_SELECTION, LVM_SETITEMTEXT, lvItemIndex, (LPARAM) &lvItem ); // remove the item from choice // find it and remove it lvFindInfo.psz = bstrTemp; int iDelIndex = SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_FINDITEM, -1, (LPARAM) &lvFindInfo ); if(iDelIndex != -1) SendDlgItemMessage(IDC_LIST_ENUMCOND_CHOICE, LVM_DELETEITEM, iDelIndex, (LPARAM) 0 ); } // for if(m_pSelectedList->size() > 0) // set default selection -- first one ListView_SetItemState(GetDlgItem(IDC_LIST_ENUMCOND_SELECTION), 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); if(lTotalChoices > m_pSelectedList->size()) // still some in availableset default selection -- first one ListView_SetItemState(GetDlgItem(IDC_LIST_ENUMCOND_CHOICE), 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); return TRUE; } //+--------------------------------------------------------------------------- // // Function: SwapSelection // // Class: CEnumConditionEditor // // Synopsis: move a selected item from one list box to another list box // and move it back to "Choices" list // // Arguments: int iSource - source list box // int iDest - destination list box // // Returns: LRESULT - // S_FALSE: failure // S_OK: succeed // // History: Created byao 1/30/98 3:47:33 PM //+--------------------------------------------------------------------------- LRESULT CEnumConditionEditor::SwapSelection(int iSource, int iDest) { TRACE_FUNCTION("CEnumConditionEditor::SwapSelection"); LRESULT lErrCode; TCHAR buffer[MAX_PATH * 2]; // // get the current selection index in the source list box // // LVM_GETSELECTIONMARK int iTotalSel = SendDlgItemMessage(iSource, LVM_GETSELECTEDCOUNT, 0, 0 ); int iCurSel = SendDlgItemMessage(iSource, LVM_GETSELECTIONMARK, 0, 0 ); // no selection if(iCurSel == -1 || iTotalSel < 1) return S_OK; LVITEM lvItem; lvItem.mask = 0; lvItem.iSubItem = 0; lvItem.iItem = iCurSel; lvItem.pszText = buffer; lvItem.cchTextMax = MAX_PATH * 2; // since we only allow single selection if (SendDlgItemMessage(iSource, LVM_GETITEMTEXT, iCurSel, (LPARAM)&lvItem ) > 0) { // remove the item from source SendDlgItemMessage(iSource, LVM_DELETEITEM, iCurSel, (LPARAM)&lvItem ); // add the new item in the dest list lvItem.mask = 0; lvItem.iItem = 0; lvItem.iSubItem = 0; int lvItemIndex = SendDlgItemMessage(iDest, LVM_INSERTITEM, 0, (LPARAM) &lvItem ); lvItem.mask = LVIF_TEXT; lvItem.iItem = lvItemIndex; lvItem.iSubItem = 0; SendDlgItemMessage(iDest, LVM_SETITEMTEXT, lvItemIndex, (LPARAM) &lvItem ); // total number of items int i = SendDlgItemMessage(iSource, LVM_GETITEMCOUNT, 0, 0); // select the new added on in dest ListView_SetItemState(GetDlgItem(iDest), lvItemIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); // select next item -- source if ( i > iCurSel) { ListView_SetItemState(GetDlgItem(iSource), iCurSel, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); } else if ( i > 0) { ListView_SetItemState(GetDlgItem(iSource), i - 1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); } } return S_OK; // succeed } ///////////////////////////////////////////////////////////////////////////// /*++ CEnumConditionEditor::GetHelpPath Remarks: This method is called to get the help file path within an compressed HTML document when the user presses on the Help button of a property sheet. It is an override of CIASDialog::OnGetHelpPath. --*/ ////////////////////////////////////////////////////////////////////////////// HRESULT CEnumConditionEditor::GetHelpPath( LPTSTR szHelpPath ) { TRACE_FUNCTION("CEnumCondEditor::GetHelpPath"); #if 0 // ISSUE: We seemed to have a problem with passing WCHAR's to the hhctrl.ocx // installed on this machine -- it appears to be non-unicode. lstrcpy( szHelpPath, _T("html/idh_proc_cond.htm") ); #else strcpy( (CHAR *) szHelpPath, "html/idh_proc_cond.htm" ); #endif return S_OK; }