📄 rvruler.pas
字号:
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 + -