windows-nt/Source/XPSP1/NT/net/ias/mmc/nap/enumcondedit.cpp
2020-09-26 16:20:57 +08:00

592 lines
14 KiB
C++

/****************************************************************************************
* NAME: EnumCondEdit.cpp
*
* CLASS: CEnumConditionEditor
*
* OVERVIEW
*
* Internet Authentication Server:
* This dialog box is used to edit enum-typed editor
*
* e.x. attr = <value1>\|<value2>
*
*
* 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;
}