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