From 4093d31ddb179cd8383acddb6eb1df3ea613ae77 Mon Sep 17 00:00:00 2001 From: skalogryz Date: Thu, 19 Mar 2015 04:25:52 +0000 Subject: [PATCH] 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 --- components/richmemo/cocoa/cocoarichmemo.pas | 108 +++++++++++++++++++- 1 file changed, 105 insertions(+), 3 deletions(-) diff --git a/components/richmemo/cocoa/cocoarichmemo.pas b/components/richmemo/cocoa/cocoarichmemo.pas index 85b119843..bcdd0d3d1 100644 --- a/components/richmemo/cocoa/cocoarichmemo.pas +++ b/components/richmemo/cocoa/cocoarichmemo.pas @@ -8,17 +8,21 @@ interface uses CocoaAll, Classes, SysUtils, - LCLType, Graphics, Controls, - CocoaPrivate, CocoaUtils, + LCLType, Graphics, Controls, StdCtrls, + CocoaPrivate, CocoaUtils, CocoaWSCommon, WSRichMemo, RichMemo; type + TCocoaRichView = objcclass(TCocoaTextView) + public + scale : Double; + end; { TCocoaWSCustomRichMemo } TCocoaWSCustomRichMemo = class(TWSCustomRichMemo) 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; var Params: TIntFontParams): Boolean; override; @@ -40,6 +44,7 @@ type class function GetParaTabs(const AWinControl: TWinControl; TextStart: integer; var AStopList: TTabStopList): Boolean; override; + class procedure SetZoomFactor(const AWinControl: TWinControl; AZoomFactor: Double); override; class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); override; @@ -144,6 +149,78 @@ end; { 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( const AWinControl: TWinControl; TextStart: Integer; var Params: TIntFontParams ): Boolean; @@ -458,6 +535,31 @@ begin 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( const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer);