summaryrefslogtreecommitdiff
path: root/utils/sapi51/include/spuihelp.h
diff options
context:
space:
mode:
Diffstat (limited to 'utils/sapi51/include/spuihelp.h')
-rw-r--r--utils/sapi51/include/spuihelp.h253
1 files changed, 253 insertions, 0 deletions
diff --git a/utils/sapi51/include/spuihelp.h b/utils/sapi51/include/spuihelp.h
new file mode 100644
index 0000000..ec8d16f
--- /dev/null
+++ b/utils/sapi51/include/spuihelp.h
@@ -0,0 +1,253 @@
+/*******************************************************************************
+* 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 <sapi.h>
+#endif
+
+#ifndef SPError_h
+#include <SPError.h>
+#endif
+
+#ifndef SPDebug_h
+#include <SPDebug.h>
+#endif
+
+#ifndef SPHelper_h
+#include <SPHelper.h>
+#endif
+
+#ifndef __ATLBASE_H__
+#include <ATLBASE.h>
+#endif
+
+#ifndef __ATLCONV_H__
+#include <ATLCONV.H>
+#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<IEnumSpObjectTokens> 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 */