4#ifndef _Stroika_Frameworks_Led_StandardStyledTextInteractor_h_
5#define _Stroika_Frameworks_Led_StandardStyledTextInteractor_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
17#include "Stroika/Frameworks/Led/StandardStyledTextImager.h"
18#include "Stroika/Frameworks/Led/TextInteractor.h"
20#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO.h"
22namespace Stroika::Frameworks::Led {
32#ifndef qStroika_Frameworks_Led_IncludeLedNativeFileFormatSupportInStandardStyledTextInteractor
33#define qStroika_Frameworks_Led_IncludeLedNativeFileFormatSupportInStandardStyledTextInteractor 0
36 extern const Led_ClipFormat kLedPrivateClipFormat;
37 extern const Led_ClipFormat kRTFClipFormat;
38 extern const Led_ClipFormat kHTMLClipFormat;
47 using inherited = StyledTextIO::StyledTextIOWriter::SrcStream;
51 size_t selectionStart = 0,
size_t selectionEnd = kBadIndex);
52#if qStroika_Frameworks_Led_SupportGDI
57 virtual size_t readNTChars (Led_tChar* intoBuf,
size_t maxTChars)
override;
58 virtual size_t current_offset ()
const override;
59 virtual void seek_to (
size_t to)
override;
60 virtual size_t GetTotalTextLength ()
const override;
61 virtual vector<StyledInfoSummaryRecord> GetStyleInfo (
size_t from,
size_t len)
const override;
62#if qStroika_Frameworks_Led_SupportGDI
63 virtual vector<SimpleEmbeddedObjectStyleMarker*> CollectAllEmbeddingMarkersInRange (
size_t from,
size_t to)
const override;
65 virtual Table* GetTableAt (
size_t at)
const override;
66 virtual void SummarizeFontAndColorTable (set<SDKString>* fontNames, set<Color>* colorsUsed)
const override;
67 virtual size_t GetEmbeddingMarkerPosOffset ()
const override;
70 nonvirtual
size_t GetCurOffset ()
const;
71 nonvirtual
size_t GetSelStart ()
const;
72 nonvirtual
size_t GetSelEnd ()
const;
75 TextStore* fTextStore;
76 shared_ptr<AbstractStyleDatabaseRep> fStyleRunDatabase;
89 using inherited = StyledTextIO::StyledTextIOReader::SinkStream;
98 virtual size_t current_offset ()
const override;
99 virtual void AppendText (
const Led_tChar* text,
size_t nTChars,
const FontSpecification* fontSpec)
override;
100 virtual void ApplyStyle (
size_t from,
size_t to,
const vector<StyledInfoSummaryRecord>& styleRuns)
override;
102#if qStroika_Frameworks_Led_SupportGDI
103 virtual void InsertEmbeddingForExistingSentinel (SimpleEmbeddedObjectStyleMarker* embedding,
size_t at)
override;
104 virtual void AppendEmbedding (SimpleEmbeddedObjectStyleMarker* embedding)
override;
106 virtual void AppendSoftLineBreak ()
override;
107 virtual void InsertMarker (Marker* m,
size_t at,
size_t length,
MarkerOwner* markerOwner)
override;
108 virtual void Flush ()
override;
111 nonvirtual
size_t GetInsertionStart ()
const;
112 nonvirtual
void SetInsertionStart (
size_t insertionStart);
113 nonvirtual
size_t GetOriginalStart ()
const;
114 nonvirtual
size_t GetCachedTextSize ()
const;
117 nonvirtual
const vector<Led_tChar>& GetCachedText ()
const;
120 nonvirtual TextStore& GetTextStore ()
const;
121 nonvirtual shared_ptr<AbstractStyleDatabaseRep> GetStyleDatabase ()
const;
124 nonvirtual
void PushContext (TextStore* ts,
const shared_ptr<AbstractStyleDatabaseRep>& textStyleDatabase,
size_t insertionStart);
125 nonvirtual
void PopContext ();
129 TextStore* fTextStore;
130 shared_ptr<AbstractStyleDatabaseRep> fStyleRunDatabase;
131 size_t fOriginalStart;
132 size_t fInsertionStart;
134 vector<Context> fSavedContexts;
137 TextStore* fTextStore{
nullptr};
138 shared_ptr<AbstractStyleDatabaseRep> fStyleRunDatabase{
nullptr};
139 size_t fOriginalStart{0};
140 size_t fInsertionStart{0};
141 vector<StyledInfoSummaryRecord> fSavedStyleInfo{};
142 vector<Led_tChar> fCachedText{};
145#if qStroika_Frameworks_Led_SupportGDI
146 class SimpleEmbeddedObjectStyleMarker;
148 DISABLE_COMPILER_MSC_WARNING_START (4250)
164 class StandardStyledTextInteractor : public virtual TextInteractor, public StandardStyledTextImager {
166 using inherited =
void*;
168 StandardStyledTextInteractor ();
171 virtual ~StandardStyledTextInteractor () =
default;
181 static const CommandNames& GetCommandNames ();
182 static void SetCommandNames (
const CommandNames& cmdNames);
183 static CommandNames MakeDefaultCommandNames ();
186 static CommandNames sCommandNames;
189 virtual void HookLosingTextStore ()
override;
190 nonvirtual
void HookLosingTextStore_ ();
191 virtual void HookGainedNewTextStore ()
override;
192 nonvirtual
void HookGainedNewTextStore_ ();
195 virtual void SetDefaultFont (
const IncrementalFontSpecification& defaultFont)
override;
198 virtual void InteractiveSetFont (
const IncrementalFontSpecification& defaultFont);
201 virtual IncrementalFontSpecification GetContinuousStyleInfo (
size_t from,
size_t nTChars)
const override;
204 virtual void DidUpdateText (
const UpdateInfo& updateInfo)
noexcept override;
207 virtual bool ShouldEnablePasteCommand ()
const override;
208 virtual bool CanAcceptFlavor (Led_ClipFormat clipFormat)
const override;
211 class StyledTextFlavorPackageInternalizer;
212 class StyledTextFlavorPackageExternalizer;
215 virtual void HookStyleDatabaseChanged ()
override;
218 virtual shared_ptr<FlavorPackageInternalizer> MakeDefaultInternalizer ()
override;
219 virtual shared_ptr<FlavorPackageExternalizer> MakeDefaultExternalizer ()
override;
222 virtual bool ProcessSimpleClick (Led_Point clickedAt,
unsigned clickCount,
bool extendSelection,
size_t* dragAnchor)
override;
223 virtual void WhileSimpleMouseTracking (Led_Point newMousePos,
size_t dragAnchor)
override;
226 virtual void InteractiveReplace (
const Led_tChar* withWhat,
size_t withWhatCharCount, UpdateMode updateMode = eDefaultUpdate)
override;
227 virtual void SetSelection (
size_t start,
size_t end)
override;
228 using TextInteractor::SetSelection;
231 virtual bool InteractiveReplaceEarlyPostReplaceHook (
size_t withWhatCharCount)
override;
232 nonvirtual
void SetSelection_ (
size_t start,
size_t end);
234 bool fEmptySelectionStyleSuppressMode;
239 nonvirtual
void SetEmptySelectionStyle ();
243 nonvirtual vector<SimpleEmbeddedObjectStyleMarker*> CollectAllEmbeddingMarkersInRange (
size_t from,
size_t to)
const;
246 virtual InteractiveReplaceCommand::SavedTextRep* InteractiveUndoHelperMakeTextRep (
size_t regionStart,
size_t regionEnd,
247 size_t selStart,
size_t selEnd)
override;
250 class EmptySelStyleTextRep;
251 friend class EmptySelStyleTextRep;
253 DISABLE_COMPILER_MSC_WARNING_END (4250)
266 struct StandardStyledTextInteractor::CommandNames {
267 SDKString fFontChangeCommandName;
275 class StandardStyledTextInteractor::StyledTextFlavorPackageInternalizer :
public virtual FlavorPackageInternalizer {
277 using inherited = FlavorPackageInternalizer;
280 StyledTextFlavorPackageInternalizer (TextStore& ts,
const shared_ptr<AbstractStyleDatabaseRep>& styleDatabase);
283 virtual bool InternalizeBestFlavor (ReaderFlavorPackage& flavorPackage,
size_t from,
size_t to)
override;
286 virtual void InternalizeFlavor_FILEGuessFormatsFromName (filesystem::path fileName, Led_ClipFormat* suggestedClipFormat,
287 optional<CodePage> suggestedCodePage)
override;
288 virtual void InternalizeFlavor_FILEGuessFormatsFromStartOfData (Led_ClipFormat* suggestedClipFormat, optional<CodePage> suggestedCodePage,
289 const byte* fileStart,
const byte* fileEnd)
override;
292#if qStroika_Frameworks_Led_IncludeLedNativeFileFormatSupportInStandardStyledTextInteractor
293 virtual bool InternalizeFlavor_Native (ReaderFlavorPackage& flavorPackage,
size_t from,
size_t to);
295 virtual bool InternalizeFlavor_RTF (ReaderFlavorPackage& flavorPackage,
size_t from,
size_t to);
296 virtual bool InternalizeFlavor_HTML (ReaderFlavorPackage& flavorPackage,
size_t from,
size_t to);
297 virtual bool InternalizeFlavor_OtherRegisteredEmbedding (ReaderFlavorPackage& flavorPackage,
size_t from,
size_t to);
300 virtual StandardStyledTextIOSinkStream* mkStandardStyledTextIOSinkStream (
size_t insertionStart);
303 shared_ptr<AbstractStyleDatabaseRep> fStyleDatabase;
311 class StandardStyledTextInteractor::StyledTextFlavorPackageExternalizer :
public virtual FlavorPackageExternalizer {
313 using inherited = FlavorPackageExternalizer;
316 StyledTextFlavorPackageExternalizer (TextStore& ts,
const shared_ptr<AbstractStyleDatabaseRep>& styleDatabase);
319 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage,
size_t from,
size_t to)
override;
320 virtual void ExternalizeBestFlavor (WriterFlavorPackage& flavorPackage,
size_t from,
size_t to)
override;
323#if qStroika_Frameworks_Led_IncludeLedNativeFileFormatSupportInStandardStyledTextInteractor
324 nonvirtual
void ExternalizeFlavor_Native (WriterFlavorPackage& flavorPackage,
size_t from,
size_t to);
326 nonvirtual
void ExternalizeFlavor_RTF (WriterFlavorPackage& flavorPackage,
size_t from,
size_t to);
327 nonvirtual
void ExternalizeFlavor_SingleSelectedEmbedding (WriterFlavorPackage& flavorPackage, SimpleEmbeddedObjectStyleMarker* embedding);
330 virtual StandardStyledTextIOSrcStream* mkStandardStyledTextIOSrcStream (
size_t selectionStart,
size_t selectionEnd);
333 shared_ptr<AbstractStyleDatabaseRep> fStyleDatabase;
341 class StandardStyledTextInteractor::EmptySelStyleTextRep :
public InteractiveReplaceCommand::SavedTextRep {
343 using inherited = InteractiveReplaceCommand::SavedTextRep;
346 EmptySelStyleTextRep (StandardStyledTextInteractor* interactor,
size_t selStart,
size_t selEnd);
349 virtual size_t GetLength ()
const override;
350 virtual void InsertSelf (TextInteractor* interactor,
size_t at,
size_t nBytesToOverwrite)
override;
353 FontSpecification fSavedStyle;
364#include "StandardStyledTextInteractor.inl"