diff --git a/components/richmemo/richmemo.pas b/components/richmemo/richmemo.pas index 46028b4db..0269c45bf 100644 --- a/components/richmemo/richmemo.pas +++ b/components/richmemo/richmemo.pas @@ -59,6 +59,7 @@ type end; TTextModifyMask = set of (tmm_Color, tmm_Name, tmm_Size, tmm_Styles); + TParaModifyMask = set of (pmm_FirstLine, pmm_HeadIndent, pmm_TailIndent, pmm_SpaceBefore, pmm_SpaceAfter, pmm_LineSpacing); TSearchOption = (soMatchCase, soWholeWord, soBackward); TSearchOptions = set of TSearchOption; @@ -112,6 +113,8 @@ type procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor); procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask; const FontName: String; FontSize: Integer; FontColor: TColor; AddFontStyle, RemoveFontStyle: TFontStyles); + procedure SetRangeParaParams(TextStart, TextLength: INteger; ModifyMask: TParaModifyMask; + const ParaMetric: TParaMetric); function LoadRichText(Source: TStream): Boolean; virtual; function SaveRichText(Dest: TStream): Boolean; virtual; @@ -458,6 +461,31 @@ begin end; end; +procedure TCustomRichMemo.SetRangeParaParams(TextStart, TextLength: INteger; + ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric); +var + i : integer; + st, ln: Integer; + m : TParaMetric; +begin + repeat + GetParaRange(TextStart, TextStart, ln); + GetParaMetric(TextStart, m); + + if pmm_FirstLine in ModifyMask then m.FirstLine:=ParaMetric.FirstLine; + if pmm_HeadIndent in ModifyMask then m.HeadIndent:=ParaMetric.HeadIndent; + if pmm_TailIndent in ModifyMask then m.TailIndent:=ParaMetric.TailIndent; + if pmm_SpaceBefore in ModifyMask then m.SpaceBefore:=ParaMetric.SpaceBefore; + if pmm_SpaceAfter in ModifyMask then m.SpaceAfter:=ParaMetric.SpaceAfter; + if pmm_LineSpacing in ModifyMask then m.LineSpacing:=ParaMetric.LineSpacing; + SetParaMetric(TextStart, 1, m); + + inc(TextStart, ln); + dec(TextLength, ln); + + until TextLength<=0; +end; + function TCustomRichMemo.LoadRichText(Source: TStream): Boolean; begin Result:=false; diff --git a/components/richmemo/samples/paragraphs/mainform.lfm b/components/richmemo/samples/paragraphs/mainform.lfm index a12378ae5..0f804f3dc 100644 --- a/components/richmemo/samples/paragraphs/mainform.lfm +++ b/components/richmemo/samples/paragraphs/mainform.lfm @@ -20,8 +20,8 @@ object Form1: TForm1 end object RichMemo1: TRichMemo Left = 8 - Height = 280 - Top = 48 + Height = 224 + Top = 104 Width = 599 Anchors = [akTop, akLeft, akRight, akBottom] HideSelection = False @@ -187,6 +187,57 @@ object Form1: TForm1 GroupIndex = 1 OnClick = btnJAClick end + object edtFL: TSpinEdit + Left = 72 + Height = 21 + Top = 48 + Width = 88 + MaxValue = 1000 + OnChange = edtFLChange + TabOrder = 3 + end + object edtHI: TSpinEdit + Left = 72 + Height = 21 + Top = 72 + Width = 88 + MaxValue = 1000 + OnChange = edtHIChange + TabOrder = 4 + end + object edtTI: TSpinEdit + Left = 240 + Height = 21 + Top = 48 + Width = 88 + MaxValue = 1000 + OnChange = edtTIChange + TabOrder = 5 + end + object Label1: TLabel + Left = 8 + Height = 13 + Top = 48 + Width = 43 + Caption = 'First Line' + ParentColor = False + end + object Label2: TLabel + Left = 8 + Height = 13 + Top = 72 + Width = 32 + Caption = 'Indent' + ParentColor = False + end + object Label3: TLabel + Left = 176 + Height = 13 + Top = 48 + Width = 51 + Caption = 'Tail Indent' + ParentColor = False + end object OpenDialog1: TOpenDialog left = 488 top = 16 diff --git a/components/richmemo/samples/paragraphs/mainform.pas b/components/richmemo/samples/paragraphs/mainform.pas index 86e21fb77..94eccaca8 100644 --- a/components/richmemo/samples/paragraphs/mainform.pas +++ b/components/richmemo/samples/paragraphs/mainform.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, - Buttons, ComCtrls, RichMemo, RichMemoUtils, Win32RichMemo; + Buttons, ComCtrls, Spin, RichMemo, RichMemoUtils; type @@ -16,12 +16,18 @@ type Button1: TButton; Button2: TButton; ImageList1: TImageList; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; OpenDialog1: TOpenDialog; RichMemo1: TRichMemo; btnLA: TSpeedButton; btnCA: TSpeedButton; btnRA: TSpeedButton; btnJA: TSpeedButton; + edtFL: TSpinEdit; + edtHI: TSpinEdit; + edtTI: TSpinEdit; procedure btnCAClick(Sender: TObject); procedure btnJAClick(Sender: TObject); procedure btnLAClick(Sender: TObject); @@ -29,6 +35,9 @@ type procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); + procedure edtFLChange(Sender: TObject); + procedure edtHIChange(Sender: TObject); + procedure edtTIChange(Sender: TObject); procedure FormShow(Sender: TObject); procedure RichMemo1Click(Sender: TObject); procedure RichMemo1KeyDown(Sender: TObject; var Key: Word; @@ -92,6 +101,36 @@ procedure TForm1.Button3Click(Sender: TObject); begin end; +procedure TForm1.edtFLChange(Sender: TObject); +var + m : TParaMetric; +begin + InitParaMetric(m); + m.FirstLine:=edtFL.Value; + RichMemo1.SetRangeParaParams(RichMemo1.SelStart, RichMemo1.SelLength, + [pmm_FirstLine], m); +end; + +procedure TForm1.edtHIChange(Sender: TObject); +var + m :TParaMetric; +begin + InitParaMetric(m); + m.HeadIndent:=edtHI.Value; + RichMemo1.SetRangeParaParams(RichMemo1.SelStart, RichMemo1.SelLength, + [pmm_HeadIndent], m); +end; + +procedure TForm1.edtTIChange(Sender: TObject); +var + m :TParaMetric; +begin + InitParaMetric(m); + m.TailIndent:=edtTI.Value; + RichMemo1.SetRangeParaParams(RichMemo1.SelStart, RichMemo1.SelLength, + [pmm_TailIndent], m); +end; + procedure TForm1.FormShow(Sender: TObject); begin SelectionChanged; @@ -111,6 +150,7 @@ end; procedure TForm1.SelectionChanged; var pa : TParaAlignment; + m : TParaMetric; begin pa:=RichMemo1.GetParaAlignment(RichMemo1.SelStart); case pa of @@ -119,6 +159,16 @@ begin paCenter: btnCA.Down:=true; paJustify: btnJA.Down:=true; end; + edtFL.OnChange:=nil; + edtHI.OnChange:=nil; + edtTI.OnChange:=nil; + RichMemo1.GetParaMetric(RichMemo1.SelStart, m); + edtFL.Value:=round(m.FirstLine); + edtHI.Value:=round(m.HeadIndent); + edtTI.Value:=round(m.TailIndent); + edtFL.OnChange:=@edtFLChange; + edtHI.OnChange:=@edtHIChange; + edtTI.OnChange:=@edtTIChange; end; procedure TForm1.SetRichAlign(a: TParaAlignment);