⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pararvfrm.pas

📁 richviewaction 1.58 需要richview 1.9.46
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{*******************************************************}
{                                                       }
{       RichViewActions                                 }
{       Dialog for paragraph attributes                 }
{                                                       }
{       Copyright (c) Sergey Tkachenko                  }
{       svt@trichview.com                               }
{       http://www.trichview.com                        }
{                                                       }
{*******************************************************}


unit ParaRVFrm;

interface

{$I RichViewActions.inc}

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, RVOfficeRadioBtn, ImgList, RVScroll, RVClasses,
  {$IFDEF USERVKSDEVTE}
  te_controls, te_extctrls,
  {$ENDIF}
  {$IFDEF USERVTNT}
  TntComCtrls,
  {$ENDIF}
  RichView, RVStyle, BaseRVFrm, RVSpinEdit, ExtCtrls, RVALocalize, ComCtrls;

type
  TfrmRVPara = class(TfrmRVBase)
    btnOk: TButton;
    btnCancel: TButton;
    pc: TPageControl;
    ts1: TTabSheet;
    ts2: TTabSheet;
    ts3: TTabSheet;
    gbAlignment: TRVOfficeRadioGroup;
    gbIndents: TGroupBox;
    lblLeft: TLabel;
    lblRight: TLabel;
    lblFirstLine: TLabel;
    Bevel1: TBevel;
    seLeftIndent: TRVSpinEdit;
    seRightIndent: TRVSpinEdit;
    rbNegative: TRVOfficeRadioButton;
    rbPositive: TRVOfficeRadioButton;
    seFirstLineIndent: TRVSpinEdit;
    gbSpacing: TGroupBox;
    lblBefore: TLabel;
    lblAfter: TLabel;
    lblLineSpacing: TLabel;
    Bevel3: TBevel;
    lblBy: TLabel;
    seSpaceBefore: TRVSpinEdit;
    seSpaceAfter: TRVSpinEdit;
    seLineSpacingValue: TRVSpinEdit;
    cmbLineSpacing: TComboBox;
    gbSample: TGroupBox;
    rv: TRichView;
    ImageList1: TImageList;
    rvs: TRVStyle;
    gbPagination: TGroupBox;
    cbKeepLinesTogether: TCheckBox;
    cbKeepWithNext: TCheckBox;
    ilSmallTabs: TImageList;
    ilTabs: TImageList;
    lstTabs: TListBox;
    btnDelete: TButton;
    btnDeleteAll: TButton;
    rgTabAlign: TRVOfficeRadioGroup;
    rgLeader: TRadioGroup;
    seTabPos: TRVSpinEdit;
    lblTabPos: TLabel;
    btnSet: TButton;
    lblDelTabs: TLabel;
    lblDelTabList: TLabel;
    ilListTabs: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure seFirstLineIndentChange(Sender: TObject);
    procedure cmbLineSpacingClick(Sender: TObject);
    procedure seLineSpacingValueChange(Sender: TObject);
    procedure seChange(Sender: TObject);
    procedure gbAlignmentClick(Sender: TObject);
    procedure gbAlignmentDblClickItem(Sender: TObject);
    procedure rbFLClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure seLeftIndentChange(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure lstTabsDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure lstTabsClick(Sender: TObject);
    procedure seTabPosChange(Sender: TObject);
    procedure btnDeleteAllClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure btnSetClick(Sender: TObject);
  private
    { Private declarations }
    _lstTabs, _rgLeader, _lblDelTabList: TControl;
    _btnSet, _btnDelete, _btnDeleteAll: TControl;
    _ts2: TControl;    
    IgnoreChanges: Boolean;
    FDeleteAllTabs: Boolean;
    FTabsToDelete: TRVIntegerList;
    FTabs: TRVTabInfos;
    DoNotResetLeader: Boolean;
    procedure UpdateSample;
    procedure SetTabs(Value: TRVTabInfos);
    procedure UpdateTabList(NewIndex: Integer);
    procedure DrawTabItem(Canvas: TCanvas; Index: Integer; R: TRect; Selected: Boolean);
    procedure UpdateDelTabList;
  protected
    {$IFDEF RVASKINNED}
    procedure OnCreateThemedControl(OldControl, NewControl: TControl); override;
    {$ENDIF}
  public
    { Public declarations }
    _cmbLineSpacing, _cbKeepWithNext, _cbKeepLinesTogether: TControl;
    TabsModified: Boolean;
    procedure Localize; override;
    procedure HideTabsPage;
    property DeleteAllTabs: Boolean read FDeleteAllTabs write FDeleteAllTabs;
    property TabsToDelete: TRVIntegerList read FTabsToDelete;
    property Tabs: TRVTabInfos read FTabs write SetTabs;
  end;

var
  frmRVPara: TfrmRVPara;

implementation

{$R *.dfm}

procedure TfrmRVPara.FormCreate(Sender: TObject);
var h: Integer;
begin
  Canvas.Font := lstTabs.Font;
  h := Canvas.TextHeight('Wg')+4;
  if h<20 then
    h := 20;
  lstTabs.ItemHeight := h;
  _cmbLineSpacing := cmbLineSpacing;
  _cbKeepWithNext := cbKeepWithNext;
  _cbKeepLinesTogether := cbKeepLinesTogether;
  _lstTabs := lstTabs;
  _rgLeader := rgLeader;
  _btnSet := btnSet;
  _btnDelete := btnDelete;
  _btnDeleteAll := btnDeleteAll;
  _lblDelTabList := lblDelTabList;
  _ts2 := ts2;
  rgLeader.Items[4] := #$B7#$B7#$B7#$B7#$B7#$B7#$B7#$B7#$B7#$B7;
  inherited;
  rv.AddNL(RVA_GetS(rvam_par_Preview), 0, 0);
  rv.AddNL(RVA_GetS(rvam_par_Preview), 1, 1);
  rv.AddNL(RVA_GetS(rvam_par_Preview), 0, 0);
  rv.Format;
  FTabsToDelete := TRVIntegerList.Create;
  FTabs := TRVTabInfos.Create(nil);
end;

procedure TfrmRVPara.FormDestroy(Sender: TObject);
begin
  FTabsToDelete.Free;
  FTabs.Free;
  inherited;
end;

procedure TfrmRVPara.seFirstLineIndentChange(Sender: TObject);
begin
  if not Visible or IgnoreChanges then
    exit;
  if seFirstLineIndent.Indeterminate or (seFirstLineIndent.AsInteger=0) then begin
    rbNegative.Checked := False;
    rbPositive.Checked := False;
    end
  else if not seFirstLineIndent.Indeterminate and not rbNegative.Checked and not rbPositive.Checked then
    rbPositive.Checked := True
  else if rbNegative.Checked and
    (seLeftIndent.AsInteger-seFirstLineIndent.AsInteger-Round(seLeftIndent.MinValue)<0) then begin
    IgnoreChanges := True;
    seLeftIndent.Value := seFirstLineIndent.AsInteger+Round(seLeftIndent.MinValue);
    IgnoreChanges := False;
  end;
  UpdateSample;
end;

procedure TfrmRVPara.seLeftIndentChange(Sender: TObject);
begin
  if not Visible or IgnoreChanges then
    exit;
  if rbNegative.Checked and (seFirstLineIndent.Value>0) and
    (seLeftIndent.AsInteger-seFirstLineIndent.AsInteger-Round(seLeftIndent.MinValue)<0) then begin
    IgnoreChanges := True;
    seFirstLineIndent.Value := seLeftIndent.AsInteger-Round(seLeftIndent.MinValue);
    IgnoreChanges := False;
  end;
  UpdateSample;
end;

procedure TfrmRVPara.rbFLClick(Sender: TObject);
begin
  if not Visible then
    exit;
  if rbNegative.Checked and
    (seLeftIndent.AsInteger-seFirstLineIndent.AsInteger-Round(seLeftIndent.MinValue)<0) then begin
    IgnoreChanges := True;
    seLeftIndent.Value := seFirstLineIndent.AsInteger+Round(seLeftIndent.MinValue);
    IgnoreChanges := False;
  end;
  if seFirstLineIndent.Indeterminate then
    seFirstLineIndent.Value := 0;
  UpdateSample;
end;


procedure TfrmRVPara.cmbLineSpacingClick(Sender: TObject);
begin
  if not Visible then
    exit;
  if GetXBoxItemIndex(_cmbLineSpacing)<>3 then
    seLineSpacingValue.Indeterminate := True
  else if seLineSpacingValue.Indeterminate then
    seLineSpacingValue.Value := 3;
  UpdateSample;
end;

procedure TfrmRVPara.seLineSpacingValueChange(Sender: TObject);
begin
  if not Visible then
    exit;
  if not seLineSpacingValue.Indeterminate then
    SetXBoxItemIndex(_cmbLineSpacing, 3);
  UpdateSample;
end;

procedure TfrmRVPara.gbAlignmentClick(Sender: TObject);
begin
  UpdateSample;
end;

procedure TfrmRVPara.UpdateSample;
begin
  if not Visible then
    exit;
  with rvs.ParaStyles[1] do begin
    if gbAlignment.ItemIndex<0 then
      Alignment := rvaLeft
    else
      Alignment :=  TRVAlignment(gbAlignment.ItemIndex);
    SpaceBefore := seSpaceBefore.AsInteger div 2;
    SpaceAfter := seSpaceAfter.AsInteger  div 2;
    Background.BorderOffsets.Top := SpaceBefore;
    Background.BorderOffsets.Bottom := SpaceAfter;
    LeftIndent := seLeftIndent.AsInteger  div 2;
    RightIndent := seRightIndent.AsInteger  div 2;
    if rbNegative.Checked then
      FirstIndent := -seFirstLineIndent.AsInteger div 2
    else
      FirstIndent := seFirstLineIndent.AsInteger div 2;
    case GetXBoxItemIndex(_cmbLineSpacing) of
      0: LineSpacing := 100;
      1: LineSpacing := 150;
      2: LineSpacing := 200;
      3: LineSpacing := Round(seLineSpacingValue.Value * 100);
    end;
  end;
  rv.Format;
end;

procedure TfrmRVPara.seChange(Sender: TObject);
begin
  UpdateSample;
end;


procedure TfrmRVPara.gbAlignmentDblClickItem(Sender: TObject);
begin
  ModalResult := mrOk;
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -