4#ifndef _Stroika_Framework_Led_Command_h_
5#define _Stroika_Framework_Led_Command_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
10#include "Stroika/Frameworks/Led/Support.h"
21namespace Stroika::Frameworks::Led {
27#if qStroika_Frameworks_Led_SupportGDI
38 Command (
bool done =
false);
39 virtual ~Command () =
default;
42 virtual void Do (TextInteractor& interactor);
43 virtual void UnDo (TextInteractor& interactor);
44 virtual void ReDo (TextInteractor& interactor);
47 virtual bool UpdateSimpleTextInsert (
size_t insertAt, Led_tChar c);
50 virtual const SDKChar* GetName ()
const;
53 nonvirtual
bool GetDone ()
const;
66 class CommandHandler {
68 CommandHandler () =
default;
78 virtual void Post (Command* newCommand) = 0;
83 virtual bool PostUpdateSimpleTextInsert (
size_t insertAt, Led_tChar c);
90 virtual void BreakInGroupedCommands () = 0;
96 virtual void BreakInGroupedCommandsIfDifferentCommand (
const SDKString& cmdName) = 0;
103 virtual void DoUndo (TextInteractor& interactor) = 0;
108 virtual void DoRedo (TextInteractor& interactor) = 0;
115 virtual void Commit () = 0;
120 virtual bool CanUndo () = 0;
125 virtual bool CanRedo () = 0;
131 virtual size_t GetUndoRedoWhatMessageText (
char* buf,
size_t bufSize);
132 virtual const SDKChar* GetUndoCmdName () = 0;
133 virtual const SDKChar* GetRedoCmdName () = 0;
142 class SingleUndoCommandHandler :
public CommandHandler {
144 SingleUndoCommandHandler ();
147 virtual void Post (Command* newCommand)
override;
148 virtual bool PostUpdateSimpleTextInsert (
size_t insertAt, Led_tChar c)
override;
149 virtual void BreakInGroupedCommands ()
override;
150 virtual void BreakInGroupedCommandsIfDifferentCommand (
const SDKString& cmdName)
override;
151 virtual void DoUndo (TextInteractor& interactor)
override;
152 virtual void DoRedo (TextInteractor& interactor)
override;
153 virtual void Commit ()
override;
154 virtual bool CanUndo ()
override;
155 virtual bool CanRedo ()
override;
156 virtual const SDKChar* GetUndoCmdName ()
override;
157 virtual const SDKChar* GetRedoCmdName ()
override;
159 virtual bool GetDone ()
const;
164#if qStroika_Foundation_Debug_AssertionsChecked
176 class MultiLevelUndoCommandHandler :
public CommandHandler {
178 MultiLevelUndoCommandHandler (
size_t maxUndoLevels,
size_t maxCmdsPerLevel = 100);
179 virtual ~MultiLevelUndoCommandHandler ();
182 virtual void Post (Command* newCommand)
override;
183 virtual bool PostUpdateSimpleTextInsert (
size_t insertAt, Led_tChar c)
override;
184 virtual void BreakInGroupedCommands ()
override;
185 virtual void BreakInGroupedCommandsIfDifferentCommand (
const SDKString& cmdName)
override;
186 virtual void DoUndo (TextInteractor& interactor)
override;
187 virtual void DoRedo (TextInteractor& interactor)
override;
188 virtual void Commit ()
override;
189 virtual bool CanUndo ()
override;
190 virtual bool CanRedo ()
override;
191 virtual const SDKChar* GetUndoCmdName ()
override;
192 virtual const SDKChar* GetRedoCmdName ()
override;
195 nonvirtual
size_t GetMaxUnDoLevels ();
196 nonvirtual
void SetMaxUnDoLevels (
size_t maxUndoLevels);
199 size_t fMaxUndoLevels;
200 size_t fMaxCmdsPerLevel;
202 vector<Command*> fCommands;
203 unsigned fCommandGroupCount;
204 unsigned fUndoneGroupCount;
206#if qStroika_Foundation_Debug_AssertionsChecked
211 nonvirtual
bool GetLastCmdRangeBefore (
size_t* startIdx,
size_t* endIdx)
const;
212 nonvirtual
bool GetLastCmdRangeAfter (
size_t* startIdx,
size_t* endIdx)
const;
213 nonvirtual
void Commit_After (
size_t after);
214 nonvirtual
void Commit_Before (
size_t before);
229 class SnoopingCommandHandler :
public CommandHandler {
231 SnoopingCommandHandler (CommandHandler* realHandler);
234 nonvirtual CommandHandler* GetRealHandler ()
const;
237 virtual void Post (Command* newCommand)
override;
238 virtual void BreakInGroupedCommands ()
override;
239 virtual void BreakInGroupedCommandsIfDifferentCommand (
const SDKString& cmdName)
override;
240 virtual void DoUndo (TextInteractor& interactor)
override;
241 virtual void DoRedo (TextInteractor& interactor)
override;
242 virtual void Commit ()
override;
243 virtual bool CanUndo ()
override;
244 virtual bool CanRedo ()
override;
245 virtual const SDKChar* GetUndoCmdName ()
override;
246 virtual const SDKChar* GetRedoCmdName ()
override;
249 virtual void Snoop (Command* newCommand) = 0;
252 CommandHandler* fRealHandler;
266 class TextInteractor;
267 class InteractiveReplaceCommand :
public Command {
269 using inherited = Command;
276 InteractiveReplaceCommand (SavedTextRep* beforeRegion, SavedTextRep* afterRegion,
size_t at,
const SDKString& cmdName);
277 ~InteractiveReplaceCommand ();
280 virtual void Do (TextInteractor& )
override;
281 virtual void UnDo (TextInteractor& )
override;
282 virtual void ReDo (TextInteractor& )
override;
285 virtual bool UpdateSimpleTextInsert (
size_t insertAt, Led_tChar c)
override;
288 virtual const SDKChar* GetName ()
const override;
291 SavedTextRep* fBeforeRegion;
292 SavedTextRep* fAfterRegion;
303 class InteractiveReplaceCommand::SavedTextRep {
305 SavedTextRep (
size_t selStart,
size_t selEnd);
306 virtual ~SavedTextRep ();
313 virtual size_t GetLength ()
const = 0;
321 virtual void InsertSelf (TextInteractor* imager,
size_t at,
size_t nBytesToOverwrite) = 0;
330 virtual void ApplySelection (TextInteractor* imager);
345 class InteractiveReplaceCommand::PlainTextRep :
public InteractiveReplaceCommand::SavedTextRep,
346 public Foundation::Memory::UseBlockAllocationIfAppropriate<PlainTextRep> {
348 using inherited = SavedTextRep;
351 PlainTextRep (
size_t selStart,
size_t selEnd,
const Led_tChar* text,
size_t textLen);
355 virtual size_t GetLength ()
const override;
356 virtual void InsertSelf (TextInteractor* imager,
size_t at,
size_t nBytesToOverwrite)
override;
359 nonvirtual
bool AppendCharToRep (
size_t insertAt, Led_tChar c);
374#include "Command.inl"
conditional_t< qTargetPlatformSDKUseswchar_t, wchar_t, char > SDKChar
basic_string< SDKChar > SDKString