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

📄 rvrtfprops.pas

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