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

📄 rvruler.pas

📁 richviewaction 1.58 需要richview 1.9.46
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  StartFrom: Integer;
  data: TRVDeleteUnusedStylesData;
  UseStartFrom: Boolean;
begin
  inherited;
  if not Assigned(FRichViewEdit) or FUpdating then
    Exit;

  RVEditor := FRichViewEdit.TopLevelEditor;
  M := MultiPixels; // TRichView is based on pixels
  if UseRTL then
  begin
    FFirstIndent := Round(M * FirstIndent);
    FRightIndent := Round(M * LeftIndent + FFirstIndent);
    FFirstIndent := FFirstIndent - FRightIndent;
    FLeftIndent  := Round(M * RightIndent);
  end
  else
  begin
    FFirstIndent := Round(M * FirstIndent);
    FLeftIndent  := Round(M * LeftIndent + FFirstIndent);
    FFirstIndent := FFirstIndent - FLeftIndent;
    FRightIndent := Round(M * RightIndent);
  end;

  if ListEditor.Active then
  begin
    FirstParaItemNo := RVEditor.CurItemNo;
    while not RVEditor.IsParaStart(FirstParaItemNo) do
      Dec(FirstParaItemNo);
    RVEditor.GetListMarkerInfo(FirstParaItemNo, ListNo, ListLevel, StartFrom, UseStartFrom);

    ListStyle:= TRVListInfo.Create(nil);
    try
      ListStyle.Assign(RVEditor.Style.ListStyles[ListNo]);

      RVListLevel := ListStyle.Levels[ListEditor.ListLevel];
      if UseRTL then
        RVListLevel.LeftIndent := FRightIndent
      else
        RVListLevel.LeftIndent := FLeftIndent;
      RVListLevel.FirstIndent := FFirstIndent;

      if not ListStyle.HasNumbering then
        ListNo := FRichViewEdit.Style.ListStyles.FindSuchStyle(ListStyle, True)
      else
      begin
        data := TRVDeleteUnusedStylesData.Create(False, False, True);
        FRichViewEdit.MarkStylesInUse(data);
        ListNo := -1;
        for I := 0 to FRichViewEdit.Style.ListStyles.Count - 1 do
          if (data.UsedListStyles[I] = 0) and
             FRichViewEdit.Style.ListStyles[I].IsSimpleEqual(ListStyle, False, True) then
          begin
            ListNo := I;
            Break;
          end;
        data.Free;
        if ListNo < 0 then
        begin
          FRichViewEdit.Style.ListStyles.Add.Assign(ListStyle);
          ListNo := FRichViewEdit.Style.ListStyles.Count - 1;
          FRichViewEdit.Style.ListStyles[ListNo].Standard := False;
        end;
      end;

      FRichViewEdit.ApplyListStyle(ListNo, ListLevel, StartFrom, UseStartFrom, False);
    finally
      ListStyle.Free;
    end;
  end;

  OldStyleConversionEvent := RVEditor.OnParaStyleConversion;
  try
    RVEditor.OnParaStyleConversion := RichViewEditParaStyleConversion;
    RVEditor.ApplyParaStyleConversion(0);
  finally
    RVEditor.OnParaStyleConversion := OldStyleConversionEvent;
  end;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.SetRichViewEdit(const Value: TCustomRichViewEdit);
begin
  RestoreRichViewEditEvents;
  FRichViewEdit := Value;
  if not (csLoading in ComponentState) then
    AssignRichViewEditEvents;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.SetRVRulerOptions(const Value: TRVRulerOptions);
begin
  if FRVRulerOptions <> Value then
  begin
    FRVRulerOptions := Value;
    Invalidate;
  end;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.AssignRichViewEditEvents;
