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 {};
226 virtual Tablet* AcquireTablet ()
const = 0;
233 virtual void ReleaseTablet (Tablet* tablet)
const = 0;
236 virtual void TabletChangedMetrics ();
239 class Tablet_Acquirer;
240 friend class Tablet_Acquirer;
248 class SimpleTabStopList;
251 virtual const TabStopList& GetTabStopList (
size_t containingPos)
const;
257 nonvirtual Led_Rect GetWindowRect ()
const;
258 virtual void SetWindowRect (
const Led_Rect& windowRect);
261 nonvirtual
void SetWindowRect_ (
const Led_Rect& windowRect);
264 Led_Rect fWindowRect;
269 struct TransientRowSpecification {
270 size_t fRowStartMarkerPos;
283 virtual size_t GetTopRowInWindow ()
const = 0;
288 virtual size_t GetTotalRowsInWindow ()
const = 0;
295 virtual size_t GetLastRowInWindow ()
const = 0;
300 virtual void SetTopRowInWindow (
size_t newTopRow) = 0;
308 virtual size_t GetMarkerPositionOfStartOfWindow ()
const = 0;
316 virtual size_t GetMarkerPositionOfEndOfWindow ()
const = 0;
321 virtual size_t GetMarkerPositionOfStartOfLastRowOfWindow ()
const = 0;
329 virtual ptrdiff_t CalculateRowDeltaFromCharDeltaFromTopOfWindow (
long deltaChars)
const = 0;
334 virtual ptrdiff_t CalculateCharDeltaFromRowDeltaFromTopOfWindow (ptrdiff_t deltaRows)
const = 0;
347 virtual void ScrollByIfRoom (ptrdiff_t downByRows) = 0;
357 virtual void ScrollSoShowing (
size_t markerPos,
size_t andTryToShowMarkerPos = 0) = 0;
360 nonvirtual
void ScrollSoShowingHHelper (
size_t markerPos,
size_t andTryToShowMarkerPos);
368 nonvirtual
bool GetForceAllRowsShowing ()
const;
369 nonvirtual
void SetForceAllRowsShowing (
bool forceAllRowsShowing);
372 bool fForceAllRowsShowing;
380 virtual void AssureWholeWindowUsedIfNeeded () = 0;
383 nonvirtual
bool GetImageUsingOffscreenBitmaps ()
const;
384 nonvirtual
void SetImageUsingOffscreenBitmaps (
bool imageUsingOffscreenBitmaps);
387 bool fImageUsingOffscreenBitmaps;
410 nonvirtual CoordinateType GetHScrollPos ()
const;
411 virtual void SetHScrollPos (CoordinateType hScrollPos);
414 nonvirtual
void SetHScrollPos_ (CoordinateType hScrollPos);
417 virtual DistanceType ComputeMaxHScrollPos ()
const;
420 CoordinateType fHScrollPos;
427 virtual DistanceType CalculateLongestRowInWindowPixelWidth ()
const;
430 enum CursorMovementDirection {
436 enum CursorMovementUnit {
444 virtual size_t ComputeRelativePosition (
size_t fromPos, CursorMovementDirection direction, CursorMovementUnit movementUnit);
447 class GoalColumnRecomputerControlContext;
448 nonvirtual
void RecomputeSelectionGoalColumn ();
451 bool fSuppressGoalColumnRecompute;
454 nonvirtual TWIPS GetSelectionGoalColumn ()
const;
455 nonvirtual
void SetSelectionGoalColumn (TWIPS selectionGoalColumn);
458 TWIPS fSelectionGoalColumn;
473 virtual void GetStableTypingRegionContaingMarkerRange (
size_t fromMarkerPos,
size_t toMarkerPos,
size_t* expandedFromMarkerPos,
474 size_t* expandedToMarkerPos)
const = 0;
477 nonvirtual Led_Rect GetTextWindowBoundingRect (
size_t fromMarkerPos,
size_t toMarkerPos)
const;
480 nonvirtual Led_Rect GetIntraRowTextWindowBoundingRect (
size_t fromMarkerPos,
size_t toMarkerPos)
const;
483 virtual vector<Led_Rect> GetRowHilightRects (
const TextLayoutBlock& text,
size_t rowStart,
size_t rowEnd,
size_t hilightStart,
484 size_t hilightEnd)
const;
492 virtual FontMetrics GetFontMetricsAt (
size_t charAfterPos)
const;
505 virtual void InvalidateScrollBarParameters ();
508 nonvirtual
bool GetUseSelectEOLBOLRowHilightStyle ()
const;
509 nonvirtual
void SetUseSelectEOLBOLRowHilightStyle (
bool useEOLBOLRowHilightStyle);
512 bool fUseEOLBOLRowHilightStyle;
520 nonvirtual
bool GetSelectionShown ()
const;
521 virtual void SetSelectionShown (
bool shown);
524 bool fSelectionShown;
527 nonvirtual
size_t GetSelectionStart ()
const;
528 nonvirtual
size_t GetSelectionEnd ()
const;
529 nonvirtual
void GetSelection (
size_t* start,
size_t* end)
const;
530 virtual void SetSelection (
size_t start,
size_t end);
533 nonvirtual
void SetSelection_ (
size_t start,
size_t end);
536 class HilightMarker :
public Marker {
538 HilightMarker () =
default;
540 HilightMarker* fHiliteMarker;
541 bool fWeAllocedHiliteMarker;
544 nonvirtual
void SetHilightMarker (HilightMarker* newHilightMarker);
560 virtual Led_Rect GetCharLocation (
size_t afterPosition)
const = 0;
568 virtual size_t GetCharAtLocation (
const Led_Point& where)
const = 0;
575 virtual Led_Rect GetCharWindowLocation (
size_t afterPosition)
const = 0;
581 virtual size_t GetCharAtWindowLocation (
const Led_Point& where)
const = 0;
587 virtual size_t GetStartOfRow (
size_t rowNumber)
const = 0;
592 virtual size_t GetStartOfRowContainingPosition (
size_t charPosition)
const = 0;
600 virtual size_t GetEndOfRow (
size_t rowNumber)
const = 0;
605 virtual size_t GetEndOfRowContainingPosition (
size_t charPosition)
const = 0;
612 virtual size_t GetRealEndOfRow (
size_t rowNumber)
const = 0;
617 virtual size_t GetRealEndOfRowContainingPosition (
size_t charPosition)
const = 0;
622 virtual size_t GetRowContainingPosition (
size_t charPosition)
const = 0;
627 virtual size_t GetRowCount ()
const = 0;
629 nonvirtual
size_t GetRowLength (
size_t rowNumber)
const;
636 virtual Led_Rect GetCharLocationRowRelativeByPosition (
size_t afterPosition,
size_t positionOfTopRow,
size_t maxRowsToCheck)
const = 0;
641 nonvirtual
size_t GetStartOfNextRowFromRowContainingPosition (
size_t charPosition)
const;
642 nonvirtual
size_t GetStartOfPrevRowFromRowContainingPosition (
size_t charPosition)
const;
650 virtual DistanceType GetRowHeight (
size_t rowNumber)
const = 0;
658 virtual DistanceType GetRowRelativeBaselineOfRowContainingPosition (
size_t charPosition)
const = 0;
666 virtual TextDirection GetTextDirection (
size_t charPosition)
const = 0;
669 virtual TextLayoutBlock_Copy GetTextLayoutBlock (
size_t rowStart,
size_t rowEnd)
const;
678 virtual vector<Led_Rect> GetSelectionWindowRects (
size_t from,
size_t to)
const;
679 virtual void GetSelectionWindowRegion (Region* r,
size_t from,
size_t to)
const;
688 virtual void Draw (
const Led_Rect& subsetToDraw,
bool printing) = 0;
722 enum DefaultColorIndex {
724 eDefaultBackgroundColor,
725 eDefaultSelectedTextColor,
726 eDefaultSelectedTextBackgroundColor,
727 eMaxDefaultColorIndex
729 nonvirtual Color* GetDefaultTextColor (DefaultColorIndex dci)
const;
730 nonvirtual Color GetEffectiveDefaultTextColor (DefaultColorIndex dci)
const;
731 nonvirtual
void ClearDefaultTextColor (DefaultColorIndex dci);
732 nonvirtual
void SetDefaultTextColor (DefaultColorIndex dci,
const Color& textColor);
735 Color* fDefaultColorIndex[eMaxDefaultColorIndex];
738 virtual void EraseBackground (Tablet* tablet,
const Led_Rect& subsetToDraw,
bool printing);
741 virtual void HilightArea (Tablet* tablet, Led_Rect hiliteArea);
742 virtual void HilightArea (Tablet* tablet,
const Region& hiliteArea);
745 virtual void DrawRow (Tablet* tablet,
const Led_Rect& currentRowRect,
const Led_Rect& invalidRowRect,
const TextLayoutBlock& text,
746 size_t rowStart,
size_t rowEnd,
bool printing);
747 virtual void DrawRowSegments (Tablet* tablet,
const Led_Rect& currentRowRect,
const Led_Rect& invalidRowRect,
748 const TextLayoutBlock& text,
size_t rowStart,
size_t rowEnd);
749 virtual void DrawRowHilight (Tablet* tablet,
const Led_Rect& currentRowRect,
const Led_Rect& invalidRowRect,
750 const TextLayoutBlock& text,
size_t rowStart,
size_t rowEnd);
751 virtual void DrawInterLineSpace (DistanceType interlineSpace, Tablet* tablet, CoordinateType vPosOfTopOfInterlineSpace,
752 bool segmentHilighted,
bool printing);
755 virtual bool ContainsMappedDisplayCharacters (
const Led_tChar* text,
size_t nTChars)
const;
756 virtual void ReplaceMappedDisplayCharacters (
const Led_tChar* srcText, Led_tChar* copyText,
size_t nTChars)
const;
757 virtual size_t RemoveMappedDisplayCharacters (Led_tChar* copyText,
size_t nTChars)
const;
758 virtual void PatchWidthRemoveMappedDisplayCharacters (
const Led_tChar* srcText, DistanceType* distanceResults,
size_t nTChars)
const;
761 static bool ContainsMappedDisplayCharacters_HelperForChar (
const Led_tChar* text,
size_t nTChars, Led_tChar charToMap);
762 static void ReplaceMappedDisplayCharacters_HelperForChar (Led_tChar* copyText,
size_t nTChars, Led_tChar charToMap, Led_tChar charToMapTo);
763 static size_t RemoveMappedDisplayCharacters_HelperForChar (Led_tChar* copyText,
size_t nTChars, Led_tChar charToRemove);
764 static void PatchWidthRemoveMappedDisplayCharacters_HelperForChar (
const Led_tChar* srcText, DistanceType* distanceResults,
765 size_t nTChars, Led_tChar charToRemove);
768 virtual void DrawSegment (Tablet* tablet,
size_t from,
size_t to,
const TextLayoutBlock& text,
const Led_Rect& drawInto,
769 const Led_Rect& invalidRect, CoordinateType useBaseLine, DistanceType* pixelsDrawn);
773 nonvirtual
void DrawSegment_ (Tablet* tablet,
const FontSpecification& fontSpec,
size_t from,
size_t to,
const TextLayoutBlock& text,
774 const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType* pixelsDrawn)
const;
784 virtual void MeasureSegmentWidth (
size_t from,
size_t to,
const Led_tChar* text, DistanceType* distanceResults)
const;
787 nonvirtual
void MeasureSegmentWidth_ (
const FontSpecification& fontSpec,
size_t from,
size_t to,
const Led_tChar* text,
788 DistanceType* distanceResults)
const;
791 virtual DistanceType MeasureSegmentHeight (
size_t from,
size_t to)
const;
794 nonvirtual DistanceType MeasureSegmentHeight_ (
const FontSpecification& fontSpec,
size_t from,
size_t to)
const;
797 virtual DistanceType MeasureSegmentBaseLine (
size_t from,
size_t to)
const;
800 nonvirtual DistanceType MeasureSegmentBaseLine_ (
const FontSpecification& fontSpec,
size_t from,
size_t to)
const;
822 virtual DistanceType CalcSegmentSize (
size_t from,
size_t to)
const = 0;
838 virtual void GetRowRelativeCharLoc (
size_t charLoc, DistanceType* lhs, DistanceType* rhs)
const = 0;
850 virtual size_t GetRowRelativeCharAtLoc (CoordinateType hOffset,
size_t rowStart)
const = 0;
854 mutable FontSpecification fCachedFontSpec;
855 mutable FontMetrics fCachedFontInfo;
856#if qStroika_Foundation_Common_Platform_Windows
857 mutable FontObject* fCachedFont;
859 mutable bool fCachedFontValid;
863 class FontCacheInfoUpdater {
865 FontCacheInfoUpdater (
const TextImager* imager, Tablet* tablet,
const FontSpecification& fontSpec);
866 ~FontCacheInfoUpdater ();
869 nonvirtual FontMetrics GetMetrics ()
const;
872 const TextImager* fImager;
874#if qStroika_Foundation_Common_Platform_Windows
877 HGDIOBJ fRestoreObject;
878 HGDIOBJ fRestoreAttribObject;
881 friend class FontCacheInfoUpdater;
884 friend class GoalColumnRecomputerControlContext;
891 class TextImager::Tablet_Acquirer {
893 Tablet_Acquirer (
const TextImager* textImager)
894 : fTextImager (textImager)
897 fTablet = fTextImager->AcquireTablet ();
912 fTextImager->ReleaseTablet (fTablet);
916 const TextImager* fTextImager;
926 class TextImager::SimpleTabStopList :
public TabStopList {
928 SimpleTabStopList (TWIPS twipsPerTabStop);
931 virtual TWIPS ComputeIthTab (
size_t i)
const override;
932 virtual TWIPS ComputeTabStopAfterPosition (TWIPS afterPos)
const override;
935 TWIPS fTWIPSPerTabStop;
942 class TextImager::GoalColumnRecomputerControlContext {
944 GoalColumnRecomputerControlContext (TextImager& imager,
bool suppressRecompute);
945 ~GoalColumnRecomputerControlContext ();
948 TextImager& fTextImager;
949 bool fSavedSuppressRecompute;
952 DISABLE_COMPILER_MSC_WARNING_START (4250)
961 template <typename TEXTSTORE, typename IMAGER>
962 class TrivialImager : public IMAGER {
964 using inherited = IMAGER;
967 TrivialImager (Tablet* t);
970 TrivialImager (Tablet* t, Led_Rect bounds,
const Led_tString& initialText = LED_TCHAR_OF (
""));
974 nonvirtual
void Draw (
bool printing =
false);
975 virtual void Draw (
const Led_Rect& subsetToDraw,
bool printing)
override;
978 virtual Tablet* AcquireTablet ()
const override;
979 virtual void ReleaseTablet (Tablet* )
const override;
982 virtual void EraseBackground (Tablet* tablet,
const Led_Rect& subsetToDraw,
bool printing)
override;
985 nonvirtual
void SnagAttributesFromTablet ();
988 nonvirtual Color GetBackgroundColor ()
const;
989 nonvirtual
void SetBackgroundColor (Color c);
990 nonvirtual
bool GetBackgroundTransparent ()
const;
991 nonvirtual
void SetBackgroundTransparent (
bool transparent);
994 TEXTSTORE fTextStore;
996 bool fBackgroundTransparent;
998 DISABLE_COMPILER_MSC_WARNING_END (4250)
1008#include "TextImager.inl"