Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
MFC.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Frameworks/StroikaPreComp.h"
5
6#include <climits>
7
8#if qStroika_HasComponent_ATLMFC
9
10#include <afxext.h>
11
12DISABLE_COMPILER_MSC_WARNING_START (5054)
13#include <afxole.h>
14DISABLE_COMPILER_MSC_WARNING_END (5054)
15
16#include "MFC.h"
17
18#if qSupportDrawTextGetTextExtent
19
20#include "SimpleTextImager.h"
21#include "SimpleTextStore.h"
22#include "WordWrappedTextImager.h"
23
24#endif
25
26using namespace Stroika::Foundation;
27
28using namespace Stroika::Frameworks::Led;
29using namespace Stroika::Frameworks::Led::Platform;
30
31#if qLedAssertsDefaultToMFCAsserts && qStroika_Foundation_Debug_AssertionsChecked
32static class OneTimeLedMFCAssertionFunctionSetter {
33public:
34 static void MFCAssertionHandler (const char* fileName, int lineNum)
35 {
36 ::AfxAssertFailedLine (fileName, lineNum);
37 }
38 OneTimeLedMFCAssertionFunctionSetter ()
39 {
40 Led_SetAssertionHandler (MFCAssertionHandler);
41 }
42} sOneTimeLedMFCAssertionFunctionSetter;
43#endif
44
45CompileTimeFlagChecker_SOURCE (Stroika::Frameworks::Led::Platform, qMFCRequiresCWndLeftmostBaseClass, qMFCRequiresCWndLeftmostBaseClass);
46
47#if qProvideLedStubsForOLEACCDLL
48/*
49 ********************************************************************************
50 ******************************** OLEACC.DLL ************************************
51 ********************************************************************************
52 */
53STDAPI CreateStdAccessibleObject (HWND hwnd, LONG idObject, REFIID riid, void** ppvObject)
54{
55 HINSTANCE oleACCDLL = ::LoadLibrary (_T ("OLEACC.dll"));
56 HRESULT hr = E_FAIL;
57 if (oleACCDLL != NULL) {
58 HRESULT (WINAPI * pCreateStdAccessibleObject)
59 (HWND, LONG, REFIID, void**) =
60 (HRESULT (WINAPI*) (HWND, LONG, REFIID, void**)) (::GetProcAddress (oleACCDLL, "CreateStdAccessibleObject"));
61 if (pCreateStdAccessibleObject != NULL) {
62 hr = (pCreateStdAccessibleObject)(hwnd, idObject, riid, ppvObject);
63 }
64 Verify (::FreeLibrary (oleACCDLL));
65 }
66 return hr;
67}
68
69STDAPI AccessibleObjectFromWindow (HWND hwnd, DWORD dwId, REFIID riid, void** ppvObject)
70{
71 HINSTANCE oleACCDLL = ::LoadLibrary (_T ("OLEACC.dll"));
72 HRESULT hr = E_FAIL;
73 if (oleACCDLL != NULL) {
74 HRESULT (WINAPI * pAccessibleObjectFromWindow)
75 (HWND, DWORD, REFIID, void**) =
76 (HRESULT (WINAPI*) (HWND, DWORD, REFIID, void**)) (::GetProcAddress (oleACCDLL, "AccessibleObjectFromWindow"));
77 if (pAccessibleObjectFromWindow != NULL) {
78 hr = (pAccessibleObjectFromWindow)(hwnd, dwId, riid, ppvObject);
79 }
80 Verify (::FreeLibrary (oleACCDLL));
81 }
82 return hr;
83}
84
85STDAPI_ (LRESULT)
86LresultFromObject (REFIID riid, WPARAM wParam, LPUNKNOWN punk)
87{
88 HINSTANCE oleACCDLL = ::LoadLibrary (_T ("OLEACC.dll"));
89 HRESULT hr = E_FAIL;
90 if (oleACCDLL != NULL) {
91 LRESULT (WINAPI * pLresultFromObject)
92 (REFIID, WPARAM, LPUNKNOWN) = (LRESULT (WINAPI*) (REFIID, WPARAM, LPUNKNOWN)) (::GetProcAddress (oleACCDLL, "LresultFromObject"));
93 if (pLresultFromObject != NULL) {
94 hr = (pLresultFromObject)(riid, wParam, punk);
95 }
96 Verify (::FreeLibrary (oleACCDLL));
97 }
98 return hr;
99}
100#endif
101
102/*
103 ********************************************************************************
104 ******************** Led_MFCReaderDAndDFlavorPackage ***************************
105 ********************************************************************************
106 */
107Led_MFCReaderDAndDFlavorPackage::Led_MFCReaderDAndDFlavorPackage (COleDataObject* dataObject)
109 , fDataObject (dataObject)
110{
111 RequireNotNull (dataObject);
112}
113
114bool Led_MFCReaderDAndDFlavorPackage::GetFlavorAvailable (Led_ClipFormat clipFormat) const
115{
116 AssertNotNull (fDataObject);
117 return fDataObject->IsDataAvailable (clipFormat);
118}
119
120size_t Led_MFCReaderDAndDFlavorPackage::GetFlavorSize (Led_ClipFormat clipFormat) const
121{
122 // is there some more efficient way todo this? - LGP 960410
123 HGLOBAL hObj = fDataObject->GetGlobalData (clipFormat);
124 if (hObj == NULL) {
125 // Some D&D sources - e.g. "Character Map" application on WinXP - return NULL for GetGlobalData()
126 // UNLESS you pass along the full FORMATC. No idea why... SPR#1146
127 FORMATETC formatC;
128 fDataObject->BeginEnumFormats ();
129 while (fDataObject->GetNextFormat (&formatC)) {
130 if (formatC.cfFormat == clipFormat) {
131 hObj = fDataObject->GetGlobalData (clipFormat, &formatC);
132 }
133 }
134 }
135 if (hObj == NULL) {
136 return 0;
137 }
138 size_t result = ::GlobalSize (hObj);
139 ::GlobalFree (hObj);
140 return result;
141}
142
143size_t Led_MFCReaderDAndDFlavorPackage::ReadFlavorData (Led_ClipFormat clipFormat, size_t bufSize, void* buf) const
144{
145 HGLOBAL hObj = fDataObject->GetGlobalData (clipFormat);
146 if (hObj == NULL) {
147 // Some D&D sources - e.g. "Character Map" application on WinXP - return NULL for GetGlobalData()
148 // UNLESS you pass along the full FORMATC. No idea why... SPR#1146
149 FORMATETC formatC;
150 fDataObject->BeginEnumFormats ();
151 while (fDataObject->GetNextFormat (&formatC)) {
152 if (formatC.cfFormat == clipFormat) {
153 hObj = fDataObject->GetGlobalData (clipFormat, &formatC);
154 }
155 }
156 }
157 size_t sizeCopied = 0;
158 if (hObj != NULL) {
159 size_t realSize = ::GlobalSize (hObj);
160 sizeCopied = min (realSize, bufSize);
161 void* p = ::GlobalLock (hObj);
162 if (p != nullptr and sizeCopied != 0) {
163 (void)::memcpy (buf, p, sizeCopied);
164 }
165 ::GlobalUnlock (hObj);
166 ::GlobalFree (hObj);
167 }
168 Ensure (sizeCopied <= bufSize);
169 return sizeCopied;
170}
171
172COleDataObject* Led_MFCReaderDAndDFlavorPackage::GetOleDataObject () const
173{
174 return fDataObject;
175}
176
177/*
178 ********************************************************************************
179 ******************** Led_MFCWriterDAndDFlavorPackage ***************************
180 ********************************************************************************
181 */
182Led_MFCWriterDAndDFlavorPackage::Led_MFCWriterDAndDFlavorPackage (COleDataSource* dataObject)
184 , fDataObject (dataObject)
185{
186 RequireNotNull (dataObject);
187}
188
189void Led_MFCWriterDAndDFlavorPackage::AddFlavorData (Led_ClipFormat clipFormat, size_t bufSize, const void* buf)
190{
191 HGLOBAL dataHandle = ::GlobalAlloc (GMEM_DDESHARE, bufSize);
192 Execution::ThrowIfNull (dataHandle);
193 char* lockedMem = (char*)::GlobalLock (dataHandle);
194 AssertNotNull (lockedMem);
195 (void)::memcpy (lockedMem, buf, bufSize);
196 ::GlobalUnlock (lockedMem);
197 fDataObject->CacheGlobalData (clipFormat, dataHandle);
198
199 // Note we needn't delete 'dataHandle' cuz puts the handle into a
200 // stgMedium, and on desctuction of ole data source, it calls stgfree(or some such)
201 // which appears to delte the global handle...
202 // LGP 960412
203}
204
205COleDataSource* Led_MFCWriterDAndDFlavorPackage::GetOleDataSource () const
206{
207 return fDataObject;
208}
209
210/*
211 ********************************************************************************
212 ***************************** MFC_CommandNumberMapping *************************
213 ********************************************************************************
214 */
215MFC_CommandNumberMapping::MFC_CommandNumberMapping ()
216{
217 AddAssociation (ID_EDIT_UNDO, TextInteractor::kUndo_CmdID);
218 AddAssociation (ID_EDIT_REDO, TextInteractor::kRedo_CmdID);
219 AddAssociation (ID_EDIT_SELECT_ALL, TextInteractor::kSelectAll_CmdID);
220 AddAssociation (ID_EDIT_CUT, TextInteractor::kCut_CmdID);
221 AddAssociation (ID_EDIT_COPY, TextInteractor::kCopy_CmdID);
222 AddAssociation (ID_EDIT_PASTE, TextInteractor::kPaste_CmdID);
223 AddAssociation (ID_EDIT_CLEAR, TextInteractor::kClear_CmdID);
224 AddAssociation (ID_EDIT_FIND, TextInteractor::kFind_CmdID);
225}
226
227/*
228 ********************************************************************************
229 ****************************** Led_MFC_TmpCmdUpdater ***************************
230 ********************************************************************************
231 */
232Led_MFC_TmpCmdUpdater::CommandNumber Led_MFC_TmpCmdUpdater::GetCmdID () const
233{
234 return fCmdNum;
235}
236
237bool Led_MFC_TmpCmdUpdater::GetEnabled () const
238{
239 return fEnabled;
240}
241
242void Led_MFC_TmpCmdUpdater::SetEnabled (bool enabled)
243{
244 EnsureNotNull (fCmdUI);
245 fCmdUI->Enable (enabled);
246 fEnabled = enabled;
247}
248
249void Led_MFC_TmpCmdUpdater::SetChecked (bool checked)
250{
251 EnsureNotNull (fCmdUI);
252 fCmdUI->SetCheck (checked);
253}
254
255void Led_MFC_TmpCmdUpdater::SetText (const Characters::SDKChar* text)
256{
257 EnsureNotNull (fCmdUI);
258 fCmdUI->SetText (text);
259}
260
261#if qSupportDrawTextGetTextExtent
262/*
263@METHOD: Led_GetTextExtent
264@DESCRIPTION: <p>Instantiate @'Led_GetTextExtent<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>.
265 <p>See also @'qSupportDrawTextGetTextExtent',
266 @'Led_DrawText',
267 @'Led_GetTextExtent<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>'.</p>
268*/
269CSize Led_GetTextExtent (CDC* cdc, const Led_tString& text, CRect r, bool wordWrap)
270{
271 return Led_GetTextExtent<WordWrappedTextImager, SimpleTextImager, SimpleTextStore> (cdc, text, r, wordWrap);
272}
273
274/*
275@METHOD: Led_DrawText
276@DESCRIPTION: <p>Instantiate @'Led_DrawText<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>.</p>
277 <p>See also @'qSupportDrawTextGetTextExtent',
278 @'Led_GetTextExtent',
279 @'Led_DrawText<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>'.</p>
280*/
281void Led_DrawText (CDC* cdc, const Led_tString& text, CRect r, bool wordWrap)
282{
283 Led_DrawText<WordWrappedTextImager, SimpleTextImager, SimpleTextStore> (cdc, text, r, wordWrap);
284}
285#endif
286
287#endif
#define AssertNotNull(p)
Definition Assertions.h:333
#define EnsureNotNull(p)
Definition Assertions.h:340
#define RequireNotNull(p)
Definition Assertions.h:347
#define Verify(c)
Definition Assertions.h:419
#define CompileTimeFlagChecker_SOURCE(NS_PREFIX, NAME, VALUE)
conditional_t< qTargetPlatformSDKUseswchar_t, wchar_t, char > SDKChar
Definition SDKChar.h:71