begin
  if not Assigned(FRichViewEdit) or (csDesigning in ComponentState) then
    Exit;
  if RulerType = rtHorizontal then
  begin
    FRVEOldCaretMove := TRichViewEdit(FRichViewEdit).OnCaretMove;
    FRVEOldHScrolled := TRichViewEdit(FRichViewEdit).OnHScrolled;
    TRichViewEdit(FRichViewEdit).OnCaretMove := RichViewEditCaretMove;
    TRichViewEdit(FRichViewEdit).OnHScrolled := RichViewEditHScrolled;
    if Assigned(FRichViewEdit.Style) then
      DefaultTabWidth := FRichViewEdit.Style.DefTabWidth/MultiPixels;
  end
  else
  begin
    FRVEOldVScrolled := TRichViewEdit(FRichViewEdit).OnVScrolled;
    TRichViewEdit(FRichViewEdit).OnVScrolled := RichViewEditVScrolled;
  end;
  FRVEOldCurParaStyleChanged := TRichViewEdit(FRichViewEdit).OnCurParaStyleChanged;
  TRichViewEdit(FRichViewEdit).OnCurParaStyleChanged := RichViewEditCurParaStyleChanged;
  {$IFDEF RICHVIEWDEF4}
  FRVEOldResize := TRichViewEdit(FRichViewEdit).OnResize;
  TRichViewEdit(FRichViewEdit).OnResize := RichViewEditResize;
  {$ENDIF}
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.RestoreRichViewEditEvents;
begin
  if not Assigned(FRichViewEdit) or (csDesigning in ComponentState) then
    Exit;
  if RulerType = rtHorizontal then
  begin
    TRichViewEdit(FRichViewEdit).OnCaretMove := FRVEOldCaretMove;
    TRichViewEdit(FRichViewEdit).OnHScrolled := FRVEOldHScrolled;
  end
  else
    TRichViewEdit(FRichViewEdit).OnVScrolled := FRVEOldVScrolled;
  TRichViewEdit(FRichViewEdit).OnCurParaStyleChanged := FRVEOldCurParaStyleChanged;
  {$IFDEF RICHVIEWDEF4}
  TRichViewEdit(FRichViewEdit).OnResize := FRVEOldResize;
  {$ENDIF}

  FRVEOldCaretMove := nil;
  FRVEOldCurParaStyleChanged := nil;
  FRVEOldResize := nil;
  FRVEOldHScrolled := nil;
  FRVEOldVScrolled := nil;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.AdjustPosition;
var pt: TPoint;
begin
  if not Assigned(FRichViewEdit)                 then Exit;
  if not (rvroAutoAdjustInset in RVRulerOptions) then Exit;

  if RulerType = rtHorizontal then
  begin
    pt := FRichViewEdit.ClientOrigin;
    pt := FRichViewEdit.Parent.ScreenToClient(pt);
    Dec(pt.X, FRichViewEdit.Left);
    FRulerInset := -(FRichViewEdit.HScrollPos - pt.X);
    if UseRTL then
      with FRichViewEdit do
        Inset := Pred(Width - (pt.X + RVData.TextWidth + LeftMargin +
          RightMargin) + HScrollPos)
    else
      Inset := FRulerInset;
  end
  else
  begin
    pt := FRichViewEdit.ClientOrigin;
    pt := FRichViewEdit.Parent.ScreenToClient(pt);
    Dec(pt.Y, FRichViewEdit.Top);
    FRulerInset := pt.Y - FRichViewEdit.VScrollPos * FRichViewEdit.VSmallStep;
    Inset := FRulerInset;
  end;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.RichViewEditHScrolled(Sender: TObject);
begin
  AdjustPosition;
  if Assigned(FRVEOldHScrolled) then
    FRVEOldHScrolled(Sender);
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.RichViewEditVScrolled(Sender: TObject);
begin
  AdjustPosition;
  if Assigned(FRVEOldVScrolled) then
    FRVEOldVScrolled(Sender);
end;
{------------------------------------------------------------------------------}
{$IFDEF RICHVIEWDEF4}
procedure TRVRuler.RichViewEditResize(Sender: TObject);
begin
  AdjustPosition;
  UpdateRulerMargins;
  UpdateTableEditor;
  if Assigned(FRVEOldResize) then
    FRVEOldResize(Sender);
end;
{$ENDIF}
{------------------------------------------------------------------------------}
procedure TRVRuler.RichViewEditCaretMove(Sender: TObject);
begin
  UpdateListEditor;
  if Assigned(FRVEOldCaretMove) then
    FRVEOldCaretMove(Sender);
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.RichViewEditCurParaStyleChanged(Sender: TObject);
var RVBiDiMode: TRVBiDiMode;
begin
  if Assigned(FRVEOldCurParaStyleChanged) then
    FRVEOldCurParaStyleChanged(Sender);

  if FRichViewEdit.ItemCount = 0 then
    Exit;

  if RulerType = rtHorizontal then
  begin
    RVBiDiMode := FRichViewEdit.Style.ParaStyles[FRichViewEdit.CurParaStyleNo].BiDiMode;
    if RVBiDiMode = rvbdUnspecified then
      RVBiDiMode := FRichViewEdit.BiDiMode;
    if RVBiDiMode = rvbdRightToLeft then
      BiDiModeRuler := bmRightToLeft
    else
      BiDiModeRuler := bmUseBiDiMode;
  end
  else
    BiDiModeRuler := bmLeftToRight;

  UpdateTableEditor;
  UpdateRulerIndents;
  UpdateListEditor;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.RichViewEditParaStyleConversion(
  Sender: TCustomRichViewEdit; StyleNo, UserData: Integer;
  AppliedToText: Boolean; var NewStyleNo: Integer);
