1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
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 */
|