📄 rvrtfprops.pas
字号:
{$ENDIF}
StyleNo, ParaNo: Integer;
UseUnicode: Boolean;
var ResText: String): TRVTextItemInfo;
var
Target, Extras: String;
AStyleNo,ItemTag: Integer;
begin
Result := RichViewTextItemClass.Create(CurrentRVData);
Result.BeforeLoading(rvlfRTF);
{$IFNDEF RVDONOTUSEUNICODE}
if RVStyle.TextStyles[StyleNo].Unicode then
Include(Result.ItemOptions, rvioUnicode);
if not UseUnicode then
if RVStyle.TextStyles[StyleNo].Unicode then
ResText := RVU_AnsiToUnicode(RVU_Charset2CodePage(Reader.FontTable[Reader.RTFState.CharProps.FontIndex].Charset), Text)
else
ResText := Text
else
if RVStyle.TextStyles[StyleNo].Unicode then begin
SetLength(ResText, Length(WideText)*2);
Move(Pointer(WideText)^, PChar(ResText)^, Length(ResText));
end
else
ResText := Reader.UnicodeToAnsi(WideText);
{$ELSE}
ResText := Text;
{$ENDIF}
ResText := CurrentRVData.ReplaceTabs(ResText, StyleNo, False);
ItemTag := 0;
if IsHypertext(Target, Extras) then begin
AStyleNo := StyleNo;
CurrentRVData.ReadHyperlink(Target, Extras, rvlfRTF, AStyleNo, ItemTag, ResText);
if AStyleNo>=0 then
StyleNo := AStyleNo;
end;
Result.StyleNo := StyleNo;
Result.ParaNo := ParaNo;
Result.Tag := ItemTag;
end;
{------------------------------------------------------------------------------}
procedure TRVRTFReaderProperties.InsertItem(var Text: String;
item: TCustomRVItemInfo; Position: TRVRTFPosition);
var Dummy: Integer;
begin
case Position of
rtf_ts_ContinuePara:
item.SameAsPrev := True;
rtf_ts_NewLine,
rtf_ts_NewPara:
begin
if (Position = rtf_ts_NewLine) and not LineBreaksAsParagraphs then
item.BR := True
else begin
if not AllowNewPara then
item.BR := True
else begin
{$IFNDEF RVDONOTUSELISTS}
if (item.StyleNo<>rvsListMarker) and not IgnoreLists {$IFNDEF RVDONOTUSETABLES} and (item.StyleNo<>rvsTable){$ENDIF} then
if InsertMarker(item.ParaNo) then
item.SameAsPrev := True;
{$ENDIF}
end;
end;
end;
end;
if PageBreak then begin
item.PageBreakBefore := True;
PageBreak := False;
end;
if RVData=CurrentRVData then begin
if FirstTime then begin
FirstTime := False;
if not EditFlag and ((InsertPoint=0) or
(CurrentRVData.GetItem(InsertPoint-1).GetBoolValue(rvbpFullWidth))) then
item.SameAsPrev := False;
if not RVData.InsertFirstRVFItem(InsertPoint, Text, Item, EditFlag, FullReformat, Dummy) then begin
FailedBecauseOfProtect := True;
abort;
end;
if item<>nil then begin
Item.AfterLoading(rvlfRTF);
inc(InsertPoint);
Index := InsertPoint-1;
end
else
FirstTime := True;
{$IFNDEF RVDONOTUSELISTS}
if (item<>nil) and (item.StyleNo=rvsListMarker) then
LastMarkerIndex := Index;
{$ENDIF}
end
else begin
if (InsertPoint=0) or
(CurrentRVData.GetItem(InsertPoint-1).GetBoolValue(rvbpFullWidth)) then
item.SameAsPrev := False;
Item.Inserting(RVData, Text, False);
RVData.Items.InsertObject(InsertPoint, Text, Item);
Item.Inserted(RVData, InsertPoint);
Item.AfterLoading(rvlfRTF);
{$IFNDEF RVDONOTUSELISTS}
RVData.AddMarkerInList(InsertPoint);
if item.StyleNo=rvsListMarker then
LastMarkerIndex := InsertPoint;
{$ENDIF}
inc(InsertPoint);
inc(NonFirstItemsAdded);
end;
end
else begin
if (CurrentRVData.Items.Count=0) or
(CurrentRVData.GetItem(CurrentRVData.Items.Count-1).GetBoolValue(rvbpFullWidth)) then
item.SameAsPrev := False;
Item.Inserting(CurrentRVData, Text, False);
CurrentRVData.Items.AddObject(Text, Item);
Item.Inserted(CurrentRVData, CurrentRVData.Items.Count-1);
if (CurrentRVData=FHeaderRVData) or (CurrentRVData=FFooterRVData) then
Item.AfterLoading(rvlfRTF);
{$IFNDEF RVDONOTUSELISTS}
CurrentRVData.AddMarkerInList(CurrentRVData.Items.Count-1);
if item.StyleNo=rvsListMarker then
LastMarkerIndex := CurrentRVData.Items.Count-1;
{$ENDIF}
{$IFNDEF RVDONOTUSETABLES}
if (CurrentRVData<>FHeaderRVData) and (CurrentRVData<>FFooterRVData) then
TTableInfo(Tables[Tables.Count-1]).RowFinished := False;
{$ENDIF}
end;
end;
{------------------------------------------------------------------------------}
{$IFNDEF RVDONOTUSELISTS}
procedure ConvMarker(RTFMarker: TRVRTFMarkerProperties;
var RVType: TRVListType;
var FormatStr1,FormatStr2: String);
begin
if RTFMarker.Level=11 then begin
RVType := rvlstBullet;
FormatStr1 := RTFMarker.TextBefore;
FormatStr2 := RTFMarker.TextBefore;
end
else begin
case RTFMarker.ListType of
rtf_pn_Decimal:
RVType := rvlstDecimal;
rtf_pn_LowerLetter:
RVType := rvlstLowerAlpha;
rtf_pn_UpperLetter:
RVType := rvlstUpperAlpha;
rtf_pn_LowerRoman:
RVType := rvlstLowerRoman;
rtf_pn_UpperRoman:
RVType := rvlstUpperRoman;
end;
FormatStr1 := RTFMarker.TextBefore+'%s'+RTFMarker.TextAfter;
FormatStr2 := RTFMarker.TextBefore+'%0:s'+RTFMarker.TextAfter;
end;
end;
{------------------------------------------------------------------------------}
{$IFNDEF RICHVIEWCBDEF4}
function max(a,b:Integer): Integer;
begin
if a>b then
Result := a
else
Result := b;
end;
{$ENDIF}
function TRVRTFReaderProperties.GetMarkerIndex(RTFMarker: TRVRTFMarkerProperties): Integer;
var i: Integer;
Level : TRVListLevel;
FormatStr1,FormatStr2, FontName: String;
ListType: TRVListType;
FirstIndent, LeftIndent, PNIndent, PNSpace: Integer;
MarkerAlign: TRVRTFAlignment;
{..............................................}
function IsEqualIndents(Level : TRVListLevel): Boolean;
begin
if RTFMarker.Hanging then
Result :=
(Level.LeftIndent=LeftIndent) and
(Level.FirstIndent=max(PNSpace, FirstIndent+PNIndent))
else
Result :=
(Level.LeftIndent=LeftIndent) and
(Level.FirstIndent= max(0, FirstIndent+max(PNIndent,PNSpace)));
if not Result then
exit;
case MarkerAlign of
rtf_al_Left:
Result := Level.MarkerIndent=LeftIndent+FirstIndent;
rtf_al_Right:
Result := Level.MarkerIndent=Level.FirstIndent+Level.LeftIndent;
rtf_al_Center:
Result := Level.MarkerIndent=(LeftIndent+FirstIndent+Level.FirstIndent+Level.LeftIndent) div 2;
end;
end;
{..............................................}
begin
Result := -1;
if ParaStyleMode<>rvrsAddIfNeeded then
exit;
if (RTFMarker=nil) or (RTFMarker.FontIndex>=Reader.FontTable.Count) or (RTFMarker.Level<=0) then
exit;
if LevelToListNo.Count=0 then
LevelToListNo.InitWith(-1, 11);
if (RTFMarker.Level<11) and (LevelToListNo[RTFMarker.Level-1]>=0) then begin
Result := LevelToListNo[RTFMarker.Level-1];
exit;
end;
FontName := Reader.FontTable[RTFMarker.FontIndex].Name;
ConvMarker(RTFMarker, ListType, FormatStr1,FormatStr2);
MarkerAlign := RTFMarker.Alignment;
if RTFMarker.Level=11 then
MarkerAlign := rtf_al_Left;
LeftIndent := Round(Reader.RTFState.ParaProps.LeftIndentTw*PixelsPerTwip);
FirstIndent := Round(Reader.RTFState.ParaProps.FirstIndentTw*PixelsPerTwip);
PNIndent := Round(RTFMarker.IndentTw*PixelsPerTwip);
PNSpace := Round(RTFMarker.SpaceTw*PixelsPerTwip);
for i := 0 to RVStyle.ListStyles.Count-1 do begin
if RVStyle.ListStyles[i].Levels.Count=0 then
continue;
Level := RVStyle.ListStyles[i].Levels[0];
if (Level.ListType=ListType) and
(Level.MarkerAlignment=TRVMarkerAlignment(MarkerAlign)) and
IsEqualIndents(Level) and
(Level.Font.Size=RTFMarker.FontSize) and
(Level.Font.Style=RTFMarker.FontStyle) and
(Level.Font.Color=RTFMarker.Color) and
(AnsiCompareText(Level.Font.Name,FontName)=0) and
((Level.FormatString=FormatStr1) or (Level.FormatString=FormatStr2)) then begin
Result := i;
LevelToListNo[RTFMarker.Level-1] := Result;
exit;
end;
end;
Result := RVStyle.ListStyles.Count;
Level := RVStyle.ListStyles.Add.Levels.Add;
RVStyle.ListStyles[RVStyle.ListStyles.Count-1].Standard := False;
Level.ListType := ListType;
Level.LeftIndent := LeftIndent;
Level.MarkerIndent := LeftIndent+FirstIndent;
if RTFMarker.Hanging then
Level.FirstIndent := max(PNSpace, FirstIndent+PNIndent)
else
Level.FirstIndent := max(0, FirstIndent+max(PNIndent,PNSpace));
Level.MarkerAlignment := TRVMarkerAlignment(MarkerAlign);
case MarkerAlign of
rtf_al_Right:
begin
Level.MarkerIndent := Level.FirstIndent+Level.LeftIndent;
end;
rtf_al_Center:
begin
Level.MarkerIndent := (Level.FirstIndent+Level.LeftIndent+Level.MarkerIndent) div 2;
end;
end;
Level.Font.Size := RTFMarker.FontSize;
Level.Font.Style := RTFMarker.FontStyle;
Level.Font.Color := RTFMarker.Color;
Level.Font.Name := FontName;
Level.FormatString := FormatStr1;
LevelToListNo[RTFMarker.Level-1] := Result;
end;
{------------------------------------------------------------------------------}
// Old-style numbering has higher priority
function TRVRTFReaderProperties.InsertMarker(ParaNo: Integer): Boolean;
var marker: TRVMarkerItemInfo;
s: String;
begin
if ParaStyleMode<>rvrsAddIfNeeded then begin
Result := False;
exit;
end;
if not Reader.RTFState.ParaProps.HasMarker then
LevelToListNo.Clear;
Result := Reader.RTFState.ParaProps.HasMarker and
(Reader.RTFState.ParaProps.MarkerProps.Level>0);
if not Result then begin
if Reader.RTFState.ParaProps.ListOverrideIndex>=0 then begin
MergeListTable97;
InsertMarker97(ParaNo);
Result := True;
end;
exit;
end;
if LevelToListNo.Count=0 then
LevelToListNo.InitWith(-1, 11);
marker := TRVMarkerItemInfo.CreateEx(CurrentRVData,
-1, -1, Reader.RTFState.ParaProps.MarkerProps.Start,
LevelToListNo[Reader.RTFState.ParaProps.MarkerProps.Level-1]<0);
marker.ParaNo := ParaNo;
marker.BeforeLoading(rvlfRTF);
s := '';
// CurrentRVData.State := CurrentRVData.State+[rvstMarkersBadlyNeeded];
try
InsertItem(s, marker, rtf_ts_NewPara);
finally
// CurrentRVData.State := CurrentRVData.State-[rvstMarkersBadlyNeeded];
end;
end;
{------------------------------------------------------------------------------}
procedure TRVRTFReaderProperties.InsertMarker97(ParaNo: Integer);
var marker: TRVMarkerItemInfo;
s: String;
ListLevel, ListNo, ListMappedNo: Integer;
ListOverride: TRVRTFListOverride97;
Start: Integer;
UseStart: Boolean;
begin
if ParaStyleMode<>rvrsAddIfNeeded then
exit;
ListLevel := Reader.RTFState.ParaProps.ListLevel;
ListOverride := Reader.ListOverrideTable[Reader.RTFState.ParaProps.ListOverrideIndex];
if ListLevel<ListOverride.Count then begin
Start := ListOverride[ListLevel].Start;
UseStart := ListOverride[ListLevel].UseStart;
end
else begin
Start := 1;
UseStart := False;
end;
ListNo := ListOverride.ListIndex;
ListMappedNo := ListTableMap97[ListNo];
marker := TRVMarkerItemInfo.CreateEx(CurrentRVData,
ListMappedNo, Reader.RTFState.ParaProps.ListLevel, Start, UseStart);
marker.ParaNo := ParaNo;
marker.BeforeLoading(rvlfRTF);
s := '';
// CurrentRVData.State := CurrentRVData.State+[rvstMarkersBadlyNeeded];
try
InsertItem(s, marker, rtf_ts_NewPara);
LastMarkerIndex := -1;
finally
// CurrentRVData.State := CurrentRVData.State-[rvstMarkersBadlyNeeded];
end;
end;
{------------------------------------------------------------------------------}
procedure TRVRTFReaderProperties.ReaderUpdateMarker(Sender: TObject);
var Marker: TRVMarkerItemInfo;
begin
if ParaStyleMode<>rvrsAddIfNeeded then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -