Forráskód Böngészése

* Some more Undo stuff

pierre 26 éve
szülő
commit
98ec590a32
1 módosított fájl, 76 hozzáadás és 20 törlés
  1. 76 20
      ide/text/weditor.pas

+ 76 - 20
ide/text/weditor.pas

@@ -307,7 +307,9 @@ type
       ErrorMessage: PString;
       Bookmarks   : array[0..9] of TEditorBookmark;
       LockFlag    : integer;
-      DrawCalled  : boolean;
+      DrawCalled,
+      DrawCursorCalled,
+      IndicatorDrawCalled  : boolean;
       CurEvent    : PEvent;
       function    Overwrite: boolean;
       function    GetLine(I: sw_integer): PLine;
@@ -1191,8 +1193,21 @@ begin
   else
 {$endif DEBUG}
     Dec(LockFlag);
-  if (LockFlag=0) and DrawCalled then
+  if (LockFlag>0) then
+    exit;
+  if DrawCalled then
     DrawView;
+  If IndicatorDrawCalled and
+    assigned(Indicator) then
+      begin
+        Indicator^.DrawView;
+        IndicatorDrawCalled:=false;
+      end;
+  If DrawCursorCalled then
+    Begin
+      DrawCursor;
+      DrawCursorCalled:=false;
+    End;
 end;
 
 procedure TCodeEditor.AdjustSelectionPos(CurPosX, CurPosY: sw_integer; DeltaX, DeltaY: sw_integer);
@@ -1282,7 +1297,10 @@ begin
 {$ifdef debug}
     Indicator^.StoreUndo:=StoreUndo;
 {$endif debug}
-    Indicator^.DrawView;
+    if lockflag>0 then
+      IndicatorDrawCalled:=true
+    else
+      Indicator^.DrawView;
   end;
 end;
 
@@ -1716,7 +1734,10 @@ end;
 
 procedure TCodeEditor.DrawCursor;
 begin
-  SetCursor(CurPos.X-Delta.X,CurPos.Y-Delta.Y);
+  if lockflag>0 then
+    DrawCursorCalled:=true
+  else
+    SetCursor(CurPos.X-Delta.X,CurPos.Y-Delta.Y);
   SetState(sfCursorIns,Overwrite);
 end;
 
@@ -2949,7 +2970,7 @@ var OK: boolean;
     l,i : longint;
     p,p10,p2,p13 : pchar;
     s : string;
-    StorePos : TPoint;
+    BPos,EPos,StorePos : TPoint;
     first : boolean;
 begin
   Lock;
@@ -2990,6 +3011,9 @@ begin
                 begin
                   Inc(i);
                   Lines^.AtInsert(i,NewLine(s));
+                  BPos.X:=0;BPos.Y:=i;
+                  EPOS.X:=Length(s);EPos.Y:=i;
+                  AddAction(eaInsertLine,BPos,EPos,S);
                 end;
               if p13+1=p10 then
                 p13[0]:=#13
@@ -3107,15 +3131,17 @@ begin
             eaInsertText :
               begin
                 SetCurPtr(StartPos.X,StartPos.Y);
-                for Temp := 1 to length(Text^) do
-                  DelChar;
+                if assigned(text) then
+                  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]);
+                if assigned(text) then
+                  for Temp := 1 to length(Text^) do
+                    AddChar(Text^[Temp]);
                 SetCurPtr(StartPos.X,StartPos.Y);
               end;
             eaInsertLine :
@@ -3221,13 +3247,17 @@ begin
           begin
             SetCurPtr(StartPos.X,StartPos.Y);
             InsertLine;
+            SetCurPtr(StartPos.X,StartPos.Y);
+            InsertText(GetStr(Text));
+            SetCurPtr(EndPos.X,EndPos.Y);
           end;
         eaDeleteLine :
           begin
             SetCurPtr(StartPos.X,StartPos.Y);
             DeleteLine(StartPos.Y);
-            SetCurPtr(EndPos.X,EndPos.Y);
-            InsertText(GetStr(Text));
+            { SetCurPtr(EndPos.X,EndPos.Y);
+            for Temp := 1 to length(GetStr(Text)) do
+              DelChar;}
             SetCurPtr(EndPos.X,EndPos.Y);
           end;
         eaSelectionChanged :
@@ -4023,7 +4053,7 @@ begin
   for I:=1 to length(S) do
     AddChar(S[I]);
   InsertText:=true;
-  StoreUndo:=HoldUndo; {te}
+  StoreUndo:=HoldUndo;
   AddAction(eaInsertText,OldPos,CurPos,S);
   UnLock;
 end;
