4#ifndef _Stroika_Frameworks_Led_TextImager_h_
5#define _Stroika_Frameworks_Led_TextImager_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
16#include "Stroika/Frameworks/Led/BiDiLayoutEngine.h"
17#include "Stroika/Frameworks/Led/GDI.h"
18#include "Stroika/Frameworks/Led/Marker.h"
19#include "Stroika/Frameworks/Led/Support.h"
20#include "Stroika/Frameworks/Led/TextStore.h"
22namespace Stroika::Frameworks::Led {
30 class StandardTabStopList :
public TabStopList {
32 StandardTabStopList ();
33 StandardTabStopList (TWIPS eachWidth);
34 StandardTabStopList (
const vector<TWIPS>& tabstops);
35 StandardTabStopList (
const vector<TWIPS>& tabstops, TWIPS afterTabsWidth);
38 virtual TWIPS ComputeIthTab (
size_t i)
const override;
39 virtual TWIPS ComputeTabStopAfterPosition (TWIPS afterPos)
const override;
42 TWIPS fDefaultTabWidth;
43 vector<TWIPS> fTabStops;
46 constexpr bool operator== (
const StandardTabStopList& rhs)
const;
49#if qStroika_Frameworks_Led_SupportGDI
117 class TextImager :
public virtual MarkerOwner {
122 virtual ~TextImager ();
133 virtual TextStore* PeekAtTextStore ()
const override;
135 nonvirtual
void SpecifyTextStore (TextStore* useTextStore);
138 virtual void HookLosingTextStore ();
139 nonvirtual
void HookLosingTextStore_ ();
140 virtual void HookGainedNewTextStore ();
141 nonvirtual
void HookGainedNewTextStore_ ();
144 TextStore* fTextStore;
147 virtual void PurgeUnneededMemory ();
150 virtual void InvalidateAllCaches ();
165 nonvirtual FontSpecification GetDefaultFont ()
const;
166 virtual void SetDefaultFont (
const IncrementalFontSpecification& defaultFont);
169 nonvirtual
void SetDefaultFont_ (
const IncrementalFontSpecification& defaultFont);
172 FontSpecification fDefaultFont;
175 virtual FontSpecification GetDefaultSelectionFont ()
const;
190 class NotFullyInitialized {};
199 class NoTabletAvailable :
public NotFullyInitialized {};
225 virtual Tablet* AcquireTablet ()
const = 0;
232 virtual void ReleaseTablet (Tablet* tablet)
const = 0;
235 virtual void TabletChangedMetrics ();
238 class Tablet_Acquirer;
239 friend class Tablet_Acquirer;
247 class SimpleTabStopList;
250 virtual const TabStopList& GetTabStopList (
size_t containingPos)
const;
256 nonvirtual Led_Rect GetWindowRect ()
const;
257 virtual void SetWindowRect (
const Led_Rect& windowRect);
260 nonvirtual
void SetWindowRect_ (
const Led_Rect& windowRect);
263 Led_Rect fWindowRect;
268 struct TransientRowSpecification {
269 size_t fRowStartMarkerPos;
282 virtual size_t GetTopRowInWindow ()
const = 0;
287 virtual size_t GetTotalRowsInWindow ()
const = 0;
294 virtual size_t GetLastRowInWindow ()
const = 0;
299 virtual void SetTopRowInWindow (
size_t newTopRow) = 0;
307 virtual size_t GetMarkerPositionOfStartOfWindow ()
const = 0;
315 virtual size_t GetMarkerPositionOfEndOfWindow ()
const = 0;
320 virtual size_t GetMarkerPositionOfStartOfLastRowOfWindow ()
const = 0;
328 virtual ptrdiff_t CalculateRowDeltaFromCharDeltaFromTopOfWindow (
long deltaChars)
const = 0;
333 virtual ptrdiff_t CalculateCharDeltaFromRowDeltaFromTopOfWindow (ptrdiff_t deltaRows)
const = 0;
346 virtual void ScrollByIfRoom (ptrdiff_t downByRows) = 0;
356 virtual void ScrollSoShowing (
size_t markerPos,
size_t andTryToShowMarkerPos = 0) = 0;
359 nonvirtual
void ScrollSoShowingHHelper (
size_t markerPos,
size_t andTryToShowMarkerPos);
367 nonvirtual
bool GetForceAllRowsShowing ()
const;
368 nonvirtual
void SetForceAllRowsShowing (
bool forceAllRowsShowing);
371 bool fForceAllRowsShowing;
379 virtual void AssureWholeWindowUsedIfNeeded () = 0;
382 nonvirtual
bool GetImageUsingOffscreenBitmaps ()
const;
383 nonvirtual
void SetImageUsingOffscreenBitmaps (
bool imageUsingOffscreenBitmaps);
386 bool fImageUsingOffscreenBitmaps;
409 nonvirtual CoordinateType GetHScrollPos ()
const;
410 virtual void SetHScrollPos (CoordinateType hScrollPos);
413 nonvirtual
void SetHScrollPos_ (CoordinateType hScrollPos);
416 virtual DistanceType ComputeMaxHScrollPos ()
const;
419 CoordinateType fHScrollPos;
426 virtual DistanceType CalculateLongestRowInWindowPixelWidth ()
const;
429 enum CursorMovementDirection {
435 enum CursorMovementUnit {
443 virtual size_t ComputeRelativePosition (
size_t fromPos, CursorMovementDirection direction, CursorMovementUnit movementUnit);
446 class GoalColumnRecomputerControlContext;
447 nonvirtual
void RecomputeSelectionGoalColumn ();
450 bool fSuppressGoalColumnRecompute;
453 nonvirtual TWIPS GetSelectionGoalColumn ()
const;
454 nonvirtual
void SetSelectionGoalColumn (TWIPS selectionGoalColumn);
457 TWIPS fSelectionGoalColumn;
472 virtual void GetStableTypingRegionContaingMarkerRange (
size_t fromMarkerPos,
size_t toMarkerPos,
size_t* expandedFromMarkerPos,
473 size_t* expandedToMarkerPos)
const = 0;
476 nonvirtual Led_Rect GetTextWindowBoundingRect (
size_t fromMarkerPos,
size_t toMarkerPos)
const;
479 nonvirtual Led_Rect GetIntraRowTextWindowBoundingRect (
size_t fromMarkerPos,
size_t toMarkerPos)
const;
482 virtual vector<Led_Rect> GetRowHilightRects (
const TextLayoutBlock& text,
size_t rowStart,
size_t rowEnd,
size_t hilightStart,
483 size_t hilightEnd)
const;
491 virtual FontMetrics GetFontMetricsAt (
size_t charAfterPos)
const;
504 virtual void InvalidateScrollBarParameters ();
507 nonvirtual
bool GetUseSelectEOLBOLRowHilightStyle ()
const;
508 nonvirtual
void SetUseSelectEOLBOLRowHilightStyle (
bool useEOLBOLRowHilightStyle);
511 bool fUseEOLBOLRowHilightStyle;
519 nonvirtual
bool GetSelectionShown ()
const;
520 virtual void SetSelectionShown (
bool shown);
523 bool fSelectionShown;
526 nonvirtual
size_t GetSelectionStart ()
const;
527 nonvirtual
size_t GetSelectionEnd ()
const;
528 nonvirtual
void GetSelection (
size_t* start,
size_t* end)
const;
529 virtual void SetSelection (
size_t start,
size_t end);
532 nonvirtual
void SetSelection_ (
size_t start,
size_t end);
535 class HilightMarker :
public Marker {
537 HilightMarker () =
default;
539 HilightMarker* fHiliteMarker;
540 bool fWeAllocedHiliteMarker;
543 nonvirtual
void SetHilightMarker (HilightMarker* newHilightMarker);
559 virtual Led_Rect GetCharLocation (
size_t afterPosition)
const = 0;
567 virtual size_t GetCharAtLocation (
const Led_Point& where)
const = 0;
574 virtual Led_Rect GetCharWindowLocation (
size_t afterPosition)
const = 0;
580 virtual size_t GetCharAtWindowLocation (
const Led_Point& where)
const = 0;
586 virtual size_t GetStartOfRow (
size_t rowNumber)
const = 0;
591 virtual size_t GetStartOfRowContainingPosition (
size_t charPosition)
const = 0;
599 virtual size_t GetEndOfRow (
size_t rowNumber)
const = 0;
604 virtual size_t GetEndOfRowContainingPosition (
size_t charPosition)
const = 0;
611 virtual size_t GetRealEndOfRow (
size_t rowNumber)
const = 0;
616 virtual size_t GetRealEndOfRowContainingPosition (
size_t charPosition)
const = 0;
621 virtual size_t GetRowContainingPosition (
size_t charPosition)
const = 0;
626 virtual size_t GetRowCount ()
const = 0;
628 nonvirtual
size_t GetRowLength (
size_t rowNumber)
const;
635 virtual Led_Rect GetCharLocationRowRelativeByPosition (
size_t afterPosition,
size_t positionOfTopRow,
size_t maxRowsToCheck)
const = 0;
640 nonvirtual
size_t GetStartOfNextRowFromRowContainingPosition (
size_t charPosition)
const;
641 nonvirtual
size_t GetStartOfPrevRowFromRowContainingPosition (
size_t charPosition)
const;
649 virtual DistanceType GetRowHeight (
size_t rowNumber)
const = 0;
657 virtual DistanceType GetRowRelativeBaselineOfRowContainingPosition (
size_t charPosition)
const = 0;
665 virtual TextDirection GetTextDirection (
size_t charPosition)
const = 0;
668 virtual TextLayoutBlock_Copy GetTextLayoutBlock (
size_t rowStart,
size_t rowEnd)
const;
677 virtual vector<Led_Rect> GetSelectionWindowRects (
size_t from,
size_t to)
const;
678 virtual void GetSelectionWindowRegion (Region* r,
size_t from,
size_t to)
const;
687 virtual void Draw (
const Led_Rect& subsetToDraw,
bool printing) = 0;
721 enum DefaultColorIndex {
723 eDefaultBackgroundColor,
724 eDefaultSelectedTextColor,
725 eDefaultSelectedTextBackgroundColor,
726 eMaxDefaultColorIndex
728 nonvirtual Color* GetDefaultTextColor (DefaultColorIndex dci)
const;
729 nonvirtual Color GetEffectiveDefaultTextColor (DefaultColorIndex dci)
const;
730 nonvirtual
void ClearDefaultTextColor (DefaultColorIndex dci);
731 nonvirtual
void SetDefaultTextColor (DefaultColorIndex dci,
const Color& textColor);
734 Color* fDefaultColorIndex[eMaxDefaultColorIndex];
737 virtual void EraseBackground (Tablet* tablet,
const Led_Rect& subsetToDraw,
bool printing);
740 virtual void HilightArea (Tablet* tablet, Led_Rect hiliteArea);
741 virtual void HilightArea (Tablet* tablet,
const Region& hiliteArea);
744 virtual void DrawRow (Tablet* tablet,
const Led_Rect& currentRowRect,
const Led_Rect& invalidRowRect,
const TextLayoutBlock& text,
745 size_t rowStart,
size_t rowEnd,
bool printing);
746 virtual void DrawRowSegments (Tablet* tablet,
const Led_Rect& currentRowRect,
const Led_Rect& invalidRowRect,
747 const TextLayoutBlock& text,
size_t rowStart,
size_t rowEnd);
748 virtual void DrawRowHilight (Tablet* tablet,
const Led_Rect& currentRowRect,
const Led_Rect& invalidRowRect,
749 const TextLayoutBlock& text,
size_t rowStart,
size_t rowEnd);
750 virtual void DrawInterLineSpace (DistanceType interlineSpace, Tablet* tablet, CoordinateType vPosOfTopOfInterlineSpace,
751 bool segmentHilighted,
bool printing);
754 virtual bool ContainsMappedDisplayCharacters (
const Led_tChar* text,
size_t nTChars)
const;
755 virtual void ReplaceMappedDisplayCharacters (
const Led_tChar* srcText, Led_tChar* copyText,
size_t nTChars)
const;
756 virtual size_t RemoveMappedDisplayCharacters (Led_tChar* copyText,
size_t nTChars)
const;
757 virtual void PatchWidthRemoveMappedDisplayCharacters (
const Led_tChar* srcText, DistanceType* distanceResults,
size_t nTChars)
const;
760 static bool ContainsMappedDisplayCharacters_HelperForChar (
const Led_tChar* text,
size_t nTChars, Led_tChar charToMap);
761 static void ReplaceMappedDisplayCharacters_HelperForChar (Led_tChar* copyText,
size_t nTChars, Led_tChar charToMap, Led_tChar charToMapTo);
762 static size_t RemoveMappedDisplayCharacters_HelperForChar (Led_tChar* copyText,
size_t nTChars, Led_tChar charToRemove);
763 static void PatchWidthRemoveMappedDisplayCharacters_HelperForChar (
const Led_tChar* srcText, DistanceType* distanceResults,
764 size_t nTChars, Led_tChar charToRemove);
767 virtual void DrawSegment (Tablet* tablet,
size_t from,
size_t to,
const TextLayoutBlock& text,
const Led_Rect& drawInto,
768 const Led_Rect& invalidRect, CoordinateType useBaseLine, DistanceType* pixelsDrawn);
772 nonvirtual
void DrawSegment_ (Tablet* tablet,
const FontSpecification& fontSpec,
size_t from,
size_t to,
const TextLayoutBlock& text,
773 const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType* pixelsDrawn)
const;
783 virtual void MeasureSegmentWidth (
size_t from,
size_t to,
const Led_tChar* text, DistanceType* distanceResults)
const;
786 nonvirtual
void MeasureSegmentWidth_ (
const FontSpecification& fontSpec,
size_t from,
size_t to,
const Led_tChar* text,
787 DistanceType* distanceResults)
const;
790 virtual DistanceType MeasureSegmentHeight (
size_t from,
size_t to)
const;
793 nonvirtual DistanceType MeasureSegmentHeight_ (
const FontSpecification& fontSpec,
size_t from,
size_t to)
const;
796 virtual DistanceType MeasureSegmentBaseLine (
size_t from,
size_t to)
const;
799 nonvirtual DistanceType MeasureSegmentBaseLine_ (
const FontSpecification& fontSpec,
size_t from,
size_t to)
const;
821 virtual DistanceType CalcSegmentSize (
size_t from,
size_t to)
const = 0;
837 virtual void GetRowRelativeCharLoc (
size_t charLoc, DistanceType* lhs, DistanceType* rhs)
const = 0;
849 virtual size_t GetRowRelativeCharAtLoc (CoordinateType hOffset,
size_t rowStart)
const = 0;
853 mutable FontSpecification fCachedFontSpec;
854 mutable FontMetrics fCachedFontInfo;
855#if qStroika_Platform_Windows
856 mutable FontObject* fCachedFont;
858 mutable bool fCachedFontValid;
862 class FontCacheInfoUpdater {
864 FontCacheInfoUpdater (
const TextImager* imager, Tablet* tablet,
const FontSpecification& fontSpec);
865 ~FontCacheInfoUpdater ();
868 nonvirtual FontMetrics GetMetrics ()
const;
871 const TextImager* fImager;
873#if qStroika_Platform_Windows
876 HGDIOBJ fRestoreObject;
877 HGDIOBJ fRestoreAttribObject;
880 friend class FontCacheInfoUpdater;
883 friend class GoalColumnRecomputerControlContext;
890 class TextImager::Tablet_Acquirer {
892 Tablet_Acquirer (
const TextImager* textImager)
893 : fTextImager (textImager)
896 fTablet = fTextImager->AcquireTablet ();
911 fTextImager->ReleaseTablet (fTablet);
915 const TextImager* fTextImager;
925 class TextImager::SimpleTabStopList :
public TabStopList {
927 SimpleTabStopList (TWIPS twipsPerTabStop);
930 virtual TWIPS ComputeIthTab (
size_t i)
const override;
931 virtual TWIPS ComputeTabStopAfterPosition (TWIPS afterPos)
const override;
934 TWIPS fTWIPSPerTabStop;
941 class TextImager::GoalColumnRecomputerControlContext {
943 GoalColumnRecomputerControlContext (TextImager& imager,
bool suppressRecompute);
944 ~GoalColumnRecomputerControlContext ();
947 TextImager& fTextImager;
948 bool fSavedSuppressRecompute;
958 template <
typename TEXTSTORE,
typename IMAGER>
959 class TrivialImager :
public IMAGER {
961 using inherited = IMAGER;
964 TrivialImager (Tablet* t);
967 TrivialImager (Tablet* t, Led_Rect bounds,
const Led_tString& initialText = LED_TCHAR_OF (
""));
971 nonvirtual
void Draw (
bool printing =
false);
972 virtual void Draw (
const Led_Rect& subsetToDraw,
bool printing)
override;
975 virtual Tablet* AcquireTablet ()
const override;
976 virtual void ReleaseTablet (Tablet* )
const override;
979 virtual void EraseBackground (Tablet* tablet,
const Led_Rect& subsetToDraw,
bool printing)
override;
982 nonvirtual
void SnagAttributesFromTablet ();
985 nonvirtual Color GetBackgroundColor ()
const;
986 nonvirtual
void SetBackgroundColor (Color c);
987 nonvirtual
bool GetBackgroundTransparent ()
const;
988 nonvirtual
void SetBackgroundTransparent (
bool transparent);
991 TEXTSTORE fTextStore;
993 bool fBackgroundTransparent;
1004#include "TextImager.inl"