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

📄 rvervdata.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 5 页
字号:
begin
  item := GetItem(ItemNo);
  if (item.StyleNo<0) or (item.StyleNo=StyleNo) then
    exit;

  List := GetUndoList;
  if List<>nil then begin
    ui             := TRVUndoStyleNoInfo.Create;
    ui.Action      := rvuStyleNo;
    ui.ItemNo      := ItemNo;
    ui.WasStyleNo  := item.StyleNo;
    List.AddInfo(ui);
  end;
  {$IFNDEF RVDONOTUSEUNICODE}
  if GetRVStyle.TextStyles[item.StyleNo].Unicode then begin
    if not GetRVStyle.TextStyles[StyleNo].Unicode then
      Exclude(item.ItemOptions, rvioUnicode)
    end
  else begin
    if GetRVStyle.TextStyles[StyleNo].Unicode then
      Include(item.ItemOptions, rvioUnicode)
  end;
  {$ENDIF}
  item.StyleNo := StyleNo;
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Do_InsertItem(ItemNo: Integer; var s: String;
                                     item: TCustomRVItemInfo; FromUndo: Boolean;
                                     var FullReformat: Boolean);
var  List: TRVUndoList;
     ui: TRVUndoInsertItemInfo;
     LastAffectedItemNo: Integer;
     Checkpoint: TRVCPInfo;
begin
  FullReformat := False;
  if item.CanBeBorderStart and (ItemNo<Items.Count) and
     not GetItem(ItemNo).CanBeBorderStart then
    LastAffectedItemNo := GetParaEndItemNo(ItemNo)
  else
    LastAffectedItemNo := -1;

  Checkpoint := item.Checkpoint;
  item.Checkpoint := nil;

  List := GetUndoList;
  if List<>nil then begin
    ui := TRVUndoInsertItemInfo.Create;
    ui.Action :=  rvuInsertItem;
    ui.ItemNo := ItemNo;
    ui.LastAffectedItemNo := LastAffectedItemNo;
    List.AddInfo(ui);
  end;
  item.Inserting(Self, s, False);
  Items.InsertObject(ItemNo,s,item);
  item.Inserted(Self, ItemNo);
  {$IFNDEF RVDONOTUSELISTS}
  AddMarkerInList(ItemNo);
  {$ENDIF}
  if FromUndo then
    item.MovingFromUndoList(ItemNo, Self);  
  item.UpdatePaletteInfo(GetDoInPaletteMode, False, GetRVPalette, GetRVLogPalette);
  if LastAffectedItemNo<>-1 then
     Do_Para(ItemNo+1,LastAffectedItemNo+1,item.ParaNo,FullReformat);
     //SetParaStyle(ItemNo+1,LastAffectedItemNo+1,item.ParaNo);
  if Checkpoint<>nil then
    Do_AddCP(ItemNo, Checkpoint);
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Do_ReplaceItem(ItemNo: Integer; item: TCustomRVItemInfo);
var List: TRVUndoList;
    ui: TRVUndoReplaceItemInfo;
    olditem :TCustomRVItemInfo;
    s: String;
    StyleNo: Integer;
begin
  s := Items[ItemNo];
  olditem := GetItem(ItemNo);
  StyleNo := item.StyleNo;
  item.Assign(olditem);
  item.StyleNo := StyleNo;
  item.DrawItemNo := olditem.DrawItemNo;
  item.Tag        := olditem.Tag;
  item.ItemOptions:= olditem.ItemOptions;
  item.JumpID     := olditem.JumpID;
  item.Checkpoint := olditem.Checkpoint;
  if item.Checkpoint<>nil then
    item.Checkpoint.ItemInfo := item;
  olditem.Checkpoint := nil;
  olditem.Tag        := 0;
  if olditem=CaptureMouseItem then
    ReleaseMouseCapture(olditem);
  if olditem=FActiveItem then
    FActiveItem := item;
  List := GetUndoList;
  if List<>nil then begin
    ui             := TRVUndoReplaceItemInfo.Create;
    ui.Action      := rvuModifyItem;
    ui.ItemNo      := ItemNo;
    ui.item        := olditem;
    olditem.MovingToUndoList(ItemNo, Self, ui);
    List.AddInfo(ui);
    end
  else
    FreeItem(ItemNo, False);
  item.Inserting(Self, s, False);
  Items.Objects[ItemNo] := item;
  item.Inserted(Self, ItemNo);
