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