richmemo: load rtf (tobe improved), paragraph set alignment for cocoa

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3837 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz 2014-12-12 06:05:10 +00:00
parent d048bf3343
commit e46d06509e

View File

@ -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.