167 lines
3.9 KiB
PHP
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;
|
|
|