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 qUseMapForControlWordMap
27#define qUseMapForControlWordMap 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 qUseMapForControlWordMap
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#if qFriendDeclarationsDontWorkWithNestedClassesBug
245 friend bool operator< (
const RTFIO::StringNControlWordAtom& lhs,
const RTFIO::StringNControlWordAtom& rhs)
247 return lhs.first < rhs.first;
250 friend bool operator< (
const RTFIO::StringNControlWordAtom& lhs,
const RTFIO::StringNControlWordAtom& rhs);
253 struct StringNControlWordAtom_Comparator;
254 friend struct StringNControlWordAtom_Comparator;
257 using ControlWordNameMap = vector<StringNControlWordAtom>;
260 static ControlWordNameMap sControlWordNameMap;
263 static ControlWordNameMap mkDefaultControlWordNameMap ();
266 static string GetAtomName (ControlWordAtom atom);
267#if qUseMapForControlWordMap
268 static ControlWordAtom EnterControlWord (
const ControlWordAtomName& controlWord);
270 static ControlWordAtom EnterControlWord (
const char* controlWord);
277 ControlWordAtom fWord;
286 class FontTableEntry {
319 FontTable (
const vector<FontTableEntry>& fontTable);
322 nonvirtual IncrementalFontSpecification GetFontSpec (
int fontNumber);
323 nonvirtual
const FontTableEntry* LookupEntryByNumber (
int fontNumber);
324 nonvirtual
const FontTableEntry* LookupEntryByName (
const SDKString& name);
325 nonvirtual FontTableEntry Add (
const FontTableEntry& newEntry);
326 nonvirtual
int FindSmallestUnusedFontNumber ()
const;
329 vector<FontTableEntry> fEntries;
335 ColorTable (
const vector<Color>& colorTable);
338 nonvirtual Color LookupColor (
size_t colorNumber)
const;
339 nonvirtual
size_t LookupColor (
const Color& color)
const;
340 nonvirtual
size_t EnterColor (
const Color& color);
343 vector<Color> fEntries;
350 class ListTableEntry {
357 ListStyle fListStyle;
365 class ListOverrideTableEntry {
367 ListOverrideTableEntry ();
382 ListTables (
const vector<ListTableEntry>& listTableEntries,
const vector<ListOverrideTableEntry>& listOverrideTableEntries);
385 vector<ListTableEntry> fEntries;
386 vector<ListOverrideTableEntry> fOverrideEntries;
389#if qStroika_Frameworks_Led_SupportGDI
390 static const Led_PrivateEmbeddingTag kRTFBodyGroupFragmentEmbeddingTag;
391 static const Led_ClipFormat kRTFBodyGroupFragmentClipFormat;
394 using UnknownRTFEmbedding = StandardUnknownTypeStyleMarker;
396 class RTFOLEEmbedding {
398 static const Led_PrivateEmbeddingTag kEmbeddingTag;
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;
422 static TWIPS GetStaticDefaultTabStopWidth ();
425 TWIPS fDefaultTabStop;
428 nonvirtual TWIPS GetDefaultTabStop ()
const;
431 static TWIPS_Point GetStaticDefaultPaperSize ();
434 TWIPS_Point fDefaultPaperSize;
437 static void GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r);
440 TWIPS fDefaultMarginTop;
441 TWIPS fDefaultMarginLeft;
442 TWIPS fDefaultMarginBottom;
443 TWIPS fDefaultMarginRight;
446 nonvirtual TWIPS GetEffectiveDrawingWidth ()
const;
457 class StyledTextIOReader_RTF :
public StyledTextIOReader {
459 StyledTextIOReader_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo =
nullptr);
460 ~StyledTextIOReader_RTF ();
463 using inherited = StyledTextIOReader;
466 virtual void Read ()
override;
467 virtual bool QuickLookAppearsToBeRightFormat ()
override;
470 nonvirtual FontSpecification GetPlainFont ()
const;
471 nonvirtual
void SetPlainFont (
const FontSpecification& fsp);
474 FontSpecification fPlainFont;
480 virtual void ReadGroup (ReaderContext& readerContext);
483 struct SpecialCharMappings {
484 RTFIO::ControlWordAtom fControlWordName;
485 wchar_t fUNICODECharacter;
487 static const SpecialCharMappings kMappings[8];
490 nonvirtual Led_tChar GetDefaultUnsupportedCharacterChar ()
const;
493 Led_tChar fDefaultUnsupportedCharacterChar;
496 virtual RTFIO::ControlWord ReadControlWord ();
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);
503 virtual void ReadIn_pn_Group (ReaderContext& readerContext);
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);
576 virtual bool HandleControlWord_UnknownControlWord (ReaderContext& readerContext,
const RTFIO::ControlWord& controlWord);
579 nonvirtual
void CheckIfAboutToStartBody (ReaderContext& readerContext);
580 virtual void AboutToStartBody (ReaderContext& readerContext);
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);
599 eDefaultImageFormat = eBITMAP
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);
609 virtual void ApplyFontSpec (ReaderContext& readerContext,
const RTFIO::ControlWord& cw);
613 nonvirtual
unsigned char GetNextRTFHexByte ()
const;
614 nonvirtual
string ReadInGroupAndSave ();
615 nonvirtual
void SkipToEndOfCurrentGroup ();
616 nonvirtual
void ScanForwardFor (
const char* setOfChars);
619 nonvirtual
bool SearchForwardFor (
const char* searchFor,
size_t maxCharsToExamine =
size_t (-1));
622 nonvirtual Color LookupColor (ReaderContext& readerContext,
size_t index)
const;
625 nonvirtual RTFInfo& GetRTFInfo ()
const;
631#if qStroika_Foundation_Common_Platform_Windows
633 FontSpecification::FontSize fCachedFontSize;
634 long fCachedFontSizeTMHeight;
644 class StyledTextIOReader_RTF::ReaderContext {
646 ReaderContext (StyledTextIOReader_RTF& reader);
650 nonvirtual StyledTextIOReader_RTF& GetReader ()
const;
653 StyledTextIOReader_RTF& fReader;
657 int fDefaultFontNumber{-1};
658 bool fStartedBodyYet{
false};
661 nonvirtual
CodePage GetCurrentInputCharSetEncoding ()
const;
662 nonvirtual
void UseInputCharSetEncoding (CodePage codePage);
665 CodePage fCurrentInputCharSetEncoding_;
666 char fMultiByteInputCharBuf[2];
669 size_t fUnicodeUCValue{1};
670 size_t fSkipNextNChars_UC{0};
673 nonvirtual
void PutRawCharToDestination (
char c);
676 size_t fHiddenTextStart{
static_cast<size_t> (-1)};
683 class SinkStreamDestination;
686 nonvirtual Destination_& GetDestination ()
const;
687 virtual void SetDestination (Destination_* destination);
690 Destination_* fCurrentDestination{
nullptr};
693 unique_ptr<Destination_> fDefaultDestination;
699 nonvirtual GroupContext* GetCurrentGroupContext ()
const;
700 nonvirtual GroupContext* GetParentGroupContext ()
const;
702 GroupContext* fCurrentGroup{
nullptr};
704 friend class GroupContext;
707 RTFIO::FontTable* fFontTable{
nullptr};
708 RTFIO::ColorTable* fColorTable{
nullptr};
713 class StyledTextIOReader_RTF::ReaderContext::Destination_ {
715 Destination_ () =
default;
718 virtual ~Destination_ () =
default;
724 Context () =
default;
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};
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;
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;
779 virtual void Flush () = 0;
780 virtual void Done () = 0;
783 virtual Context GetContext ()
const = 0;
784 virtual void SetContext (
const Context& c) = 0;
792 class StyledTextIOReader_RTF::ReaderContext::SinkStreamDestination :
public StyledTextIOReader_RTF::ReaderContext::Destination_ {
794 using SinkStream = StyledTextIOReader::SinkStream;
797 SinkStreamDestination (StyledTextIOReader_RTF& reader);
798 ~SinkStreamDestination ();
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;
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;
838 nonvirtual
void AssureTableOpen ();
839 nonvirtual
void DoStartRow ();
840 nonvirtual
void DoStartCell ();
841 nonvirtual
void DoEndTable ();
844 virtual void Flush ()
override;
845 virtual void Done ()
override;
848 virtual Context GetContext ()
const override;
849 virtual void SetContext (
const Context& c)
override;
852 nonvirtual
void ApplyContext (
const Context& c);
855 nonvirtual
size_t current_offset ()
const;
856 nonvirtual
void InsertMarker (Marker* m,
size_t at,
size_t length, MarkerOwner* markerOwner);
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;
865 SinkStream& fSinkStream;
867 StyledTextIOReader_RTF& fReader;
868 Context fCurrentContext{};
869 Context fNewContext{};
870 mutable bool fNewContextPending{
false};
871 Led_tChar fSmallBuffer[8 * 1024];
872 size_t fTCharsInSmallBuffer{0};
873 mutable bool fParaEndedFlag{
false};
876 mutable bool fParaEndBeforeNewContext{
false};
879 bool fInTable{
false};
880 bool fTableOpen{
false};
881 size_t fTableNextRowNum{0};
882 bool fTableInRow{
false};
883 size_t fTableNextCellNum{0};
884 bool fTableInCell{
false};
893 CellInfo fNextCellInfo;
899 TWIPS_Rect fDefaultCellMargins;
900 TWIPS_Rect fDefaultCellSpacing;
901 vector<CellInfo> fCellInfosForThisRow;
910 class StyledTextIOReader_RTF::ReaderContext::GroupContext {
912 GroupContext (ReaderContext& readerContext);
916 GroupContext (
const GroupContext&) =
delete;
917 GroupContext& operator= (
const GroupContext&) =
delete;
920 ReaderContext& fReaderContext;
921 GroupContext* fParentGroup;
924 size_t fCurrentGroupStartIdx;
927 Destination_::Context fDestinationContext;
930 friend class StyledTextIOReader_RTF::ReaderContext;
938 class StyledTextIOWriter_RTF :
public StyledTextIOWriter {
940 StyledTextIOWriter_RTF (SrcStream* srcStream, SinkStream* sinkStream, RTFInfo* rtfInfo =
nullptr);
941 ~StyledTextIOWriter_RTF ();
944 virtual void Write ()
override;
947 nonvirtual
CodePage GetCurrentOutputCharSetEncoding ()
const;
948 nonvirtual
void UseOutputCharSetEncoding (CodePage codePage);
951 CodePage fCurrentOutputCharSetEncoding;
954 nonvirtual
const vector<pair<string, wchar_t>>& GetCharactersSavedByName ()
const;
955 nonvirtual
void SetCharactersSavedByName (
const vector<pair<string, wchar_t>>& charactersSavedByName);
958 vector<pair<string, wchar_t>> fCharactersSavedByName;
959 map<string, wchar_t> fCharactersSavedByName_Name2Char;
960 map<wchar_t, string> fCharactersSavedByName_Char2Name;
966 using Table = StyledTextIOWriter::SrcStream::Table;
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);
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);
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 ();
998 virtual void EmitBodyFontInfoChange (WriterContext& writerContext,
const FontSpecification& newOne);
999 virtual void EmitBodyFontInfoChange (WriterContext& writerContext,
const FontSpecification& newOne,
const FontSpecification& oldOne);
1002 virtual void AssureColorTableBuilt (WriterContext& writerContext);
1003 virtual void AssureFontTableBuilt (WriterContext& writerContext);
1004 virtual void AssureStyleRunSummaryBuilt (WriterContext& writerContext);
1005 virtual void AssureListTableBuilt (WriterContext& writerContext);
1008 RTFInfo* fRTFInfo{
nullptr};
1011 RTFIO::FontTable* fFontTable{
nullptr};
1012 RTFIO::ColorTable* fColorTable{
nullptr};
1013 RTFIO::ListTables* fListTable{
nullptr};
1015 vector<StyledInfoSummaryRecord> fStyleRunSummary;
1016 const Led_tChar fSoftLineBreakChar;
1017 DiscontiguousRun<bool> fHidableTextRuns;
1024 class StyledTextIOWriter_RTF::WriterContext {
1026 WriterContext (StyledTextIOWriter_RTF& writer);
1027 WriterContext (WriterContext& parentContext, SrcStream& srcStream);
1030 nonvirtual StyledTextIOWriter_RTF& GetWriter ()
const;
1033 StyledTextIOWriter_RTF& fWriter;
1036 nonvirtual SrcStream& GetSrcStream ()
const;
1037 nonvirtual SinkStream& GetSinkStream ()
const;
1040 using Table = StyledTextIOWriter::SrcStream::Table;
1043 virtual size_t GetCurSrcOffset ()
const;
1044#if qStroika_Frameworks_Led_SupportGDI
1045 virtual SimpleEmbeddedObjectStyleMarker* GetCurSimpleEmbeddedObjectStyleMarker ()
const;
1047 virtual Table* GetCurRTFTable ()
const;
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;
1067#if !qFriendDeclarationsDontWorkWithNestedClassesBug && !qUseMapForControlWordMap
1068 inline bool operator< (
const RTFIO::StringNControlWordAtom& lhs,
const RTFIO::StringNControlWordAtom& rhs)
1070 return lhs.first < rhs.first;
1075 inline RTFIO::ControlWord::ControlWord ()
1076 : fWord (eMinControlAtom)
1083 inline TWIPS RTFInfo::GetStaticDefaultTabStopWidth ()
1087 inline TWIPS RTFInfo::GetDefaultTabStop ()
const
1089 return fDefaultTabStop;
1091 inline TWIPS_Point RTFInfo::GetStaticDefaultPaperSize ()
1094 return TWIPS_Point (TWIPS (11 * 1440), TWIPS (
static_cast<long> (8.5 * 1440)));
1096 inline void RTFInfo::GetStaticDefaultMargins (TWIPS* t, TWIPS* l, TWIPS* b, TWIPS* r)
1107 inline RTFInfo::RTFInfo ()
1108 : fDefaultTabStop (GetStaticDefaultTabStopWidth ())
1109 , fDefaultPaperSize (GetStaticDefaultPaperSize ())
1110 , fDefaultMarginTop (0)
1111 , fDefaultMarginLeft (0)
1112 , fDefaultMarginBottom (0)
1113 , fDefaultMarginRight (0)
1115 GetStaticDefaultMargins (&fDefaultMarginTop, &fDefaultMarginLeft, &fDefaultMarginBottom, &fDefaultMarginRight);
1117 inline TWIPS RTFInfo::GetEffectiveDrawingWidth ()
const
1119 TWIPS subtract = TWIPS (fDefaultMarginLeft + fDefaultMarginRight);
1120 Ensure (fDefaultPaperSize.h > subtract);
1121 return TWIPS (fDefaultPaperSize.h - subtract);
1125 inline Led_tChar StyledTextIOReader_RTF::GetDefaultUnsupportedCharacterChar ()
const
1127 return fDefaultUnsupportedCharacterChar;
1131 inline StyledTextIOReader_RTF& StyledTextIOReader_RTF::ReaderContext::GetReader ()
const
1135 inline CodePage StyledTextIOReader_RTF::ReaderContext::GetCurrentInputCharSetEncoding ()
const
1137 return fCurrentInputCharSetEncoding_;
1139 inline StyledTextIOReader_RTF::ReaderContext::Destination_& StyledTextIOReader_RTF::ReaderContext::GetDestination ()
const
1142 return (*fCurrentDestination);
1144 inline void StyledTextIOReader_RTF::ReaderContext::SetDestination (Destination_* destination)
1146 fCurrentDestination = destination;
1148 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetCurrentGroupContext ()
const
1150 return fCurrentGroup;
1152 inline StyledTextIOReader_RTF::ReaderContext::GroupContext* StyledTextIOReader_RTF::ReaderContext::GetParentGroupContext ()
const
1155 if (fCurrentGroup !=
nullptr) {
1156 return fCurrentGroup->fParentGroup;
1170 inline FontSpecification StyledTextIOReader_RTF::GetPlainFont ()
const
1179 inline void StyledTextIOReader_RTF::SetPlainFont (
const FontSpecification& fsp)
1183 inline void StyledTextIOReader_RTF::CheckIfAboutToStartBody (ReaderContext& readerContext)
1185 if (not readerContext.fStartedBodyYet) {
1186 AboutToStartBody (readerContext);
1187 Assert (readerContext.fStartedBodyYet);
1194 inline Color StyledTextIOReader_RTF::LookupColor (ReaderContext& readerContext,
size_t index)
const
1196 if (readerContext.fColorTable ==
nullptr) {
1197 HandleBadlyFormattedInput ();
1198 return Color::kBlack;
1202 return (readerContext.fColorTable->LookupColor (
static_cast<size_t> (index)));
1205 return Color::kBlack;
1211 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (StyledTextIOWriter_RTF& writer)
1214 , fSrcStream (writer.GetSrcStream ())
1215 , fLastEmittedISR (IncrementalFontSpecification (), 0)
1216 , fNextStyleChangeAt (0)
1218 , fNextHidableTextChangeAt (size_t (-1))
1219 , fHidableTextRegionOpen (false)
1220 , fIthHidableTextRun (0)
1224 inline StyledTextIOWriter_RTF::WriterContext::WriterContext (WriterContext& parentContext, SrcStream& srcStream)
1225 : fWriter (parentContext.fWriter)
1227 , fSrcStream (srcStream)
1228 , fLastEmittedISR (IncrementalFontSpecification (), 0)
1229 , fNextStyleChangeAt (0)
1231 , fNextHidableTextChangeAt (size_t (-1))
1232 , fHidableTextRegionOpen (false)
1233 , fIthHidableTextRun (0)
1237 inline StyledTextIOWriter_RTF& StyledTextIOWriter_RTF::WriterContext::GetWriter ()
const
1241 inline StyledTextIOWriter_RTF::SrcStream& StyledTextIOWriter_RTF::WriterContext::GetSrcStream ()
const
1245 inline StyledTextIOWriter_RTF::SinkStream& StyledTextIOWriter_RTF::WriterContext::GetSinkStream ()
const
1247 return fWriter.GetSinkStream ();
1251 inline CodePage StyledTextIOWriter_RTF::GetCurrentOutputCharSetEncoding ()
const
1253 return fCurrentOutputCharSetEncoding;
#define RequireNotNull(p)
basic_string< SDKChar > SDKString