/******************************************************************************* * SPUIHelp.h * *------------* * Description: * This is the header file for user-interface helper functions. Note that * unlike SpHelper.H, this file requires the use of ATL. *------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. *******************************************************************************/ #ifndef SPUIHelp_h #define SPUIHelp_h #ifndef __sapi_h__ #include #endif #ifndef SPError_h #include #endif #ifndef SPDebug_h #include #endif #ifndef SPHelper_h #include #endif #ifndef __ATLBASE_H__ #include #endif #ifndef __ATLCONV_H__ #include #endif /**************************************************************************** * * * ********************************************************************* RAL ***/ // // Dont call this function directly. Use SpInitTokenComboBox or SpInitTokenListBox. // inline HRESULT SpInitTokenList(UINT MsgAddString, UINT MsgSetItemData, UINT MsgSetCurSel, HWND hwnd, const WCHAR * pszCatName, const WCHAR * pszRequiredAttrib, const WCHAR * pszOptionalAttrib) { HRESULT hr; ISpObjectToken * pToken; // NOTE: Not a CComPtr! Be Careful. CComPtr cpEnum; hr = SpEnumTokens(pszCatName, pszRequiredAttrib, pszOptionalAttrib, &cpEnum); if (hr == S_OK) { bool fSetDefault = false; while (cpEnum->Next(1, &pToken, NULL) == S_OK) { CSpDynamicString dstrDesc; hr = SpGetDescription(pToken, &dstrDesc); if (SUCCEEDED(hr)) { USES_CONVERSION; LRESULT i = ::SendMessage(hwnd, MsgAddString, 0, (LPARAM)W2T(dstrDesc)); if (i == CB_ERR || i == CB_ERRSPACE) // Note: CB_ and LB_ errors are identical values... { hr = E_OUTOFMEMORY; } else { ::SendMessage(hwnd, MsgSetItemData, i, (LPARAM)pToken); if (!fSetDefault) { ::SendMessage(hwnd, MsgSetCurSel, i, 0); fSetDefault = true; } } } if (FAILED(hr)) { pToken->Release(); } } } else { hr = SPERR_NO_MORE_ITEMS; } return hr; } inline HRESULT SpInitTokenComboBox(HWND hwnd, const WCHAR * pszCatName, const WCHAR * pszRequiredAttrib = NULL, const WCHAR * pszOptionalAttrib = NULL) { return SpInitTokenList(CB_ADDSTRING, CB_SETITEMDATA, CB_SETCURSEL, hwnd, pszCatName, pszRequiredAttrib, pszOptionalAttrib); } inline HRESULT SpInitTokenListBox(HWND hwnd, const WCHAR * pszCatName, const WCHAR * pszRequiredAttrib = NULL, const WCHAR * pszOptionalAttrib = NULL) { return SpInitTokenList(LB_ADDSTRING, LB_SETITEMDATA, LB_SETCURSEL, hwnd, pszCatName, pszRequiredAttrib, pszOptionalAttrib); } // // Dont call this function directly. Use SpDestoyTokenComboBox or SpDestroyTokenListBox. // inline void SpDestroyTokenList(UINT MsgGetCount, UINT MsgGetItemData, HWND hwnd) { LRESULT c = ::SendMessage(hwnd, MsgGetCount, 0, 0); for (LRESULT i = 0; i < c; i++) { IUnknown * pUnkObj = (IUnknown *)::SendMessage(hwnd, MsgGetItemData, i, 0); if (pUnkObj) { pUnkObj->Release(); } } } inline void SpDestroyTokenComboBox(HWND hwnd) { SpDestroyTokenList(CB_GETCOUNT, CB_GETITEMDATA, hwnd); } inline void SpDestroyTokenListBox(HWND hwnd) { SpDestroyTokenList(LB_GETCOUNT, LB_GETITEMDATA, hwnd); } inline ISpObjectToken * SpGetComboBoxToken(HWND hwnd, WPARAM Index) { return (ISpObjectToken *)::SendMessage(hwnd, CB_GETITEMDATA, Index, 0); } inline ISpObjectToken * SpGetListBoxToken(HWND hwnd, WPARAM Index) { return (ISpObjectToken *)::SendMessage(hwnd, LB_GETITEMDATA, Index, 0); } inline ISpObjectToken * SpGetCurSelComboBoxToken(HWND hwnd) { LRESULT i = ::SendMessage(hwnd, CB_GETCURSEL, 0, 0); return (i == CB_ERR) ? NULL : SpGetComboBoxToken(hwnd, i); } inline ISpObjectToken * SpGetCurSelListBoxToken(HWND hwnd) { LRESULT i = ::SendMessage(hwnd, LB_GETCURSEL, 0, 0); return (i == LB_ERR) ? NULL : SpGetListBoxToken(hwnd, i); } // // Don't call this directly. Use SpUpdateCurSelComboBoxToken or SpUpdateCurSelListBoxToken // inline HRESULT SpUpdateCurSelToken(UINT MsgDelString, UINT MsgInsertString, UINT MsgGetItemData, UINT MsgSetItemData, UINT MsgGetCurSel, UINT MsgSetCurSel, HWND hwnd) { HRESULT hr = S_OK; LRESULT i = ::SendMessage(hwnd, MsgGetCurSel, 0, 0); if (i != CB_ERR) { ISpObjectToken * pToken = (ISpObjectToken *)::SendMessage(hwnd, MsgGetItemData, i, 0); CSpDynamicString dstrDesc; hr = SpGetDescription(pToken, &dstrDesc); if (SUCCEEDED(hr)) { USES_CONVERSION; ::SendMessage(hwnd, MsgDelString, i, 0); ::SendMessage(hwnd, MsgInsertString, i, (LPARAM)W2T(dstrDesc)); ::SendMessage(hwnd, MsgSetItemData, i, (LPARAM)pToken); ::SendMessage(hwnd, MsgSetCurSel, i, 0); } } return hr; } inline HRESULT SpUpdateCurSelComboBoxToken(HWND hwnd) { return SpUpdateCurSelToken(CB_DELETESTRING, CB_INSERTSTRING, CB_GETITEMDATA, CB_SETITEMDATA, CB_GETCURSEL, CB_SETCURSEL, hwnd); } inline HRESULT SpUpdateCurSelListBoxToken(HWND hwnd) { return SpUpdateCurSelToken(LB_DELETESTRING, LB_INSERTSTRING, LB_GETITEMDATA, LB_SETITEMDATA, LB_GETCURSEL, LB_SETCURSEL, hwnd); } inline HRESULT SpAddTokenToList(UINT MsgAddString, UINT MsgSetItemData, UINT MsgSetCurSel, HWND hwnd, ISpObjectToken * pToken) { CSpDynamicString dstrDesc; HRESULT hr = SpGetDescription(pToken, &dstrDesc); if (SUCCEEDED(hr)) { USES_CONVERSION; LRESULT i = ::SendMessage(hwnd, MsgAddString, 0, (LPARAM)W2T(dstrDesc)); if (i == CB_ERR || i == CB_ERRSPACE) // Note: CB_ and LB_ errors are identical values... { hr = E_OUTOFMEMORY; } else { ::SendMessage(hwnd, MsgSetItemData, i, (LPARAM)pToken); ::SendMessage(hwnd, MsgSetCurSel, i, 0); pToken->AddRef(); } } return hr; } inline HRESULT SpAddTokenToComboBox(HWND hwnd, ISpObjectToken * pToken) { return SpAddTokenToList(CB_ADDSTRING, CB_SETITEMDATA, CB_SETCURSEL, hwnd, pToken); } inline HRESULT SpAddTokenToListBox(HWND hwnd, ISpObjectToken * pToken) { return SpAddTokenToList(LB_ADDSTRING, LB_SETITEMDATA, LB_SETCURSEL, hwnd, pToken); } inline HRESULT SpDeleteCurSelToken(UINT MsgGetCurSel, UINT MsgSetCurSel, UINT MsgGetItemData, UINT MsgDeleteString, HWND hwnd) { HRESULT hr = S_OK; LRESULT i = ::SendMessage(hwnd, MsgGetCurSel, 0, 0); if (i == CB_ERR) { hr = S_FALSE; } else { ISpObjectToken * pToken = (ISpObjectToken *)::SendMessage(hwnd, MsgGetItemData, i, 0); if (pToken) { pToken->Release(); } ::SendMessage(hwnd, MsgDeleteString, i, 0); ::SendMessage(hwnd, MsgSetCurSel, i, 0); } return hr; } inline HRESULT SpDeleteCurSelComboBoxToken(HWND hwnd) { return SpDeleteCurSelToken(CB_GETCURSEL, CB_SETCURSEL, CB_GETITEMDATA, CB_DELETESTRING, hwnd); } inline HRESULT SpDeleteCurSelListBoxToken(HWND hwnd) { return SpDeleteCurSelToken(LB_GETCURSEL, CB_SETCURSEL, LB_GETITEMDATA, LB_DELETESTRING, hwnd); } #endif /* #ifndef SPUIHelp_h -- This must be the last line in the file */