4#ifndef _Stroika_Frameworks_Led_StyledTextIO_RTF_h_
5#define _Stroika_Frameworks_Led_StyledTextIO_RTF_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
14#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO.h"
15#include "Stroika/Frameworks/Led/Support.h"
24namespace Stroika::Frameworks::Led::StyledTextIO {
26#ifndef qStroika_Frameworks_Led_UseMapForControlWordMap
27#define qStroika_Frameworks_Led_UseMapForControlWordMap 1
38 static constexpr char kRTFOpenGroupChar =
'{';
39 static constexpr char kRTFCloseGroupChar =
'}';
40 static constexpr char kRTFStartTagChar =
'\\';
41 static constexpr char kRTFQuoteNextCharChar =
'\\';
45 enum ControlWordAtom {
48 eControlAtom_tab = eMinControlAtom,
54 eControlAtom_ldblquote,
55 eControlAtom_rdblquote,
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,
94 eControlAtom_colortbl,
99 eControlAtom_dibitmap,
101 eControlAtom_emfblip,
104 eControlAtom_fcharset,
107 eControlAtom_fmodern,
110 eControlAtom_fonttbl,
115 eControlAtom_fscript,
123 eControlAtom_jpegblip,
126 eControlAtom_listtext,
127 eControlAtom_ledprivateobjectembeddingformat,
130 eControlAtom_macpict,
135 eControlAtom_objdata,
139 eControlAtom_objscalex,
140 eControlAtom_objscaley,
150 eControlAtom_pichgoal,
151 eControlAtom_picscalex,
152 eControlAtom_picscaley,
155 eControlAtom_picwgoal,
157 eControlAtom_pmmetafile,
159 eControlAtom_pngblip,
178 eControlAtom_stylesheet,
182 eControlAtom_trpaddb,
183 eControlAtom_trpaddl,
184 eControlAtom_trpaddr,
185 eControlAtom_trpaddt,
197 eControlAtom_wbitmap,
198 eControlAtom_wmetafile,
200 eControlAtomDynamicRangeStart,
201 eMaxControlAtom = 65000
203#if qStroika_Frameworks_Led_UseMapForControlWordMap
206 eMaxControlAtomNameLen = 31
208 struct ControlWordAtomName {
209 ControlWordAtomName ()
214 ControlWordAtomName (
const char* c);
219 operator const char*()
const
223 char& operator[] (
size_t i)
225 Require (i <= eMaxControlAtomNameLen);
228 char fName[eMaxControlAtomNameLen + 1];
232 struct ControlWordAtomName_less {
233 bool operator() (
const ControlWordAtomName& _Left,
const ControlWordAtomName& _Right)
const
235 return ::strcmp (_Left, _Right) < 0;
238 using ControlWordNameMap = map<ControlWordAtomName, ControlWordAtom, ControlWordAtomName_less>;
241 using StringNControlWordAtom = pair<string, ControlWordAtom>;
244 friend bool operator< (
const RTFIO::StringNControlWordAtom& lhs,
const RTFIO::StringNControlWordAtom& rhs);
247 struct StringNControlWordAtom_Comparator;
248 friend struct StringNControlWordAtom_Comparator;
251 using ControlWordNameMap = vector<StringNControlWordAtom>;
254 static ControlWordNameMap sControlWordNameMap;
257 static ControlWordNameMap mkDefaultControlWordNameMap ();
260 static string GetAtomName (ControlWordAtom atom);
261#if qStroika_Frameworks_Led_UseMapForControlWordMap
262 static ControlWordAtom EnterControlWord (
const ControlWordAtomName& controlWord);
264 static ControlWordAtom EnterControlWord (
const char* controlWord);
271 ControlWordAtom fWord;
280 class FontTableEntry {
313 FontTable (
const vector<FontTableEntry>& fontTable);
316 nonvirtual IncrementalFontSpecification GetFontSpec (
int fontNumber);
317 nonvirtual
const FontTableEntry* LookupEntryByNumber (
int fontNumber);
318 nonvirtual
const FontTableEntry* LookupEntryByName (
const SDKString& name);
319 nonvirtual FontTableEntry Add (
const FontTableEntry& newEntry);
320 nonvirtual
int FindSmallestUnusedFontNumber ()
const;
323 vector<FontTableEntry> fEntries;
329 ColorTable (
const vector<Color>& colorTable);
332 nonvirtual Color LookupColor (
size_t colorNumber)
const;
333 nonvirtual
size_t LookupColor (
const Color& color)
const;
334 nonvirtual
size_t EnterColor (
const Color& color);
337 vector<Color> fEntries;
344 class ListTableEntry {
351 ListStyle fListStyle;
359 class ListOverrideTableEntry {
361 ListOverrideTableEntry ();
376 ListTables (
const vector<ListTableEntry>& listTableEntries,
const vector<ListOverrideTableEntry>& listOverrideTableEntries);
379 vector<ListTableEntry> fEntries;
380 vector<ListOverrideTableEntry> fOverrideEntries;
383#if qStroika_Frameworks_Led_SupportGDI
384 static const Led_PrivateEmbeddingTag kRTFBodyGroupFragmentEmbeddingTag;
385 static const Led_ClipFormat kRTFBodyGroupFragmentClipFormat;
388 using UnknownRTFEmbedding = StandardUnknownTypeStyleMarker;
390 class RTFOLEEmbedding {
392 static const Led_PrivateEmbeddingTag kEmbeddingTag;
394 virtual void PostCreateSpecifyExtraInfo (TWIPS_Point size) = 0;
395 virtual SDKString GetObjClassName ()
const = 0;
396 virtual void DoWriteToOLE1Stream (
size_t* nBytes,
byte** resultData) = 0;
397 virtual Led_Size GetSize () = 0;
416 static TWIPS GetStaticDefaultTabStopWidth ();
419 TWIPS fDefaultTabStop;
422 nonvirtual TWIPS GetDefaultTabStop ()
const;
425 static TWIPS_Point GetStaticDefaultPaperSize ();
428 TWIPS_Point fDefaultPaperSize;
431 static void GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r);
434 TWIPS fDefaultMarginTop;
435 TWIPS fDefaultMarginLeft;
436 TWIPS fDefaultMarginBottom;
437 TWIPS fDefaultMarginRight;
440 nonvirtual TWIPS GetEffectiveDrawingWidth ()
const;
451 class StyledTextIOReader_RTF :
public StyledTextIOReader {
453 StyledTextIOReader_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo =
nullptr);
454 ~StyledTextIOReader_RTF ();
457 using inherited = StyledTextIOReader;
460 virtual void Read ()
override;
461 virtual bool QuickLookAppearsToBeRightFormat ()
override;
464 nonvirtual FontSpecification GetPlainFont ()
const;
465 nonvirtual
void SetPlainFont (
const FontSpecification& fsp);
468 FontSpecification fPlainFont;
474 virtual void ReadGroup (ReaderContext& readerContext);
477 struct SpecialCharMappings {
478 RTFIO::ControlWordAtom fControlWordName;
479 wchar_t fUNICODECharacter;
481 static const SpecialCharMappings kMappings[8];
484 nonvirtual Led_tChar GetDefaultUnsupportedCharacterChar ()
const;
487 Led_tChar fDefaultUnsupportedCharacterChar;
490 virtual RTFIO::ControlWord ReadControlWord ();
492 virtual bool HandleControlWord (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
493 virtual bool HandlePossibleSpecialCharacterControlWord (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
494 virtual void ReadCommentGroup (ReaderContext& readerContext);
497 virtual void ReadIn_pn_Group (ReaderContext& readerContext);
500 virtual bool HandleControlWord_ansi (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
501 virtual bool HandleControlWord_author (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
502 virtual bool HandleControlWord_b (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
503 virtual bool HandleControlWord_brdrXXX (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
504 virtual bool HandleControlWord_cchs (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
505 virtual bool HandleControlWord_cell (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
506 virtual bool HandleControlWord_cellx (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
507 virtual bool HandleControlWord_cf (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
508 virtual bool HandleControlWord_clcbpat (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
509 virtual bool HandleControlWord_cpg (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
510 virtual bool HandleControlWord_colortbl (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
511 virtual bool HandleControlWord_deff (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
512 virtual bool HandleControlWord_deftab (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
513 virtual bool HandleControlWord_deleted (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
514 virtual bool HandleControlWord_dn (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
515 virtual bool HandleControlWord_f (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
516 virtual bool HandleControlWord_fonttbl (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
517 virtual bool HandleControlWord_footer (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
518 virtual bool HandleControlWord_fi (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
519 virtual bool HandleControlWord_fs (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
520 virtual bool HandleControlWord_header (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
521 virtual bool HandleControlWord_i (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
522 virtual bool HandleControlWord_ilvl (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
523 virtual bool HandleControlWord_info (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
524 virtual bool HandleControlWord_intbl (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
525 virtual bool HandleControlWord_li (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
526 virtual bool HandleControlWord_line (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
527 virtual bool HandleControlWord_listtext (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
528 virtual bool HandleControlWord_ls (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
529 virtual bool HandleControlWord_mac (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
530 virtual bool HandleControlWord_margX (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
531 virtual bool HandleControlWord_object (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
532 virtual bool HandleControlWord_outl (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
533 virtual bool HandleControlWord_paperX (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
534 virtual bool HandleControlWord_par (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
535 virtual bool HandleControlWord_pard (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
536 virtual bool HandleControlWord_pc (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
537 virtual bool HandleControlWord_pca (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
538 virtual bool HandleControlWord_pict (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
539 virtual bool HandleControlWord_plain (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
540 virtual bool HandleControlWord_pntext (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
541 virtual bool HandleControlWord_qc (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
542 virtual bool HandleControlWord_qj (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
543 virtual bool HandleControlWord_ql (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
544 virtual bool HandleControlWord_qr (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
545 virtual bool HandleControlWord_ri (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
546 virtual bool HandleControlWord_row (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
547 virtual bool HandleControlWord_rtf (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
548 virtual bool HandleControlWord_sa (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
549 virtual bool HandleControlWord_sb (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
550 virtual bool HandleControlWord_shad (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
551 virtual bool HandleControlWord_sl (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
552 virtual bool HandleControlWord_slmult (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
553 virtual bool HandleControlWord_sub (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
554 virtual bool HandleControlWord_super (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
555 virtual bool HandleControlWord_strike (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
556 virtual bool HandleControlWord_stylesheet (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
557 virtual bool HandleControlWord_trleft (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
558 virtual bool HandleControlWord_trgaph (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
559 virtual bool HandleControlWord_trowd (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
560 virtual bool HandleControlWord_trpaddX (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
561 virtual bool HandleControlWord_trspdX (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
562 virtual bool HandleControlWord_tx (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
563 virtual bool HandleControlWord_u (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
564 virtual bool HandleControlWord_uc (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
565 virtual bool HandleControlWord_ul (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
566 virtual bool HandleControlWord_ulnone (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
567 virtual bool HandleControlWord_up (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
568 virtual bool HandleControlWord_v (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
570 virtual bool HandleControlWord_UnknownControlWord (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
573 nonvirtual
void CheckIfAboutToStartBody (ReaderContext& readerContext);
574 virtual void AboutToStartBody (ReaderContext& readerContext);
577 virtual RTFIO::FontTableEntry ReadInFontTablesEntry ();
578 virtual void ReadInObjectSubGroupEntry (ReaderContext& readerContext, vector<char>* data,
size_t* resultFoundAt);
579 virtual void ReadObjData (vector<char>* data);
580 virtual void ConstructOLEEmebddingFromRTFInfo (ReaderContext& readerContext, TWIPS_Point size,
size_t nBytes,
const void* data);
581 virtual void ConstructLedEmebddingFromRTFInfo (ReaderContext& readerContext,
size_t nBytes,
const void* data);
593 eDefaultImageFormat = eBITMAP
595 virtual void ReadPictData (vector<char>* data);
596 virtual void ReadTopLevelPictData (TWIPS_Point* shownSize, ImageFormat* imageFormat, TWIPS_Point* bmSize, vector<char>* objData);
597 virtual Led_DIB* ConstructDIBFromData (TWIPS_Point shownSize, ImageFormat imageFormat, TWIPS_Point bmSize,
size_t nBytes,
const void* data);
598#if qStroika_Platform_Windows
599 virtual Led_DIB* ConstructDIBFromEMFHelper (TWIPS_Point shownSize, TWIPS_Point bmSize,
const HENHMETAFILE hMF);
603 virtual void ApplyFontSpec (ReaderContext& readerContext,
const RTFIO::ControlWord& cw);
607 nonvirtual
unsigned char GetNextRTFHexByte ()
const;
608 nonvirtual
string ReadInGroupAndSave ();
609 nonvirtual
void SkipToEndOfCurrentGroup ();
610 nonvirtual
void ScanForwardFor (
const char* setOfChars);
613 nonvirtual
bool SearchForwardFor (
const char* searchFor,
size_t maxCharsToExamine =
size_t (-1));
616 nonvirtual Color LookupColor (ReaderContext& readerContext,
size_t index)
const;
619 nonvirtual RTFInfo& GetRTFInfo ()
const;
625#if qStroika_Platform_Windows
627 FontSpecification::FontSize fCachedFontSize;
628 long fCachedFontSizeTMHeight;
638 class StyledTextIOReader_RTF::ReaderContext {
640 ReaderContext (StyledTextIOReader_RTF& reader);
644 nonvirtual StyledTextIOReader_RTF& GetReader ()
const;
647 StyledTextIOReader_RTF& fReader;
651 int fDefaultFontNumber{-1};
652 bool fStartedBodyYet{
false};
655 nonvirtual
CodePage GetCurrentInputCharSetEncoding ()
const;
656 nonvirtual
void UseInputCharSetEncoding (CodePage codePage);
659 CodePage fCurrentInputCharSetEncoding_;
660 char fMultiByteInputCharBuf[2];
663 size_t fUnicodeUCValue{1};
664 size_t fSkipNextNChars_UC{0};
667 nonvirtual
void PutRawCharToDestination (
char c);
670 size_t fHiddenTextStart{
static_cast<size_t> (-1)};
677 class SinkStreamDestination;
680 nonvirtual Destination_& GetDestination ()
const;
681 virtual void SetDestination (Destination_* destination);
684 Destination_* fCurrentDestination{
nullptr};
687 unique_ptr<Destination_> fDefaultDestination;
693 nonvirtual GroupContext* GetCurrentGroupContext ()
const;
694 nonvirtual GroupContext* GetParentGroupContext ()
const;
696 GroupContext* fCurrentGroup{
nullptr};
698 friend class GroupContext;
701 RTFIO::FontTable* fFontTable{
nullptr};
702 RTFIO::ColorTable* fColorTable{
nullptr};
707 class StyledTextIOReader_RTF::ReaderContext::Destination_ {
709 Destination_ () =
default;
712 virtual ~Destination_ () =
default;
718 Context () =
default;
720 IncrementalFontSpecification fFontSpec{};
721 StandardTabStopList fTabStops{StandardTabStopList{RTFInfo::GetStaticDefaultTabStopWidth ()}};
722 Justification fJustification{eLeftJustify};
723 TWIPS fSpaceBefore{TWIPS{0}};
724 TWIPS fSpaceAfter{TWIPS{0}};
725 CoordinateType fSpaceBetweenLines{1000};
726 bool fSpaceBetweenLinesMult{
true};
727 ListStyle fListStyle{eListStyle_None};
728 unsigned char fListIndentLevel{0};
729 TWIPS fFirstIndent{TWIPS{0}};
730 TWIPS fLeftMargin{TWIPS{0}};
731 TWIPS fRightMargin{TWIPS{0}};
732 bool fTextHidden{
false};
736 virtual void AppendText (
const Led_tChar* text,
size_t nTChars) = 0;
737#if qStroika_Frameworks_Led_SupportGDI
738 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding) = 0;
740 virtual void AppendSoftLineBreak () = 0;
741 virtual void EndParagraph () = 0;
742 virtual void UseFont (
const IncrementalFontSpecification& fontSpec) = 0;
743 virtual void SetJustification (Justification justification) = 0;
744 virtual void SetTabStops (
const StandardTabStopList& tabStops) = 0;
745 virtual void SetFirstIndent (TWIPS tx) = 0;
746 virtual void SetLeftMargin (TWIPS lhs) = 0;
747 virtual void SetRightMargin (TWIPS rhs) = 0;
748 virtual void SetSpaceBefore (TWIPS tx) = 0;
749 virtual void SetSpaceAfter (TWIPS tx) = 0;
750 virtual void SetSpaceBetweenLines (CoordinateType tx) = 0;
751 virtual void SetSpaceBetweenLinesMult (
bool multipleLineSpacing) = 0;
752 virtual void SetTextHidden (
bool hidden) = 0;
753 virtual void SetInTable (
bool inTable) = 0;
754 virtual void EndRow (
bool forceEmit =
false) = 0;
755 virtual void EndCell (
bool forceEmit =
false) = 0;
756 virtual void SetListStyle (ListStyle listStyle) = 0;
757 virtual void SetListIndentLevel (
unsigned char indentLevel) = 0;
758 virtual void SetTableBorderColor (Color c) = 0;
759 virtual void SetCellX (TWIPS cellx) = 0;
760 virtual void SetCellBackColor (
const Color& c) = 0;
761 virtual void Call_trowd () = 0;
762 virtual void Set_trleft (TWIPS t) = 0;
763 virtual void SetDefaultCellMarginsForRow_top (TWIPS t) = 0;
764 virtual void SetDefaultCellMarginsForRow_left (TWIPS t) = 0;
765 virtual void SetDefaultCellMarginsForRow_bottom (TWIPS t) = 0;
766 virtual void SetDefaultCellMarginsForRow_right (TWIPS t) = 0;
767 virtual void SetDefaultCellSpacingForRow_top (TWIPS t) = 0;
768 virtual void SetDefaultCellSpacingForRow_left (TWIPS t) = 0;
769 virtual void SetDefaultCellSpacingForRow_bottom (TWIPS t) = 0;
770 virtual void SetDefaultCellSpacingForRow_right (TWIPS t) = 0;
773 virtual void Flush () = 0;
774 virtual void Done () = 0;
777 virtual Context GetContext ()
const = 0;
778 virtual void SetContext (
const Context& c) = 0;
786 class StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination :
public StyledTextIOReader_RTF::ReaderContext::Destination_ {
788 using SinkStream = StyledTextIOReader::SinkStream;
791 SinkStreamDestination (StyledTextIOReader_RTF& reader);
792 ~SinkStreamDestination ();
795 virtual void AppendText (
const Led_tChar* text,
size_t nTChars)
override;
796#if qStroika_Frameworks_Led_SupportGDI
797 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding)
override;
799 virtual void AppendSoftLineBreak ()
override;
800 virtual void EndParagraph ()
override;
801 virtual void UseFont (
const IncrementalFontSpecification& fontSpec)
override;
802 virtual void SetJustification (Justification justification)
override;
803 virtual void SetTabStops (
const StandardTabStopList& tabStops)
override;
804 virtual void SetFirstIndent (TWIPS tx)
override;
805 virtual void SetLeftMargin (TWIPS lhs)
override;
806 virtual void SetRightMargin (TWIPS rhs)
override;
807 virtual void SetSpaceBefore (TWIPS tx)
override;
808 virtual void SetSpaceAfter (TWIPS tx)
override;
809 virtual void SetSpaceBetweenLines (CoordinateType tx)
override;
810 virtual void SetSpaceBetweenLinesMult (
bool multipleLineSpacing)
override;
811 virtual void SetTextHidden (
bool hidden)
override;
812 virtual void SetInTable (
bool inTable)
override;
813 virtual void EndRow (
bool forceEmit =
false)
override;
814 virtual void EndCell (
bool forceEmit =
false)
override;
815 virtual void SetListStyle (ListStyle listStyle)
override;
816 virtual void SetListIndentLevel (
unsigned char indentLevel)
override;
817 virtual void SetTableBorderColor (Color c)
override;
818 virtual void SetCellX (TWIPS cellx)
override;
819 virtual void SetCellBackColor (
const Color& c)
override;
820 virtual void Call_trowd ()
override;
821 virtual void Set_trleft (TWIPS t)
override;
822 virtual void SetDefaultCellMarginsForRow_top (TWIPS t)
override;
823 virtual void SetDefaultCellMarginsForRow_left (TWIPS t)
override;
824 virtual void SetDefaultCellMarginsForRow_bottom (TWIPS t)
override;
825 virtual void SetDefaultCellMarginsForRow_right (TWIPS t)
override;
826 virtual void SetDefaultCellSpacingForRow_top (TWIPS t)
override;
827 virtual void SetDefaultCellSpacingForRow_left (TWIPS t)
override;
828 virtual void SetDefaultCellSpacingForRow_bottom (TWIPS t)
override;
829 virtual void SetDefaultCellSpacingForRow_right (TWIPS t)
override;
832 nonvirtual
void AssureTableOpen ();
833 nonvirtual
void DoStartRow ();
834 nonvirtual
void DoStartCell ();
835 nonvirtual
void DoEndTable ();
838 virtual void Flush ()
override;
839 virtual void Done ()
override;
842 virtual Context GetContext ()
const override;
843 virtual void SetContext (
const Context& c)
override;
846 nonvirtual
void ApplyContext (
const Context& c);
849 nonvirtual
size_t current_offset ()
const;
850 nonvirtual
void InsertMarker (Marker* m,
size_t at,
size_t length, MarkerOwner* markerOwner);
853 nonvirtual
void AppendText_ (
const Led_tChar* text,
size_t nTChars);
854 nonvirtual
void AboutToChange ()
const;
855 nonvirtual
void FlushSetContextCalls ()
const;
856 nonvirtual
void FlushParaEndings ()
const;
859 SinkStream& fSinkStream;
862 Context fCurrentContext{};
863 Context fNewContext{};
864 mutable bool fNewContextPending{
false};
865 Led_tChar fSmallBuffer[8 * 1024];
866 size_t fTCharsInSmallBuffer{0};
867 mutable bool fParaEndedFlag{
false};
870 mutable bool fParaEndBeforeNewContext{
false};
873 bool fInTable{
false};
874 bool fTableOpen{
false};
875 size_t fTableNextRowNum{0};
876 bool fTableInRow{
false};
877 size_t fTableNextCellNum{0};
878 bool fTableInCell{
false};
887 CellInfo fNextCellInfo;
893 TWIPS_Rect fDefaultCellMargins;
894 TWIPS_Rect fDefaultCellSpacing;
895 vector<CellInfo> fCellInfosForThisRow;
904 class StyledTextIOReader_RTF::ReaderContext::GroupContext {
906 GroupContext (ReaderContext& readerContext);
910 GroupContext (
const GroupContext&) =
delete;
911 GroupContext& operator= (
const GroupContext&) =
delete;
914 ReaderContext& fReaderContext;
915 GroupContext* fParentGroup;
918 size_t fCurrentGroupStartIdx;
921 Destination_::Context fDestinationContext;
924 friend class StyledTextIOReader_RTF::ReaderContext;
932 class StyledTextIOWriter_RTF :
public StyledTextIOWriter {
934 StyledTextIOWriter_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo =
nullptr);
935 ~StyledTextIOWriter_RTF ();
938 virtual void Write ()
override;
941 nonvirtual
CodePage GetCurrentOutputCharSetEncoding ()
const;
942 nonvirtual
void UseOutputCharSetEncoding (CodePage codePage);
945 CodePage fCurrentOutputCharSetEncoding;
948 nonvirtual
const vector<pair<string, wchar_t>>& GetCharactersSavedByName ()
const;
949 nonvirtual
void SetCharactersSavedByName (
const vector<pair<string, wchar_t>>& charactersSavedByName);
952 vector<pair<string, wchar_t>> fCharactersSavedByName;
953 map<string, wchar_t> fCharactersSavedByName_Name2Char;
954 map<wchar_t, string> fCharactersSavedByName_Char2Name;
960 using Table = StyledTextIOWriter::SrcStream::Table;
963 virtual void WriteHeader (WriterContext& writerContext);
964 virtual void WriteBody (WriterContext& writerContext);
965 virtual void WriteBodyCharacter (WriterContext& writerContext, Led_tChar c);
966 nonvirtual
void WritePlainUnicodeCharCharacterHelper (
wchar_t c);
967 nonvirtual
void WriteHexCharHelper (
unsigned char c);
968 virtual void WriteStartParagraph (WriterContext& writerContext);
969 virtual void WriteTable (WriterContext& writerContext, Table* table);
970#if qStroika_Frameworks_Led_SupportGDI
971 virtual bool PossiblyWriteUnknownRTFEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
972 virtual bool PossiblyWriteOLERTFEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
973 virtual bool PossiblyWritePICTEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
974 virtual void WritePrivatLedEmbedding (WriterContext& writerContext, SimpleEmbeddedObjectStyleMarker* embedding);
976 virtual void WriteTag (
const char* tagStr);
977 virtual void WriteTagNValue (
const char* tagStr,
int value);
978 virtual void WriteHexCharDataBlock (
size_t nBytes,
const void* resultData);
979 nonvirtual
void WriteRTFHexByte (
unsigned char theByte);
982 virtual void WriteDocCharset ();
983 virtual void WriteFontTable (WriterContext& writerContext);
984 virtual void WriteFontTablesEntry (
const RTFIO::FontTableEntry& entry);
985 virtual void WriteColorTable (WriterContext& writerContext);
986 virtual void WriteListTable ();
987 virtual void WriteListTablesEntry (
const RTFIO::ListTableEntry& entry);
988 virtual void WriteListOverrideTablesEntry (
const RTFIO::ListOverrideTableEntry& oEntry);
989 virtual void WriteGenerator ();
992 virtual void EmitBodyFontInfoChange (WriterContext& writerContext,
const FontSpecification& newOne);
993 virtual void EmitBodyFontInfoChange (WriterContext& writerContext,
const FontSpecification& newOne,
const FontSpecification& oldOne);
996 virtual void AssureColorTableBuilt (WriterContext& writerContext);
997 virtual void AssureFontTableBuilt (WriterContext& writerContext);
998 virtual void AssureStyleRunSummaryBuilt (WriterContext& writerContext);
999 virtual void AssureListTableBuilt (WriterContext& writerContext);
1002 RTFInfo* fRTFInfo{
nullptr};
1005 RTFIO::FontTable* fFontTable{
nullptr};
1006 RTFIO::ColorTable* fColorTable{
nullptr};
1007 RTFIO::ListTables* fListTable{
nullptr};
1009 vector<StyledInfoSummaryRecord> fStyleRunSummary;
1010 const Led_tChar fSoftLineBreakChar;
1011 DiscontiguousRun<bool> fHidableTextRuns;
1018 class StyledTextIOWriter_RTF::WriterContext {
1020 WriterContext (StyledTextIOWriter_RTF& writer);
1021 WriterContext (WriterContext& parentContext, SrcStream& srcStream);
1024 nonvirtual StyledTextIOWriter_RTF& GetWriter ()
const;
1027 StyledTextIOWriter_RTF& fWriter;
1030 nonvirtual SrcStream& GetSrcStream ()
const;
1031 nonvirtual SinkStream& GetSinkStream ()
const;
1034 using Table = StyledTextIOWriter::SrcStream::Table;
1037 virtual size_t GetCurSrcOffset ()
const;
1038#if qStroika_Frameworks_Led_SupportGDI
1039 virtual SimpleEmbeddedObjectStyleMarker* GetCurSimpleEmbeddedObjectStyleMarker ()
const;
1041 virtual Table* GetCurRTFTable ()
const;
1045 StyledTextIOWriter_RTF::SrcStream& fSrcStream;
1046 StyledInfoSummaryRecord fLastEmittedISR;
1047 size_t fNextStyleChangeAt;
1048 size_t fIthStyleRun;
1049 size_t fNextHidableTextChangeAt;
1050 bool fHidableTextRegionOpen;
1051 size_t fIthHidableTextRun;
1052 size_t fCharsToSkip;
1061#if !qStroika_Frameworks_Led_UseMapForControlWordMap
1062 inline bool operator< (
const RTFIO::StringNControlWordAtom& lhs,
const RTFIO::StringNControlWordAtom& rhs)
1064 return lhs.first < rhs.first;
1069 inline RTFIO::ControlWord::ControlWord ()
1070 : fWord (eMinControlAtom)
1077 inline TWIPS RTFInfo::GetStaticDefaultTabStopWidth ()
1081 inline TWIPS RTFInfo::GetDefaultTabStop ()
const
1083 return fDefaultTabStop;
1085 inline TWIPS_Point RTFInfo::GetStaticDefaultPaperSize ()
1088 return TWIPS_Point (TWIPS (11 * 1440), TWIPS (
static_cast<long> (8.5 * 1440)));
1090 inline void RTFInfo::GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r)
1101 inline RTFInfo::RTFInfo ()
1102 : fDefaultTabStop (GetStaticDefaultTabStopWidth ())
1103 , fDefaultPaperSize (GetStaticDefaultPaperSize ())
1104 , fDefaultMarginTop (0)
1105 , fDefaultMarginLeft (0)
1106 , fDefaultMarginBottom (0)
1107 , fDefaultMarginRight (0)
1109 GetStaticDefaultMargins (&fDefaultMarginTop, &fDefaultMarginLeft, &fDefaultMarginBottom, &fDefaultMarginRight);
1111 inline TWIPS RTFInfo::GetEffectiveDrawingWidth ()
const
1113 TWIPS subtract = TWIPS (fDefaultMarginLeft + fDefaultMarginRight);
1114 Ensure (fDefaultPaperSize.h > subtract);
1115 return TWIPS (fDefaultPaperSize.h - subtract);
1119 inline Led_tChar StyledTextIOReader_RTF::GetDefaultUnsupportedCharacterChar ()
const
1121 return fDefaultUnsupportedCharacterChar;
1125 inline StyledTextIOReader_RTF& StyledTextIOReader_RTF::ReaderContext::GetReader ()
const
1129 inline CodePage StyledTextIOReader_RTF::ReaderContext::GetCurrentInputCharSetEncoding ()
const
1131 return fCurrentInputCharSetEncoding_;
1133 inline StyledTextIOReader_RTF::ReaderContext::Destination_& StyledTextIOReader_RTF::ReaderContext::GetDestination ()
const
1136 return (*fCurrentDestination);
1138 inline void StyledTextIOReader_RTF::ReaderContext::SetDestination (Destination_* destination)
1140 fCurrentDestination = destination;
1142 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetCurrentGroupContext ()
const
1144 return fCurrentGroup;
1146 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetParentGroupContext ()
const
1149 if (fCurrentGroup !=
nullptr) {
1150 return fCurrentGroup->fParentGroup;
1164 inline FontSpecification StyledTextIOReader_RTF::GetPlainFont ()
const
1173 inline void StyledTextIOReader_RTF::SetPlainFont (
const FontSpecification& fsp)
1177 inline void StyledTextIOReader_RTF::CheckIfAboutToStartBody (ReaderContext& readerContext)
1179 if (not readerContext.fStartedBodyYet) {
1180 AboutToStartBody (readerContext);
1181 Assert (readerContext.fStartedBodyYet);
1188 inline Color StyledTextIOReader_RTF::LookupColor (ReaderContext& readerContext,
size_t index)
const
1190 if (readerContext.fColorTable ==
nullptr) {
1191 HandleBadlyFormattedInput ();
1192 return Color::kBlack;
1196 return (readerContext.fColorTable->LookupColor (
static_cast<size_t> (index)));
1199 return Color::kBlack;
1205 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (StyledTextIOWriter_RTF& writer)
1208 , fSrcStream{writer.GetSrcStream ()}
1209 , fLastEmittedISR (IncrementalFontSpecification (), 0)
1210 , fNextStyleChangeAt{0}
1212 , fNextHidableTextChangeAt (size_t (-1))
1213 , fHidableTextRegionOpen (false)
1214 , fIthHidableTextRun{0}
1218 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (WriterContext& parentContext, SrcStream& srcStream)
1219 : fWriter{parentContext.fWriter}
1221 , fSrcStream (srcStream)
1222 , fLastEmittedISR{IncrementalFontSpecification{}, 0}
1223 , fNextStyleChangeAt{0}
1225 , fNextHidableTextChangeAt{size_t (-1)}
1226 , fHidableTextRegionOpen (false)
1227 , fIthHidableTextRun{0}
1231 inline StyledTextIOWriter_RTF& StyledTextIOWriter_RTF::WriterContext::GetWriter ()
const
1235 inline StyledTextIOWriter_RTF::SrcStream& StyledTextIOWriter_RTF::WriterContext::GetSrcStream ()
const
1239 inline StyledTextIOWriter_RTF::SinkStream& StyledTextIOWriter_RTF::WriterContext::GetSinkStream ()
const
1241 return fWriter.GetSinkStream ();
1245 inline CodePage StyledTextIOWriter_RTF::GetCurrentOutputCharSetEncoding ()
const
1247 return fCurrentOutputCharSetEncoding;
#define RequireNotNull(p)
basic_string< SDKChar > SDKString