@@ -4031,30 +4061,38 @@ end;
 function TCodeEditor.InsertFrom(Editor: PCodeEditor): Boolean;
 var OK: boolean;
     LineDelta,LineCount: Sw_integer;
-    StartPos,DestPos: TPoint;
+    StartPos,DestPos,BPos,EPos: TPoint;
     LineStartX,LineEndX: Sw_integer;
     S,OrigS,AfterS: string;
     VerticalBlock: boolean;
     SEnd: TPoint;
 begin
+  if (Editor^.Flags and efVerticalBlocks)<>0 then
+    begin
+      NotImplemented;
+      Exit;
+    end;
   Lock;
   OK:=(Editor^.SelStart.X<>Editor^.SelEnd.X) or (Editor^.SelStart.Y<>Editor^.SelEnd.Y);
   if OK then
   begin
     StartPos:=CurPos; DestPos:=CurPos;
+    EPos:=CurPos;
     VerticalBlock:=(Editor^.Flags and efVerticalBlocks)<>0;
     LineDelta:=0; LineCount:=(Editor^.SelEnd.Y-Editor^.SelStart.Y)+1;
     OK:=GetLineCount<MaxLineCount;
     OrigS:=GetDisplayText(DestPos.Y);
     AfterS:=Copy(OrigS,DestPos.X+1,255);
 
-    { BUG:: this is wrong if we do not insert at begin of line !!! PM }
     while OK and (LineDelta<LineCount) do
     begin
       if (LineDelta<LineCount-1) and (VerticalBlock=false) then
       if (LineDelta<>0) or (Editor^.SelEnd.X=0) then
         begin
           Lines^.AtInsert(DestPos.Y,NewLine(''));
+          BPos.X:=0;BPos.Y:=DestPos.Y;
+          EPOS.X:=0;EPos.Y:=DestPos.Y;
+          AddAction(eaInsertLine,BPos,EPos,'');
           LimitsChanged;
         end;
 
@@ -4070,17 +4108,29 @@ begin
 
       if LineEndX<LineStartX then
         S:=''
-      else
+      else if VerticalBlock then
         S:=RExpand(copy(Editor^.GetLineText(Editor^.SelStart.Y+LineDelta),LineStartX+1,LineEndX-LineStartX+1),
-                   Min(LineEndX-LineStartX+1,255));
+                   Min(LineEndX-LineStartX+1,255))
+      else
+        S:=copy(Editor^.GetLineText(Editor^.SelStart.Y+LineDelta),LineStartX+1,LineEndX-LineStartX+1);
       if VerticalBlock=false then
         begin
           If LineDelta>0 then
             OrigS:='';
           if LineDelta=LineCount-1 then
-            SetLineText(DestPos.Y,RExpand(copy(OrigS,1,DestPos.X),DestPos.X)+S+AfterS)
+            begin
+              SetLineText(DestPos.Y,RExpand(copy(OrigS,1,DestPos.X),DestPos.X)+S+AfterS);
+              BPos.X:=DestPos.X;BPos.Y:=DestPos.Y;
+              EPOS.X:=DestPos.X+Length(S);EPos.Y:=DestPos.Y;
+              AddAction(eaInsertText,BPos,EPos,S);
+            end
           else
-            SetLineText(DestPos.Y,RExpand(copy(OrigS,1,DestPos.X),DestPos.X)+S);
+            begin
+              SetLineText(DestPos.Y,RExpand(copy(OrigS,1,DestPos.X),DestPos.X)+S);
+              BPos.X:=DestPos.X;BPos.Y:=DestPos.Y;
+              EPOS.X:=DestPos.X+Length(S);EPos.Y:=DestPos.Y;
+              AddAction(eaInsertText,BPos,EPos,S);
+            end;
           if LineDelta=LineCount-1 then
             begin
               SEnd.Y:=DestPos.Y;
@@ -4101,7 +4151,10 @@ begin
       OK:=GetLineCount<MaxLineCount;
     end;
     if OK=false then EditorDialog(edTooManyLines,nil);
-    SetCurPtr(CurPos.X,CurPos.Y);
+    { mainly to force eaMove insertion }
+    if not IsClipboard then
+      SetCurPtr(EPos.X,EPos.Y);
+    SetCurPtr(StartPos.X,StartPos.Y);
     UpdateAttrs(StartPos.Y,attrAll);
     SetModified(true);
     LimitsChanged;
@@ -5027,7 +5080,10 @@ end;
 END.
 {
   $Log$
-  Revision 1.61  1999-11-10 00:45:30  pierre
+  Revision 1.62  1999-11-18 13:42:06  pierre
+   * Some more Undo stuff
+
+  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