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

📄 rvundo.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 3 页
字号:
{------------------------------------------------------------------------------}
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 + -