From e5c319db91fe69c20b5e328dbe750eb0e7199d0c Mon Sep 17 00:00:00 2001 From: martin Date: Sun, 17 Jun 2012 21:14:03 +0000 Subject: [PATCH] SynEdit, MacroRecorder: Added AssignEvents git-svn-id: trunk@37678 - --- components/synedit/synmacrorecorder.pas | 82 ++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/components/synedit/synmacrorecorder.pas b/components/synedit/synmacrorecorder.pas index 34c7b0774c..2e7d2dc8f3 100644 --- a/components/synedit/synmacrorecorder.pas +++ b/components/synedit/synmacrorecorder.pas @@ -51,19 +51,22 @@ resourcestring sCannotResume = 'Can only resume when paused'; type - TSynMacroState = (msStopped, msRecording, msPlaying, msPaused); + TSynMacroState = (msStopped, msRecording, msPlaying, msPaused); // msPaused = paused recording TSynMacroCommand = (mcRecord, mcPlayback); + { TSynMacroEvent } + TSynMacroEvent = class(TObject) protected fRepeatCount: Byte; function GetAsString : string; virtual; abstract; procedure InitEventParameters(aStr : string); virtual; abstract; public - constructor Create; {$IFNDEF FPC}virtual;{$ENDIF} + constructor Create; virtual; procedure Initialize(aCmd: TSynEditorCommand; const aChar: TUTF8Char; aData: Pointer); virtual; abstract; + procedure Assign(AnEvent: TSynMacroEvent); virtual; { the CommandID must not be read inside LoadFromStream/SaveToStream. It's read by the MacroRecorder component to decide which MacroEvent class to instanciate } procedure LoadFromStream(aStream: TStream); virtual; abstract; @@ -73,6 +76,8 @@ type property RepeatCount : Byte read fRepeatCount write fRepeatCount; end; + TSynMacroEventClass = class of TSynMacroEvent; + { TSynIgnoredEvent } TSynIgnoredEvent = class(TSynMacroEvent) @@ -88,6 +93,8 @@ type procedure Playback(aEditor: TCustomSynEdit); override; end; + { TSynBasicEvent } + TSynBasicEvent = class(TSynMacroEvent) protected fCommand: TSynEditorCommand; @@ -97,6 +104,7 @@ type procedure Initialize(aCmd: TSynEditorCommand; const aChar: TUTF8Char; aData: Pointer); override; + procedure Assign(AnEvent: TSynMacroEvent); override; procedure LoadFromStream(aStream: TStream); override; procedure SaveToStream(aStream: TStream); override; procedure Playback(aEditor: TCustomSynEdit); override; @@ -104,6 +112,8 @@ type property Command: TSynEditorCommand read fCommand write fCommand; end; + { TSynCharEvent } + TSynCharEvent = class(TSynMacroEvent) protected fKey: TUTF8Char; @@ -113,6 +123,7 @@ type procedure Initialize(aCmd: TSynEditorCommand; const aChar: TUTF8Char; aData: Pointer); override; + procedure Assign(AnEvent: TSynMacroEvent); override; procedure LoadFromStream(aStream: TStream); override; procedure SaveToStream(aStream: TStream); override; procedure Playback(aEditor: TCustomSynEdit); override; @@ -120,6 +131,8 @@ type property Key: TUTF8Char read fKey write fKey; end; + { TSynStringEvent } + TSynStringEvent = class(TSynMacroEvent) protected fString: string; @@ -129,6 +142,7 @@ type procedure Initialize(aCmd: TSynEditorCommand; const aChar: TUTF8Char; aData: Pointer); override; + procedure Assign(AnEvent: TSynMacroEvent); override; procedure LoadFromStream(aStream: TStream); override; procedure SaveToStream(aStream: TStream); override; procedure Playback(aEditor: TCustomSynEdit); override; @@ -136,6 +150,8 @@ type property Value: string read fString write fString; end; + { TSynPositionEvent } + TSynPositionEvent = class(TSynBasicEvent) protected fPosition: TPoint; @@ -145,6 +161,7 @@ type procedure Initialize(aCmd: TSynEditorCommand; const aChar: TUTF8Char; aData: Pointer); override; + procedure Assign(AnEvent: TSynMacroEvent); override; procedure LoadFromStream(aStream: TStream); override; procedure SaveToStream(aStream: TStream); override; procedure Playback(aEditor: TCustomSynEdit); override; @@ -152,6 +169,8 @@ type property Position: TPoint read fPosition write fPosition; end; + { TSynDataEvent } + TSynDataEvent = class(TSynBasicEvent) protected fData: Pointer; @@ -159,6 +178,7 @@ type procedure Initialize(aCmd: TSynEditorCommand; const aChar: TUTF8Char; aData: Pointer); override; + procedure Assign(AnEvent: TSynMacroEvent); override; procedure LoadFromStream(aStream: TStream); override; procedure SaveToStream(aStream: TStream); override; procedure Playback(aEditor: TCustomSynEdit); override; @@ -234,6 +254,7 @@ type procedure Stop; procedure Pause; procedure Resume; + procedure AssignEventsFrom(AMacroRecorder: TCustomSynMacroRecorder); property IsEmpty: boolean read GetIsEmpty; property State: TSynMacroState read fState; procedure Clear; @@ -319,7 +340,13 @@ procedure TSynDataEvent.Initialize(aCmd: TSynEditorCommand; const aChar: TUTF8Ch begin fCommand := aCmd; Assert( aChar = #0 ); - fData := aData; + fData := aData; // Todo: must be copied... +end; + +procedure TSynDataEvent.Assign(AnEvent: TSynMacroEvent); +begin + inherited Assign(AnEvent); + // Todo: COPY data. end; procedure TSynDataEvent.LoadFromStream(aStream: TStream); @@ -659,6 +686,22 @@ begin StateChanged; end; +procedure TCustomSynMacroRecorder.AssignEventsFrom(AMacroRecorder: TCustomSynMacroRecorder); +var + i: Integer; + NewEvent: TSynMacroEvent; +begin + Clear; + if AMacroRecorder.fEvents = nil then exit; + + fEvents := TList.Create; + for i := 0 to AMacroRecorder.fEvents.Count -1 do begin + NewEvent := TSynMacroEventClass(TSynMacroEvent(AMacroRecorder.fEvents[i]).ClassType).Create; + NewEvent.Assign(TSynMacroEvent(AMacroRecorder.fEvents[i])); + fEvents.add(NewEvent); + end; +end; + procedure TCustomSynMacroRecorder.SaveToStream(aDest: TStream); var cEvent, eCnt : integer; @@ -857,6 +900,13 @@ begin {$ENDIF} end; +procedure TSynBasicEvent.Assign(AnEvent: TSynMacroEvent); +begin + inherited Assign(AnEvent); + if AnEvent is TSynBasicEvent then + fCommand := TSynBasicEvent(AnEvent).fCommand; +end; + procedure TSynBasicEvent.LoadFromStream(aStream: TStream); begin aStream.Read( fRepeatCount, SizeOf(fRepeatCount) ); @@ -906,6 +956,13 @@ begin Assert( aData = nil ); end; +procedure TSynCharEvent.Assign(AnEvent: TSynMacroEvent); +begin + inherited Assign(AnEvent); + if AnEvent is TSynCharEvent then + fKey := TSynCharEvent(AnEvent).fKey; +end; + procedure TSynCharEvent.LoadFromStream(aStream: TStream); begin aStream.Read( fKey, SizeOf(Key) ); @@ -978,6 +1035,13 @@ begin Position := Point( 0, 0 ); end; +procedure TSynPositionEvent.Assign(AnEvent: TSynMacroEvent); +begin + inherited Assign(AnEvent); + if AnEvent is TSynPositionEvent then + fPosition := TSynPositionEvent(AnEvent).fPosition; +end; + procedure TSynPositionEvent.LoadFromStream(aStream: TStream); begin aStream.Read( fPosition, SizeOf(Position) ); @@ -1045,6 +1109,13 @@ begin Value := String(aData); end; +procedure TSynStringEvent.Assign(AnEvent: TSynMacroEvent); +begin + inherited Assign(AnEvent); + if AnEvent is TSynStringEvent then + fString := TSynStringEvent(AnEvent).fString; +end; + procedure TSynStringEvent.LoadFromStream(aStream: TStream); var l : Integer; @@ -1108,4 +1179,9 @@ begin fRepeatCount := 1; end; +procedure TSynMacroEvent.Assign(AnEvent: TSynMacroEvent); +begin + fRepeatCount := AnEvent.fRepeatCount; +end; + end.