end;
{------------------------------------------------------------------------------}
function TRVEditRVData.Do_InsertItems_1(ItemNo,Count: Integer):TRVUndoInsertItemsInfo;
var List: TRVUndoList;
    ui: TRVUndoInsertItemsInfo;
begin
  Result   := nil;

  if Count=0 then
    exit;

  List := GetUndoList;
  if List<>nil then begin
    ui :=  TRVUndoInsertItemsInfo.Create;
    ui.Action := rvuInsertItems;
    ui.ItemNo := ItemNo;
    ui.Count  := Count;
    List.AddInfo(ui);
    end
  else
    ui := nil;
  Result := ui;
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Do_InsertItems_2(ItemNo,Count: Integer; ui: TRVUndoInsertItemsInfo;
                                         var FullReformat: Boolean);
var i: Integer;
    Checkpoint: TRVCPInfo;
    item: TCustomRVItemInfo;
    LastAffectedItemNo: Integer;    
begin
  FullReformat := False;
  if Count=0 then exit;
  if (ItemNo+Count<Items.Count) and
     not GetItem(ItemNo+Count).CanBeBorderStart then
    LastAffectedItemNo := GetParaEndItemNo(ItemNo+Count-1)
  else
    LastAffectedItemNo := -1;

  if ui<>nil then begin
    ui.LastAffectedItemNo := LastAffectedItemNo;
  end;

  if LastAffectedItemNo<>-1 then
    Do_Para(ItemNo+Count-1,LastAffectedItemNo,
            GetItemPara(ItemNo+Count-1), FullReformat);

  for i := ItemNo to ItemNo+Count-1 do begin
    item := GetItem(i);
    if item.Checkpoint<>nil then begin
      Checkpoint := item.Checkpoint;
      item.Checkpoint := nil;
      Do_AddCP(i, Checkpoint);
    end;
  end;
end;
{------------------------------------------------------------------------------}
// in rev. order
procedure TRVEditRVData.Do_InsertItems(ItemNo: Integer; sl: TStringList; FromUndo: Boolean;
                                       var FullReformat: Boolean);
var  i: Integer;
     item: TCustomRVItemInfo;
     ui: TRVUndoInsertItemsInfo;
     s: String;
begin
  FullReformat := False;
  if sl.Count=0 then exit;

  ui := Do_InsertItems_1(ItemNo, sl.Count);

  for i := 0 to sl.Count-1 do begin
    item := TCustomRVItemInfo(sl.Objects[i]);
    s := sl[i];
    item.Inserting(Self, s, False);
    Items.InsertObject(ItemNo, s, item);
    item.Inserted(Self, ItemNo);
    {$IFNDEF RVDONOTUSELISTS}
    AddMarkerInList(ItemNo);
    {$ENDIF}
    if FromUndo then
      item.MovingFromUndoList(ItemNo, Self);
    item.UpdatePaletteInfo(GetDoInPaletteMode, False, GetRVPalette, GetRVLogPalette);
  end;

  Do_InsertItems_2(ItemNo, sl.Count, ui, FullReformat);

end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Do_InsertSubstring(ItemNo, Index: Integer; const s: String);
var str: String;
    List: TRVUndoList;
    ui: TRVUndoInsertSubstringInfo;
begin
  if (Length(s)=0) then exit;
  if (ItemNo<0) or (ItemNo>=Items.Count) or
     (GetItemStyle(ItemNo)<0) then
    raise Exception.Create(errRVUndo);
  List := GetUndoList;
  if List<>nil then begin
    ui := TRVUndoInsertSubstringInfo.Create;
    ui.Action := rvuInsertSubstring;
    ui.ItemNo := ItemNo;
    ui.Index  := Index;
    ui.Length := RVU_Length(s, GetItemOptions(ItemNo));
    List.AddInfo(ui);
  end;
  str := Items[ItemNo];
  RVU_Insert(s, str, Index, GetItemOptions(ItemNo));
  ItemAction(rviaTextModifying, GetItem(ItemNo), str, Self);
  Items[ItemNo] := str;
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Do_ChangeText(ItemNo: Integer; const s: String);
var List: TRVUndoList;
    ui: TRVUndoChangeTextInfo;
    str: String;
