Stroika Library 3.0d25
 
Loading...
Searching...
No Matches
MFC.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. 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
12#include <afxole.h>
13
14#include "MFC.h"
15
16#if qSupportDrawTextGetTextExtent
17
18#include "Stroika/Frameworks/Led/SimpleTextImager.h"
19#include "Stroika/Frameworks/Led/SimpleTextStore.h"
20#include "Stroika/Frameworks/Led/WordWrappedTextImager.h"
21
22#endif
23
24using namespace Stroika::Foundation;
25
26using namespace Stroika::Frameworks::Led;
27using namespace Stroika::Frameworks::Led::Platform;
28
29#if qStroika_Frameworks_Led_AssertsDefaultToMFCAsserts && qStroika_Foundation_Debug_AssertionsChecked
30static class OneTimeLedMFCAssertionFunctionSetter {
31public:
32 static void MFCAssertionHandler (const char* fileName, int lineNum)
33 {
34 ::AfxAssertFailedLine (fileName, lineNum);
35 }
36 OneTimeLedMFCAssertionFunctionSetter ()
37 {
38 Led_SetAssertionHandler (MFCAssertionHandler);
39 }
40} sOneTimeLedMFCAssertionFunctionSetter;
41#endif
42
43CompileTimeFlagChecker_SOURCE (Stroika::Frameworks::Led::Platform, qStroika_Frameworks_Led_MFCRequiresCWndLeftmostBaseClass,
44 qStroika_Frameworks_Led_MFCRequiresCWndLeftmostBaseClass);
45
46/*
47 ********************************************************************************
48 ******************** Led_MFCReaderDAndDFlavorPackage ***************************
49 ********************************************************************************
50 */
51Led_MFCReaderDAndDFlavorPackage::Led_MFCReaderDAndDFlavorPackage (COleDataObject* dataObject)
53 , fDataObject (dataObject)
54{
55 RequireNotNull (dataObject);
56}
57
58bool Led_MFCReaderDAndDFlavorPackage::GetFlavorAvailable (Led_ClipFormat clipFormat) const
59{
60 AssertNotNull (fDataObject);
61 return fDataObject->IsDataAvailable (clipFormat);
62}
63
64size_t Led_MFCReaderDAndDFlavorPackage::GetFlavorSize (Led_ClipFormat clipFormat) const
65{
66 // is there some more efficient way todo this? - LGP 960410
67 HGLOBAL hObj = fDataObject->GetGlobalData (clipFormat);
68 if (hObj == NULL) {
69 // Some D&D sources - e.g. "Character Map" application on WinXP - return NULL for GetGlobalData()
70 // UNLESS you pass along the full FORMATC. No idea why... SPR#1146
71 FORMATETC formatC;
72 fDataObject->BeginEnumFormats ();
73 while (fDataObject->GetNextFormat (&formatC)) {
74 if (formatC.cfFormat == clipFormat) {
75 hObj = fDataObject->GetGlobalData (clipFormat, &formatC);
76 }
77 }
78 }
79 if (hObj == NULL) {
80 return 0;
81 }
82 size_t result = ::GlobalSize (hObj);
83 ::GlobalFree (hObj);
84 return result;
85}
86
87size_t Led_MFCReaderDAndDFlavorPackage::ReadFlavorData (Led_ClipFormat clipFormat, size_t bufSize, void* buf) const
88{
89 HGLOBAL hObj = fDataObject->GetGlobalData (clipFormat);
90 if (hObj == NULL) {
91 // Some D&D sources - e.g. "Character Map" application on WinXP - return NULL for GetGlobalData()
92 // UNLESS you pass along the full FORMATC. No idea why... SPR#1146
93 FORMATETC formatC;
94 fDataObject->BeginEnumFormats ();
95 while (fDataObject->GetNextFormat (&formatC)) {
96 if (formatC.cfFormat == clipFormat) {
97 hObj = fDataObject->GetGlobalData (clipFormat, &formatC);
98 }
99 }
100 }
101 size_t sizeCopied = 0;
102 if (hObj != NULL) {
103 size_t realSize = ::GlobalSize (hObj);
104 sizeCopied = min (realSize, bufSize);
105 void* p = ::GlobalLock (hObj);
106 if (p != nullptr and sizeCopied != 0) {
107 (void)::memcpy (buf, p, sizeCopied);
108 }
109 ::GlobalUnlock (hObj);
110 ::GlobalFree (hObj);
111 }
112 Ensure (sizeCopied <= bufSize);
113 return sizeCopied;
114}
115
116COleDataObject* Led_MFCReaderDAndDFlavorPackage::GetOleDataObject () const
117{
118 return fDataObject;
119}
120
121/*
122 ********************************************************************************
123 ******************** Led_MFCWriterDAndDFlavorPackage ***************************
124 ********************************************************************************
125 */
126Led_MFCWriterDAndDFlavorPackage::Led_MFCWriterDAndDFlavorPackage (COleDataSource* dataObject)
128 , fDataObject (dataObject)
129{
130 RequireNotNull (dataObject);
131}
132
133void Led_MFCWriterDAndDFlavorPackage::AddFlavorData (Led_ClipFormat clipFormat, size_t bufSize, const void* buf)
134{
135 HGLOBAL dataHandle = ::GlobalAlloc (GMEM_DDESHARE, bufSize);
136 Execution::ThrowIfNull (dataHandle);
137 char* lockedMem = (char*)::GlobalLock (dataHandle);
138 AssertNotNull (lockedMem);
139 (void)::memcpy (lockedMem, buf, bufSize);
140 ::GlobalUnlock (lockedMem);
141 fDataObject->CacheGlobalData (clipFormat, dataHandle);
142
143 // Note we needn't delete 'dataHandle' cuz puts the handle into a
144 // stgMedium, and on desctuction of ole data source, it calls stgfree(or some such)
145 // which appears to delte the global handle...
146 // LGP 960412
147}
148
149COleDataSource* Led_MFCWriterDAndDFlavorPackage::GetOleDataSource () const
150{
151 return fDataObject;
152}
153
154/*
155 ********************************************************************************
156 ***************************** MFC_CommandNumberMapping *************************
157 ********************************************************************************
158 */
159MFC_CommandNumberMapping::MFC_CommandNumberMapping ()
160{
161 AddAssociation (ID_EDIT_UNDO, TextInteractor::kUndo_CmdID);
162 AddAssociation (ID_EDIT_REDO, TextInteractor::kRedo_CmdID);
163 AddAssociation (ID_EDIT_SELECT_ALL, TextInteractor::kSelectAll_CmdID);
164 AddAssociation (ID_EDIT_CUT, TextInteractor::kCut_CmdID);
165 AddAssociation (ID_EDIT_COPY, TextInteractor::kCopy_CmdID);
166 AddAssociation (ID_EDIT_PASTE, TextInteractor::kPaste_CmdID);
167 AddAssociation (ID_EDIT_CLEAR, TextInteractor::kClear_CmdID);
168 AddAssociation (ID_EDIT_FIND, TextInteractor::kFind_CmdID);
169}
170
171/*
172 ********************************************************************************
173 ****************************** Led_MFC_TmpCmdUpdater ***************************
174 ********************************************************************************
175 */
176Led_MFC_TmpCmdUpdater::CommandNumber Led_MFC_TmpCmdUpdater::GetCmdID () const
177{
178 return fCmdNum;
179}
180
181bool Led_MFC_TmpCmdUpdater::GetEnabled () const
182{
183 return fEnabled;
184}
185
186void Led_MFC_TmpCmdUpdater::SetEnabled (bool enabled)
187{
188 EnsureNotNull (fCmdUI);
189 fCmdUI->Enable (enabled);
190 fEnabled = enabled;
191}
192
193void Led_MFC_TmpCmdUpdater::SetChecked (bool checked)
194{
195 EnsureNotNull (fCmdUI);
196 fCmdUI->SetCheck (checked);
197}
198
199void Led_MFC_TmpCmdUpdater::SetText (const Characters::SDKChar* text)
200{
201 EnsureNotNull (fCmdUI);
202 fCmdUI->SetText (text);
203}
204
205#if qSupportDrawTextGetTextExtent
206/*
207@METHOD: Led_GetTextExtent
208@DESCRIPTION: <p>Instantiate @'Led_GetTextExtent<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>.
209 <p>See also @'qSupportDrawTextGetTextExtent',
210 @'Led_DrawText',
211 @'Led_GetTextExtent<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>'.</p>
212*/
213CSize Led_GetTextExtent (CDC* cdc, const Led_tString& text, CRect r, bool wordWrap)
214{
215 return Led_GetTextExtent<WordWrappedTextImager, SimpleTextImager, SimpleTextStore> (cdc, text, r, wordWrap);
216}
217
218/*
219@METHOD: Led_DrawText
220@DESCRIPTION: <p>Instantiate @'Led_DrawText<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>.</p>
221 <p>See also @'qSupportDrawTextGetTextExtent',
222 @'Led_GetTextExtent',
223 @'Led_DrawText<WORDWRAPPEDTEXTIMAGER,SIMPLETEXTIMAGER,TEXTSTORE>'.</p>
224*/
225void Led_DrawText (CDC* cdc, const Led_tString& text, CRect r, bool wordWrap)
226{
227 Led_DrawText<WordWrappedTextImager, SimpleTextImager, SimpleTextStore> (cdc, text, r, wordWrap);
228}
229#endif
230
231#endif
#define AssertNotNull(p)
Definition Assertions.h:336
#define EnsureNotNull(p)
Definition Assertions.h:343
#define RequireNotNull(p)
Definition Assertions.h:350
#define CompileTimeFlagChecker_SOURCE(NS_PREFIX, NAME, VALUE)
conditional_t< qStroika_Foundation_Characters_SDKUseswchar_t, wchar_t, char > SDKChar
Definition SDKChar.h:77