richmemo: cocoa implemented zoomfactor(), had to introduce TCocoaRichView to store the previous scaling factor

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4053 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2015-03-19 04:25:52 +00:00
parent 7b24fd2711
commit 4093d31ddb

View File

@ -8,17 +8,21 @@ interface
uses uses
CocoaAll, Classes, SysUtils, CocoaAll, Classes, SysUtils,
LCLType, Graphics, Controls, LCLType, Graphics, Controls, StdCtrls,
CocoaPrivate, CocoaUtils, CocoaPrivate, CocoaUtils, CocoaWSCommon,
WSRichMemo, RichMemo; WSRichMemo, RichMemo;
type type
TCocoaRichView = objcclass(TCocoaTextView)
public
scale : Double;
end;
{ TCocoaWSCustomRichMemo } { TCocoaWSCustomRichMemo }
TCocoaWSCustomRichMemo = class(TWSCustomRichMemo) TCocoaWSCustomRichMemo = class(TWSCustomRichMemo)
public public
// assumption is made that LCL creates NSTextView class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class function GetTextAttributes(const AWinControl: TWinControl; TextStart: Integer; class function GetTextAttributes(const AWinControl: TWinControl; TextStart: Integer;
var Params: TIntFontParams): Boolean; override; var Params: TIntFontParams): Boolean; override;
@ -40,6 +44,7 @@ type
class function GetParaTabs(const AWinControl: TWinControl; TextStart: integer; class function GetParaTabs(const AWinControl: TWinControl; TextStart: integer;
var AStopList: TTabStopList): Boolean; override; var AStopList: TTabStopList): Boolean; override;
class procedure SetZoomFactor(const AWinControl: TWinControl; AZoomFactor: Double); 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;
@ -144,6 +149,78 @@ end;
{ TCocoaWSCustomRichMemo } { TCocoaWSCustomRichMemo }
const
VerticalScrollerVisible: array[TScrollStyle] of boolean = (
{ssNone } false,
{ssHorizontal } false,
{ssVertical } true,
{ssBoth } true,
{ssAutoHorizontal} false,
{ssAutoVertical } true,
{ssAutoBoth } true
);
HorizontalScrollerVisible: array[TScrollStyle] of boolean = (
{ssNone } false,
{ssHorizontal } true,
{ssVertical } false,
{ssBoth } true,
{ssAutoHorizontal} true,
{ssAutoVertical } false,
{ssAutoBoth } true
);
ScrollerAutoHide: array[TScrollStyle] of boolean = (
{ssNone } false,
{ssHorizontal } false,
{ssVertical } false,
{ssBoth } false,
{ssAutoHorizontal} true,
{ssAutoVertical } true,
{ssAutoBoth } true
);
class function TCocoaWSCustomRichMemo.CreateHandle(
const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle;
var
txt: TCocoaRichView;
ns: NSString;
scr: TCocoaScrollView;
nr:NSRect;
r:TRect;
begin
scr := TCocoaScrollView(NSView(TCocoaScrollView.alloc).lclInitWithCreateParams(AParams));
nr.origin.x:=0;
nr.origin.x:=0;
nr.size.height:=0;
nr.size.width:=AParams.Width;
txt := TCocoaRichView.alloc.initwithframe(nr);
txt.scale := 1.0;
scr.setDocumentView(txt);
scr.setHasVerticalScroller(VerticalScrollerVisible[TMemo(AWinControl).ScrollBars]);
scr.setHasHorizontalScroller(HorizontalScrollerVisible[TMemo(AWinControl).ScrollBars]);
scr.setAutohidesScrollers(ScrollerAutoHide[TMemo(AWinControl).ScrollBars]);
if TCustomMemo(AWinControl).BorderStyle=bsSingle then
scr.setBorderType(NSBezelBorder);
nr:=scr.documentVisibleRect;
txt.setFrame(nr);
txt.textContainer.setLineFragmentPadding(0);
txt.callback := TLCLCommonCallback.Create(txt, AWinControl);
ns := NSStringUtf8(AParams.Caption);
txt.setString(ns);
ns.release;
scr.callback := txt.callback;
Result := TLCLIntfHandle(scr);
end;
class function TCocoaWSCustomRichMemo.GetTextAttributes( class function TCocoaWSCustomRichMemo.GetTextAttributes(
const AWinControl: TWinControl; TextStart: Integer; var Params: TIntFontParams const AWinControl: TWinControl; TextStart: Integer; var Params: TIntFontParams
): Boolean; ): Boolean;
@ -458,6 +535,31 @@ begin
end; end;
end; end;
class procedure TCocoaWSCustomRichMemo.SetZoomFactor(
const AWinControl: TWinControl; AZoomFactor: Double);
var
view : TCocoaRichView;
sz : NSSize;
begin
view:=TCocoaRichView(MemoTextView(AWinControl));
if not Assigned(view) then Exit;
// reset Scaling
if view.scale<>1.0 then begin
sz.width:=1/view.scale;
sz.height:=1/view.scale;
view.scaleUnitSquareToSize(sz);
end;
// set new scaling
sz.width:=AZoomFactor;
sz.height:=AZoomFactor;
view.scaleUnitSquareToSize(sz);
view.layoutManager.ensureLayoutForTextContainer(view.textContainer);
view.scale:=AZoomFactor;
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);