📄 rvundo.pas
字号:
{------------------------------------------------------------------------------}
procedure TRVUndoDeleteItemsInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_InsertItems(StartItemNo,List,True,FR);
EndItemNo := StartItemNo+List.Count-1;
List.Clear;
end;
{=========================== TRVUndoDeleteSubstring ===========================}
function TRVUndoDeleteSubstringInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoDeleteSubstringInfo.Undo(RVData: TRichViewRVData);
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
TRVEditRVData(RVData).Do_InsertSubstring(ItemNo, Index, s);
end;
{============================ TRVUndoInsertItem ===============================}
function TRVUndoInsertItemInfo.ItemsAdded: Integer;
begin
Result := -1;
end;
{------------------------------------------------------------------------------}
function TRVUndoInsertItemInfo.RequiresFullReformat1(
RVData: TRichViewRVData): Boolean;
begin
Result := RVData.CalculateMinItemWidthPlusEx(ItemNo)>=
RVData.DocumentWidth;
end;
{------------------------------------------------------------------------------}
function TRVUndoInsertItemInfo.RequiresFullReformat2(RVData: TRichViewRVData): Boolean;
begin
Result := FR;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoInsertItemInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_DeleteItem(ItemNo, FR);
end;
{============================ TRVUndoInsertSubstring ==========================}
function TRVUndoInsertSubstringInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoInsertSubstringInfo.Undo(RVData: TRichViewRVData);
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
TRVEditRVData(RVData).Do_DeleteSubstring(ItemNo, Index, Length);
end;
{========================= TRVUndoInsertItems =================================}
function TRVUndoInsertItemsInfo.ItemsAdded: Integer;
begin
Result := -Count;
end;
{------------------------------------------------------------------------------}
function TRVUndoInsertItemsInfo.RequiresFullReformat1(
RVData: TRichViewRVData): Boolean;
begin
Result := RVData.CalculateMinItemsWidthPlusEx(ItemNo,ItemNo+Count-1)>=RVData.DocumentWidth;
end;
{------------------------------------------------------------------------------}
function TRVUndoInsertItemsInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := FR;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoInsertItemsInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_DeleteItems(ItemNo,ItemNo+Count-1,FR);
end;
{============================== TRVUndoNewLine ================================}
function TRVUndoNewLineInfo.RequiresFullReformat2(RVData: TRichViewRVData): Boolean;
begin
Result := FR;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoNewLineInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_NewLine(ItemNo, WasSameAsPrev, WasParaNo, FR);
end;
{=============================== TRVUndoBR ====================================}
procedure TRVUndoBRInfo.Undo(RVData: TRichViewRVData);
var FR: Boolean;
begin
TRVEditRVData(RVData).Do_BR(ItemNo, WasBR, FR);
end;
{========================== TRVUndoPageBreakInfo ==============================}
procedure TRVUndoPageBreakInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_PageBreak(ItemNo, WasPageBreak);
end;
{========================= TRVUndoExtraIntProperty ============================}
function TRVUndoExtraIntProperty.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoExtraIntProperty.Undo(RVData: TRichViewRVData);
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
TRVEditRVData(RVData).Do_ExtraIntProperty(ItemNo, Prop, OldValue);
end;
{============================= TRVUndoListInfo ================================}
constructor TRVUndoListInfo.Create;
begin
inherited Create;
List := TRVIntegerList.Create;
end;
{------------------------------------------------------------------------------}
destructor TRVUndoListInfo.Destroy;
begin
List.Free;
inherited Destroy;
end;
{============================ TRVUndoParaListInfo =============================}
function TRVUndoParaListInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := FR;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoParaListInfo.SetItemsRange(var StartItem, EndItem: Integer;
RVData: TRichViewRVData);
begin
StartItem := StartItemNo;
EndItem := StartItem+List.Count;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoParaListInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_ParaList(StartItemNo, List, FR);
end;
{============================== TRVUndoParaInfo ===============================}
function TRVUndoParaInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := FR;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoParaInfo.SetItemsRange(var StartItem, EndItem: Integer;
RVData: TRichViewRVData);
begin
StartItem := ItemNo;
EndItem := StartItem+Count;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoParaInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_Para(ItemNo, ItemNo+Count-1, ParaNo, FR);
end;
{============================ TRVUndoTypingInfo ===============================}
function TRVUndoTypingInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoTypingInfo.Undo(RVData: TRichViewRVData);
var s: String;
c: String;
idx: Integer;
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
s := RVData.Items[ItemNo];
{$IFNDEF RVDONOTUSEUNICODE}
if Unicode then begin
RVCheckUni(System.Length(s));
idx := (Index+Length-2)*2+1;
c := s[idx]+s[idx+1];
Delete(s, idx, 2);
end
else
{$ENDIF}
begin
idx := Index+Length-1;
c := s[idx];
Delete(s, idx, 1);
end;
dec(Length);
RVData.Items[ItemNo] := s;
TRVEditRVData(RVData).RedoList.AddUntyping(c, ItemNo, Index+Length+1);
end;
{=========================== TRVRedoTypingInfo ================================}
function TRVRedoTypingInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVRedoTypingInfo.Undo(RVData: TRichViewRVData);
var str: String;
l: Integer;
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
str := RVData.Items[ItemNo];
{$IFNDEF RVDONOTUSEUNICODE}
if Unicode then begin
RVCheckUni(Length(s));
RVCheckUni(Length(str));
l := Length(s);
Insert(s[l-1]+s[l], str, (Index-1)*2-l+1);
s := Copy(s,1,l-2);
l := l div 2;
end
else
{$ENDIF}
begin
l := Length(s);
Insert(s[l], str, Index-l);
s := Copy(s,1,l-1);
end;
RVData.Items[ItemNo] := str;
TRVEditRVData(RVData).UndoList.AddTyping(ItemNo, Index-l, Unicode);
end;
{============================= TRVUndoTagInfo =================================}
destructor TRVUndoTagInfo.Destroy;
begin
if TagsArePChars then
StrDispose(PChar(WasTag));
inherited Destroy;
end;
{------------------------------------------------------------------------------}
function TRVUndoTagInfo.RequiresFormat: Boolean;
begin
Result := False;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoTagInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_Tag(ItemNo, WasTag, False);
end;
{============================ TRVUndoStyleNoInfo ==============================}
function TRVUndoStyleNoInfo.RequiresFullReformat2(RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoStyleNoInfo.Undo(RVData: TRichViewRVData);
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
TRVEditRVData(RVData).Do_StyleNo(ItemNo, WasStyleNo);
end;
{============================== TRVUndoAddCPInfo ==============================}
procedure TRVUndoAddCPInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_DeleteCP(ItemNo);
end;
{============================= TRVUndoDeleteCPInfo ============================}
destructor TRVUndoDeleteCPInfo.Destroy;
begin
if Checkpoint<>nil then begin
if TagsArePChars then
StrDispose(PChar(Checkpoint.Tag));
Checkpoint.Tag := 0;
Checkpoint.Free;
end;
inherited Destroy;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoDeleteCPInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_AddCP(ItemNo, Checkpoint);
Checkpoint := nil;
end;
{============================ TRVUndoModifyItemInfo ===========================}
function TRVUndoModifyItemInfo.RequiresFullReformat1(RVData: TRichViewRVData): Boolean;
var Item1: TCustomRVItemInfo;
w1,w2: Integer;
begin
Item1 := TCustomRVItemInfo(RVData.Items.Objects[ItemNo]);
w2 := RVData.CalculateMinItemWidthPlusEx(ItemNo);
w1 := w2-Item1.GetMinWidth(nil,nil,RVData)+Item.GetMinWidth(nil,nil,RVData);
Result := (w1<>w2) and
((w1>RVData.DocumentWidth) or (w2>=RVData.DocumentWidth));
end;
{------------------------------------------------------------------------------}
procedure TRVUndoModifyItemInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_ModifyItem(ItemNo, s, Item);
Item := nil;
end;
{========================== TRVUndoChangeTextInfo =============================}
function TRVUndoChangeTextInfo.RequiresFullReformat2(RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoChangeTextInfo.Undo(RVData: TRichViewRVData);
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
TRVEditRVData(RVData).Do_ChangeText(ItemNo, s);
end;
{===================== TRVUndoChangeVAlignInfo ================================}
procedure TRVUndoChangeVAlignInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_ChangeVAlign(ItemNo, VAlign);
end;
{============================ TRVUndoResizeInfo ===============================}
function TRVUndoResizeInfo.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
begin
Result := NFR2(ItemNo, OldWidth, RVData);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoResizeInfo.Undo(RVData: TRichViewRVData);
begin
OldWidth := RVData.CalculateMinItemWidthPlusEx(ItemNo);
TRVEditRVData(RVData).Do_Resize(ItemNo, Width, Height, False);
end;
{======================= TRVUndoModifyItemProps ===============================}
function TRVUndoModifyItemProps.GetOppositeClass: TRVUndoInfoClass;
begin
Result := TRVUndoInfoClass(ClassType);
end;
{------------------------------------------------------------------------------}
procedure TRVUndoModifyItemProps.SetOppositeUndoInfoProps(UndoInfo: TRVUndoModifyItemProps);
begin
// empty
end;
{------------------------------------------------------------------------------}
function TRVUndoModifyItemProps.RequiresFormat: Boolean;
begin
Result := AffectSize;
end;
{------------------------------------------------------------------------------}
function TRVUndoModifyItemProps.RequiresFullReformat1(
RVData: TRichViewRVData): Boolean;
begin
Result := AffectSize and AffectWidth;
if not Result then
exit;
OldW := RVData.CalculateMinItemWidthPlusEx(ItemNo);
Result := OldW >= RVData.DocumentWidth;
end;
{------------------------------------------------------------------------------}
function TRVUndoModifyItemProps.RequiresFullReformat2(
RVData: TRichViewRVData): Boolean;
var NewW: Integer;
begin
Result := AffectSize and AffectWidth;
if not Result then
exit;
NewW := RVData.CalculateMinItemWidthPlusEx(ItemNo);
Result := (NewW<>OldW) and (NewW>RVData.DocumentWidth);
end;
{========================== TRVUndoModifyItemIntProperty ======================}
procedure TRVUndoModifyItemIntProperty.Undo(RVData: TRichViewRVData);
begin
SetOppositeUndoInfoProps(TRVEditRVData(RVData).Do_ModifyItemIntProperty(ItemNo, SubObject, PropertyName, Value,
AffectSize, AffectWidth,GetOppositeClass));
end;
{============================ TRVUndoModifyItemIntProperties ==================}
constructor TRVUndoModifyItemIntProperties.Create;
begin
inherited Create;
PropList := TStringList.Create;
end;
{------------------------------------------------------------------------------}
destructor TRVUndoModifyItemIntProperties.Destroy;
begin
PropList.Free;
inherited Destroy;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoModifyItemIntProperties.Undo(RVData: TRichViewRVData);
begin
SetOppositeUndoInfoProps(TRVEditRVData(RVData).Do_ModifyItemIntProperties(ItemNo, SubObject, PropList,
AffectSize, AffectWidth, GetOppositeClass));
end;
{================================ TRVUndoModifyItemTerminator =================}
constructor TRVUndoModifyItemTerminator.Create;
begin
inherited Create;
AffectWidth := True;
AffectSize := True;
Action := rvuModifyItem;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoModifyItemTerminator.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_ItemModifyTerminator(ItemNo, not Opening);
end;
{============================== TRVCompositeUndo ==============================}
destructor TRVCompositeUndo.Destroy;
begin
UndoList.Free;
inherited Destroy;
end;
{------------------------------------------------------------------------------}
function TRVCompositeUndo.RequiresFormat: Boolean;
begin
Result := False;
end;
{------------------------------------------------------------------------------}
procedure TRVCompositeUndo.SetItemsRange(var StartItem, EndItem: Integer;
RVData: TRichViewRVData);
begin
StartItem := ItemNo;
EndItem := ItemNo;
end;
{------------------------------------------------------------------------------}
procedure TRVCompositeUndo.Undo(RVData: TRichViewRVData);
begin
UndoList.Undo(RVData);
end;
{===================== TRVUndoReplaceItemInfo =================================}
function TRVUndoReplaceItemInfo.RequiresFormat: Boolean;
begin
Result := False;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoReplaceItemInfo.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_ReplaceItem(ItemNo, item);
item := nil;
end;
{============================= TRVUndoReformateRange ==========================}
function TRVUndoReformateRange.RequiresSuperFormat: Boolean;
begin
Result := SuperReformat;
end;
{------------------------------------------------------------------------------}
procedure TRVUndoReformateRange.Undo(RVData: TRichViewRVData);
begin
TRVEditRVData(RVData).Do_ReformateRange(ItemNo, LastAffectedItemNo, SuperReformat);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -