mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-22 16:09:17 +02:00
+ groupd action started, not yet working
This commit is contained in:
parent
06dbbc88f9
commit
94e9de50fb
@ -124,14 +124,14 @@ const
|
||||
eaDeleteText = 5;
|
||||
eaSelectionChanged = 6;
|
||||
eaCut = 7;
|
||||
eaCopy = 8;
|
||||
eaPaste = 9;
|
||||
eaPaste = 8;
|
||||
eaPasteWin = 9;
|
||||
eaClear = 10;
|
||||
LastAction = eaClear;
|
||||
|
||||
ActionString : array [0..LastAction] of string[8] =
|
||||
('','Move','InsLine','InsText','DelLine','DelText',
|
||||
'SelCh','Cut','Copy','Paste','Clear');
|
||||
'SelCh','Cut','Paste','PasteWin','Clear');
|
||||
|
||||
CIndicator = #2#3#1;
|
||||
CEditor = #33#34#35#36#37#38#39#40#41#42#43#44#45#46#47#48#49;
|
||||
@ -183,22 +183,27 @@ type
|
||||
StartPos : TPoint;
|
||||
EndPos : TPoint;
|
||||
Text : PString;
|
||||
ActionCount : longint;
|
||||
Action : byte;
|
||||
constructor init(act:byte; StartP,EndP:TPoint;Txt:String);
|
||||
constructor init_group(act:byte);
|
||||
function is_grouped_action : boolean;
|
||||
destructor done; virtual;
|
||||
end;
|
||||
|
||||
PEditorActionCollection = ^TEditorActionCollection;
|
||||
TEditorActionCollection = object(TCollection)
|
||||
CurrentGroupedAction : PEditorAction;
|
||||
function At(Idx : sw_integer) : PEditorAction;
|
||||
end;
|
||||
{$else}
|
||||
PEditorAction = ^TEditorAction;
|
||||
TEditorAction = packed record
|
||||
Action : byte;
|
||||
StartPos : TPoint;
|
||||
EndPos : TPoint;
|
||||
Text : PString;
|
||||
ActionCount : longint;
|
||||
Action : byte;
|
||||
end;
|
||||
|
||||
PEditorActionCollection = ^TEditorActionCollection;
|
||||
@ -313,6 +318,8 @@ type
|
||||
procedure DrawLines(FirstLine: sw_integer);
|
||||
procedure HideHighlight;
|
||||
procedure AddAction(AAction: byte; AStartPos, AEndPos: TPoint; AText: string);
|
||||
procedure AddGroupedAction(AAction : byte);
|
||||
procedure CloseGroupedAction(AAction : byte);
|
||||
function ShouldExtend: boolean;
|
||||
function ValidBlock: boolean;
|
||||
public
|
||||
@ -2893,6 +2900,9 @@ function TCodeEditor.ClipCopy: Boolean;
|
||||
var OK: boolean;
|
||||
begin
|
||||
Lock;
|
||||
{AddGroupedAction(eaCopy);
|
||||
can we undo a copy ??
|
||||
maybe as an Undo Paste in Clipboard !! }
|
||||
OK:=Clipboard<>nil;
|
||||
if OK then OK:=Clipboard^.InsertFrom(@Self);
|
||||
ClipCopy:=OK;
|
||||
@ -2903,6 +2913,7 @@ procedure TCodeEditor.ClipCut;
|
||||
begin
|
||||
if IsReadOnly then Exit;
|
||||
Lock;
|
||||
AddGroupedAction(eaCut);
|
||||
DontConsiderShiftState:=true;
|
||||
if Clipboard<>nil then
|
||||
if Clipboard^.InsertFrom(@Self) then
|
||||
@ -2911,6 +2922,7 @@ begin
|
||||
DelSelect;
|
||||
SetModified(true);
|
||||
end;
|
||||
CloseGroupedAction(eaCut);
|
||||
UnLock;
|
||||
DontConsiderShiftState:=false;
|
||||
end;
|
||||
@ -2920,11 +2932,13 @@ begin
|
||||
if IsReadOnly then Exit;
|
||||
DontConsiderShiftState:=true;
|
||||
Lock;
|
||||
AddGroupedAction(eaPaste);
|
||||
if Clipboard<>nil then
|
||||
begin
|
||||
InsertFrom(Clipboard);
|
||||
SetModified(true);
|
||||
end;
|
||||
CloseGroupedAction(eaPaste);
|
||||
UnLock;
|
||||
DontConsiderShiftState:=false;
|
||||
end;
|
||||
@ -2952,6 +2966,7 @@ begin
|
||||
OK:=GetTextWinClipBoardData(p,l);
|
||||
if OK then
|
||||
begin
|
||||
AddGroupedAction(eaPasteWin);
|
||||
p2:=p;
|
||||
p13:=strpos(p,#13);
|
||||
p10:=strpos(p,#10);
|
||||
@ -2993,6 +3008,7 @@ begin
|
||||
end;
|
||||
SetCurPtr(StorePos.X,StorePos.Y);
|
||||
SetModified(true);
|
||||
CloseGroupedAction(eaPasteWin);
|
||||
Update;
|
||||
{ we must free the allocated memory }
|
||||
freemem(p,l);
|
||||
@ -3058,7 +3074,8 @@ end;
|
||||
procedure TCodeEditor.Undo;
|
||||
{$ifdef Undo}
|
||||
var
|
||||
Temp,Idx : Longint;
|
||||
Temp,Idx,Last,Count : Longint;
|
||||
Is_grouped : boolean;
|
||||
{$endif Undo}
|
||||
begin
|
||||
{$ifdef Undo}
|
||||
@ -3066,66 +3083,89 @@ begin
|
||||
Lock;
|
||||
if UndoList^.count > 0 then
|
||||
begin
|
||||
Idx:=UndoList^.count-1;
|
||||
with UndoList^.At(Idx)^ do
|
||||
begin
|
||||
case action of
|
||||
eaMoveCursor :
|
||||
begin
|
||||
{ move cursor back to original position }
|
||||
SetCurPtr(startpos.x,startpos.y);
|
||||
end;
|
||||
eaInsertText :
|
||||
begin
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
for Temp := 1 to length(Text^) do
|
||||
DelChar;
|
||||
end;
|
||||
eaDeleteText :
|
||||
begin
|
||||
{ reinsert deleted text }
|
||||
SetCurPtr(EndPos.X,EndPos.Y);
|
||||
for Temp := 1 to length(Text^) do
|
||||
AddChar(Text^[Temp]);
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
end;
|
||||
eaInsertLine :
|
||||
begin
|
||||
SetCurPtr(EndPos.X,EndPos.Y);
|
||||
SetDisplayText(EndPos.Y,Copy(GetDisplayText(EndPos.Y),EndPos.X+1,255));
|
||||
BackSpace;
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
end;
|
||||
eaDeleteLine :
|
||||
begin
|
||||
SetCurPtr(EndPos.X,EndPos.Y);
|
||||
DelEnd;
|
||||
InsertLine;
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
SetLineText(StartPos.Y,GetStr(Text));
|
||||
end;
|
||||
eaSelectionChanged :
|
||||
begin
|
||||
{ move cursor to end of last set selection }
|
||||
end;
|
||||
else
|
||||
{ what the 'ell's an undefined action doing round 'ere mate! }
|
||||
end; { once this lot is done paste into redo and modify to suit needs }
|
||||
{ move item to redo stack }
|
||||
RedoList^.Insert(UndoList^.At(Idx));
|
||||
UpdateUndoRedo(cmRedo,UndoList^.At(Idx)^.Action);
|
||||
UndoList^.atDelete(Idx);
|
||||
If Idx>0 then
|
||||
UpdateUndoRedo(cmUndo,UndoList^.At(Idx-1)^.Action)
|
||||
else
|
||||
UpdateUndoRedo(cmUndo,0);
|
||||
Last:=UndoList^.count-1;
|
||||
if UndoList^.At(Last)^.Is_grouped_action then
|
||||
begin
|
||||
Count:=UndoList^.At(Last)^.ActionCount;
|
||||
Dec(Last);
|
||||
Is_grouped:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Count:=1;
|
||||
Is_grouped:=false;
|
||||
end;
|
||||
for Idx:=Last downto Last-Count+1 do
|
||||
with UndoList^.At(Idx)^ do
|
||||
begin
|
||||
case action of
|
||||
eaMoveCursor :
|
||||
begin
|
||||
{ move cursor back to original position }
|
||||
SetCurPtr(startpos.x,startpos.y);
|
||||
end;
|
||||
eaInsertText :
|
||||
begin
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
for Temp := 1 to length(Text^) do
|
||||
DelChar;
|
||||
end;
|
||||
eaDeleteText :
|
||||
begin
|
||||
{ reinsert deleted text }
|
||||
SetCurPtr(EndPos.X,EndPos.Y);
|
||||
for Temp := 1 to length(Text^) do
|
||||
AddChar(Text^[Temp]);
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
end;
|
||||
eaInsertLine :
|
||||
begin
|
||||
SetCurPtr(EndPos.X,EndPos.Y);
|
||||
SetDisplayText(EndPos.Y,Copy(GetDisplayText(EndPos.Y),EndPos.X+1,255));
|
||||
BackSpace;
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
end;
|
||||
eaDeleteLine :
|
||||
begin
|
||||
SetCurPtr(EndPos.X,EndPos.Y);
|
||||
DelEnd;
|
||||
InsertLine;
|
||||
SetCurPtr(StartPos.X,StartPos.Y);
|
||||
SetLineText(StartPos.Y,GetStr(Text));
|
||||
end;
|
||||
eaSelectionChanged :
|
||||
begin
|
||||
{ move cursor to end of last set selection }
|
||||
end;
|
||||
else
|
||||
{ what the 'ell's an undefined action doing round 'ere mate! }
|
||||
end; { once this lot is done paste into redo and modify to suit needs }
|
||||
{ move item to redo stack }
|
||||
RedoList^.Insert(UndoList^.At(Idx));
|
||||
UpdateUndoRedo(cmRedo,UndoList^.At(Idx)^.Action);
|
||||
UndoList^.atDelete(Idx);
|
||||
If Idx>0 then
|
||||
UpdateUndoRedo(cmUndo,UndoList^.At(Idx-1)^.Action)
|
||||
else
|
||||
UpdateUndoRedo(cmUndo,0);
|
||||
end;{Idx loop for grouped actions }
|
||||
if is_grouped then
|
||||
begin
|
||||
Idx:=UndoList^.Count-1;
|
||||
RedoList^.Insert(UndoList^.At(Idx));
|
||||
UpdateUndoRedo(cmRedo,UndoList^.At(Idx)^.Action);
|
||||
UndoList^.atDelete(Idx);
|
||||
If Idx>0 then
|
||||
UpdateUndoRedo(cmUndo,UndoList^.At(Idx-1)^.Action)
|
||||
else
|
||||
UpdateUndoRedo(cmUndo,0);
|
||||
end;
|
||||
if UndoList^.count=0 then
|
||||
SetCmdState(UndoCmd,false);
|
||||
SetCmdState(RedoCmd,true);
|
||||
Message(Application,evBroadcast,cmCommandSetChanged,nil);
|
||||
DrawView;
|
||||
end;
|
||||
end;
|
||||
StoreUndo := True;
|
||||
Unlock;
|
||||
{$else}
|
||||
@ -3136,16 +3176,29 @@ end;
|
||||
procedure TCodeEditor.Redo;
|
||||
{$ifdef Undo}
|
||||
var
|
||||
Idx,Temp : Longint;
|
||||
Temp,Idx,Last,Count : Longint;
|
||||
Is_grouped : boolean;
|
||||
{$endif Undo}
|
||||
begin
|
||||
{$ifdef Undo}
|
||||
StoreUndo := False;
|
||||
Lock;
|
||||
if RedoList^.count <> 0 then
|
||||
begin
|
||||
Idx:=RedoList^.count-1;
|
||||
with PEditorAction(RedoList^.At(Idx))^ do
|
||||
begin
|
||||
Last:=RedoList^.count-1;
|
||||
if RedoList^.At(Last)^.Is_grouped_action then
|
||||
begin
|
||||
Count:=RedoList^.At(Last)^.ActionCount;
|
||||
Dec(Last);
|
||||
Is_grouped:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Count:=1;
|
||||
Is_grouped:=false;
|
||||
end;
|
||||
for Idx:=Last downto Last-Count+1 do
|
||||
with RedoList^.At(Idx)^ do
|
||||
begin
|
||||
case action of
|
||||
eaMoveCursor :
|
||||
@ -3186,19 +3239,30 @@ begin
|
||||
end; { once this lot is done paste back into undo and modify to suit needs }
|
||||
{ move item to undo stack }
|
||||
UndoList^.Insert(RedoList^.At(Idx));
|
||||
UpdateUndoRedo(cmUndo,PEditorAction(RedoList^.At(Idx))^.Action);
|
||||
UpdateUndoRedo(cmUndo,RedoList^.At(Idx)^.Action);
|
||||
If Idx>0 then
|
||||
UpdateUndoRedo(cmRedo,PEditorAction(RedoList^.At(Idx-1))^.Action)
|
||||
UpdateUndoRedo(cmRedo,RedoList^.At(Idx-1)^.Action)
|
||||
else
|
||||
UpdateUndoRedo(cmRedo,0);
|
||||
RedoList^.atDelete(Idx);
|
||||
end;{ Idx loop for grouped action }
|
||||
If is_grouped then
|
||||
begin
|
||||
Idx:=RedoList^.count-1;
|
||||
UndoList^.Insert(RedoList^.At(Idx));
|
||||
UpdateUndoRedo(cmUndo,RedoList^.At(Idx)^.Action);
|
||||
If Idx>0 then
|
||||
UpdateUndoRedo(cmRedo,RedoList^.At(Idx-1)^.Action)
|
||||
else
|
||||
UpdateUndoRedo(cmRedo,0);
|
||||
RedoList^.atDelete(Idx);
|
||||
end;
|
||||
if RedoList^.count=0 then
|
||||
SetCmdState(RedoCmd,false);
|
||||
SetCmdState(UndoCmd,true);
|
||||
DrawView;
|
||||
Message(Application,evBroadcast,cmCommandSetChanged,nil);
|
||||
end;
|
||||
end;
|
||||
StoreUndo := True;
|
||||
Unlock;
|
||||
{$else}
|
||||
@ -4097,6 +4161,8 @@ begin
|
||||
if not ActionIntegrated then
|
||||
begin
|
||||
UndoList^.Insert(New(PEditorAction,Init(AAction,AStartPos,AEndPos,AText)));
|
||||
if assigned(UndoList^.CurrentGroupedAction) then
|
||||
Inc(UndoList^.CurrentGroupedAction^.actionCount);
|
||||
UpdateUndoRedo(cmUndo,AAction);
|
||||
end;
|
||||
if UndoList^.count>0 then
|
||||
@ -4110,6 +4176,23 @@ begin
|
||||
{$endif Undo}
|
||||
end;
|
||||
|
||||
procedure TCodeEditor.AddGroupedAction(AAction : byte);
|
||||
begin
|
||||
{$ifdef Undo}
|
||||
UndoList^.CurrentGroupedAction:=New(PEditorAction,Init_group(AAction));
|
||||
{$endif Undo}
|
||||
end;
|
||||
|
||||
procedure TCodeEditor.CloseGroupedAction(AAction : byte);
|
||||
begin
|
||||
{$ifdef Undo}
|
||||
UndoList^.Insert(UndoList^.CurrentGroupedAction);
|
||||
UndoList^.CurrentGroupedAction:=nil;
|
||||
UpdateUndoRedo(cmUndo,AAction);
|
||||
{$endif Undo}
|
||||
end;
|
||||
|
||||
|
||||
function TCodeEditor.ValidBlock: boolean;
|
||||
begin
|
||||
ValidBlock:=(SelStart.X<>SelEnd.X) or (SelStart.Y<>SelEnd.Y);
|
||||
@ -4373,12 +4456,25 @@ begin
|
||||
end;
|
||||
|
||||
{$ifdef Undo}
|
||||
|
||||
constructor TEditorAction.init(act:byte; StartP,EndP:TPoint;Txt:String);
|
||||
begin
|
||||
Action := act;
|
||||
StartPos := StartP;
|
||||
EndPos := EndP;
|
||||
Text := NewStr(txt);
|
||||
Action:=act;
|
||||
StartPos:=StartP;
|
||||
EndPos:=EndP;
|
||||
Text:=NewStr(txt);
|
||||
ActionCount:=0;
|
||||
end;
|
||||
|
||||
constructor TEditorAction.init_group(act:byte);
|
||||
begin
|
||||
Action:=act;
|
||||
ActionCount:=0;
|
||||
end;
|
||||
|
||||
function TEditorAction.Is_grouped_action : boolean;
|
||||
begin
|
||||
Is_grouped_action:=Action in [eaCut,eaPaste,eaPasteWin,eaClear];
|
||||
end;
|
||||
|
||||
destructor TEditorAction.done;
|
||||
@ -4931,7 +5027,10 @@ end;
|
||||
END.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.60 1999-11-05 13:49:13 pierre
|
||||
Revision 1.61 1999-11-10 00:45:30 pierre
|
||||
+ groupd action started, not yet working
|
||||
|
||||
Revision 1.60 1999/11/05 13:49:13 pierre
|
||||
* WinPaste depends on avalaible Clipboard data
|
||||
|
||||
Revision 1.59 1999/11/03 09:39:23 peter
|
||||
|
Loading…
Reference in New Issue
Block a user