lasarus_compotents/ATSynEdit/atsynedit/atsynedit_cmd_clipboard.inc

167 lines
3.9 KiB
PHP

{$ifdef nn}begin end;{$endif}
function TATSynEdit.DoCommand_ClipboardPaste(AKeepCaret, ASelectThen: boolean): TATCommandResults;
var
Str: atString;
begin
Result:= [];
if ModeReadOnly then Exit;
//column block
if Clipboard.HasFormat(cATClipboardFormatId) then
begin
if ModeOneLine then Exit;
Result:= DoCommand_ClipboardPasteColumnBlock(AKeepCaret);
Exit
end;
//usual text
Str:= UTF8Decode(Clipboard.AsText);
if ModeOneLine then
Str:= SRemoveNewlineChars(Str);
Strings.BeginUndoGroup;
DoCommand_TextDeleteSelection;
Result:= DoCommand_TextInsertAtCarets(Str,
AKeepCaret,
FOverwrite and FOptOverwriteAllowedOnPaste,
ASelectThen);
Strings.EndUndoGroup;
//workaround: paste on last line end
if Carets.Count>0 then
if Carets[0].PosY>=Strings.Count then
Strings.ActionAddFakeLineIfNeeded;
end;
function TATSynEdit.DoCommand_ClipboardPasteColumnBlock(AKeepCaret: boolean): TATCommandResults;
var
Str: atString;
begin
Result:= [];
if ModeReadOnly then Exit;
Str:= UTF8Decode(Clipboard.AsText);
Strings.BeginUndoGroup;
Result:= DoCommand_TextInsertColumnBlockOnce(Str, AKeepCaret);
Strings.EndUndoGroup;
end;
function TATSynEdit.DoCommand_ClipboardCut: TATCommandResults;
begin
Result:= [];
if ModeReadOnly then Exit;
if Carets.IsSelection then
begin
DoCommand_ClipboardCopy;
Result:= DoCommand_TextDeleteSelection;
end
else
begin
if FOptCutLinesIfNoSel then
begin
DoCommand_ClipboardCopy;
Result:= DoCommand_TextDeleteLines;
end;
end;
end;
function TATSynEdit.DoCommand_ClipboardCopy(Append: boolean): TATCommandResults;
begin
if not IsSelRectEmpty then
begin
Clipboard.AsText:= GetTextForClipboard;
Clipboard.AddFormat(cATClipboardFormatId, cATClipboardSignatureColBlock, SizeOf(cATClipboardSignatureColBlock));
end
else
begin
if Append then
Clipboard.AsText:= Clipboard.AsText+GetTextForClipboard
else
Clipboard.AsText:= GetTextForClipboard;
end;
Result:= [];
end;
function TATSynEdit.GetTextForClipboard: string;
var
ListNum: TList;
ListStr: TStringList;
Caret: TATCaretItem;
i, NLen, X1, Y1, X2, Y2: integer;
bSel: boolean;
Str: atString;
begin
Result:= '';
if not IsSelRectEmpty then
begin
for i:= FSelRect.Top to FSelRect.Bottom do
begin
Str:= Strings.Lines[i];
X1:= SColumnPosToCharPos(Str, FSelRect.Left, OptTabSize);
X2:= SColumnPosToCharPos(Str, FSelRect.Right, OptTabSize);
Str:= Strings.TextSubstring(X1, i, X2, i);
NLen:= X2-X1-Length(Str);
if NLen>0 then
Str:= Str+StringOfChar(' ', NLen);
Result:= Result+UTF8Encode(Str)+sLineBreak;
end;
Exit;
end;
ListNum:= TList.Create;
ListStr:= TStringList.Create;
try
for i:= 0 to Carets.Count-1 do
begin
Caret:= Carets[i];
if ListNum.IndexOf(pointer{%H-}(Caret.PosY))<0 then
ListNum.Add(pointer{%H-}(Caret.PosY));
end;
//no selections-- copy entire lines
if not Carets.IsSelection then
begin
if FOptCopyLinesIfNoSel then
begin
for i:= 0 to ListNum.Count-1 do
begin
Str:= Strings.Lines[NativeInt{%H-}(ListNum[i])];
if Str<>'' then
ListStr.Add(UTF8Encode(Str));
end;
Result:= ListStr.Text; //always use Text, need eol
end;
end
else
//selections-- copy selected ranges
begin
for i:= 0 to Carets.Count-1 do
begin
Caret:= Carets[i];
Caret.GetRange(X1, Y1, X2, Y2, bSel);
if not bSel then Continue;
Str:= Strings.TextSubstring(X1, Y1, X2, Y2);
if Str<>'' then
ListStr.Add(UTF8Encode(Str));
end;
if ListStr.Count=1 then
Result:= ListStr[0] //don't use Text to skip eol
else
Result:= ListStr.Text;
end;
finally
FreeAndNil(ListStr);
FreeAndNil(ListNum);
end;
end;