FIX: COCOA: TCocoaTextField: detect and remove line-break when entering text

This commit is contained in:
rich2014 2022-10-14 08:30:32 +08:00 committed by Maxim Ganetsky
parent a96c7af5e8
commit 64b389f43f
2 changed files with 27 additions and 0 deletions

View File

@ -71,6 +71,7 @@ type
procedure resetCursorRects; override;
// key
procedure textDidChange(notification: NSNotification); override;
function textView_shouldChangeTextInRange_replacementString (textView: NSTextView; affectedCharRange: NSRange; replacementString: NSString): ObjCBOOL; message 'textView:shouldChangeTextInRange:replacementString:';
// mouse
procedure mouseDown(event: NSEvent); override;
procedure mouseUp(event: NSEvent); override;
@ -985,6 +986,24 @@ begin
callback.SendOnTextChanged;
end;
// detect and remove line-break when entering text
// TextField (TEdit) should be single line
function TCocoaTextField.textView_shouldChangeTextInRange_replacementString (textView: NSTextView; affectedCharRange: NSRange; replacementString: NSString): ObjCBOOL;
var
newString: NSString; // need not release
begin
Result:= true;
newString:= NSStringRemoveLineBreak( replacementString );
if newString.length <> replacementString.length then
begin
// only handled if there is line-break in replacementString
// use insertText() for undo/redo support
// textDidChange will be called in insertText()
if newString.length>0 then currentEditor.insertText( newString );
Result:= false;
end;
end;
procedure TCocoaTextField.mouseDown(event: NSEvent);
begin
if Assigned(callback) and not callback.MouseUpDownEvent(event) then

View File

@ -52,6 +52,8 @@ function StrToNSString(const s: string; AutoRelease: Boolean = true): NSString;
function StrToNSStr(const s: string; AutoRelease: Boolean = true): NSString; inline;
function NSStringToString(ns: NSString): String;
function NSStringRemoveLineBreak(const str: NSString): NSString;
function GetNSObjectWindow(obj: NSObject): NSWindow;
procedure SetNSText(text: NSText; const s: String); inline;
@ -831,6 +833,12 @@ begin
Result := CFStringToStr(CFStringRef(ns));
end;
function NSStringRemoveLineBreak(const str: NSString): NSString;
begin
Result:= str.stringByReplacingOccurrencesOfString_withString( NSStr(#10) , NSString.string_ );
Result:= Result.stringByReplacingOccurrencesOfString_withString( NSStr(#13), NSString.string_ );
end;
procedure SetNSText(text: NSText; const s: String); inline;
var
ns: NSString;