begin
  if Items[ItemNo]=s then exit;
  List := GetUndoList;
  if List<>nil then begin
    ui := TRVUndoChangeTextInfo.Create;
    ui.Action := rvuChangeText;
    ui.ItemNo := ItemNo;
    ui.s      := Items[ItemNo];
    List.AddInfo(ui);
  end;
  str := s;
  ItemAction(rviaTextModifying, GetItem(ItemNo), str, Self);
  Items[ItemNo] := str;
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Do_ChangeVAlign(ItemNo: Integer; VAlign: TRVVAlign);
var List: TRVUndoList;
    ui: TRVUndoChangeVAlignInfo;
    item: TCustomRVItemInfo;
begin
  item := GetItem(ItemNo);
  if (item as TRVRectItemInfo).VAlign = VAlign then exit;
  List := GetUndoList;
  if List<>nil then begin
    ui := TRVUndoChangeVAlignInfo.Create;
    ui.Action := rvuChangeText;
    ui.ItemNo := ItemNo;
    ui.VAlign := TRVRectItemInfo(item).VAlign;
    List.AddInfo(ui);
  end;
  TRVRectItemInfo(item).Valign := VAlign;
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Do_Resize(ItemNo, Width, Height: Integer;Reformat: Boolean);
var List: TRVUndoList;
    ui: TRVUndoResizeInfo;
    item: TRVControlItemInfo;
begin
  // for controls only
  item := TRVControlItemInfo(GetItem(ItemNo));
  if (item.Control.Width  = Width) and
     (item.Control.Height = Height) then exit;
  List := GetUndoList;
  if List<>nil then begin
    ui := TRVUndoResizeInfo.Create;
    ui.Action := rvuModifyItem;
    ui.ItemNo := ItemNo;
    ui.Width  := item.Control.Width;
    ui.Height := item.Control.Height;
    List.AddInfo(ui);
  end;
  ResizeControl(ItemNo, Width, Height, Reformat);
end;
{------------------------------------------------------------------------------}
function TRVEditRVData.Do_ModifyItemIntProperty(ItemNo: Integer;
                        SubObject: TObject;
                        const PropertyName: String;
                        Value: LongInt;
                        AffectSize, AffectWidth: Boolean;
                        UndoInfoClass: TRVUndoInfoClass):TRVUndoModifyItemProps;
var List: TRVUndoList;
    ui: TRVUndoModifyItemIntProperty;
    item: TCustomRVItemInfo;
    propinfo: PPropInfo;
    OldValue:LongInt;
begin
  Result := nil;
  item := GetItem(ItemNo);
  if SubObject=nil then
    SubObject := item;
  propinfo := GetPropInfo(SubObject.ClassInfo, PropertyName);
  OldValue := GetOrdProp(SubObject, propinfo);
  if OldValue=Value then exit;
  List := GetUndoList;
  if List<>nil then begin
    ui := TRVUndoModifyItemIntProperty(UndoInfoClass.Create);
    ui.Action := rvuModifyItem;
    ui.ItemNo := ItemNo;
    ui.PropertyName := PropertyName;
    ui.Value        := OldValue;
    ui.AffectSize   := AffectSize;
    ui.AffectWidth  := AffectWidth;
    ui.SubObject    := SubObject;
    List.AddInfo(ui);
    end
  else
    ui := nil;
  item.BeforeUndoChangeProperty;
  try
    SetOrdProp(SubObject, propinfo,Value);
  finally
    item.AfterUndoChangeProperty;
  end;
  Result := ui;
end;
{------------------------------------------------------------------------------}
function TRVEditRVData.Do_ModifyItemIntProperties(ItemNo: Integer;
  SubObject: TObject; PropList: TStringList; AffectSize,
  AffectWidth: Boolean;
  UndoInfoClass: TRVUndoInfoClass):TRVUndoModifyItemProps;
var List: TRVUndoList;
    ui: TRVUndoModifyItemIntProperties;
    item: TCustomRVItemInfo;
    propinfo: PPropInfo;
    i: Integer;
    OldValue, NewValue: LongInt;
begin
  item := GetItem(ItemNo);
  if SubObject=nil then
    SubObject := item;
  List := GetUndoList;
  if List<>nil then begin
    ui := TRVUndoModifyItemIntProperties(UndoInfoClass.Create);
    ui.Action := rvuModifyItem;
    ui.ItemNo := ItemNo;
    ui.AffectSize   := AffectSize;
    ui.AffectWidth  := AffectWidth;
    ui.SubObject    := SubObject;
    end
  else
    ui := nil;
  item.BeforeUndoChangeProperty;
  try
    for i := PropList.Count-1 downto 0 do begin

⌨️ 快捷键说明

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