Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
MFC_WordProcessor.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef _Stroika_Frameworks_Led_Platform_MFC_WordProcessor_h_
5#define _Stroika_Frameworks_Led_Platform_MFC_WordProcessor_h_ 1
6
7#include "Stroika/Frameworks/StroikaPreComp.h"
8
9/*
10@MODULE: Led_MFC_WordProcessor
11@DESCRIPTION:
12 <p>Some stuff which applies only to use of @'Led_MFC' along with @'WordProcessor'
13 classes (e.g. OLE embeddings)</p>.
14 */
15
16static_assert (qStroika_HasComponent_ATLMFC,
17 "Error: Stroika::Framework::Led::Platform MFC_WordProcessor code requires the ATLMFC feature to be set true");
18
19DISABLE_COMPILER_MSC_WARNING_START (5054)
20#include <afxole.h>
21DISABLE_COMPILER_MSC_WARNING_END (5054)
22
23#include <afxwin.h>
24#include <oleidl.h>
25
26#include <set>
27
28#include "Stroika/Frameworks/Led/Platform/MFC.h"
29#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO_RTF.h"
30#include "Stroika/Frameworks/Led/WordProcessor.h"
31
32namespace Stroika::Frameworks::Led::Platform {
33
34 /*
35 **************** MFC/WordProcessor specific Configuration variables **************
36 */
37
38/*
39 @CONFIGVAR: qSupportOLEControlEmbedding
40 @DESCRIPTION: <p>You may want to shut this off for building an OLE control itself. Or for building applications that
41 don't want to include the OLE libaries.</p>
42 <p>Turn ON by default
43 */
44#ifndef qSupportOLEControlEmbedding
45#define qSupportOLEControlEmbedding 1
46#endif
47
48#if qSupportOLEControlEmbedding
49 class Led_MFC_ControlItem;
50#endif
51
52 DISABLE_COMPILER_MSC_WARNING_START (4250) // inherits via dominance warning (Stroika::Frameworks::Led::WordProcessor::Stroika::Frameworks::Led::WordProcessor::HookLosingTextStore)
53 /*
54 @CLASS: WordProcessorCommonCommandHelper_MFC<BASECLASS>
55 @BASES: BASECLASS
56 @DESCRIPTION: <p>BASECLASS is generally @'WordProcessor'.
57 </p>
58 */
59 template <typename BASECLASS>
60 class WordProcessorCommonCommandHelper_MFC : public BASECLASS {
61 private:
62 using inherited = BASECLASS;
63
64 public:
65 WordProcessorCommonCommandHelper_MFC ();
66
67#if qSupportOLEControlEmbedding
68 protected:
69 afx_msg void OnPaint ();
70
71 protected:
72 /*
73 @CLASS: WordProcessorCommonCommandHelper_MFC<BASECLASS>::ControlItemContextInternalizer
74 @BASES: @'WordProcessor::WordProcessorFlavorPackageInternalizer'
75 @DESCRIPTION: <p>Add call to @'Led_MFC_ControlItem::DocContextDefiner' so that we can instantiate OLE embeddings using the
76 MFC mechanism.</p>
77 <p>Note - as of Led 3.0d6, and MSVC60SP3, we had to declare this here cuz I couldn't get it compiling when nested locally
78 within the MakeDefaultInternalizer () function - which would probably have been better.</p>
79 */
80 class ControlItemContextInternalizer : public WordProcessor::WordProcessorFlavorPackageInternalizer {
81 private:
82 using inherited = WordProcessor::WordProcessorFlavorPackageInternalizer;
83
84 public:
85 ControlItemContextInternalizer (COleDocument* doc, TextStore& ts, const shared_ptr<AbstractStyleDatabaseRep>& styleDatabase,
86 const shared_ptr<AbstractParagraphDatabaseRep>& paragraphDatabase,
87 const shared_ptr<HidableTextMarkerOwner>& hiddenTextDatabase)
88 : FlavorPackageInternalizer{ts}
89 , inherited{ts, styleDatabase, paragraphDatabase, hiddenTextDatabase}
90 , fDocument{doc}
91 {
92 }
93
94 public:
95 virtual bool InternalizeBestFlavor (ReaderFlavorPackage& flavorPackage, size_t from, size_t to) override
96 {
97 typename Led_MFC_ControlItem::DocContextDefiner tmp{fDocument};
98 return inherited::InternalizeBestFlavor (flavorPackage, from, to);
99 }
100
101 protected:
102 COleDocument* fDocument;
103 };
104
105 protected:
106 virtual shared_ptr<FlavorPackageInternalizer> MakeDefaultInternalizer () override;
107#endif
108 public:
109 virtual SDKString GetPrettyTypeName (SimpleEmbeddedObjectStyleMarker* m) override;
110
111 protected:
112 DECLARE_MESSAGE_MAP ()
113
114 protected:
115#if qSupportOLEControlEmbedding
116 friend class Led_MFC_ControlItem;
117#endif
118 };
119 DISABLE_COMPILER_MSC_WARNING_END (4250) // inherits via dominance warning (Stroika::Frameworks::Led::WordProcessor::Stroika::Frameworks::Led::WordProcessor::HookLosingTextStore)
120
121#if qSupportOLEControlEmbedding
122 /*
123 @CLASS: Led_MFC_ControlItem
124 @BASES: COleClientItem, @'SimpleEmbeddedObjectStyleMarker'
125 @DESCRIPTION:
126 <p>A Led embedding object for embedded OLE controls. Useful for applications which
127 want to allow for embedded OLE objects. (these docs could really use embellishing!).</p>
128 <p>NB: This also supports the embedding format @'RTFIO::RTFOLEEmbedding::kEmbeddingTag'.</p>
129 */
130 class Led_MFC_ControlItem : public COleClientItem, public SimpleEmbeddedObjectStyleMarker, public StyledTextIO::RTFIO::RTFOLEEmbedding {
131 public:
132 static const Led_ClipFormat kClipFormat;
133 static const Led_PrivateEmbeddingTag kEmbeddingTag;
134
135 // Note: pContainer is allowed to be NULL to enable IMPLEMENT_SERIALIZE.
136 // IMPLEMENT_SERIALIZE requires the class have a constructor with
137 // zero arguments. Normally, OLE items are constructed with a
138 // non-NULL document pointer.
139 Led_MFC_ControlItem (COleDocument* pContainer = NULL);
140 ~Led_MFC_ControlItem ();
141
142 public:
143 struct DocContextDefiner;
144 static SimpleEmbeddedObjectStyleMarker* mkLed_MFC_ControlItemStyleMarker (const char* embeddingTag, const void* data, size_t len);
145 static SimpleEmbeddedObjectStyleMarker* mkLed_MFC_ControlItemStyleMarker (ReaderFlavorPackage& flavorPackage);
146
147 protected:
148 static SimpleEmbeddedObjectStyleMarker* mkLed_MFC_ControlItemStyleMarker_ (const char* embeddingTag, const void* data, size_t len,
149 Led_MFC_ControlItem* builtItem);
150 static SimpleEmbeddedObjectStyleMarker* mkLed_MFC_ControlItemStyleMarker_ (ReaderFlavorPackage& flavorPackage, Led_MFC_ControlItem* builtItem);
151
152 public:
153 nonvirtual COleDocument& GetDocument () const;
154 nonvirtual Led_MFC& GetActiveView () const;
155
156 public:
157 virtual void OnChange (OLE_NOTIFICATION wNotification, DWORD dwParam) override;
158 virtual void OnActivate () override;
159 virtual BOOL DoVerb (LONG nVerb, CView* pView, LPMSG lpMsg = NULL) override;
160
161 protected:
162 virtual void OnGetItemPosition (CRect& rPosition) override;
163 virtual void OnDeactivateUI (BOOL bUndoable) override;
164 virtual BOOL OnChangeItemPosition (const CRect& rectPos) override;
165
166 public:
167 virtual void DrawSegment (const StyledTextImager* imager, const StyleRunElement& runElement, Tablet* tablet, size_t from, size_t to,
168 const TextLayoutBlock& text, const Led_Rect& drawInto, const Led_Rect& /*invalidRect*/,
169 CoordinateType useBaseLine, DistanceType* pixelsDrawn) override;
170 virtual void MeasureSegmentWidth (const StyledTextImager* imager, const StyleRunElement& runElement, size_t from, size_t to,
171 const Led_tChar* text, DistanceType* distanceResults) const override;
172 virtual DistanceType MeasureSegmentHeight (const StyledTextImager* imager, const StyleRunElement& runElement, size_t from, size_t to) const override;
173 virtual void DidUpdateText (const MarkerOwner::UpdateInfo& updateInfo) noexcept override;
174 virtual bool HandleOpen () override;
175
176 public:
177 virtual vector<PrivateCmdNumber> GetCmdNumbers () const override;
178 virtual bool IsCmdEnabled (PrivateCmdNumber cmd) const override;
179
180 private:
181 Led_Size fSize;
182
183 // Support RTFIO::RTFOLEEmbedding API
184 public:
185 virtual void PostCreateSpecifyExtraInfo (TWIPS_Point size) override;
186 virtual SDKString GetObjClassName () const override;
187 virtual void DoWriteToOLE1Stream (size_t* nBytes, byte** resultData) override;
188 virtual Led_Size GetSize () override;
189
190 public:
191 virtual const char* GetTag () const override;
192 virtual void Write (SinkStream& sink) override;
193 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage) override;
194
195 virtual void Serialize (CArchive& ar) override;
196
197 private:
198 DECLARE_SERIAL (Led_MFC_ControlItem)
199 };
200
201 /*
202 * Because this mkLed_MFC_ControlItemStyleMarker () gets called from so many levels
203 * removed from anything that knows about MFC/COleDocuments, and since building
204 * control items really requires we know the document (before we can call
205 * serialize), we need some sort of hack to communicate this info from that code
206 * that knows, to this produdure.
207 *
208 * The hack chosen, is the venerable global variable. But we do this hack with
209 * a little but of control/circumspection. We use a tmp stack-based class which defines
210 * a context, and methods which might indirectly call this must create one of these
211 * little objects on the stack which will have the side-effect of setting/restoring
212 * the global variable. We don't support nested calls (cuz no need, would be easy).
213 */
214 struct Led_MFC_ControlItem::DocContextDefiner {
215 public:
216 DocContextDefiner (COleDocument* doc);
217 ~DocContextDefiner ();
218
219 public:
220 static COleDocument* GetDoc ();
221
222 private:
223 static COleDocument* sDoc;
224
225 private:
226 COleDocument* fOldDoc;
227
228 public:
229 static set<HWND> sWindowsWhichHadDisplaySuppressed;
230 };
231#endif
232
233 /*
234 ********************************************************************************
235 ***************************** Implementation Details ***************************
236 ********************************************************************************
237 */
238 // class WordProcessorCommonCommandHelper_MFC<BASECLASS>
239 template <typename BASECLASS>
240 inline WordProcessorCommonCommandHelper_MFC<BASECLASS>::WordProcessorCommonCommandHelper_MFC ()
241 : inherited ()
242 {
243 }
244#if qSupportOLEControlEmbedding
245 template <typename BASECLASS>
246 void WordProcessorCommonCommandHelper_MFC<BASECLASS>::OnPaint ()
247 {
248 if (Led_MFC_ControlItem::DocContextDefiner::GetDoc () != NULL) {
249 // suppress display but create CPaintDC object to eat update event (and accumulate window to re-inval just below)
250 CPaintDC dc (this);
251 Led_MFC_ControlItem::DocContextDefiner::sWindowsWhichHadDisplaySuppressed.insert (this->GetHWND ());
252 return;
253 }
254 inherited::OnPaint ();
255 }
256 template <typename BASECLASS>
257 shared_ptr<FlavorPackageInternalizer> WordProcessorCommonCommandHelper_MFC<BASECLASS>::MakeDefaultInternalizer ()
258 {
259 return make_shared<ControlItemContextInternalizer> (dynamic_cast<COleDocument*> (this->GetDocument ()), this->GetTextStore (),
260 this->GetStyleDatabase (), this->GetParagraphDatabase (),
261 this->GetHidableTextDatabase ());
262 }
263#endif
264 template <typename BASECLASS>
265 SDKString WordProcessorCommonCommandHelper_MFC<BASECLASS>::GetPrettyTypeName (SimpleEmbeddedObjectStyleMarker* m)
266 {
267#if qSupportOLEControlEmbedding
268 if (dynamic_cast<Led_MFC_ControlItem*> (m) != NULL) {
269 return Led_SDK_TCHAROF ("OLE embedding");
270 }
271#endif
272 return inherited::GetPrettyTypeName (m);
273 }
274 template <typename BASECLASS>
275 const AFX_MSGMAP* WordProcessorCommonCommandHelper_MFC<BASECLASS>::GetMessageMap () const
276 {
277 return GetThisMessageMap ();
278 }
279 template <typename BASECLASS>
280 const AFX_MSGMAP* PASCAL WordProcessorCommonCommandHelper_MFC<BASECLASS>::GetThisMessageMap ()
281 {
282 using ThisClass = WordProcessorCommonCommandHelper_MFC<BASECLASS>;
283 using TheBaseClass = BASECLASS;
284
285 DISABLE_COMPILER_MSC_WARNING_START (4407) // warning C4407: cast between different pointer to member representations, compiler may generate incorrect code
286 // Not sure this is safe to ignore but I think it is due to qMFCRequiresCWndLeftmostBaseClass
287 static const AFX_MSGMAP_ENTRY _messageEntries[] = {
288 ON_WM_PAINT ()
289
290 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kSelectTableIntraCellAll_CmdID) LED_MFC_HANDLE_COMMAND_M (
291 WordProcessor::kSelectTableCell_CmdID) LED_MFC_HANDLE_COMMAND_M (WordProcessor::kSelectTableRow_CmdID)
292 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kSelectTableColumn_CmdID) LED_MFC_HANDLE_COMMAND_M (WordProcessor::kSelectTable_CmdID) LED_MFC_HANDLE_COMMAND_M (
293 WordProcessor::kFontStylePlain_CmdID) LED_MFC_HANDLE_COMMAND_M (WordProcessor::kFontStyleBold_CmdID)
294 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kFontStyleItalic_CmdID) LED_MFC_HANDLE_COMMAND_M (
295 WordProcessor::kFontStyleUnderline_CmdID) LED_MFC_HANDLE_COMMAND_M (WordProcessor::kFontStyleStrikeout_CmdID)
296 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kSubScriptCommand_CmdID) LED_MFC_HANDLE_COMMAND_M (
297 WordProcessor::kSuperScriptCommand_CmdID) LED_MFC_HANDLE_COMMAND_M (WordProcessor::kChooseFontCommand_CmdID)
298 LED_MFC_HANDLE_COMMAND_RANGE_M (WordProcessor::kBaseFontSize_CmdID, WordProcessor::kLastFontSize_CmdID) LED_MFC_HANDLE_COMMAND_RANGE_M (
299 WordProcessor::kFontMenuFirst_CmdID, WordProcessor::kFontMenuLast_CmdID)
300 LED_MFC_HANDLE_COMMAND_RANGE_M (WordProcessor::kBaseFontColor_CmdID, WordProcessor::kLastFontColor_CmdID)
301 LED_MFC_HANDLE_COMMAND_RANGE_M (WordProcessor::kHideSelection_CmdID, WordProcessor::kUnHideSelection_CmdID)
302 LED_MFC_HANDLE_COMMAND_RANGE_M (WordProcessor::kFirstJustification_CmdID, WordProcessor::kLastJustification_CmdID)
303 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kParagraphSpacingCommand_CmdID)
304 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kParagraphIndentsCommand_CmdID) LED_MFC_HANDLE_COMMAND_RANGE_M (
305 WordProcessor::kFirstListStyle_CmdID,
306 WordProcessor::kLastListStyle_CmdID) LED_MFC_HANDLE_COMMAND_M (WordProcessor::kIncreaseIndent_CmdID)
307 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kDecreaseIndent_CmdID) LED_MFC_HANDLE_COMMAND_RANGE_M (
308 WordProcessor::kFirstShowHideGlyph_CmdID, WordProcessor::kLastShowHideGlyph_CmdID)
309 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kInsertTable_CmdID)
310 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kInsertTableRowAbove_CmdID)
311 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kInsertTableRowBelow_CmdID)
312 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kInsertTableColBefore_CmdID)
313 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kInsertTableColAfter_CmdID)
314 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kRemoveTableRows_CmdID)
315 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kRemoveTableColumns_CmdID)
316 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kInsertURL_CmdID)
317 LED_MFC_HANDLE_COMMAND_M (WordProcessor::kInsertSymbol_CmdID)
318 LED_MFC_HANDLE_COMMAND_RANGE_M (
319 WordProcessor::kFirstSelectedEmbedding_CmdID,
320 WordProcessor::kLastSelectedEmbedding_CmdID)
321
322 {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
323 DISABLE_COMPILER_MSC_WARNING_END (4407)
324 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
325 return &messageMap;
326 }
327
328#if qSupportOLEControlEmbedding
329//class Led_MFC_ControlItem
330#if !qStroika_Foundation_Debug_AssertionsChecked
331 inline COleDocument& Led_MFC_ControlItem::GetDocument () const
332 {
333 // See debug version for ensures...
334 return *(COleDocument*)COleClientItem::GetDocument ();
335 }
336 inline Led_MFC& Led_MFC_ControlItem::GetActiveView () const
337 {
338 // See debug version for ensures...
339 return *(Led_MFC*)COleClientItem::GetActiveView ();
340 }
341#endif
342
343 //class Led_MFC_ControlItem::DocContextDefiner
344 inline Led_MFC_ControlItem::DocContextDefiner::DocContextDefiner (COleDocument* doc)
345 : fOldDoc (sDoc)
346 {
347 RequireNotNull (doc);
348 sDoc = doc;
349 }
350 inline Led_MFC_ControlItem::DocContextDefiner::~DocContextDefiner ()
351 {
352 AssertNotNull (sDoc);
353 sDoc = fOldDoc;
354 }
355 inline COleDocument* Led_MFC_ControlItem::DocContextDefiner::GetDoc ()
356 {
357 return sDoc;
358 }
359#endif
360}
361
362#endif /*_Stroika_Frameworks_Led_Platform_MFC_WordProcessor_h_*/
#define AssertNotNull(p)
Definition Assertions.h:333
#define RequireNotNull(p)
Definition Assertions.h:347
basic_string< SDKChar > SDKString
Definition SDKString.h:38