You've already forked lazarus-ccr
richmemo: renamed tab stop alignment to left and right, implemented for cocoa
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4041 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -24,6 +24,13 @@ type
|
|||||||
const AAlign: TIntParaAlignment); override;
|
const AAlign: TIntParaAlignment); override;
|
||||||
class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer;
|
class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer;
|
||||||
var AAlign: TIntParaAlignment): Boolean; override;
|
var AAlign: TIntParaAlignment): Boolean; override;
|
||||||
|
|
||||||
|
class procedure SetParaTabs(const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||||
|
const AStopList: TTabStopList); override;
|
||||||
|
class function GetParaTabs(const AWinControl: TWinControl; TextStart: integer;
|
||||||
|
var AStopList: TTabStopList): Boolean; override;
|
||||||
|
|
||||||
|
|
||||||
class procedure InDelText(const AWinControl: TWinControl;
|
class procedure InDelText(const AWinControl: TWinControl;
|
||||||
const TextUTF8: String; DstStart, DstLen: Integer); override;
|
const TextUTF8: String; DstStart, DstLen: Integer); override;
|
||||||
class function LoadRichText(const AWinControl: TWinControl; Source: TStream): Boolean; override;
|
class function LoadRichText(const AWinControl: TWinControl; Source: TStream): Boolean; override;
|
||||||
@ -31,7 +38,6 @@ type
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
|
||||||
function MemoTextView(AWinControl: TWinControl): TCocoaTextView;
|
function MemoTextView(AWinControl: TWinControl): TCocoaTextView;
|
||||||
begin
|
begin
|
||||||
if not Assigned(AWinControl) or (AWinControl.Handle=0) then
|
if not Assigned(AWinControl) or (AWinControl.Handle=0) then
|
||||||
@ -40,6 +46,21 @@ begin
|
|||||||
Result := TCocoaTextView(NSScrollView(AWinControl.Handle).documentView);
|
Result := TCocoaTextView(NSScrollView(AWinControl.Handle).documentView);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function ParaRange(txt: NSString; textOffset, TextLen: Integer): NSRange; overload;
|
||||||
|
begin
|
||||||
|
Result.location:=textOffset;
|
||||||
|
if textOffset+TextLen>txt.length then
|
||||||
|
Result.length:=txt.length-textOffset
|
||||||
|
else
|
||||||
|
Result.length:=TextLen;
|
||||||
|
Result:=txt.paragraphRangeForRange(Result);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ParaRange(txt: NSTextStorage; textOffset, TextLen: Integer): NSRange; inline; overload;
|
||||||
|
begin
|
||||||
|
Result:=ParaRange(txt.string_, textOffset, textLen);
|
||||||
|
end;
|
||||||
|
|
||||||
{ TCocoaWSCustomRichMemo }
|
{ TCocoaWSCustomRichMemo }
|
||||||
|
|
||||||
class procedure TCocoaWSCustomRichMemo.SetParaAlignment(
|
class procedure TCocoaWSCustomRichMemo.SetParaAlignment(
|
||||||
@ -105,6 +126,87 @@ begin
|
|||||||
Result:=true;
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class procedure TCocoaWSCustomRichMemo.SetParaTabs(
|
||||||
|
const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||||
|
const AStopList: TTabStopList);
|
||||||
|
var
|
||||||
|
view : TCocoaTextView;
|
||||||
|
txt : NSTextStorage;
|
||||||
|
par : NSMutableParagraphStyle;
|
||||||
|
tabs : NSMutableArray;
|
||||||
|
tab : NSTextTab;
|
||||||
|
dict : NSDictionary;
|
||||||
|
i : Integer;
|
||||||
|
rng : NSRange;
|
||||||
|
const
|
||||||
|
TabAlignMap : array [TTabAlignment] of NSTextTabType = (
|
||||||
|
NSLeftTabStopType, // taLeft,
|
||||||
|
NSCenterTabStopType, // taCenter,
|
||||||
|
NSRightTabStopType, // taRight,
|
||||||
|
NSDecimalTabStopType, // taDecimal
|
||||||
|
NSLeftTabStopType // taWordBar - not supported
|
||||||
|
);
|
||||||
|
begin
|
||||||
|
view:=MemoTextView(AWinControl);
|
||||||
|
if not Assigned(view) then Exit;
|
||||||
|
|
||||||
|
par := NSParagraphStyle.defaultParagraphStyle.mutableCopyWithZone(nil);
|
||||||
|
if AStopList.Count>0 then begin
|
||||||
|
tabs := NSMutableArray.alloc.init;
|
||||||
|
for i:=0 to AStopList.Count-1 do begin
|
||||||
|
tab := NSTextTab.alloc.initWithType_location( TabAlignMap[AStopList.Tabs[i].Align], AStopList.Tabs[i].Offset );
|
||||||
|
tabs.addObject( tab );
|
||||||
|
tab.release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
par.setTabStops(tabs);
|
||||||
|
txt := view.textStorage;
|
||||||
|
txt.addAttribute_value_range( NSParagraphStyleAttributeName, par, ParaRange(txt, TextStart, textLen));
|
||||||
|
par.release;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TCocoaWSCustomRichMemo.GetParaTabs(
|
||||||
|
const AWinControl: TWinControl; TextStart: integer;
|
||||||
|
var AStopList: TTabStopList): Boolean;
|
||||||
|
var
|
||||||
|
view : TCocoaTextView;
|
||||||
|
txt : NSTextStorage;
|
||||||
|
par : NSParagraphStyle;
|
||||||
|
tabs : NSArray;
|
||||||
|
dict : NSDictionary;
|
||||||
|
tab : NSTextTab;
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
InitTabStopList(AStopList);
|
||||||
|
view:=MemoTextView(AWinControl);
|
||||||
|
Result:=false;
|
||||||
|
if not Assigned(view) then Exit;
|
||||||
|
|
||||||
|
txt:=view.textStorage;
|
||||||
|
dict := txt.attributesAtIndex_effectiveRange(textStart, nil);
|
||||||
|
if not Assigned(dict) then Exit;
|
||||||
|
|
||||||
|
par:=NSParagraphStyle( dict.objectForKey(NSParagraphStyleAttributeName) );
|
||||||
|
if not Assigned(par) then
|
||||||
|
par:=NSParagraphStyle.defaultParagraphStyle;
|
||||||
|
|
||||||
|
tabs:=par.tabStops;
|
||||||
|
if not Assigned(par) then Exit;
|
||||||
|
AStopList.Count:=tabs.count;
|
||||||
|
SetLength(AStopList.Tabs, AStopList.Count);
|
||||||
|
for i:=0 to tabs.count-1 do begin
|
||||||
|
tab:=NSTextTab(tabs.objectAtIndex(i));
|
||||||
|
AStopList.Tabs[i].Offset:=tab.location;
|
||||||
|
case tab.tabStopType of
|
||||||
|
NSCenterTabStopType: AStopList.Tabs[i].Align:= taCenter;
|
||||||
|
NSRightTabStopType: AStopList.Tabs[i].Align:= taRight;
|
||||||
|
NSDecimalTabStopType: AStopList.Tabs[i].Align:= taDecimal;
|
||||||
|
else
|
||||||
|
AStopList.Tabs[i].Align:=taLeft;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
class procedure TCocoaWSCustomRichMemo.InDelText(
|
class procedure TCocoaWSCustomRichMemo.InDelText(
|
||||||
const AWinControl: TWinControl; const TextUTF8: String; DstStart,
|
const AWinControl: TWinControl; const TextUTF8: String; DstStart,
|
||||||
DstLen: Integer);
|
DstLen: Integer);
|
||||||
@ -128,6 +230,7 @@ var
|
|||||||
txt : TCocoaTextView;
|
txt : TCocoaTextView;
|
||||||
begin
|
begin
|
||||||
//todo: avoid copying data.
|
//todo: avoid copying data.
|
||||||
|
Result:=false;
|
||||||
if not Assigned(Source) or not Assigned(AWinControl) or (AWinControl.Handle=0) then Exit;
|
if not Assigned(Source) or not Assigned(AWinControl) or (AWinControl.Handle=0) then Exit;
|
||||||
|
|
||||||
txt:=MemoTextView(AWinControl);
|
txt:=MemoTextView(AWinControl);
|
||||||
@ -139,6 +242,7 @@ begin
|
|||||||
txt.replaceCharactersInRange_withRTF(rng, data);
|
txt.replaceCharactersInRange_withRTF(rng, data);
|
||||||
data.release;
|
data.release;
|
||||||
end;
|
end;
|
||||||
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -91,7 +91,7 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
type
|
type
|
||||||
TTabAlignment = (taHead, taCenter, taTail, taDecimal, taWordBar);
|
TTabAlignment = (taLeft, taCenter, taRight, taDecimal, taWordBar);
|
||||||
|
|
||||||
TTabStop = record
|
TTabStop = record
|
||||||
Offset : Double;
|
Offset : Double;
|
||||||
|
Reference in New Issue
Block a user