From 38414f3a9089c3fb6acd69a1474a7e92d2c5e104 Mon Sep 17 00:00:00 2001 From: skalogryz Date: Wed, 12 Nov 2014 04:38:24 +0000 Subject: [PATCH] richmemo: paragraph alignment initialized git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3719 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/richmemo/richmemo.pas | 47 +++++++++++--- components/richmemo/win32/win32richmemo.pas | 55 +++++++++++++++- .../richmemo/win32/win32richmemoproc.pas | 30 +++++++++ components/richmemo/wsrichmemo.pas | 63 ++++++++++++++++++- 4 files changed, 184 insertions(+), 11 deletions(-) diff --git a/components/richmemo/richmemo.pas b/components/richmemo/richmemo.pas index 7acddbdbd..ad497ddd7 100644 --- a/components/richmemo/richmemo.pas +++ b/components/richmemo/richmemo.pas @@ -1,5 +1,5 @@ { - richmemo.pp + richmemo.pas Author: Dmitry 'skalogryz' Boyarintsev @@ -29,14 +29,11 @@ uses type - TFontParams = TIntFontParams; - {TIntFontParams = record // declared at WSRichMemo - Name : String; - Size : Integer; - Color : TColor; - Style : TFontStyles; - end; } - + TFontParams = WSRichMemo.TIntFontParams; + TParaAlignment = (paLeft, paRight, paCenter, paJustify); + TParaMetric = WSRichMemo.TIntParaMetric; + TParaNumStyle = WSRichMemo.TParaNumStyle; + TParaNumbering = WSRichMemo.TIntParaNumbering; TTextModifyMask = set of (tmm_Color, tmm_Name, tmm_Size, tmm_Styles); @@ -63,6 +60,9 @@ type function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual; function GetStyleRange(CharOfs: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual; + function GetParaAllignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean; virtual; + procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment); virtual; + procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont); procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor); procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask; @@ -142,6 +142,9 @@ var implementation +const + ParaAlignCode : array [TParaAlignment] of Integer = (AL_LEFT, AL_RIGHT, AL_CENTER, AL_JUSTIFY); + function GetFontParams(styles: TFontStyles): TFontParams; overload; begin Result := GetFontParams('', 0, 0, styles); @@ -234,6 +237,32 @@ begin end; end; +function TCustomRichMemo.GetParaAllignment(TextStart: Integer; + var AAlign: TParaAlignment): Boolean; +var + ac: Integer; +begin + Result := HandleAllocated and + TWSCustomRichMemoClass(WidgetSetClass).GetParaAlignment(Self, TextStart, ac); + if Result then begin + case ac of + AL_LEFT: AAlign:=paLeft; + AL_RIGHT: AAlign:=paRight; + AL_CENTER: AAlign:=paCenter; + AL_JUSTIFY: AAlign:=paJustify + else + AAlign:=paLeft; + end; + end; +end; + +procedure TCustomRichMemo.SetParaAlignment(TextStart, TextLen: Integer; + AAlign: TParaAlignment); +begin + if HandleAllocated then + TWSCustomRichMemoClass(WidgetSetClass).SetParaAlignment(Self, TextStart, TextLen, ParaAlignCode[AAlign]); +end; + function TCustomRichMemo.GetContStyleLength(TextStart: Integer): Integer; var ofs, len : Integer; diff --git a/components/richmemo/win32/win32richmemo.pas b/components/richmemo/win32/win32richmemo.pas index 96493fbcb..34841ba57 100644 --- a/components/richmemo/win32/win32richmemo.pas +++ b/components/richmemo/win32/win32richmemo.pas @@ -25,7 +25,7 @@ interface uses // Win32 headers - Windows, + Windows, RichEdit, // RTL headers Classes, SysUtils, // LCL headers @@ -61,6 +61,13 @@ type class function LoadRichText(const AWinControl: TWinControl; Source: TStream): Boolean; override; class function SaveRichText(const AWinControl: TWinControl; Dst: TStream): Boolean; override; + class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer; + var AAlign: Integer): Boolean; override; + class procedure SetParaAlignment(const AWinControl: TWinControl; TextStart, TextLen: Integer; + const AAlign: Integer); override; + + class function GetParaMatrics(const AWinControl: TWinControl; TextStart: Integer; + var AMetrics: TIntParaMetric): Boolean; override; class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); override; end; @@ -330,6 +337,52 @@ begin Result := RichEditManager.SaveRichText(AWinControl.Handle, Dst); end; +class function TWin32WSCustomRichMemo.GetParaAlignment( + const AWinControl: TWinControl; TextStart: Integer; var AAlign: Integer + ): Boolean; +var + para : PARAFORMAT2; +begin + Result:=false; + if not Assigned(RichEditManager) or not Assigned(AWinControl) then Exit; + RichEditManager.GetPara2(AWinControl.Handle, TextStart, para); + case para.wAlignment of + PFA_CENTER: AAlign:=AL_CENTER; + PFA_RIGHT: AAlign:=AL_RIGHT; + PFA_JUSTIFY: AAlign:=AL_JUSTIFY; + else + AAlign:=AL_LEFT; + end; + Result:=true; +end; + +class procedure TWin32WSCustomRichMemo.SetParaAlignment( + const AWinControl: TWinControl; TextStart, TextLen: Integer; const AAlign: Integer); +var + para : PARAFORMAT2; +const + WinPara : array [AL_LEFT..AL_JUSTIFY] of word = (PFA_LEFT, PFA_RIGHT, PFA_CENTER, PFA_JUSTIFY); +begin + if not Assigned(RichEditManager) or not Assigned(AWinControl) + or (AAlignAL_JUSTIFY) then Exit; + FillChar(para, sizeof(para), 0); + para.cbSize:=sizeof(para); + para.dwMask:=PFM_ALIGNMENT; + para.wAlignment:=WinPara[byte(AAlign)]; + RichEditManager.SetPara2(AWinControl.Handle, TextStart, TextLen, para); +end; + +class function TWin32WSCustomRichMemo.GetParaMatrics( + const AWinControl: TWinControl; TextStart: Integer; + var AMetrics: TIntParaMetric): Boolean; +var + para : PARAFORMAT2; +begin + Result:=false; + if not Assigned(RichEditManager) or not Assigned(AWinControl) then Exit; + RichEditManager.GetPara2(AWinControl.Handle, TextStart, para); +end; + class procedure TWin32WSCustomRichMemo.InDelText(const AWinControl:TWinControl; const TextUTF8:String;DstStart,DstLen:Integer); begin diff --git a/components/richmemo/win32/win32richmemoproc.pas b/components/richmemo/win32/win32richmemoproc.pas index 1f4db6485..90b14bebb 100644 --- a/components/richmemo/win32/win32richmemoproc.pas +++ b/components/richmemo/win32/win32richmemoproc.pas @@ -49,6 +49,8 @@ type class function LoadRichText(RichEditWnd: Handle; ASrc: TStream): Boolean; virtual; class function SaveRichText(RichEditWnd: Handle; ADst: TStream): Boolean; virtual; class procedure SetText(RichEditWnd: Handle; const Text: WideString; TextStart, ReplaceLength: Integer); virtual; + class procedure GetPara2(RichEditWnd: Handle; TextStart: Integer; var para: PARAFORMAT2); virtual; + class procedure SetPara2(RichEditWnd: Handle; TextStart, TextLen: Integer; const para: PARAFORMAT2); virtual; end; TRichManagerClass = class of TRichEditManager; @@ -398,5 +400,33 @@ begin SetSelection(RichEditWnd, s, l); end; +class procedure TRichEditManager.GetPara2(RichEditWnd: Handle; TextStart: Integer; + var para: PARAFORMAT2); +var + s, l : Integer; +begin + GetSelection(RichEditWnd, s, l); + SetSelection(RichEditWnd, TextStart, 0); + + FillChar(para, sizeof(para), 0); + para.cbSize:=sizeof(para); + SendMessagea(RichEditWnd, EM_GETPARAFORMAT, 0, LPARAM(@para)); + + SetSelection(RichEditWnd, s, l); +end; + +class procedure TRichEditManager.SetPara2(RichEditWnd: Handle; + TextStart, TextLen: Integer; const para: PARAFORMAT2); +var + s, l : Integer; +begin + GetSelection(RichEditWnd, s, l); + SetSelection(RichEditWnd, TextStart, TextLen); + + SendMessagea(RichEditWnd, EM_SETPARAFORMAT, 0, LPARAM(@para)); + + SetSelection(RichEditWnd, s, l); +end; + end. diff --git a/components/richmemo/wsrichmemo.pas b/components/richmemo/wsrichmemo.pas index 63a3da4d6..310c22daa 100644 --- a/components/richmemo/wsrichmemo.pas +++ b/components/richmemo/wsrichmemo.pas @@ -39,6 +39,42 @@ type Style : TFontStyles; end; +const + AL_LEFT = 1; + AL_RIGHT = 2; + AL_CENTER = 3; + AL_JUSTIFY = 4; + +type + TIntParaMetric = record + StartIndent : Double; // in points + RightIndent : Double; // in points + Offset : Double; // in points + SpaceBefore : Double; // in points + SpaceAfter : Double; // in points + LineSpacing : Double; // todo: ? + end; + + TParaNumStyle = (pnNone, pnBullet, pnNumber, pnLowLetter + , pnLowRoman, pnUpLetter, pnUpRoman, pnCustomChar); + + TIntParaNumbering = record + Numbering : TParaNumStyle; + NumCustom : WideChar; + end; + + TTabAlignment = (taLeft, taCenter, taRight, taDecimal, taWordBar); + + TTabInfo = record + Offset : Double; + Align : TTabAlignment; + end; + + TIntParaTabs = record + Count : Integer; + Tabs : array of TTabInfo; + end; + { TWSCustomRichMemo } @@ -56,7 +92,13 @@ type var Params: TIntFontParams): Boolean; virtual; class procedure SetTextAttributes(const AWinControl: TWinControl; TextStart, TextLen: Integer; const Params: TIntFontParams); virtual; - class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); virtual; + class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer; + var AAlign: Integer): Boolean; virtual; + class procedure SetParaAlignment(const AWinControl: TWinControl; TextStart, TextLen: Integer; + const AAlign: Integer); virtual; + class function GetParaMatrics(const AWinControl: TWinControl; TextStart: Integer; + var AMetrics: TIntParaMetric): Boolean; virtual; + class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); virtual; class procedure SetHideSelection(const ACustomEdit: TCustomEdit; AHideSelection: Boolean); override; class function LoadRichText(const AWinControl: TWinControl; Source: TStream): Boolean; virtual; class function SaveRichText(const AWinControl: TWinControl; Dest: TStream): Boolean; virtual; @@ -105,6 +147,25 @@ class procedure TWSCustomRichMemo.SetTextAttributes(const AWinControl: TWinContr begin end; +class function TWSCustomRichMemo.GetParaAlignment( + const AWinControl: TWinControl; TextStart: Integer; var AAlign: Integer + ): Boolean; +begin + Result := false; +end; + +class procedure TWSCustomRichMemo.SetParaAlignment( + const AWinControl: TWinControl; TextStart, TextLen: Integer; const AAlign: Integer); +begin + +end; + +class function TWSCustomRichMemo.GetParaMatrics(const AWinControl: TWinControl; + TextStart: Integer; var AMetrics: TIntParaMetric): Boolean; +begin + Result := false; +end; + class procedure TWSCustomRichMemo.InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); begin