diff --git a/ide/weditor.pas b/ide/weditor.pas index 6347770688..5e54cc2d68 100644 --- a/ide/weditor.pas +++ b/ide/weditor.pas @@ -5706,18 +5706,49 @@ begin end; {$ifdef WinClipSupported} + +const + linelimit = 200; + function TCustomCodeEditor.ClipPasteWin: Boolean; -var OK: boolean; - l,i : longint; +var + StorePos : TPoint; + first : boolean; + +procedure InsertStringWrap(const s: string; var i : Longint); +var + BPos,EPos: TPoint; +begin + if first then + begin + { we need to cut the line in two + if not at end of line PM } + InsertNewLine; + SetCurPtr(StorePos.X,StorePos.Y); + InsertText(s); + first:=false; + end + else + begin + Inc(i); + InsertLine(i,s); + BPos.X:=0;BPos.Y:=i; + EPOS.X:=Length(s);EPos.Y:=i; + AddAction(eaInsertLine,BPos,EPos,GetDisplayText(i),GetFlags); + end; +end; + +var + OK: boolean; + l,i,len,len10 : longint; p,p10,p2,p13 : pchar; s : string; - BPos,EPos,StorePos : TPoint; - first : boolean; begin Lock; OK:=WinClipboardSupported; if OK then begin + first:=true; StorePos:=CurPos; i:=CurPos.Y; @@ -5732,48 +5763,39 @@ begin PushInfo(msg_readingwinclipboard); AddGroupedAction(eaPasteWin); p2:=p; - p13:=strpos(p,#13); - p10:=strpos(p,#10); - while assigned(p10) do - begin - if p13+1=p10 then - p13[0]:=#0 - else - p10[0]:=#0; - s:=strpas(p2); - if first then - begin - { we need to cut the line in two - if not at end of line PM } - InsertNewLine; - SetCurPtr(StorePos.X,StorePos.Y); - InsertText(s); - first:=false; - end - else - begin - Inc(i); - InsertLine(i,s); - BPos.X:=0;BPos.Y:=i; - EPOS.X:=Length(s);EPos.Y:=i; - AddAction(eaInsertLine,BPos,EPos,GetDisplayText(i),GetFlags); - end; - if p13+1=p10 then - p13[0]:=#13 - else - p10[0]:=#10; - p2:=@p10[1]; - p13:=strpos(p2,#13); - p10:=strpos(p2,#10); - end; - if strlen(p2)>0 then - begin - s:=strpas(p2); - if not first then - SetCurPtr(0,i+1); - InsertText(s); - end; - SetCurPtr(StorePos.X,StorePos.Y); + len:=strlen(p2); + // issue lines ((#13)#10 terminated) of maximally "linelimit" chars. + // does not take initial X position into account + repeat + p13:=strpos(p2,#13); + p10:=strpos(p2,#10); + if len> linelimit then + len:=linelimit; + if assigned(p10) then + begin + len10:=p10-p2; + if len100 then + move(p2^,s[1],len); + // cleanup + if assigned(p10) then + p2:=p10+1 + else + inc(p2,len); + insertstringwrap(s,i); + len:=strlen(p2); + until len=0; + + SetCurPtr(StorePos.X,StorePos.Y); // y+i to get after paste? SetModified(true); UpdateAttrs(StorePos.Y,attrAll); CloseGroupedAction(eaPasteWin);