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

📄 listgalleryrvfrm.pas

📁 richviewaction 1.58 需要richview 1.9.46
💻 PAS
字号:

{*******************************************************}
{                                                       }
{       RichViewActions                                 }
{       Dialog for applying lists                       }
{                                                       }
{       Copyright (c) Sergey Tkachenko                  }
{       svt@trichview.com                               }
{       http://www.trichview.com                        }
{                                                       }
{*******************************************************}

unit ListGalleryRVFrm;

interface

{$I RV_Defs.inc}
{$I RichViewActions.inc}

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

type
  TfrmRVListGallery = class(TfrmRVBase)
    btnOk: TButton;
    btnCancel: TButton;
    pc: TPageControl;
    ts1: TTabSheet;
    ts2: TTabSheet;
    rg1: TRVOfficeRadioGroup;
    btnEdit1: TButton;
    RVStyle2: TRVStyle;
    il: TImageList;
    helper: TRVReportHelper;
    btnReset: TButton;
    rvstmp: TRVStyle;
    RVStyle1: TRVStyle;
    rg2: TRVOfficeRadioGroup;
    btnEdit2: TButton;
    il2: TImageList;
    il3: TImageList;
    cmbNumbering: TComboBox;
    seStartFrom: TRVSpinEdit;
    rvsTemplate1: TRVStyle;
    rvsTemplate2: TRVStyle;
    procedure FormCreate(Sender: TObject);
    procedure rg1Click(Sender: TObject);
    procedure btnEdit1Click(Sender: TObject);
    procedure btnEdit2Click(Sender: TObject);
    procedure rg2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure rg2DblClickItem(Sender: TObject);
    procedure cmbNumberingClick(Sender: TObject);
    procedure btnResetClick(Sender: TObject);
  private
    { Private declarations }
    StyleIndices: array [0..1] of TRVIntegerList;
    StartFromList: TRVIntegerList;
    FMainPage, FMainIndex: Integer;
    _btnEdit1, _btnEdit2, _btnReset,
    _cmbNumbering, _pc, _ts1, _ts2: TControl;
    procedure CreateThumbnail(bmp: TBitmap; ListNo: Integer; RVStyle1: TRVStyle);
    procedure EditList(RVStyle: TRVStyle; Index: Integer);
    procedure InitBullets;
    function GetRVStyle(PageNo: Integer): TRVStyle;
    function GetRVStyleTemplate(PageNo: Integer): TRVStyle;
    function Getrg(PageNo: Integer): TRVOfficeRadioGroup;
  protected
    {$IFDEF RVASKINNED}
    procedure OnCreateThemedControl(OldControl, NewControl: TControl); override;
    {$ENDIF}
  public
    { Public declarations }
    procedure GetListStyle(var ListStyle: TRVListInfo; var ListNo: Integer; var StartFrom: Integer;
                           var UseStartFrom: Boolean);
    procedure InitStyles(rve: TCustomRichViewEdit);
    procedure Localize; override;
  end;


implementation

uses ParaListRVFrm;

const ThumbWidth = 67;
      ThumbHeight = 93;
      LongText = '--------------------------------------------------------------------------------------------------------';

var ModifiedTemplates: array [0..1] of TRVStyle;

{$R *.dfm}

function GetThemedColor(Color: TColor): TColor;
begin
  Result := Color;
  {$IFDEF USERVKSDEVTE}
  if GetThemeLink(nil)<>nil then
    Result := GetThemeLink(nil).SysColors[Color];
  {$ENDIF}
end;


{ TfrmRVListGallery }

procedure TfrmRVListGallery.CreateThumbnail(bmp: TBitmap; ListNo: Integer;
  RVStyle1: TRVStyle);


var h,level,i: Integer;
begin
  bmp.Canvas.Brush.Color := GetThemedColor(clWindow);

  bmp.Canvas.FillRect(Bounds(0,0,bmp.Width,bmp.Height));

  level := 0;
  if RVStyle1.ListStyles[ListNo].Levels.Count=0 then
    exit;

  rvstmp.ListStyles.Clear;
  rvstmp.ListStyles.Add.Assign(RVStyle1.ListStyles[ListNo]);

  for i := 0 to rvstmp.ListStyles[0].Levels.Count-1 do begin
   rvstmp.ListStyles[0].Levels[i].LeftIndent := Round(rvstmp.ListStyles[0].Levels[i].LeftIndent/2);
   rvstmp.ListStyles[0].Levels[i].MarkerIndent := Round(rvstmp.ListStyles[0].Levels[i].MarkerIndent/2);
   rvstmp.ListStyles[0].Levels[i].FirstIndent := Round(rvstmp.ListStyles[0].Levels[i].FirstIndent/2);
  end;
  ListNo := 0;

  helper.RichView.Clear;
  helper.RichView.Style := rvstmp;

  for i := 0 to 2 do begin
    helper.RichView.SetListMarkerInfo(-1, ListNo, level, 1, 0, False);
    helper.RichView.AddNL(LongText, 0, -1);
    helper.RichView.SetAddParagraphMode(False);
    helper.RichView.AddNL(LongText, 0, 0);
    helper.RichView.SetAddParagraphMode(True);
    if not rvstmp.ListStyles[ListNo].OneLevelPreview then
      inc(level);
    if level = rvstmp.ListStyles[ListNo].Levels.Count then
      level := 0;
  end;

  helper.Init(Canvas, bmp.Width);
  helper.FormatNextPage(1000);
  h := helper.EndAt;
  if h<il.Height then
    h := il.Height;
  helper.rv.ClientHeight := h;
//  w := il.Width;
  helper.rv.ClientWidth := MulDiv(helper.RichView.ClientWidth, h, il.Height);
  helper.DrawPreview(1, bmp.Canvas, Rect(0,0,il.Width,il.Height));
  //helper.DrawPage(1, bmp.Canvas, True, bmp.Height);
end;

procedure TfrmRVListGallery.EditList(RVStyle: TRVStyle; Index: Integer);
var frm: TfrmRVParaList;
    r: Boolean;
begin
  if Index<1 then
    exit;
  frm := TfrmRVParaList.Create(Application);
  frm.SetListStyle(RVStyle.ListStyles[Index-1]);
  r := frm.ShowModal=mrOk;
  if r then begin
    frm.GetListStyle(rvstmp.ListStyles[0]);
    if rvstmp.ListStyles[0].HasNumbering then
      SetPageControlActivePage(_pc, _ts2)
    else
      SetPageControlActivePage(_pc, _ts1);
    Getrg(GetPageControlActivePageIndex(_pc)).ItemIndex := Index;
    StyleIndices[GetPageControlActivePageIndex(_pc)][Index-1] := -1;
    frm.GetListStyle(ModifiedTemplates[GetPageControlActivePageIndex(_pc)].ListStyles[Index-1]);
    frm.GetListStyle(GetRVStyle(GetPageControlActivePageIndex(_pc)).ListStyles[Index-1]);
  end;
  frm.Free;
  if r then
    ModalResult := mrOk;
end;

procedure TfrmRVListGallery.FormCreate(Sender: TObject);
var bmp: TBitmap;
    r: TRect;
    i: Integer;
begin
  _btnEdit1 := btnEdit1;
  _btnEdit2 := btnEdit2;
  _btnReset := btnReset;
  _cmbNumbering := cmbNumbering;
  _pc  := pc;
  _ts1 := ts1;
  _ts2 := ts2;
  inherited;
  StartFromList := TRVIntegerList.CreateEx(7,-1);
  for i := 0 to 1 do begin
    StyleIndices[i] := TRVIntegerList.CreateEx(7,-1);
  end;

  InitBullets;

  RVStyle1.TextStyles[0].Color := GetThemedColor(clBtnShadow);
  RVStyle1.TextStyles[0].BackColor := GetThemedColor(clBtnFace);
  RVStyle2.TextStyles[0].Color := GetThemedColor(clBtnShadow);
  RVStyle2.TextStyles[0].BackColor := GetThemedColor(clBtnFace);
  rvsTemplate1.TextStyles[0].Color := GetThemedColor(clBtnShadow);
  rvsTemplate1.TextStyles[0].BackColor := GetThemedColor(clBtnFace);
  rvsTemplate2.TextStyles[0].Color := GetThemedColor(clBtnShadow);
  rvsTemplate2.TextStyles[0].BackColor := GetThemedColor(clBtnFace);

  if ModifiedTemplates[0]=nil then begin
    ModifiedTemplates[0] := TRVStyle.Create(nil);
    ModifiedTemplates[0].TextStyles.Clear;
    ModifiedTemplates[0].ParaStyles.Clear;
    ModifiedTemplates[0].ListStyles := rvsTemplate1.ListStyles;
  end;
  if ModifiedTemplates[1]=nil then begin
    ModifiedTemplates[1] := TRVStyle.Create(nil);
    ModifiedTemplates[1].TextStyles.Clear;
    ModifiedTemplates[1].ParaStyles.Clear;
    ModifiedTemplates[1].ListStyles := rvsTemplate2.ListStyles;
  end;

  RVStyle1.ListStyles := ModifiedTemplates[0].ListStyles;
  RVStyle2.ListStyles := ModifiedTemplates[1].ListStyles;

  rvstmp.ParaStyles := RVStyle1.ParaStyles;
  rvstmp.TextStyles := RVStyle1.TextStyles;

  helper.RichView.Style := RVStyle1;
  helper.RichView.LeftMargin := 0;
  helper.RichView.TopMargin := 0;
  helper.RichView.RightMargin := 0;
  helper.RichView.BottomMargin := 0;

  r := Rect(0,0,il.Width,il.Height);

  bmp := TBitmap.Create;
  bmp.Width := il.Width;
  bmp.Height := il.Height;

  bmp.Canvas.Brush.Color := GetThemedColor(clWindow);
  bmp.Canvas.FillRect(r);
  bmp.Canvas.Font.Name := 'Arial';
  bmp.Canvas.Font.Size := 12;

  DrawText(bmp.Canvas.Handle, RVA_GetPC(rvam_lg_None), -1, r,
    DT_CENTER or DT_VCENTER or DT_SINGLELINE);
  il.AddMasked(bmp, clWindow);
  il2.AddMasked(bmp, clWindow);
  il3.AddMasked(bmp, clWindow);
  bmp.Free;

  for i := 0 to RVStyle1.ListStyles.Count-1 do begin
    bmp := TBitmap.Create;
    bmp.Width := il.Width;
    bmp.Height := il.Height;
    bmp.Canvas.Brush.Color := GetThemedColor(clWindow);
    bmp.Canvas.FillRect(r);
    CreateThumbnail(bmp,i,RVStyle1);
    il.AddMasked(bmp, clWhite);
    bmp.Free;
  end;

  for i := 0 to RVStyle2.ListStyles.Count-1 do begin
    bmp := TBitmap.Create;
    bmp.Width := il.Width;
    bmp.Height := il.Height;
    bmp.Canvas.Brush.Color := GetThemedColor(clWindow);
    bmp.Canvas.FillRect(r);
    CreateThumbnail(bmp,i,RVStyle2);
    il2.AddMasked(bmp, clWhite);
    bmp.Free;
  end;

  {
  for i := 0 to RVStyle3.ListStyles.Count-1 do begin
    bmp := TBitmap.Create;
    bmp.Width := il.Width;
    bmp.Height := il.Height;
    bmp.Canvas.Brush.Color := GetThemedColor(clWindow);
    bmp.Canvas.FillRect(r);
    CreateThumbnail(bmp,i,RVStyle3);
    il3.AddMasked(bmp, clWindow);
    bmp.Free;
  end;
  }
end;

procedure TfrmRVListGallery.FormDestroy(Sender: TObject);
var i : Integer;
begin
  for i := 0 to 1 do begin
    StyleIndices[i].Free;
    StyleIndices[i] := nil;
  end;
  StartFromList.Free;
  StartFromList := nil;
  inherited;
end;

procedure TfrmRVListGallery.rg1Click(Sender: TObject);
begin
  _btnEdit1.Enabled := rg1.ItemIndex>0;
  if GetPageControlActivePageIndex(_pc)=0 then
    _btnReset.Enabled :=
      (rg1.ItemIndex>0) and
      not RVStyle1.ListStyles[rg1.ItemIndex-1].IsSimpleEqual(rvsTemplate1.ListStyles[rg1.ItemIndex-1], False);
end;

procedure TfrmRVListGallery.rg2Click(Sender: TObject);
begin
  if GetPageControlActivePageIndex(_pc)=1 then
    _btnReset.Enabled :=
      (rg2.ItemIndex>0) and
      not RVStyle2.ListStyles[rg2.ItemIndex-1].IsSimpleEqual(rvsTemplate2.ListStyles[rg2.ItemIndex-1], False);
  if rg2.ItemIndex<0 then
    exit;
  ClearXBoxItems(_cmbNumbering);
  if rg2.ItemIndex=0 then begin
    _cmbNumbering.Enabled := False;
    seStartFrom.Enabled := False;
    seStartFrom.Indeterminate := True;
    _btnEdit2.Enabled := False;
    exit;
  end;
  if StyleIndices[1][rg2.ItemIndex-1]>=0 then begin
    XBoxItemsAddObject(_cmbNumbering, RVA_GetS(rvam_lg_NumContinue), TObject(1));
    XBoxItemsAddObject(_cmbNumbering, RVA_GetS(rvam_lg_NumReset), TObject(2));
  end;
  XBoxItemsAddObject(_cmbNumbering, RVA_GetS(rvam_lg_NumCreate), TObject(3));
  _cmbNumbering.Enabled := True;
  if StyleIndices[1][rg2.ItemIndex-1]>=0 then begin
    if StartFromList[rg2.ItemIndex-1]<0 then begin
      SetXBoxItemIndex(_cmbNumbering, 0);
      seStartFrom.Indeterminate := True;      
      seStartFrom.Enabled := False;
      end
    else begin
      SetXBoxItemIndex(_cmbNumbering, 1);
      seStartFrom.Value := StartFromList[rg2.ItemIndex-1];
      seStartFrom.Enabled := True;
    end
    end
  else begin
    SetXBoxItemIndex(_cmbNumbering, 0);
    seStartFrom.Value := 1;
    seStartFrom.Enabled := True;
  end;
  _btnEdit2.Enabled := rg2.ItemIndex>0;
end;

procedure TfrmRVListGallery.cmbNumberingClick(Sender: TObject);
begin
  if (GetXBoxItemIndex(_cmbNumbering)<0) or
     (Integer(GetXBoxObject(_cmbNumbering, GetXBoxItemIndex(_cmbNumbering)))=1) then begin
    seStartFrom.Indeterminate := True;
    seStartFrom.Enabled := False;
    exit;
  end;
  if (Integer(GetXBoxObject(_cmbNumbering, GetXBoxItemIndex(_cmbNumbering)))=2) and
     (StartFromList[rg2.ItemIndex-1]>=0) then
    seStartFrom.Value := StartFromList[rg2.ItemIndex-1]
  else
    seStartFrom.Value := 1;
  seStartFrom.Enabled := True;
end;

procedure TfrmRVListGallery.btnEdit1Click(Sender: TObject);
begin
  EditList(RVStyle1, rg1.ItemIndex)
end;

procedure TfrmRVListGallery.btnEdit2Click(Sender: TObject);
begin
  EditList(RVStyle2, rg2.ItemIndex)
end;

procedure TfrmRVListGallery.InitBullets;
var i: Integer;
begin
  with rvsTemplate1.ListStyles[0] do begin
    Levels[0].FormatString := 'v';
    Levels[1].FormatString := '

⌨️ 快捷键说明

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