Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
StyledTextIO_RTF.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef _Stroika_Frameworks_Led_StyledTextIO_RTF_h_
5#define _Stroika_Frameworks_Led_StyledTextIO_RTF_h_ 1
6
7#include "Stroika/Frameworks/StroikaPreComp.h"
8
9#include <map>
10#include <memory>
11#include <vector>
12
14#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO.h"
15#include "Stroika/Frameworks/Led/Support.h"
16
17/*
18@MODULE: StyledTextIO_RTF
19@DESCRIPTION:
20 <p>The knowledge of how to read RTF is in @'StyledTextIOReader_RTF' and the knowledge of how to write RTF is in
21 @'StyledTextIOWriter_RTF'.</p>
22 */
23
24namespace Stroika::Frameworks::Led::StyledTextIO {
25
26#ifndef qUseMapForControlWordMap
27#define qUseMapForControlWordMap 1
28#endif
29
30 /*
31 @CLASS: RTFIO
32 @DESCRIPTION: <p>This RTFIO class serves as a (shared) scope to define some other classes used in reading/writing
33 RTF. It probably should be replaced with something using namespaces. But I wanted to make as small and
34 simple a change as possible to the old code (that used @'RTFInfo' for this purpose).</p>
35 */
36 class RTFIO {
37 public:
38 static constexpr char kRTFOpenGroupChar = '{';
39 static constexpr char kRTFCloseGroupChar = '}';
40 static constexpr char kRTFStartTagChar = '\\';
41 static constexpr char kRTFQuoteNextCharChar = '\\';
42
43 public:
44 // perhaps should be more careful to keep these sorted, so easier to find particular one...
45 enum ControlWordAtom {
46 eMinControlAtom = 0,
47
48 eControlAtom_tab = eMinControlAtom,
49 eControlAtom_bullet,
50 eControlAtom_endash,
51 eControlAtom_emdash,
52 eControlAtom_lquote,
53 eControlAtom_rquote,
54 eControlAtom_ldblquote,
55 eControlAtom_rdblquote,
56
57 eControlAtom_ansi,
58 eControlAtom_author,
59 eControlAtom_b,
60 eControlAtom_blue,
61 eControlAtom_brdrs,
62 eControlAtom_brdrth,
63 eControlAtom_brdrsh,
64 eControlAtom_brdrdb,
65 eControlAtom_brdrdot,
66 eControlAtom_brdrdash,
67 eControlAtom_brdrhair,
68 eControlAtom_brdrdashsm,
69 eControlAtom_brdrdashd,
70 eControlAtom_brdrdashdd,
71 eControlAtom_brdrtriple,
72 eControlAtom_brdrtnthsg,
73 eControlAtom_brdrthtnsg,
74 eControlAtom_brdrtnthtnsg,
75 eControlAtom_brdrtnthmg,
76 eControlAtom_brdrthtnmg,
77 eControlAtom_brdrtnthtnmg,
78 eControlAtom_brdrtnthlg,
79 eControlAtom_brdrthtnlg,
80 eControlAtom_brdrtnthtnlg,
81 eControlAtom_brdrwavy,
82 eControlAtom_brdrwavydb,
83 eControlAtom_brdrdashdotstr,
84 eControlAtom_brdremboss,
85 eControlAtom_brdrengrave,
86 eControlAtom_brdrw,
87 eControlAtom_brdrcf,
88 eControlAtom_cchs,
89 eControlAtom_cell,
90 eControlAtom_cellx,
91 eControlAtom_cf,
92 eControlAtom_clcbpat,
93 eControlAtom_cpg,
94 eControlAtom_colortbl,
95 eControlAtom_deff,
96 eControlAtom_deflang,
97 eControlAtom_deftab,
98 eControlAtom_deleted,
99 eControlAtom_dibitmap,
100 eControlAtom_dn,
101 eControlAtom_emfblip,
102 eControlAtom_f,
103 eControlAtom_fbidi,
104 eControlAtom_fcharset,
105 eControlAtom_fdecor,
106 eControlAtom_fi,
107 eControlAtom_fmodern,
108 eControlAtom_footer,
109 eControlAtom_fnil,
110 eControlAtom_fonttbl,
111 eControlAtom_fprq,
112 eControlAtom_froman,
113 eControlAtom_fs,
114 eControlAtom_fswiss,
115 eControlAtom_fscript,
116 eControlAtom_ftech,
117 eControlAtom_green,
118 eControlAtom_header,
119 eControlAtom_i,
120 eControlAtom_ilvl,
121 eControlAtom_info,
122 eControlAtom_intbl,
123 eControlAtom_jpegblip,
124 eControlAtom_li,
125 eControlAtom_line,
126 eControlAtom_listtext,
127 eControlAtom_ledprivateobjectembeddingformat,
128 eControlAtom_ls,
129 eControlAtom_mac,
130 eControlAtom_macpict,
131 eControlAtom_margb,
132 eControlAtom_margl,
133 eControlAtom_margr,
134 eControlAtom_margt,
135 eControlAtom_objdata,
136 eControlAtom_object,
137 eControlAtom_objemb,
138 eControlAtom_objh,
139 eControlAtom_objscalex,
140 eControlAtom_objscaley,
141 eControlAtom_objw,
142 eControlAtom_outl,
143 eControlAtom_paperh,
144 eControlAtom_paperw,
145 eControlAtom_par,
146 eControlAtom_pard,
147 eControlAtom_pc,
148 eControlAtom_pca,
149 eControlAtom_pich,
150 eControlAtom_pichgoal,
151 eControlAtom_picscalex,
152 eControlAtom_picscaley,
153 eControlAtom_pict,
154 eControlAtom_picw,
155 eControlAtom_picwgoal,
156 eControlAtom_plain,
157 eControlAtom_pmmetafile,
158 eControlAtom_pn,
159 eControlAtom_pngblip,
160 eControlAtom_pntext,
161 eControlAtom_qc,
162 eControlAtom_qj,
163 eControlAtom_ql,
164 eControlAtom_qr,
165 eControlAtom_red,
166 eControlAtom_result,
167 eControlAtom_ri,
168 eControlAtom_row,
169 eControlAtom_rtf,
170 eControlAtom_sa,
171 eControlAtom_sb,
172 eControlAtom_shad,
173 eControlAtom_sl,
174 eControlAtom_slmult,
175 eControlAtom_sub,
176 eControlAtom_super,
177 eControlAtom_strike,
178 eControlAtom_stylesheet,
179 eControlAtom_trleft,
180 eControlAtom_trgaph,
181 eControlAtom_trowd,
182 eControlAtom_trpaddb,
183 eControlAtom_trpaddl,
184 eControlAtom_trpaddr,
185 eControlAtom_trpaddt,
186 eControlAtom_trspdb,
187 eControlAtom_trspdl,
188 eControlAtom_trspdr,
189 eControlAtom_trspdt,
190 eControlAtom_tx,
191 eControlAtom_u,
192 eControlAtom_uc,
193 eControlAtom_ul,
194 eControlAtom_ulnone,
195 eControlAtom_up,
196 eControlAtom_v,
197 eControlAtom_wbitmap,
198 eControlAtom_wmetafile,
199
200 eControlAtomDynamicRangeStart,
201 eMaxControlAtom = 65000
202 };
203#if qUseMapForControlWordMap
204 public:
205 enum {
206 eMaxControlAtomNameLen = 31
207 };
208 struct ControlWordAtomName {
209 ControlWordAtomName ()
210 //:fName ()
211 {
212 fName[0] = '\0';
213 }
214 ControlWordAtomName (const char* c);
215 operator char* ()
216 {
217 return fName;
218 }
219 operator const char* () const
220 {
221 return fName;
222 }
223 char& operator[] (size_t i)
224 {
225 Require (i <= eMaxControlAtomNameLen);
226 return fName[i];
227 }
228 char fName[eMaxControlAtomNameLen + 1];
229 };
230
231 private:
232 struct ControlWordAtomName_less {
233 bool operator() (const ControlWordAtomName& _Left, const ControlWordAtomName& _Right) const
234 {
235 return ::strcmp (_Left, _Right) < 0;
236 }
237 };
238 using ControlWordNameMap = map<ControlWordAtomName, ControlWordAtom, ControlWordAtomName_less>;
239#else
240 private:
241 using StringNControlWordAtom = pair<string, ControlWordAtom>;
242
243 public:
244#if qFriendDeclarationsDontWorkWithNestedClassesBug
245 friend bool operator< (const RTFIO::StringNControlWordAtom& lhs, const RTFIO::StringNControlWordAtom& rhs)
246 {
247 return lhs.first < rhs.first;
248 }
249#else
250 friend bool operator< (const RTFIO::StringNControlWordAtom& lhs, const RTFIO::StringNControlWordAtom& rhs);
251#endif
252 private:
253 struct StringNControlWordAtom_Comparator;
254 friend struct StringNControlWordAtom_Comparator;
255
256 private:
257 using ControlWordNameMap = vector<StringNControlWordAtom>;
258#endif
259 private:
260 static ControlWordNameMap sControlWordNameMap;
261
262 public:
263 static ControlWordNameMap mkDefaultControlWordNameMap ();
264
265 public:
266 static string GetAtomName (ControlWordAtom atom);
267#if qUseMapForControlWordMap
268 static ControlWordAtom EnterControlWord (const ControlWordAtomName& controlWord);
269#else
270 static ControlWordAtom EnterControlWord (const char* controlWord);
271#endif
272
273 class ControlWord {
274 public:
275 ControlWord ();
276
277 ControlWordAtom fWord;
278 bool fHasArg;
279 long fValue;
280 };
281
282 /*
283 @CLASS: RTFIO::FontTableEntry
284 @DESCRIPTION: <p>These objects are collected together in a @'RTFIO::FontTable'.</p>
285 */
286 class FontTableEntry {
287 public:
288 FontTableEntry ();
289
290 public:
291 enum FontFamily {
292 eNil,
293 eRoman,
294 eSwiss,
295 eModern,
296 eScript,
297 eDecor,
298 eTech,
299 eBidi
300 };
301
302 public:
303 SDKString fFontName; // font name
304 int fFNum; // font number
305 FontFamily fFamily; // font family
306 uint8_t fCharSet; // font charset (from https://msdn.microsoft.com/en-us/library/windows/desktop/dd145037(v=vs.85).aspx - this is a byte)
307 int fPitch; // font pitch
308 int fCodePage; // font code page
309 };
310
311 /*
312 @CLASS: RTFIO::FontTable
313 @DESCRIPTION: <p>This object contains a vector of @'RTFIO::FontTableEntry'. This corresponds to the
314 \fonttbl RTF element. Its used to associate font numbers with names and other information.</p>
315 */
316 class FontTable {
317 public:
318 FontTable ();
319 FontTable (const vector<FontTableEntry>& fontTable);
320
321 public:
322 nonvirtual IncrementalFontSpecification GetFontSpec (int fontNumber); // throws if not present
323 nonvirtual const FontTableEntry* LookupEntryByNumber (int fontNumber); // return nullptr if not present
324 nonvirtual const FontTableEntry* LookupEntryByName (const SDKString& name); // return nullptr if not present
325 nonvirtual FontTableEntry Add (const FontTableEntry& newEntry); // ignores the fFNum, and supplies its own! - returns same entry but with revised fFNum
326 nonvirtual int FindSmallestUnusedFontNumber () const;
327
328 public:
329 vector<FontTableEntry> fEntries;
330 };
331
332 class ColorTable {
333 public:
334 ColorTable ();
335 ColorTable (const vector<Color>& colorTable);
336
337 public:
338 nonvirtual Color LookupColor (size_t colorNumber) const; // throws if not present
339 nonvirtual size_t LookupColor (const Color& color) const; // asserts if not present
340 nonvirtual size_t EnterColor (const Color& color); // LookupColor, and if not present, add it. Either way, return index
341
342 public:
343 vector<Color> fEntries;
344 };
345
346 /*
347 @CLASS: RTFIO::ListTableEntry
348 @DESCRIPTION: <p>These objects are collected together in a @'RTFIO::ListTables'.</p>
349 */
350 class ListTableEntry {
351 public:
352 ListTableEntry ();
353
354 public:
355 int fListID; // \listidN
356 int fListTemplateID; // \listtemplateidN
357 ListStyle fListStyle; // \levelnfcN
358 int fFontID; // must be dynamicly specified based on current font table
359 };
360
361 /*
362 @CLASS: RTFIO::ListOverrideTableEntry
363 @DESCRIPTION: <p>These objects are collected together in a @'RTFIO::ListTables'.</p>
364 */
365 class ListOverrideTableEntry {
366 public:
367 ListOverrideTableEntry ();
368
369 public:
370 int fListID; // \listidN
371 };
372
373 /*
374 @CLASS: RTFIO::ListTables
375 @DESCRIPTION: <p>This object contains a vector of @'RTFIO::ListTableEntry'. This corresponds to the
376 \listtable RTF element. It also contains a vector of @'RTFIO::ListOverrideTableEntry' entries. These
377 map to \listoverridetable entries. See the RTF 1.5 (or later) spec.</p>
378 */
379 class ListTables {
380 public:
381 ListTables ();
382 ListTables (const vector<ListTableEntry>& listTableEntries, const vector<ListOverrideTableEntry>& listOverrideTableEntries);
383
384 public:
385 vector<ListTableEntry> fEntries;
386 vector<ListOverrideTableEntry> fOverrideEntries;
387 };
388
389#if qStroika_Frameworks_Led_SupportGDI
390 static const Led_PrivateEmbeddingTag kRTFBodyGroupFragmentEmbeddingTag;
391 static const Led_ClipFormat kRTFBodyGroupFragmentClipFormat;
392
393 // Just use UnknownObject as a tmp hack for these RTF embeddings
394 using UnknownRTFEmbedding = StandardUnknownTypeStyleMarker;
395
396 class RTFOLEEmbedding {
397 public:
398 static const Led_PrivateEmbeddingTag kEmbeddingTag;
399
400 virtual void PostCreateSpecifyExtraInfo (TWIPS_Point size) = 0;
401 virtual SDKString GetObjClassName () const = 0;
402 virtual void DoWriteToOLE1Stream (size_t* nBytes, byte** resultData) = 0;
403 virtual Led_Size GetSize () = 0;
404 };
405#endif
406 };
407
408 /*
409 @CLASS: RTFInfo
410 @DESCRIPTION: <p>This RTFInfo class is designed to capture any extra information about the RTF file
411 you might want to keep track of, as a side-effect of reading it in (beyond simply
412 the things which Led supports). For example, if you wanted to keep track of the
413 original character set, the author, or the original style sheet information, this
414 would be a good place to store those things.</p>
415 <p>NB: This class used to contain all the definitions name contained in @'RTFIO'.</p>
416 */
417 class RTFInfo {
418 public:
419 RTFInfo ();
420
421 public:
422 static TWIPS GetStaticDefaultTabStopWidth ();
423
424 public:
425 TWIPS fDefaultTabStop;
426
427 public:
428 nonvirtual TWIPS GetDefaultTabStop () const;
429
430 public:
431 static TWIPS_Point GetStaticDefaultPaperSize ();
432
433 public:
434 TWIPS_Point fDefaultPaperSize;
435
436 public:
437 static void GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r);
438
439 public:
440 TWIPS fDefaultMarginTop;
441 TWIPS fDefaultMarginLeft;
442 TWIPS fDefaultMarginBottom;
443 TWIPS fDefaultMarginRight;
444
445 public:
446 nonvirtual TWIPS GetEffectiveDrawingWidth () const;
447 };
448
449 /*
450 @CLASS: StyledTextIOReader_RTF
451 @BASES: @'StyledTextIOReader'
452 @DESCRIPTION: <p>This is the class you construct to read in content as RTF-formatted text. You
453 must specify SrcStream of input data (usually a file, or a clipboard record), and a
454 SinkStream (usually a text buffer) to write to.</p>
455 <p>Then call @'StyledTextIOReader_RTF::Read' () to get the actual reading done.</p>
456 */
457 class StyledTextIOReader_RTF : public StyledTextIOReader {
458 public:
459 StyledTextIOReader_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo = nullptr);
460 ~StyledTextIOReader_RTF ();
461
462 private:
463 using inherited = StyledTextIOReader;
464
465 public:
466 virtual void Read () override;
467 virtual bool QuickLookAppearsToBeRightFormat () override;
468
469 public:
470 nonvirtual FontSpecification GetPlainFont () const;
471 nonvirtual void SetPlainFont (const FontSpecification& fsp);
472
473 private:
474 FontSpecification fPlainFont;
475
476 public:
477 class ReaderContext;
478
479 protected:
480 virtual void ReadGroup (ReaderContext& readerContext); // must be looking at a kRTFOpenGroupChar
481
482 protected:
483 struct SpecialCharMappings {
484 RTFIO::ControlWordAtom fControlWordName;
485 wchar_t fUNICODECharacter;
486 };
487 static const SpecialCharMappings kMappings[8];
488
489 public:
490 nonvirtual Led_tChar GetDefaultUnsupportedCharacterChar () const;
491
492 protected:
493 Led_tChar fDefaultUnsupportedCharacterChar;
494
495 protected:
496 virtual RTFIO::ControlWord ReadControlWord (); // must be looking at a kRTFStartTagChar
497 // HandleControlWord () returns true if it read to end (and consumed end) of current group
498 virtual bool HandleControlWord (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
499 virtual bool HandlePossibleSpecialCharacterControlWord (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
500 virtual void ReadCommentGroup (ReaderContext& readerContext);
501
502 protected:
503 virtual void ReadIn_pn_Group (ReaderContext& readerContext);
504
505 protected:
506 virtual bool HandleControlWord_ansi (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
507 virtual bool HandleControlWord_author (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
508 virtual bool HandleControlWord_b (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
509 virtual bool HandleControlWord_brdrXXX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
510 virtual bool HandleControlWord_cchs (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
511 virtual bool HandleControlWord_cell (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
512 virtual bool HandleControlWord_cellx (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
513 virtual bool HandleControlWord_cf (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
514 virtual bool HandleControlWord_clcbpat (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
515 virtual bool HandleControlWord_cpg (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
516 virtual bool HandleControlWord_colortbl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
517 virtual bool HandleControlWord_deff (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
518 virtual bool HandleControlWord_deftab (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
519 virtual bool HandleControlWord_deleted (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
520 virtual bool HandleControlWord_dn (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
521 virtual bool HandleControlWord_f (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
522 virtual bool HandleControlWord_fonttbl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
523 virtual bool HandleControlWord_footer (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
524 virtual bool HandleControlWord_fi (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
525 virtual bool HandleControlWord_fs (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
526 virtual bool HandleControlWord_header (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
527 virtual bool HandleControlWord_i (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
528 virtual bool HandleControlWord_ilvl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
529 virtual bool HandleControlWord_info (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
530 virtual bool HandleControlWord_intbl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
531 virtual bool HandleControlWord_li (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
532 virtual bool HandleControlWord_line (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
533 virtual bool HandleControlWord_listtext (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
534 virtual bool HandleControlWord_ls (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
535 virtual bool HandleControlWord_mac (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
536 virtual bool HandleControlWord_margX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
537 virtual bool HandleControlWord_object (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
538 virtual bool HandleControlWord_outl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
539 virtual bool HandleControlWord_paperX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
540 virtual bool HandleControlWord_par (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
541 virtual bool HandleControlWord_pard (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
542 virtual bool HandleControlWord_pc (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
543 virtual bool HandleControlWord_pca (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
544 virtual bool HandleControlWord_pict (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
545 virtual bool HandleControlWord_plain (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
546 virtual bool HandleControlWord_pntext (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
547 virtual bool HandleControlWord_qc (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
548 virtual bool HandleControlWord_qj (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
549 virtual bool HandleControlWord_ql (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
550 virtual bool HandleControlWord_qr (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
551 virtual bool HandleControlWord_ri (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
552 virtual bool HandleControlWord_row (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
553 virtual bool HandleControlWord_rtf (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
554 virtual bool HandleControlWord_sa (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
555 virtual bool HandleControlWord_sb (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
556 virtual bool HandleControlWord_shad (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
557 virtual bool HandleControlWord_sl (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
558 virtual bool HandleControlWord_slmult (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
559 virtual bool HandleControlWord_sub (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
560 virtual bool HandleControlWord_super (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
561 virtual bool HandleControlWord_strike (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
562 virtual bool HandleControlWord_stylesheet (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
563 virtual bool HandleControlWord_trleft (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
564 virtual bool HandleControlWord_trgaph (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
565 virtual bool HandleControlWord_trowd (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
566 virtual bool HandleControlWord_trpaddX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
567 virtual bool HandleControlWord_trspdX (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
568 virtual bool HandleControlWord_tx (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
569 virtual bool HandleControlWord_u (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
570 virtual bool HandleControlWord_uc (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
571 virtual bool HandleControlWord_ul (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
572 virtual bool HandleControlWord_ulnone (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
573 virtual bool HandleControlWord_up (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
574 virtual bool HandleControlWord_v (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
575
576 virtual bool HandleControlWord_UnknownControlWord (ReaderContext& readerContext, const RTFIO::ControlWord& controlWord);
577
578 protected:
579 nonvirtual void CheckIfAboutToStartBody (ReaderContext& readerContext);
580 virtual void AboutToStartBody (ReaderContext& readerContext);
581
582 protected:
583 virtual RTFIO::FontTableEntry ReadInFontTablesEntry ();
584 virtual void ReadInObjectSubGroupEntry (ReaderContext& readerContext, vector<char>* data, size_t* resultFoundAt);
585 virtual void ReadObjData (vector<char>* data);
586 virtual void ConstructOLEEmebddingFromRTFInfo (ReaderContext& readerContext, TWIPS_Point size, size_t nBytes, const void* data);
587 virtual void ConstructLedEmebddingFromRTFInfo (ReaderContext& readerContext, size_t nBytes, const void* data);
588
589 protected:
590 enum ImageFormat {
591 eEMF, // enhanced meta file
592 ePNG, // portable network graphix file
593 eJPEG,
594 eMacPICT,
595 ePMMetaFile, // OS/2 meta file
596 eWMF, // Windows meta file
597 eDIB,
598 eBITMAP, // device dependent bitmap
599 eDefaultImageFormat = eBITMAP // according to RTF 1.5 spec - "The \wbitmap control word is optional. If no other picture type is specified, the picture is assumed to be a Windows bitmap"
600 };
601 virtual void ReadPictData (vector<char>* data);
602 virtual void ReadTopLevelPictData (TWIPS_Point* shownSize, ImageFormat* imageFormat, TWIPS_Point* bmSize, vector<char>* objData);
603 virtual Led_DIB* ConstructDIBFromData (TWIPS_Point shownSize, ImageFormat imageFormat, TWIPS_Point bmSize, size_t nBytes, const void* data);
604#if qStroika_Foundation_Common_Platform_Windows
605 virtual Led_DIB* ConstructDIBFromEMFHelper (TWIPS_Point shownSize, TWIPS_Point bmSize, const HENHMETAFILE hMF);
606#endif
607
608 protected:
609 virtual void ApplyFontSpec (ReaderContext& readerContext, const RTFIO::ControlWord& cw);
610
611 // utility functions to help reading/low level scanning rtf
612 protected:
613 nonvirtual unsigned char GetNextRTFHexByte () const;
614 nonvirtual string ReadInGroupAndSave ();
615 nonvirtual void SkipToEndOfCurrentGroup ();
616 nonvirtual void ScanForwardFor (const char* setOfChars); // stop when next char is a member of 'setOfChars'
617 // (nb: doesn't look at current/prev chars - just FOLLOWING ones
618 // (at eof returns no error, but does return)
619 nonvirtual bool SearchForwardFor (const char* searchFor, size_t maxCharsToExamine = size_t (-1));
620
621 protected:
622 nonvirtual Color LookupColor (ReaderContext& readerContext, size_t index) const;
623
624 public:
625 nonvirtual RTFInfo& GetRTFInfo () const;
626
627 private:
628 RTFInfo* fRTFInfo;
629 bool fOwnRTFInfo;
630
631#if qStroika_Foundation_Common_Platform_Windows
632 private:
633 FontSpecification::FontSize fCachedFontSize; // Keep these as a speedtweek - SetPointSize() expensive on WIN32
634 long fCachedFontSizeTMHeight;
635#endif
636 };
637
638 /*
639 @CLASS: StyledTextIOReader_RTF::ReaderContext
640 @DESCRIPTION: <p>This context object is used during the process of reading RTF text from a source, and
641 internalizing it into internal format. It is used to keep track of various document context information,
642 like character sets, etc.</p>
643 */
644 class StyledTextIOReader_RTF::ReaderContext {
645 public:
646 ReaderContext (StyledTextIOReader_RTF& reader);
647 ~ReaderContext ();
648
649 public:
650 nonvirtual StyledTextIOReader_RTF& GetReader () const;
651
652 private:
653 StyledTextIOReader_RTF& fReader;
654
655 public:
656 CodePage fDocumentCharacterSet;
657 int fDefaultFontNumber{-1}; // -1 ==> none specified
658 bool fStartedBodyYet{false};
659
660 public:
661 nonvirtual CodePage GetCurrentInputCharSetEncoding () const;
662 nonvirtual void UseInputCharSetEncoding (CodePage codePage);
663
664 private:
665 CodePage fCurrentInputCharSetEncoding_;
666 char fMultiByteInputCharBuf[2];
667
668 public:
669 size_t fUnicodeUCValue{1}; // support for \u and \uc RTF tags
670 size_t fSkipNextNChars_UC{0};
671
672 public:
673 nonvirtual void PutRawCharToDestination (char c);
674
675 public:
676 size_t fHiddenTextStart{static_cast<size_t> (-1)}; // -1 => NOT in a hidden text block, and otherwise its the start of the block.
677
678 public:
679 /*
680 * Support for RTF destinations.
681 */
682 class Destination_;
683 class SinkStreamDestination;
684
685 public:
686 nonvirtual Destination_& GetDestination () const;
687 virtual void SetDestination (Destination_* destination);
688
689 private:
690 Destination_* fCurrentDestination{nullptr};
691
692 public:
693 unique_ptr<Destination_> fDefaultDestination;
694
695 public:
696 class GroupContext;
697
698 public:
699 nonvirtual GroupContext* GetCurrentGroupContext () const; // can be nullptr
700 nonvirtual GroupContext* GetParentGroupContext () const; // can be nullptr
701 private:
702 GroupContext* fCurrentGroup{nullptr};
703
704 friend class GroupContext;
705
706 public:
707 RTFIO::FontTable* fFontTable{nullptr};
708 RTFIO::ColorTable* fColorTable{nullptr};
709 };
710
711 /**
712 */
713 class StyledTextIOReader_RTF::ReaderContext::Destination_ {
714 protected:
715 Destination_ () = default;
716
717 public:
718 virtual ~Destination_ () = default;
719
720 public:
721 /**
722 */
723 struct Context {
724 Context () = default;
725
726 IncrementalFontSpecification fFontSpec{};
727 StandardTabStopList fTabStops{StandardTabStopList{RTFInfo::GetStaticDefaultTabStopWidth ()}};
728 Justification fJustification{eLeftJustify};
729 TWIPS fSpaceBefore{TWIPS{0}};
730 TWIPS fSpaceAfter{TWIPS{0}};
731 CoordinateType fSpaceBetweenLines{1000};
732 bool fSpaceBetweenLinesMult{true};
733 ListStyle fListStyle{eListStyle_None};
734 unsigned char fListIndentLevel{0};
735 TWIPS fFirstIndent{TWIPS{0}};
736 TWIPS fLeftMargin{TWIPS{0}};
737 TWIPS fRightMargin{TWIPS{0}};
738 bool fTextHidden{false};
739 };
740
741 public:
742 virtual void AppendText (const Led_tChar* text, size_t nTChars) = 0;
743#if qStroika_Frameworks_Led_SupportGDI
744 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding) = 0;
745#endif
746 virtual void AppendSoftLineBreak () = 0;
747 virtual void EndParagraph () = 0;
748 virtual void UseFont (const IncrementalFontSpecification& fontSpec) = 0;
749 virtual void SetJustification (Justification justification) = 0;
750 virtual void SetTabStops (const StandardTabStopList& tabStops) = 0;
751 virtual void SetFirstIndent (TWIPS tx) = 0;
752 virtual void SetLeftMargin (TWIPS lhs) = 0;
753 virtual void SetRightMargin (TWIPS rhs) = 0;
754 virtual void SetSpaceBefore (TWIPS tx) = 0;
755 virtual void SetSpaceAfter (TWIPS tx) = 0;
756 virtual void SetSpaceBetweenLines (CoordinateType tx) = 0;
757 virtual void SetSpaceBetweenLinesMult (bool multipleLineSpacing) = 0;
758 virtual void SetTextHidden (bool hidden) = 0;
759 virtual void SetInTable (bool inTable) = 0;
760 virtual void EndRow (bool forceEmit = false) = 0;
761 virtual void EndCell (bool forceEmit = false) = 0;
762 virtual void SetListStyle (ListStyle listStyle) = 0;
763 virtual void SetListIndentLevel (unsigned char indentLevel) = 0;
764 virtual void SetTableBorderColor (Color c) = 0;
765 virtual void SetCellX (TWIPS cellx) = 0;
766 virtual void SetCellBackColor (const Color& c) = 0;
767 virtual void Call_trowd () = 0;
768 virtual void Set_trleft (TWIPS t) = 0;
769 virtual void SetDefaultCellMarginsForRow_top (TWIPS t) = 0;
770 virtual void SetDefaultCellMarginsForRow_left (TWIPS t) = 0;
771 virtual void SetDefaultCellMarginsForRow_bottom (TWIPS t) = 0;
772 virtual void SetDefaultCellMarginsForRow_right (TWIPS t) = 0;
773 virtual void SetDefaultCellSpacingForRow_top (TWIPS t) = 0;
774 virtual void SetDefaultCellSpacingForRow_left (TWIPS t) = 0;
775 virtual void SetDefaultCellSpacingForRow_bottom (TWIPS t) = 0;
776 virtual void SetDefaultCellSpacingForRow_right (TWIPS t) = 0;
777
778 public:
779 virtual void Flush () = 0;
780 virtual void Done () = 0;
781
782 public:
783 virtual Context GetContext () const = 0;
784 virtual void SetContext (const Context& c) = 0;
785 };
786
787 /*
788 @CLASS: StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination
789 @BASES: @'StyledTextIOReader_RTF::ReaderContext::Destination_'
790 @DESCRIPTION:
791 */
792 class StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination : public StyledTextIOReader_RTF::ReaderContext::Destination_ {
793 public:
794 using SinkStream = StyledTextIOReader::SinkStream;
795
796 public:
797 SinkStreamDestination (StyledTextIOReader_RTF& reader);
798 ~SinkStreamDestination ();
799
800 public:
801 virtual void AppendText (const Led_tChar* text, size_t nTChars) override;
802#if qStroika_Frameworks_Led_SupportGDI
803 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding) override;
804#endif
805 virtual void AppendSoftLineBreak () override;
806 virtual void EndParagraph () override;
807 virtual void UseFont (const IncrementalFontSpecification& fontSpec) override;
808 virtual void SetJustification (Justification justification) override;
809 virtual void SetTabStops (const StandardTabStopList& tabStops) override;
810 virtual void SetFirstIndent (TWIPS tx) override;
811 virtual void SetLeftMargin (TWIPS lhs) override;
812 virtual void SetRightMargin (TWIPS rhs) override;
813 virtual void SetSpaceBefore (TWIPS tx) override;
814 virtual void SetSpaceAfter (TWIPS tx) override;
815 virtual void SetSpaceBetweenLines (CoordinateType tx) override;
816 virtual void SetSpaceBetweenLinesMult (bool multipleLineSpacing) override;
817 virtual void SetTextHidden (bool hidden) override;
818 virtual void SetInTable (bool inTable) override;
819 virtual void EndRow (bool forceEmit = false) override;
820 virtual void EndCell (bool forceEmit = false) override;
821 virtual void SetListStyle (ListStyle listStyle) override;
822 virtual void SetListIndentLevel (unsigned char indentLevel) override;
823 virtual void SetTableBorderColor (Color c) override;
824 virtual void SetCellX (TWIPS cellx) override;
825 virtual void SetCellBackColor (const Color& c) override;
826 virtual void Call_trowd () override;
827 virtual void Set_trleft (TWIPS t) override;
828 virtual void SetDefaultCellMarginsForRow_top (TWIPS t) override;
829 virtual void SetDefaultCellMarginsForRow_left (TWIPS t) override;
830 virtual void SetDefaultCellMarginsForRow_bottom (TWIPS t) override;
831 virtual void SetDefaultCellMarginsForRow_right (TWIPS t) override;
832 virtual void SetDefaultCellSpacingForRow_top (TWIPS t) override;
833 virtual void SetDefaultCellSpacingForRow_left (TWIPS t) override;
834 virtual void SetDefaultCellSpacingForRow_bottom (TWIPS t) override;
835 virtual void SetDefaultCellSpacingForRow_right (TWIPS t) override;
836
837 private:
838 nonvirtual void AssureTableOpen ();
839 nonvirtual void DoStartRow ();
840 nonvirtual void DoStartCell ();
841 nonvirtual void DoEndTable ();
842
843 public:
844 virtual void Flush () override;
845 virtual void Done () override;
846
847 public:
848 virtual Context GetContext () const override;
849 virtual void SetContext (const Context& c) override;
850
851 private:
852 nonvirtual void ApplyContext (const Context& c);
853
854 public:
855 nonvirtual size_t current_offset () const;
856 nonvirtual void InsertMarker (Marker* m, size_t at, size_t length, MarkerOwner* markerOwner);
857
858 private:
859 nonvirtual void AppendText_ (const Led_tChar* text, size_t nTChars);
860 nonvirtual void AboutToChange () const;
861 nonvirtual void FlushSetContextCalls () const;
862 nonvirtual void FlushParaEndings () const;
863
864 private:
865 SinkStream& fSinkStream;
866 RTFInfo& fRTFInfo;
867 StyledTextIOReader_RTF& fReader;
868 Context fCurrentContext{};
869 Context fNewContext{};
870 mutable bool fNewContextPending{false};
871 Led_tChar fSmallBuffer[8 * 1024]; // buffer is simply a performance hack...
872 size_t fTCharsInSmallBuffer{0};
873 mutable bool fParaEndedFlag{false};
874
875 // RETHINK - MAYBE DON'T NEED???
876 mutable bool fParaEndBeforeNewContext{false}; // SPR#0968 - if we get BOTH delayed paraend and delayed setcontext call, AND
877 // finally have to flush - then we need to preserve the ordering with a flag
878 private:
879 bool fInTable{false};
880 bool fTableOpen{false};
881 size_t fTableNextRowNum{0};
882 bool fTableInRow{false}; // true if we've started a row; false if row just ended and not sure if there will be another
883 size_t fTableNextCellNum{0};
884 bool fTableInCell{false}; // ditto - except for cells
885
886 private:
887 struct CellInfo {
888 CellInfo ();
889 TWIPS f_cellx;
890 Color f_clcbpat;
891 size_t fColSpan;
892 };
893 CellInfo fNextCellInfo; // place to store up info (like clcbpat) til we get the terminating \cellx
894 private:
895 struct RowInfo {
896 RowInfo ();
897 TWIPS f_trrh;
898 TWIPS f_trleft;
899 TWIPS_Rect fDefaultCellMargins; // Not REALLY a rect - just a handy way to store 4 values... and OK since its private - not part of API
900 TWIPS_Rect fDefaultCellSpacing; // ''
901 vector<CellInfo> fCellInfosForThisRow;
902 };
903 RowInfo fThisRow;
904 };
905
906 /*
907 @CLASS: StyledTextIOReader_RTF::ReaderContext::GroupContext
908 @DESCRIPTION: <p>Helper class to implement nested scopes where we save/restore font info while reading</p>
909 */
910 class StyledTextIOReader_RTF::ReaderContext::GroupContext {
911 public:
912 GroupContext (ReaderContext& readerContext);
913 ~GroupContext ();
914
915 private:
916 GroupContext (const GroupContext&) = delete;
917 GroupContext& operator= (const GroupContext&) = delete;
918
919 private:
920 ReaderContext& fReaderContext;
921 GroupContext* fParentGroup;
922
923 public:
924 size_t fCurrentGroupStartIdx;
925 CodePage fCurrentCodePage;
926 CodePage fCCHSCodePage;
927 Destination_::Context fDestinationContext;
928
929 private:
930 friend class StyledTextIOReader_RTF::ReaderContext;
931 };
932
933 /*
934 @CLASS: StyledTextIOWriter_RTF
935 @BASES: @'StyledTextIOWriter'
936 @DESCRIPTION:
937 */
938 class StyledTextIOWriter_RTF : public StyledTextIOWriter {
939 public:
940 StyledTextIOWriter_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo = nullptr);
941 ~StyledTextIOWriter_RTF ();
942
943 public:
944 virtual void Write () override;
945
946 public:
947 nonvirtual CodePage GetCurrentOutputCharSetEncoding () const;
948 nonvirtual void UseOutputCharSetEncoding (CodePage codePage);
949
950 private:
951 CodePage fCurrentOutputCharSetEncoding;
952
953 public:
954 nonvirtual const vector<pair<string, wchar_t>>& GetCharactersSavedByName () const;
955 nonvirtual void SetCharactersSavedByName (const vector<pair<string, wchar_t>>& charactersSavedByName);
956
957 private:
958 vector<pair<string, wchar_t>> fCharactersSavedByName;
959 map<string, wchar_t> fCharactersSavedByName_Name2Char;
960 map<wchar_t, string> fCharactersSavedByName_Char2Name;
961
962 protected:
963 class WriterContext;
964
965 public:
966 using Table = StyledTextIOWriter::SrcStream::Table;
967
968 protected:
969 virtual void WriteHeader (WriterContext& writerContext);
970 virtual void WriteBody (WriterContext& writerContext);
971 virtual void WriteBodyCharacter (WriterContext& writerContext, Led_tChar c);
972 nonvirtual void WritePlainUnicodeCharCharacterHelper (wchar_t c);
973 nonvirtual void WriteHexCharHelper (unsigned char c);
974 virtual void WriteStartParagraph (WriterContext& writerContext);
975 virtual void WriteTable (WriterContext& writerContext, Table* table);
976#if qStroika_Frameworks_Led_SupportGDI
977 virtual bool PossiblyWriteUnknownRTFEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
978 virtual bool PossiblyWriteOLERTFEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
979 virtual bool PossiblyWritePICTEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
980 virtual void WritePrivatLedEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
981#endif
982 virtual void WriteTag (const char* tagStr);
983 virtual void WriteTagNValue (const char* tagStr, int value);
984 virtual void WriteHexCharDataBlock (size_t nBytes, const void* resultData);
985 nonvirtual void WriteRTFHexByte (unsigned char theByte);
986
987 protected:
988 virtual void WriteDocCharset ();
989 virtual void WriteFontTable (WriterContext& writerContext);
990 virtual void WriteFontTablesEntry (const RTFIO::FontTableEntry& entry);
991 virtual void WriteColorTable (WriterContext& writerContext);
992 virtual void WriteListTable ();
993 virtual void WriteListTablesEntry (const RTFIO::ListTableEntry& entry);
994 virtual void WriteListOverrideTablesEntry (const RTFIO::ListOverrideTableEntry& oEntry);
995 virtual void WriteGenerator ();
996
997 protected:
998 virtual void EmitBodyFontInfoChange (WriterContext& writerContext, const FontSpecification& newOne);
999 virtual void EmitBodyFontInfoChange (WriterContext& writerContext, const FontSpecification& newOne, const FontSpecification& oldOne);
1000
1001 protected:
1002 virtual void AssureColorTableBuilt (WriterContext& writerContext);
1003 virtual void AssureFontTableBuilt (WriterContext& writerContext);
1004 virtual void AssureStyleRunSummaryBuilt (WriterContext& writerContext);
1005 virtual void AssureListTableBuilt (WriterContext& writerContext);
1006
1007 private:
1008 RTFInfo* fRTFInfo{nullptr};
1009
1010 protected:
1011 RTFIO::FontTable* fFontTable{nullptr};
1012 RTFIO::ColorTable* fColorTable{nullptr};
1013 RTFIO::ListTables* fListTable{nullptr};
1014 CodePage fDocumentCharacterSet;
1015 vector<StyledInfoSummaryRecord> fStyleRunSummary;
1016 const Led_tChar fSoftLineBreakChar;
1017 DiscontiguousRun<bool> fHidableTextRuns;
1018 };
1019
1020 /*
1021 @CLASS: StyledTextIOWriter_RTF::WriterContext
1022 @DESCRIPTION:
1023 */
1024 class StyledTextIOWriter_RTF::WriterContext {
1025 public:
1026 WriterContext (StyledTextIOWriter_RTF& writer);
1027 WriterContext (WriterContext& parentContext, SrcStream& srcStream);
1028
1029 public:
1030 nonvirtual StyledTextIOWriter_RTF& GetWriter () const;
1031
1032 private:
1033 StyledTextIOWriter_RTF& fWriter;
1034
1035 public:
1036 nonvirtual SrcStream& GetSrcStream () const;
1037 nonvirtual SinkStream& GetSinkStream () const;
1038
1039 public:
1040 using Table = StyledTextIOWriter::SrcStream::Table;
1041
1042 public:
1043 virtual size_t GetCurSrcOffset () const;
1044#if qStroika_Frameworks_Led_SupportGDI
1045 virtual SimpleEmbeddedObjectStyleMarker* GetCurSimpleEmbeddedObjectStyleMarker () const;
1046#endif
1047 virtual Table* GetCurRTFTable () const;
1048
1049 public:
1050 bool fInTable;
1051 StyledTextIOWriter_RTF::SrcStream& fSrcStream;
1052 StyledInfoSummaryRecord fLastEmittedISR;
1053 size_t fNextStyleChangeAt;
1054 size_t fIthStyleRun;
1055 size_t fNextHidableTextChangeAt;
1056 bool fHidableTextRegionOpen;
1057 size_t fIthHidableTextRun;
1058 size_t fCharsToSkip;
1059 };
1060
1061 /*
1062 ********************************************************************************
1063 ***************************** Implementation Details ***************************
1064 ********************************************************************************
1065 */
1066// class RTFIO::StringNControlWordAtom
1067#if !qFriendDeclarationsDontWorkWithNestedClassesBug && !qUseMapForControlWordMap
1068 inline bool operator< (const RTFIO::StringNControlWordAtom& lhs, const RTFIO::StringNControlWordAtom& rhs)
1069 {
1070 return lhs.first < rhs.first;
1071 }
1072#endif
1073
1074 // class RTFIO::ControlWord
1075 inline RTFIO::ControlWord::ControlWord ()
1076 : fWord (eMinControlAtom)
1077 , fHasArg (false)
1078 , fValue (0)
1079 {
1080 }
1081
1082 // class RTFInfo
1083 inline TWIPS RTFInfo::GetStaticDefaultTabStopWidth ()
1084 {
1085 return TWIPS (720); // default to 1/2 inch - RTF spec default
1086 }
1087 inline TWIPS RTFInfo::GetDefaultTabStop () const
1088 {
1089 return fDefaultTabStop;
1090 }
1091 inline TWIPS_Point RTFInfo::GetStaticDefaultPaperSize ()
1092 {
1093 // From RTFSpec 1.4
1094 return TWIPS_Point (TWIPS (11 * 1440), TWIPS (static_cast<long> (8.5 * 1440)));
1095 }
1096 inline void RTFInfo::GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r)
1097 {
1098 RequireNotNull (t);
1099 RequireNotNull (l);
1100 RequireNotNull (b);
1101 RequireNotNull (r);
1102 *t = TWIPS (1440);
1103 *l = TWIPS (1800);
1104 *b = TWIPS (1440);
1105 *r = TWIPS (1800);
1106 }
1107 inline RTFInfo::RTFInfo ()
1108 : fDefaultTabStop (GetStaticDefaultTabStopWidth ())
1109 , fDefaultPaperSize (GetStaticDefaultPaperSize ())
1110 , fDefaultMarginTop (0)
1111 , fDefaultMarginLeft (0)
1112 , fDefaultMarginBottom (0)
1113 , fDefaultMarginRight (0)
1114 {
1115 GetStaticDefaultMargins (&fDefaultMarginTop, &fDefaultMarginLeft, &fDefaultMarginBottom, &fDefaultMarginRight);
1116 }
1117 inline TWIPS RTFInfo::GetEffectiveDrawingWidth () const
1118 {
1119 TWIPS subtract = TWIPS (fDefaultMarginLeft + fDefaultMarginRight);
1120 Ensure (fDefaultPaperSize.h > subtract);
1121 return TWIPS (fDefaultPaperSize.h - subtract);
1122 }
1123
1124 // class StyledTextIOReader_RTF
1125 inline Led_tChar StyledTextIOReader_RTF::GetDefaultUnsupportedCharacterChar () const
1126 {
1127 return fDefaultUnsupportedCharacterChar;
1128 }
1129
1130 // class StyledTextIOReader_RTF::ReaderContext
1131 inline StyledTextIOReader_RTF& StyledTextIOReader_RTF::ReaderContext::GetReader () const
1132 {
1133 return fReader;
1134 }
1135 inline CodePage StyledTextIOReader_RTF::ReaderContext::GetCurrentInputCharSetEncoding () const
1136 {
1137 return fCurrentInputCharSetEncoding_;
1138 }
1139 inline StyledTextIOReader_RTF::ReaderContext::Destination_& StyledTextIOReader_RTF::ReaderContext::GetDestination () const
1140 {
1141 EnsureNotNull (fCurrentDestination);
1142 return (*fCurrentDestination);
1143 }
1144 inline void StyledTextIOReader_RTF::ReaderContext::SetDestination (Destination_* destination)
1145 {
1146 fCurrentDestination = destination;
1147 }
1148 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetCurrentGroupContext () const
1149 {
1150 return fCurrentGroup; // Can be nullptr
1151 }
1152 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetParentGroupContext () const
1153 {
1154 // Can return nullptr
1155 if (fCurrentGroup != nullptr) {
1156 return fCurrentGroup->fParentGroup;
1157 }
1158 return nullptr;
1159 }
1160
1161 // class StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination
1162 //NOTHING INLINE
1163
1164 // class StyledTextIOReader_RTF
1165 /*
1166 @METHOD: StyledTextIOReader_RTF::GetPlainFont
1167 @DESCRIPTION: <p>Get the font which is used for RTF \plain directives. This can be set
1168 via @'StyledTextIOReader_RTF::SetPlainFont'</p>
1169 */
1170 inline FontSpecification StyledTextIOReader_RTF::GetPlainFont () const
1171 {
1172 return fPlainFont;
1173 }
1174 /*
1175 @METHOD: StyledTextIOReader_RTF::SetPlainFont
1176 @DESCRIPTION: <p>Set the font which is used for RTF \plain directives. See
1177 @'StyledTextIOReader_RTF::GetPlainFont'</p>
1178 */
1179 inline void StyledTextIOReader_RTF::SetPlainFont (const FontSpecification& fsp)
1180 {
1181 fPlainFont = fsp;
1182 }
1183 inline void StyledTextIOReader_RTF::CheckIfAboutToStartBody (ReaderContext& readerContext)
1184 {
1185 if (not readerContext.fStartedBodyYet) {
1186 AboutToStartBody (readerContext);
1187 Assert (readerContext.fStartedBodyYet);
1188 }
1189 }
1190 /*
1191 @METHOD: StyledTextIOReader_RTF::LookupColor
1192 @DESCRIPTION: <p>Lookup the given font index in the color table. Deal moderately gracefully with error conditions.</p>
1193 */
1194 inline Color StyledTextIOReader_RTF::LookupColor (ReaderContext& readerContext, size_t index) const
1195 {
1196 if (readerContext.fColorTable == nullptr) {
1197 HandleBadlyFormattedInput (); // Cannot have a \cfN without having specified a color table
1198 return Color::kBlack;
1199 }
1200 else {
1201 try {
1202 return (readerContext.fColorTable->LookupColor (static_cast<size_t> (index)));
1203 }
1204 catch (...) {
1205 return Color::kBlack;
1206 }
1207 }
1208 }
1209
1210 // class StyledTextIOWriter_RTF::WriterContext
1211 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (StyledTextIOWriter_RTF& writer)
1212 : fWriter (writer)
1213 , fInTable (false)
1214 , fSrcStream (writer.GetSrcStream ())
1215 , fLastEmittedISR (IncrementalFontSpecification (), 0)
1216 , fNextStyleChangeAt (0)
1217 , fIthStyleRun (0)
1218 , fNextHidableTextChangeAt (size_t (-1))
1219 , fHidableTextRegionOpen (false)
1220 , fIthHidableTextRun (0)
1221 , fCharsToSkip (0)
1222 {
1223 }
1224 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (WriterContext& parentContext, SrcStream& srcStream)
1225 : fWriter (parentContext.fWriter)
1226 , fInTable (true)
1227 , fSrcStream (srcStream)
1228 , fLastEmittedISR (IncrementalFontSpecification (), 0)
1229 , fNextStyleChangeAt (0)
1230 , fIthStyleRun (0)
1231 , fNextHidableTextChangeAt (size_t (-1))
1232 , fHidableTextRegionOpen (false)
1233 , fIthHidableTextRun (0)
1234 , fCharsToSkip (0)
1235 {
1236 }
1237 inline StyledTextIOWriter_RTF& StyledTextIOWriter_RTF::WriterContext::GetWriter () const
1238 {
1239 return fWriter;
1240 }
1241 inline StyledTextIOWriter_RTF::SrcStream& StyledTextIOWriter_RTF::WriterContext::GetSrcStream () const
1242 {
1243 return fSrcStream;
1244 }
1245 inline StyledTextIOWriter_RTF::SinkStream& StyledTextIOWriter_RTF::WriterContext::GetSinkStream () const
1246 {
1247 return fWriter.GetSinkStream ();
1248 }
1249
1250 // class StyledTextIOWriter_RTF
1251 inline CodePage StyledTextIOWriter_RTF::GetCurrentOutputCharSetEncoding () const
1252 {
1253 return fCurrentOutputCharSetEncoding;
1254 }
1255
1256}
1257
1258#endif /*_Stroika_Frameworks_Led_StyledTextIO_RTF_h_*/
#define EnsureNotNull(p)
Definition Assertions.h:340
#define RequireNotNull(p)
Definition Assertions.h:347
basic_string< SDKChar > SDKString
Definition SDKString.h:38