var ParaInfo: TParaInfo;
    {$IFNDEF RVDONOTUSETABS}
    i: Integer;
    M: Extended;
    {$ENDIF}
begin
  ParaInfo := TParaInfo.Create(nil);
  try
    ParaInfo.Assign(Sender.Style.ParaStyles[StyleNo]);

    if ListEditor.Active then
    begin
      if UseRTL then
        ParaInfo.LeftIndent  := FLeftIndent
      else
        ParaInfo.RightIndent := FRightIndent;
    end
    else
    begin
      ParaInfo.LeftIndent  := FLeftIndent;
      ParaInfo.FirstIndent := FFirstIndent;
      ParaInfo.RightIndent := FRightIndent;
    end;
    {$IFNDEF RVDONOTUSETABS}
    M := MultiPixels;
    ParaInfo.Tabs.Clear;
    for i := 0 to Tabs.Count - 1 do
      with ParaInfo.Tabs.Add do
      begin
        Position := Round(M * Tabs[i].Position);
        case Tabs[i].Align of
          taLeftAlign:   Align := rvtaLeft;
          taRightAlign:  Align := rvtaRight;
          taCenterAlign: Align := rvtaCenter;
        end;
      end;
    {$ENDIF}
    NewStyleNo := Sender.Style.ParaStyles.FindSuchStyle(StyleNo,ParaInfo,RVAllParaInfoProperties);
    if NewStyleNo = -1 then
    begin
      Sender.Style.ParaStyles.Add;
      NewStyleNo := Sender.Style.ParaStyles.Count-1;
      Sender.Style.ParaStyles[NewStyleNo].Assign(ParaInfo);
      Sender.Style.ParaStyles[NewStyleNo].Standard := False;
    end;
  finally
    ParaInfo.Free;
  end;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.UpdateRulerIndents;
var M: Extended;
    ParaNo: Integer;
    ParaStyles: TParaInfos;
    {$IFNDEF RVDONOTUSETABS}
    i: Integer;
    {$ENDIF}
begin
  if not Assigned(FRichViewEdit) or FUpdating or FUpdatingTabs or (RulerType <> rtHorizontal) then
    Exit;

  FUpdating := True;
  try
    ParaStyles := FRichViewEdit.Style.ParaStyles;
    ParaNo := FRichViewEdit.CurParaStyleNo;
    M := 1 / MultiPixels;
    if UseRTL then
    begin
      FirstIndent :=
        M * (ParaStyles[ParaNo].RightIndent + ParaStyles[ParaNo].FirstIndent);
      LeftIndent := M * -ParaStyles[ParaNo].FirstIndent;
      RightIndent := M * ParaStyles[ParaNo].LeftIndent;
    end
    else
    begin
      FirstIndent :=
        M * (ParaStyles[ParaNo].LeftIndent + ParaStyles[ParaNo].FirstIndent);
      LeftIndent  := M * -ParaStyles[ParaNo].FirstIndent;
      RightIndent := M * ParaStyles[ParaNo].RightIndent;
    end;

    {$IFNDEF RVDONOTUSETABS}
    i := ParaStyles[ParaNo].Tabs.Count;
    if i > 0 then
    begin
      Tabs.BeginUpdate;
      Tabs.Clear;
      try
        for i := 0 to i - 1 do
          with Tabs.Add do
          begin
            Position := M * ParaStyles[ParaNo].Tabs[i].Position;
            case ParaStyles[ParaNo].Tabs[i].Align of
              rvtaLeft:   Align := taLeftAlign;
              rvtaRight:  Align := taRightAlign;
              rvtaCenter: Align := taCenterAlign;
            end;
          end;
      finally
        Tabs.EndUpdate;
      end;
    end
    else
      Tabs.Clear;
    {$ENDIF}
  finally
    FUpdating := False;
  end;
end;
{------------------------------------------------------------------------------}
procedure TRVRuler.UpdateRulerMargins;
var M: Extended;
begin
  if not Assigned(FRichViewEdit) or FUpdating      then Exit;
  if not (rvroAutoAdjustMargins in RVRulerOptions) then Exit;

  FUpdating := True;
  try
    M := 1 / MultiPixels;
    if RulerType = rtHorizontal then
    begin
      LeftMargin := M * FRichViewEdit.LeftMargin;
      RightMargin := M * FRichViewEdit.RightMargin;
      PageWidth := M * (FRichViewEdit.RVData.TextWidth + FRichViewEdit.LeftMargin +
        FRichViewEdit.RightMargin);
    end
    else
    begin

⌨️ 快捷键说明

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