diff --git a/components/richmemo/cocoa/cocoarichmemo.pas b/components/richmemo/cocoa/cocoarichmemo.pas index d69b00c21..9bcd0485c 100644 --- a/components/richmemo/cocoa/cocoarichmemo.pas +++ b/components/richmemo/cocoa/cocoarichmemo.pas @@ -7,11 +7,11 @@ interface {$modeswitch objectivec2} uses - CocoaAll, Types, + CocoaAll, Types, Classes, SysUtils, LCLType, Controls, StdCtrls, CocoaPrivate, CocoaUtils, CocoaWSCommon, CocoaWSStdCtrls, - WSRichMemo; + WSRichMemo, RichMemo; type @@ -22,8 +22,11 @@ type // assumption is made that LCL creates NSTextView class procedure SetParaAlignment(const AWinControl: TWinControl; TextStart, TextLen: Integer; const AAlign: TIntParaAlignment); override; + class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer; + var AAlign: TIntParaAlignment): Boolean; override; class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); override; + class function LoadRichText(const AWinControl: TWinControl; Source: TStream): Boolean; override; end; implementation @@ -55,10 +58,53 @@ begin rng.location:=TextStart; rng.length:=TextLen; + if TextStart+TextLen>txt.textStorage.string_.length then + rng.length:=txt.textStorage.string_.length-TextStart; + rng:=txt.textStorage.string_.paragraphRangeForRange(rng); txt.setAlignment_range(TxtAlign[AAlign], rng); end; +class function TCocoaWSCustomRichMemo.GetParaAlignment( + const AWinControl: TWinControl; TextStart: Integer; + var AAlign: TIntParaAlignment): Boolean; +var + txt : TCocoaTextView; + rng : NSRange; + cur : NSRange; + al : NSTextAlignment; +const + TxtAlign : array [TIntParaAlignment] of integer = ( + NSLeftTextAlignment, NSRightTextAlignment, NSCenterTextAlignment, NSJustifiedTextAlignment + ); +begin + txt:=MemoTextView(AWinControl); + if not Assigned(txt) then begin + Result:=false; + Exit; + end; + + cur:=txt.selectedRange; + rng.location:=TextStart; + rng.length:=1; + if TextStart+1>txt.textStorage.string_.length then + rng.length:=txt.textStorage.string_.length-TextStart; + + + rng:=txt.textStorage.string_.paragraphRangeForRange(rng); + txt.setSelectedRange(rng); + al:=txt.alignment; + case al of + NSRightTextAlignment: AAlign:=paRight; + NSCenterTextAlignment: AAlign:=paCenter; + NSJustifiedTextAlignment: AAlign:=paJustify; + else + AAlign:=paLeft; + end; + txt.setSelectedRange(cur); + Result:=true; +end; + class procedure TCocoaWSCustomRichMemo.InDelText( const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); @@ -68,9 +114,31 @@ var begin txt:=MemoTextView(AWinControl); if not Assigned(txt) then Exit; + str := NSStringUtf8(TextUtf8); txt.textStorage.replaceCharactersInRange_withString(NSMakeRange(DstStart, DstLen), str); str.release; end; +class function TCocoaWSCustomRichMemo.LoadRichText( + const AWinControl: TWinControl; Source: TStream): Boolean; +var + data: NSMutableData; + rng : NSRange; + txt : TCocoaTextView; +begin + //todo: avoid copying data. + if not Assigned(Source) or not Assigned(AWinControl) or (AWinControl.Handle=0) then Exit; + + txt:=MemoTextView(AWinControl); + if Source.size>0 then begin + data:=NSMutableData(NSMutableData.alloc).initWithLength(Source.size); + Source.Read(data.mutableBytes^, Source.Size); + rng.length:=txt.textStorage.string_.length; + rng.location:=0; + txt.replaceCharactersInRange_withRTF(rng, data); + data.release; + end; +end; + end.