4#ifndef _Stroika_Frameworks_Led_StyledTextEmbeddedObjects_h_
5#define _Stroika_Frameworks_Led_StyledTextEmbeddedObjects_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
11#include "Stroika/Frameworks/Led/StyledTextImager.h"
12#include "Stroika/Frameworks/Led/TextInteractor.h"
25namespace Stroika::Frameworks::Led {
27#if qStroika_Frameworks_Led_SupportGDI
28 using Led_PrivateEmbeddingTag =
char[10];
36#if qOverrideDefaultSentinelValue
37 constexpr Led_tChar kEmbeddingSentinelChar = qOverrideDefaultSentinelValue;
39 constexpr Led_tChar kEmbeddingSentinelChar =
'\0';
52 class SimpleEmbeddedObjectStyleMarker;
60 class EmbeddedObjectCreatorRegistry {
62 EmbeddedObjectCreatorRegistry ();
65 static EmbeddedObjectCreatorRegistry& Get ();
68 static EmbeddedObjectCreatorRegistry* sThe;
74 Led_ClipFormat fFormatTag;
75 const Led_ClipFormat* fFormatTags;
79 size_t fFormatTagCount;
80 Led_PrivateEmbeddingTag fEmbeddingTag;
81 SimpleEmbeddedObjectStyleMarker* (*fReadFromMemory) (
const char* embeddingTag,
const void* data,
size_t len);
82 SimpleEmbeddedObjectStyleMarker* (*fReadFromFlavorPackage) (ReaderFlavorPackage& flavorPackage);
85 nonvirtual Led_ClipFormat GetIthFormat (
size_t i)
const;
88 friend class EmbeddedObjectCreatorRegistry;
92 nonvirtual
void AddAssoc (Assoc assoc);
93 nonvirtual
void AddAssoc (
const char* embeddingTag,
94 SimpleEmbeddedObjectStyleMarker* (*memReader) (
const char* embeddingTag,
const void* data,
size_t len));
95 nonvirtual
void AddAssoc (Led_ClipFormat clipFormat,
const char* embeddingTag,
96 SimpleEmbeddedObjectStyleMarker* (*memReader) (
const char* embeddingTag,
const void* data,
size_t len),
97 SimpleEmbeddedObjectStyleMarker* (*packageReader) (ReaderFlavorPackage& flavorPackage));
98 nonvirtual
void AddAssoc (
const Led_ClipFormat* clipFormats,
size_t clipFormatCount,
const char* embeddingTag,
99 SimpleEmbeddedObjectStyleMarker* (*memReader) (
const char* embeddingTag,
const void* data,
size_t len),
100 SimpleEmbeddedObjectStyleMarker* (*packageReader) (ReaderFlavorPackage& flavorPackage));
101 nonvirtual
const vector<Assoc>& GetAssocList ()
const;
102 nonvirtual
void SetAssocList (
const vector<Assoc>& assocList);
103 nonvirtual
void AddStandardTypes ();
104 nonvirtual
bool Lookup (
const char* embeddingTag, Assoc* result)
const;
107 vector<Assoc> fAssocList;
109 friend struct FooBarBlatzRegistryCleanupHack;
112 const Led_Size kDefaultEmbeddingMargin = Led_Size (4, 4);
126 class SimpleEmbeddedObjectStyleMarker :
public StyleMarker {
128 using inherited = StyleMarker;
131 SimpleEmbeddedObjectStyleMarker () =
default;
135 eEmbeddedObjectPriority = eBaselinePriority + 100
137 virtual int GetPriority ()
const override;
142 virtual DistanceType MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
145 virtual void DidUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
noexcept override;
151 virtual void write (
const void* buffer,
size_t bytes) = 0;
153 virtual const char* GetTag ()
const = 0;
154 virtual void Write (SinkStream& sink) = 0;
155 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage) = 0;
162 virtual bool HandleClick (Led_Point clickedAt,
unsigned clickCount);
163 virtual bool HandleOpen ();
166 enum PrivateCmdNumber {
167 eMinPrivateCmdNum = 1,
168 eOpenCmdNum = eMinPrivateCmdNum,
169 eMaxPrivateCmdNum = 100
171 virtual vector<PrivateCmdNumber> GetCmdNumbers ()
const;
172 virtual bool IsCmdEnabled (PrivateCmdNumber cmd)
const;
173 virtual SDKString GetCmdText (PrivateCmdNumber cmd);
174 virtual void DoCommand (PrivateCmdNumber cmd);
184 static const CommandNames& GetCommandNames ();
185 static void SetCommandNames (
const CommandNames& cmdNames);
186 static CommandNames MakeDefaultCommandNames ();
189 static CommandNames sCommandNames;
197 struct SimpleEmbeddedObjectStyleMarker::CommandNames {
201#if qStroika_Foundation_Common_Platform_Windows
207 class StandardMacPictureStyleMarker :
public SimpleEmbeddedObjectStyleMarker {
209 using inherited = SimpleEmbeddedObjectStyleMarker;
212#if qStroika_Foundation_Common_Platform_Windows
213 using PictureHandle = HANDLE;
217 static const Led_ClipFormat kClipFormat;
218 static const Led_PrivateEmbeddingTag kEmbeddingTag;
221 StandardMacPictureStyleMarker (
const Led_Picture* pictData,
size_t picSize);
222 ~StandardMacPictureStyleMarker ();
225 static SimpleEmbeddedObjectStyleMarker* mk (
const char* embeddingTag,
const void* data,
size_t len);
226 static SimpleEmbeddedObjectStyleMarker* mk (ReaderFlavorPackage& flavorPackage);
228#if qStroika_Foundation_Common_Platform_Windows
229 static const Led_DIB* sUnsupportedFormatPict;
237 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
238 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
239 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
240 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
241 const Led_tChar* text, DistanceType* distanceResults)
const override;
242 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
245 virtual const char* GetTag ()
const override;
246 virtual void Write (SinkStream& sink)
override;
247 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage)
override;
250 nonvirtual PictureHandle GetPictureHandle ()
const;
251 nonvirtual
size_t GetPictureByteSize ()
const;
254 PictureHandle fPictureHandle;
255#if qStroika_Foundation_Common_Platform_Windows
267 class StandardDIBStyleMarker :
public SimpleEmbeddedObjectStyleMarker {
269 using inherited = SimpleEmbeddedObjectStyleMarker;
272 static const Led_ClipFormat kClipFormat;
273 static const Led_PrivateEmbeddingTag kEmbeddingTag;
276 StandardDIBStyleMarker (
const Led_DIB* dibData);
277 ~StandardDIBStyleMarker ();
280 static SimpleEmbeddedObjectStyleMarker* mk (
const char* embeddingTag,
const void* data,
size_t len);
281 static SimpleEmbeddedObjectStyleMarker* mk (ReaderFlavorPackage& flavorPackage);
285 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
286 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
287 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
288 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
289 const Led_tChar* text, DistanceType* distanceResults)
const override;
290 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
293 virtual const char* GetTag ()
const override;
294 virtual void Write (SinkStream& sink)
override;
295 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage)
override;
298 nonvirtual
const Led_DIB* GetDIBData ()
const;
309 class StandardURLStyleMarker :
public SimpleEmbeddedObjectStyleMarker {
311 using inherited = SimpleEmbeddedObjectStyleMarker;
314 static const Led_ClipFormat kURLDClipFormat;
315#if qStroika_Foundation_Common_Platform_Windows
316 static const Led_ClipFormat kWin32URLClipFormat;
318 static const Led_PrivateEmbeddingTag kEmbeddingTag;
320 StandardURLStyleMarker (
const Led_URLD& urlData);
321 ~StandardURLStyleMarker ();
324 static SimpleEmbeddedObjectStyleMarker* mk (
const char* embeddingTag,
const void* data,
size_t len);
325 static SimpleEmbeddedObjectStyleMarker* mk (ReaderFlavorPackage& flavorPackage);
328 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
329 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
330 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
331 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
332 const Led_tChar* text, DistanceType* distanceResults)
const override;
333 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
336 virtual const char* GetTag ()
const override;
337 virtual void Write (SinkStream& sink)
override;
338 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage)
override;
341 virtual bool HandleOpen ()
override;
344 virtual vector<PrivateCmdNumber> GetCmdNumbers ()
const override;
345 virtual bool IsCmdEnabled (PrivateCmdNumber cmd)
const override;
348 nonvirtual
const Led_URLD& GetURLData ()
const;
349 nonvirtual
void SetURLData (
const Led_URLD& urlData);
355 nonvirtual Led_tString GetDisplayString ()
const;
356 nonvirtual FontSpecification GetDisplayFont (
const StyleRunElement& runElement)
const;
359#if qStroika_Foundation_Common_Platform_Windows
360 class StandardMacPictureWithURLStyleMarker :
public SimpleEmbeddedObjectStyleMarker {
362 using inherited = SimpleEmbeddedObjectStyleMarker;
365 static const Led_ClipFormat kClipFormats[];
366 static const size_t kClipFormatCount;
367 static const Led_PrivateEmbeddingTag kEmbeddingTag;
368 static const Led_PrivateEmbeddingTag kOld1EmbeddingTag;
371 StandardMacPictureWithURLStyleMarker (
const Led_Picture* pictData,
size_t picSize,
const Led_URLD& urlData);
372 ~StandardMacPictureWithURLStyleMarker ();
375 static SimpleEmbeddedObjectStyleMarker* mk (
const char* embeddingTag,
const void* data,
size_t len);
376 static SimpleEmbeddedObjectStyleMarker* mk (ReaderFlavorPackage& flavorPackage);
379 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
380 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
381 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
382 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
383 const Led_tChar* text, DistanceType* distanceResults)
const override;
384 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
387 virtual const char* GetTag ()
const override;
388 virtual void Write (SinkStream& sink)
override;
389 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage)
override;
392 virtual bool HandleOpen ()
override;
395 virtual vector<PrivateCmdNumber> GetCmdNumbers ()
const override;
396 virtual bool IsCmdEnabled (PrivateCmdNumber cmd)
const override;
402 nonvirtual StandardMacPictureStyleMarker::PictureHandle GetPictureHandle ()
const;
403 nonvirtual
size_t GetPictureByteSize ()
const;
404 nonvirtual
const Led_URLD& GetURLData ()
const;
405 nonvirtual
void SetURLData (
const Led_URLD& urlData);
408 StandardMacPictureStyleMarker::PictureHandle fPictureHandle;
409#if qStroika_Foundation_Common_Platform_Windows
414 class StandardDIBWithURLStyleMarker :
public SimpleEmbeddedObjectStyleMarker {
416 using inherited = SimpleEmbeddedObjectStyleMarker;
419 static const Led_ClipFormat kClipFormats[];
420 static const size_t kClipFormatCount;
421 static const Led_PrivateEmbeddingTag kEmbeddingTag;
424 StandardDIBWithURLStyleMarker (
const Led_DIB* dibData,
const Led_URLD& urlData);
425 ~StandardDIBWithURLStyleMarker ();
428 static SimpleEmbeddedObjectStyleMarker* mk (
const char* embeddingTag,
const void* data,
size_t len);
429 static SimpleEmbeddedObjectStyleMarker* mk (ReaderFlavorPackage& flavorPackage);
432 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
433 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
434 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
435 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
436 const Led_tChar* text, DistanceType* distanceResults)
const override;
437 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
440 virtual const char* GetTag ()
const override;
441 virtual void Write (SinkStream& sink)
override;
442 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage)
override;
445 virtual bool HandleOpen ()
override;
448 virtual vector<PrivateCmdNumber> GetCmdNumbers ()
const override;
449 virtual bool IsCmdEnabled (PrivateCmdNumber cmd)
const override;
452 nonvirtual
const Led_DIB* GetDIBData ()
const;
458 nonvirtual
const Led_URLD& GetURLData ()
const;
459 nonvirtual
void SetURLData (
const Led_URLD& urlData);
471 class StandardUnknownTypeStyleMarker :
public SimpleEmbeddedObjectStyleMarker {
473 using inherited = SimpleEmbeddedObjectStyleMarker;
476 static const Led_PrivateEmbeddingTag kDefaultEmbeddingTag;
479 StandardUnknownTypeStyleMarker (Led_ClipFormat format,
const char* embeddingTag,
const void* unknownTypeData,
size_t nBytes,
480 const Led_DIB* dib =
nullptr);
481 ~StandardUnknownTypeStyleMarker ();
484#if qStroika_Foundation_Common_Platform_Windows
485 static const Led_DIB* sUnknownPict;
489 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
490 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
491 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
492 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
493 const Led_tChar* text, DistanceType* distanceResults)
const override;
494 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
497 virtual const char* GetTag ()
const override;
498 virtual void Write (SinkStream& sink)
override;
499 virtual void ExternalizeFlavors (WriterFlavorPackage& flavorPackage)
override;
502 nonvirtual TWIPS_Point GetShownSize ()
const;
503 nonvirtual
void SetShownSize (TWIPS_Point size);
504 nonvirtual TWIPS_Point CalcDefaultShownSize ();
505 static TWIPS_Point CalcStaticDefaultShownSize ();
508 TWIPS_Point fShownSize;
511 nonvirtual
const void* GetData ()
const;
512 nonvirtual
size_t GetDataLength ()
const;
517 Led_ClipFormat fFormat;
518 Led_PrivateEmbeddingTag fEmbeddingTag;
519 unique_ptr<Led_DIB> fDisplayDIB;
522#if qStroika_Frameworks_Led_SupportGDI
530 void InsertEmbeddingForExistingSentinel (SimpleEmbeddedObjectStyleMarker* embedding, TextStore& textStore,
size_t insertAt,
531 MarkerOwner* ownerForEmbedding);
542 void AddEmbedding (SimpleEmbeddedObjectStyleMarker* embedding, TextStore& textStore,
size_t insertAt, MarkerOwner* ownerForEmbedding);
554#include "StyledTextEmbeddedObjects.inl"
basic_string< SDKChar > SDKString