RVRTF.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:213k
源码类别:

RichEdit

开发平台:

Delphi

  1.   if (Copy(UpperCase(s),1, Length(Code1))<>Code1) and
  2.      (Copy(UpperCase(s),1, Length(Code2))<>Code2) then
  3.     exit;
  4.   s := GetFieldCommandValue(s);
  5.   if s='' then
  6.     exit;
  7.   while true do begin
  8.     p := pos('\', s);
  9.     if p=0 then break;
  10.     Delete(s,p, 1);
  11.   end;
  12.   if (BasePath<>'') and (BasePath[Length(BasePath)] in ['', '/']) and
  13.      (s<>'') and (s[1] in ['', '/']) then
  14.     s := Copy(s, 2, Length(s)-1);
  15.   try
  16.     if Pos(':', s)=0 then
  17.       s := BasePath+s;
  18.     //RV_ReplaceStr(s, '/', '');
  19.     gr := LoadGraphic(s, Invalid);
  20.     if (gr=nil) or Invalid then begin
  21.       s2 := RV_DecodeURL(s);
  22.       //RV_ReplaceStr(s2, '', '/');      
  23.       if s2<>s then begin
  24.         s := s2;
  25.         gr2 := LoadGraphic(s, Invalid);
  26.         if gr2<>nil then begin
  27.           gr.Free;
  28.           gr := gr2;
  29.         end;
  30.       end;
  31.     end;
  32.     if gr<>nil then begin
  33.       if Invalid then
  34.         FRTFState.FInvalidFieldPicture := gr
  35.       else begin
  36.         FRTFState.ParaProps.Finalize;
  37.         RV_AfterImportGraphic(gr);
  38.         FOnNewPicture(Self, nil, gr, Position, s, Inserted);
  39.         Position := rtf_ts_ContinuePara;
  40.         FRTFState.FFieldPictureIncluded := True;
  41.       end;
  42.     end;
  43.   except
  44.    ;
  45.   end;
  46. end;
  47. {------------------------------------------------------------------------------}
  48. function TRVRTFReader.InsertSymbol: TRVRTFErrorCode;
  49. const Code = 'SYMBOL';
  50. var s: String;
  51.     p: Integer;
  52.     ch: Char;
  53.     FontName: String;
  54.     OldFontSize, FontSize: Integer;
  55. begin
  56.   Result := rtf_ec_OK;
  57.   OldFontSize := RTFState.CharProps.FSize;
  58.   s := Trim(FRTFState.FFieldCode);
  59.   if Copy(UpperCase(s),1, Length(Code))<>Code then
  60.     exit;
  61.   s := Copy(s,Length(Code)+2,Length(s)+1);
  62.   p := Pos(' ', s);
  63.   if p=0 then
  64.     exit;
  65.   ch := Chr(StrToInt(Copy(s, 1, p-1)));
  66.   p := Pos('f', s);
  67.   if p=0 then
  68.     exit;
  69.   FontName := Copy(s, p+3, Length(s));
  70.   if s='' then
  71.     exit;
  72.   if FontName[1]<>'"' then
  73.     exit;
  74.   FontName := Copy(FontName, 2,Length(FontName));
  75.   p := Pos('"', FontName);
  76.   if p=0 then
  77.     exit;
  78.   FontName := Copy(FontName, 1, p-1);
  79.   p := Pos('s', s);
  80.   if p=0 then
  81.     exit;
  82.   s := Copy(s, p+3, Length(s));
  83.   p := Pos(' ',s);
  84.   if p>0 then
  85.     s := Copy(s, 1, p-1);
  86.   FontSize := StrToInt(s);
  87.   RTFState.CharProps.FFontName := FontName;
  88.   RTFState.CharProps.FSize := FontSize;
  89.   OutputChar(ch, False, False);
  90.   OutputChar(#0, False, False);
  91.   RTFState.CharProps.FSize := OldFontSize;
  92.   RTFState.CharProps.FFontName := '';
  93. end;
  94. {------------------------------------------------------------------------------}
  95. type
  96.   PBitmap = ^TBitmap;
  97. function RVEnhMetaFileProc(DC: THandle; PHTable: PHandleTable;
  98.   PEMFR: PENHMetaRecord; Obj: Integer; Data: Pointer): Integer; export; stdcall;
  99. var PEMRSDIB: PEMRStretchDIBits;
  100.     PEMRSDIBTD: PEMRSetDIBitsToDevice;
  101.   bi: PBitmapInfo;
  102. begin
  103.   case PEMFR.iType of
  104.     1, 9..11, 14, 17, 21, 24, 25, 33, 34, 37, 48, 70, 75:
  105.       Result := 1;
  106.     EMR_SETDIBITSTODEVICE:
  107.       begin
  108.         if Assigned(PBitmap(Data)^) then begin
  109.           (PBitmap(Data)^).Free;
  110.           PBitmap(Data)^ := nil;
  111.           Result := 0;
  112.           exit;
  113.         end;
  114.         PBitmap(Data)^ := TBitmap.Create;
  115.         PEMRSDIBTD := PEMRSetDIBitsToDevice(PEMFR);
  116.         bi := PBitmapInfo(PChar(PEMRSDIBTD)+PEMRSDIBTD.offBmiSrc);
  117.         PBitmap(Data)^.Handle := CreateDIBitmap(DC, bi.bmiHeader,
  118.         CBM_INIT, PChar(PEMRSDIBTD)+ PEMRSDIBTD.offBitsSrc,
  119.           bi^, PEMRSDIBTD.iUsageSrc);
  120.         Result := 1;
  121.       end;
  122.     EMR_STRETCHDIBITS:
  123.       begin
  124.         if Assigned(PBitmap(Data)^) then begin
  125.           (PBitmap(Data)^).Free;
  126.           PBitmap(Data)^ := nil;
  127.           Result := 0;
  128.           exit;
  129.         end;
  130.         PBitmap(Data)^ := TBitmap.Create;
  131.         PEMRSDIB := PEMRStretchDIBits(PEMFR);
  132.         bi := PBitmapInfo(PChar(PEMRSDIB)+PEMRSDIB.offBmiSrc);
  133.         PBitmap(Data)^.Handle := CreateDIBitmap(DC, bi.bmiHeader,
  134.         CBM_INIT, PChar(PEMRSDIB)+ PEMRSDIB.offBitsSrc,
  135.           bi^, PEMRSDIB.iUsageSrc);
  136.         Result := 1;
  137.       end;
  138.     else begin
  139.       (PBitmap(Data)^).Free;
  140.       PBitmap(Data)^ := nil;
  141.       Result := 0;
  142.     end;
  143.   end;
  144. end;
  145. {------------------------------------------------------------------------------}
  146. function ConvertMetafileToBitmap(wmf: TMetafile): TBitmap;
  147. var bmp: TBitmap;
  148.     DC: THandle;
  149. begin
  150.   bmp := nil;
  151.   DC := GetDC(0);
  152.   try
  153.     EnumEnhMetaFile(DC, wmf.Handle, @RVEnhMetaFileProc, @bmp,
  154.       Bounds(0, 0, wmf.Width, wmf.Height));
  155.   finally
  156.     ReleaseDC(0, DC);
  157.   end;
  158.   Result := bmp;
  159. end;
  160. {------------------------------------------------------------------------------}
  161. // The destination specified by rds is coming to a close.
  162. // If there's any cleanup that needs to be done, do it now.
  163. function TRVRTFReader.EndGroupAction(rds: TRTFrds): TRVRTFErrorCode;
  164.   {.........................................}
  165.   procedure FinalizeDIB;
  166.   var header: TBitmapFileHeader;
  167.   begin
  168.     header.bfType := 19778; // 'BM'
  169.     header.bfSize := FPicture.FData.Size;
  170.     header.bfReserved1 := 0;
  171.     header.bfReserved2 := 0;
  172.     header.bfOffBits   := 0; // ignored by TBitmap.LoadFromStream
  173.     FPicture.FData.Position := 0;
  174.     FPicture.FData.WriteBuffer(header, sizeof(Header));
  175.   end;
  176.   {.........................................}
  177.   function CreateGraphic: TGraphic;
  178.   begin
  179.     case FPicture.FType of
  180.       rtf_pict_EMF:
  181.         begin
  182.          Result := TMetafile.Create;
  183.          TMetafile(Result).Enhanced := True;
  184.         end;
  185.       rtf_pict_WMF:
  186.         begin
  187.          Result := TMetafile.Create;
  188.          TMetafile(Result).Enhanced := False;
  189.         end;
  190.       rtf_pict_DIB:
  191.         begin
  192.           FinalizeDIB;
  193.           Result := TBitmap.Create;
  194.         end;
  195.       rtf_pict_DDB:
  196.         begin
  197.           Result := TBitmap.Create;
  198.         end;
  199.       {$IFDEF RICHVIEW}
  200.       rtf_pict_PNG:
  201.         begin
  202.           if RVPngGraphiClass<>nil then
  203.             Result := RV_CreateGraphics(RVPngGraphiClass)
  204.           else
  205.             Result := nil;
  206.         end;
  207.       {$ENDIF}
  208.       {$IFNDEF RVDONOTUSEJPEGIMAGE}
  209.       rtf_pict_JPEG:
  210.         Result := TJpegImage.Create;
  211.       {$ENDIF}
  212.       else
  213.         Result := nil;
  214.     end;
  215.   end;
  216.   {.........................................}
  217.   procedure LoadGraphic(var gr: TGraphic);
  218.   var HM: HMetafile;
  219.       MFP: TMetaFilePict;
  220.       wmf: TMetafile;
  221.       {$IFDEF RICHVIEWDEF4}
  222.       //HM2: HMetafile;
  223.       //gr2: TMetafile;
  224.       {$ENDIF}
  225.   begin
  226.     case FPicture.FType of
  227.       rtf_pict_WMF:
  228.         begin
  229.           with MFP do begin
  230.             mm := FPicture.FMetafileMapMode;
  231.             xExt := FPicture.FPicW;
  232.             yExt := FPicture.FPicH;
  233.             hMF  := 0;
  234.           end;
  235.           if (FPicture.FPicW>0) and (FPicture.FPicH>0) and
  236.              ((FPicture.FMetafileMapMode=MM_ISOTROPIC) or  (FPicture.FMetafileMapMode=MM_ANISOTROPIC))then begin
  237.             FPicture.SuggestedWidth := Round(FPicture.FPicW/2540*PixelsPerInch);
  238.             FPicture.SuggestedHeight := Round(FPicture.FPicH/2540*PixelsPerInch);
  239.           end;
  240.           HM := SetWinMetaFileBits(FPicture.FData.Size, FPicture.FData.Memory, 0, MFP);
  241.           if (HM=0) then
  242.             Exception.Create('Invalid metafile');
  243.           TMetafile(gr).Handle := HM;
  244.           {$IFDEF RICHVIEWDEF4}
  245.           // black magic starts...
  246.           {
  247.           with MFP do begin
  248.             mm := FPicture.FMetafileMapMode;
  249.             xExt := 0;
  250.             yExt := 0;
  251.             hMF  := 0;
  252.           end;
  253.           HM2 := SetWinMetaFileBits(FPicture.FData.Size, FPicture.FData.Memory, 0, MFP);
  254.           gr2 := TMetafile.Create;
  255.           gr2.Handle := HM2;
  256.           if (gr.Width<>gr2.Width) or
  257.              (gr.Height<>gr2.Height) then
  258.               TMetafile(gr).Inch := PixelsPerInch*100;
  259.           gr2.Free;
  260.           }
  261.           // black magic ends...
  262.           {$ENDIF}
  263.           TMetafile(gr).Enhanced := True;
  264.           if FExtractMetafileBitmaps then begin
  265.             wmf := TMetafile(gr);
  266.             gr := ConvertMetafileToBitmap(wmf);
  267.             if gr=nil then
  268.               gr := wmf
  269.             else
  270.               wmf.Free;
  271.           end;
  272.         end;
  273.       rtf_pict_DDB:
  274.         begin
  275.           TBitmap(gr).Handle := CreateBitmap(FPicture.FPicW, FPicture.FPicH,
  276.             FPicture.FWBMPlanes, FPicture.FWBMBitsPixel, FPicture.FData.Memory);
  277.         end;
  278.       else
  279.         begin
  280.           FPicture.FData.Position := 0;
  281.           gr.LoadFromStream(FPicture.FData);
  282.         end;
  283.     end;
  284.     if (FPicture.FPicWGoalTw<>0) and (FPicture.FPicHGoalTw<>0) then begin
  285.       FPicture.SuggestedWidth := Round(FPicture.FPicWGoalTw * PixelsPerInch / (72*20));
  286.       FPicture.SuggestedHeight := Round(FPicture.FPicHGoalTw * PixelsPerInch / (72*20));
  287.     end;
  288.   end;
  289.   {.........................................}
  290. var gr: TGraphic;
  291.     s: String;
  292.     {$IFDEF RICHVIEWCBDEF3}
  293.     ws: WideString;
  294.     {$ELSE}
  295.     ws: String;
  296.     {$ENDIF}
  297.     Inserted: Boolean;
  298. begin
  299.   Result :=  rtf_ec_OK;
  300.   case rds of
  301.     rdsFontTable:
  302.       FFontTable.RemoveChasetFromNames;
  303.     rdsFldInst:
  304.       begin
  305.         InsertExternalPicture;
  306.         InsertSymbol;
  307.       end;
  308.     rdsField:
  309.       begin
  310.         if Assigned(FOnNewPicture) and (RTFState.FInvalidFieldPicture<>nil) then begin
  311.           FRTFState.ParaProps.Finalize;
  312.           RV_AfterImportGraphic(RTFState.FInvalidFieldPicture);
  313.           FOnNewPicture(Self, nil, RTFState.FInvalidFieldPicture, Position, '', Inserted);
  314.           if Inserted then
  315.             RTFState.FInvalidFieldPicture := nil;
  316.           Position := rtf_ts_ContinuePara;
  317.         end;
  318.         FRTFState.FFieldCode := '';
  319.         FRTFState.FFieldPictureIncluded := False;
  320.         FRTFState.FInvalidFieldPicture.Free;
  321.         FRTFState.FInvalidFieldPicture := nil;
  322.       end;
  323.     rdsObjData:
  324.       begin
  325.         Result := OutputChar(#0,False,True);
  326.         if Result<>rtf_ec_OK then
  327.           exit;
  328.         Result := DoNewObject;
  329.       end;
  330.     rdsObject:
  331.       begin
  332.         FObject.Free;
  333.         FObject := nil;
  334.       end;
  335.     rdsPict:
  336.       begin
  337.         Result := OutputChar(#0,False,True);
  338.         if Result<>rtf_ec_OK then
  339.           exit;
  340.         if not FRTFState.FFieldPictureIncluded then begin
  341.           if (FPicture=nil) then begin
  342.             if Assigned(FOnNewPicture) then
  343.               Result := rtf_ec_InvalidPicture;
  344.             exit;
  345.           end;
  346.           gr := CreateGraphic;
  347.           if gr<>nil then begin
  348.             try
  349.               LoadGraphic(gr);
  350.             except
  351.               gr.Free;
  352.               gr := nil;
  353.               Result := rtf_ec_InvalidPicture;
  354.             end;
  355.           end;
  356.           if gr<>nil then
  357.             RV_AfterImportGraphic(gr);
  358.           Inserted := False;
  359.           if Result = rtf_ec_OK then
  360.             Result := DoNewPicture(gr, Inserted);
  361.           if (Result=rtf_ec_OK) and not Inserted and Assigned(FOnNewPicture) and
  362.             (RTFState.FInvalidFieldPicture<>nil) then begin
  363.             FRTFState.ParaProps.Finalize;
  364.            RV_AfterImportGraphic(RTFState.FInvalidFieldPicture);
  365.            FOnNewPicture(Self, nil, RTFState.FInvalidFieldPicture, Position, '', Inserted);
  366.            if Inserted then
  367.              RTFState.FInvalidFieldPicture := nil;
  368.            Position := rtf_ts_ContinuePara;
  369.           end;
  370.         end;
  371.         FPicture.Free;
  372.         FPicture := nil;
  373.         RTFState.FInvalidFieldPicture.Free;
  374.         RTFState.FInvalidFieldPicture := nil;
  375.       end;
  376.     rdsListLevelText:
  377.       begin
  378.         s := FListTable.GetLastList.GetLastLevel.Text;
  379.         if (Length(s)>0) then begin
  380.           s := Copy(s,1, ord(s[1])+1);
  381.           FListTable.GetLastList.GetLastLevel.FText := s;
  382.         end;
  383.         ws := FListTable.GetLastList.GetLastLevel.TextW;
  384.         if (Length(ws)>0) then begin
  385.           ws := Copy(ws,1, Word(ws[1])+1);
  386.           FListTable.GetLastList.GetLastLevel.FTextW := ws;
  387.           //FListTable.GetLastList.GetLastLevel.FText := UnicodeToAnsi(ws);
  388.         end;
  389.       end;
  390.     rdsListLevelNumbers:
  391.       begin
  392.         s := FListTable.GetLastList.GetLastLevel.Numbers;
  393.         if (Length(s)>0) then begin
  394.           s := Copy(s,1, ord(s[1])+1);
  395.           FListTable.GetLastList.GetLastLevel.FNumbers := s;
  396.         end;
  397.       end;
  398.   end;
  399. end;
  400. {------------------------------------------------------------------------------}
  401. function TRVRTFReader.DoNewPicture(gr: TGraphic; var Inserted: Boolean): TRVRTFErrorCode;
  402. begin
  403.   Inserted := False;
  404.   try
  405.     if Assigned(FOnNewPicture) then begin
  406.       FRTFState.ParaProps.Finalize;
  407.       FPicture.FData.Position := 0;
  408.       FOnNewPicture(Self, FPicture, gr, Position, '', Inserted);
  409.       if FPicture.ShpPict then
  410.         ShpPictInserted := Inserted;
  411.       if Inserted then
  412.         Position := rtf_ts_ContinuePara;
  413.     end;
  414.     Result := rtf_ec_OK;
  415.   except
  416.     Result := rtf_ec_Aborted;
  417.   end;
  418. end;
  419. {------------------------------------------------------------------------------}
  420. function TRVRTFReader.DoNewObject: TRVRTFErrorCode;
  421. begin
  422.   try
  423.     if Assigned(FOnNewObject) then begin
  424.       FRTFState.ParaProps.Finalize;
  425.       FObject.FData.Position := 0;
  426.       FOnNewObject(Self, FObject, Position, ObjectInserted);
  427.       Position := rtf_ts_ContinuePara;
  428.     end;
  429.     Result := rtf_ec_OK;
  430.   except
  431.     Result := rtf_ec_Aborted;
  432.   end;
  433. end;
  434. {------------------------------------------------------------------------------}
  435. procedure TRVRTFReader.DoTable(WhatHappens: TRVRTFTableEventKind);
  436. begin
  437.   UpdateMarker;
  438.   if WhatHappens=rvf_tbl_TableStart then
  439.     FTableAlignmentDefined := False;
  440.   if Assigned(FOnTable) then
  441.     FOnTable(Self, WhatHappens);
  442. end;
  443. {------------------------------------------------------------------------------}
  444. procedure TRVRTFReader.CheckTable(AllowEnd: Boolean);
  445. var i, lev,newlev: Integer;
  446. begin
  447.   if FRTFState.ParaProps.NoTableEv then
  448.     AllowEnd := False;
  449.   newlev := CurrentNestingLevel;
  450.   if FRTFState.ParaProps.InTable then
  451.     lev := FRTFState.ParaProps.NestingLevel
  452.   else
  453.     lev := 0;
  454.   if CurrentNestingLevel<lev then begin
  455.     for i := CurrentNestingLevel to lev-1 do
  456.       DoTable(rvf_tbl_TableStart);
  457.     newlev := lev;
  458.   end;
  459.   if AllowEnd and (CurrentNestingLevel>lev) then begin
  460.     for i := CurrentNestingLevel downto lev+1 do
  461.       DoTable(rvf_tbl_TableEnd);
  462.     newlev := lev;
  463.   end;
  464.   CurrentNestingLevel := newlev;
  465. end;
  466. {------------------------------------------------------------------------------}
  467. // Evaluate an RTF control that needs special processing.
  468. function TRVRTFReader.ParseSpecialKeyword(ipfn:TRTFIPFN): TRVRTFErrorCode;
  469. begin
  470.     Result  := rtf_ec_OK;
  471.     if (FRTFState.rds = rdsSkip) and (ipfn <> ipfnBin) then // if we're skipping, and it's not
  472.        exit;                                      // the bin keyword, ignore it.
  473.     case ipfn of
  474.       ipfnBin:
  475.         begin
  476.            FRTFState.ris   := risBin;
  477.            cbBin := lParam;
  478.         end;
  479.       ipfnSkipDest:
  480.         {if rds<>rdsStyleSheet then } fSkipDestIfUnk := True;
  481.       ipfnHex:
  482.         FRTFState.ris := risHex;
  483.       else
  484.         Result := rtf_ec_BadTable;
  485.     end;
  486. end;
  487. {------------------------------------------------------------------------------}
  488. {.$DEFINE WORDDOCDEBUG}
  489. {$IFDEF RVUSEWORDDOC}
  490. function TRVRTFReader.ParseWordDocFile(const AFileName: String): TRVRTFErrorCode;
  491. var
  492. InitResult: TRVDOCErrorCode;
  493.   Res : TRVRTFErrorCode;
  494. OutStruct : TOutPutStruct;
  495.   ListDescStruc : TListDescStruc;
  496.   ParseRes  : Char;
  497.   iTab   : Integer;
  498.   bFirstRunPass : Boolean;
  499.   i : Integer;
  500.   a : TRVRTFList97;
  501.   b : TRVRTFListLevel97;
  502.   pic : TPictStruc;
  503.   gr: TGraphic;
  504. begin
  505.   {$IFDEF WORDDOCDEBUG}
  506.   Clear;
  507.   FFontTable.Add(0);
  508.   FFontTable.Items[0].Name := 'Arial';
  509.   RTFState.CharProps.FSize := 24;
  510.   GetPicture(pic);
  511.   FPicture := TRVRTFPicture.Create;
  512.   FPicture.FPicWGoalTw := pic.dxaGoal;
  513.   FPicture.FPicHGoalTw := pic.dyaGoal;
  514.   FPicture.FPicScaleX := pic.mx;
  515.   FPicture.FPicScaleY := pic.my;
  516.   //FPicture.FMetafileMapMode := 8;
  517.   FPicture.FPicW := 447;
  518.   FPicture.FPicH := 419;
  519.   FPicture.FType := TRVRTFPictureType(pic.picType);
  520.   FPicture.FData.Position := 0;
  521.   FPicture.FData.WriteBuffer(pic.pPicBytes^, pic.picSize);
  522.   Res := EndGroupAction(rdsPict);
  523.   OnNewText(Self, 'Hello', rtf_ts_NewPara);
  524.   Result := rtf_ec_OK;
  525.   {$ELSE}
  526.   {$R-}
  527.   Clear;
  528.   bFirstRunPass := false; // in the case table is in the beginning of the document
  529.   iTab := sizeof(TFontProps);
  530.   iTab := sizeof(OutStruct.ParaProps);
  531.   FFontTable.Add(0);
  532.   InitResult := InitializeWordDocument(AFileName, OutStruct);
  533.   if InitResult = doc_ec_OK then
  534.   begin
  535.     FListTable.AddNew;
  536.     //FListOverrideTable.AddNew;
  537.     //i := 0;
  538.       while GetNextListDesc(ListDescStruc) do begin
  539.        FListTable.GetLastList.AddNew;
  540.        with FListTable.GetLastList.GetLastLevel do begin
  541.          FStart := ListDescStruc.FStart;
  542.          FListType := RVRTF.TRVRTFParaListType(ListDescStruc.FListType And 7);
  543.          FAlignment := RVRTF.TRVRTFAlignment(ListDescStruc.FListType shr 3);
  544.          FColor     := ListDescStruc.FColor;
  545.          FFontIndex := 0;//ListDescStruc.FFontIndex;
  546.          if ListDescStruc.FFontSize <> 0 then
  547.          begin
  548.           FFontSize := ListDescStruc.FFontSize;
  549.           FFontSizeDefined := True;
  550.          end;
  551.          FFontStyle := ListDescStruc.FFontStyle;
  552.          FLeftIndentTw := ListDescStruc.FLeftIndentTw;
  553.          FFirstIndentTw := ListDescStruc.FFirstIndentTw;
  554.          FTabPosTw := ListDescStruc.FTabPosTw;
  555.          FTextW := ListDescStruc.FTextW;
  556.        end;
  557.        FListOverrideTable.AddNew;
  558.        with FListOverrideTable.GetLastListOverride do begin
  559.          FListIndex := 0;
  560.          AddNew;
  561.          GetLastLevel.FUseStart := False;
  562.          GetLastLevel.FStart := 1;
  563.         end;
  564.         //Inc(i);
  565.       end;
  566.     while true do begin
  567.     //OutStruct.Text;
  568.     ParseRes := ParseWordDocument(OutStruct);
  569.     if (ParseRes = #255) then break;
  570.       //i := Integer(OutStruct.TableFlags);
  571.       // in the case the first character on the beginning of the row is the carry return
  572.       // the following to ifs should correct the situation, otherwise the carry is just disappear
  573.       if ((not bFirstRunPass) and (OutStruct.TableFlags=1) and (OutStruct.Text[0]='')) or ((OutStruct.TableFlags=1) and (OutStruct.Text[0]='') and (ParseRes=#10)) then
  574.       begin
  575.         OnTable(Self, rvf_tbl_TableStart);
  576.         OutStruct.TableFlags := 0;
  577.       end;
  578.       if (OutStruct.TableFlags=3) and (OutStruct.Text[0]='') and (ParseRes=#10) then
  579.       begin
  580.         TGetRowProperties;
  581.         CheckTable(True);
  582.         Position := rtf_ts_NewPara;
  583.         OnTable(Self, rvf_tbl_RowEnd);
  584.         OutStruct.TableFlags := 0;
  585.       end;
  586.       bFirstRunPass := true;
  587.       FFontTable.Items[0].Name := OutStruct.FontProps.FontName;
  588.       RTFState.CharProps.FSize := OutStruct.FontProps.FontSize;
  589.       RTFState.CharProps.FStyle := []; // clear all styles
  590.       RTFState.CharProps.FStyle := OutStruct.FontProps.FontStyle;
  591.       RTFState.CharProps.FColor := OutStruct.FontProps.FontColor;
  592.       RTFState.CharProps.FCharSpacingTw := OutStruct.FontProps.FCharSpacingTw;
  593.       RTFState.CharProps.FCharScaleX := OutStruct.FontProps.FCharScaleX;
  594.       RTFState.CharProps.FBackColor  := OutStruct.FontProps.FBackColor;
  595.       RTFState.CharProps.FSScriptType:= TRVRTFSScriptType(OutStruct.FontProps.FSScriptType);
  596.       if OutStruct.ParaProps.bIsInList = 1 then
  597.       begin
  598.         RTFState.FParaProps.FListOverrideIndex := OutStruct.ParaProps.FListIndex;
  599.         b := FListTable[0].Items[OutStruct.ParaProps.FListIndex];//Reader.ListTable[i].Items[j]
  600.         //b := a.Items[OutStruct.ParaProps.FListIndex];
  601.         b.FFontSizeDefined := True;
  602.         b.FFontSize := 72;
  603.       end;
  604.       RTFState.FParaProps.FAlignment     := RVRTF.TRVRTFAlignment(OutStruct.ParaProps.ParaAlignment);
  605.       RTFState.FParaProps.FFirstIndentTw := OutStruct.ParaProps.FFirstIndentTw;
  606.       RTFState.FParaProps.FLeftIndentTw  := OutStruct.ParaProps.FLeftIndentTw;
  607.       RTFState.FParaProps.FRightIndentTw := OutStruct.ParaProps.FRightIndentTw;
  608.       RTFState.FParaProps.FSpaceBeforeTw := OutStruct.ParaProps.FSpaceBeforeTw;
  609.       RTFState.FParaProps.FSpaceAfterTw  := OutStruct.ParaProps.FSpaceAfterTw;
  610.       RTFState.FParaProps.FLineSpacing   := OutStruct.ParaProps.FLineSpacing;
  611.       RTFState.FParaProps.FColor := OutStruct.ParaProps.FColor;
  612.       RTFState.FParaProps.Border.Sides[rtf_side_Left].FBorderType := TRVRTFBorderType(OutStruct.ParaProps.FBorders.BrLeft.FBorderType);
  613.       RTFState.FParaProps.Border.Sides[rtf_side_Left].FWidthTw    := OutStruct.ParaProps.FBorders.BrLeft.FWidthTw;
  614.       RTFState.FParaProps.Border.Sides[rtf_side_Left].FColor      := OutStruct.ParaProps.FBorders.BrLeft.FColor;
  615.       RTFState.FParaProps.Border.Sides[rtf_side_Left].FSpaceTw    := OutStruct.ParaProps.FBorders.BrLeft.FSpaceTw;
  616.       RTFState.FParaProps.Border.Sides[rtf_side_Right].FBorderType:= TRVRTFBorderType(OutStruct.ParaProps.FBorders.BrRight.FBorderType);
  617.       RTFState.FParaProps.Border.Sides[rtf_side_Right].FWidthTw   := OutStruct.ParaProps.FBorders.BrRight.FWidthTw;
  618.       RTFState.FParaProps.Border.Sides[rtf_side_Right].FColor     := OutStruct.ParaProps.FBorders.BrRight.FColor;
  619.       RTFState.FParaProps.Border.Sides[rtf_side_Right].FSpaceTw   := OutStruct.ParaProps.FBorders.BrRight.FSpaceTw;
  620.       RTFState.FParaProps.Border.Sides[rtf_side_Top].FBorderType  := TRVRTFBorderType(OutStruct.ParaProps.FBorders.BrTop.FBorderType);
  621.       RTFState.FParaProps.Border.Sides[rtf_side_Top].FWidthTw     := OutStruct.ParaProps.FBorders.BrTop.FWidthTw;
  622.       RTFState.FParaProps.Border.Sides[rtf_side_Top].FColor       := OutStruct.ParaProps.FBorders.BrTop.FColor;
  623.       RTFState.FParaProps.Border.Sides[rtf_side_Top].FSpaceTw     := OutStruct.ParaProps.FBorders.BrTop.FSpaceTw;
  624.       RTFState.FParaProps.Border.Sides[rtf_side_Bottom].FBorderType:= TRVRTFBorderType(OutStruct.ParaProps.FBorders.BrBottom.FBorderType);
  625.       RTFState.FParaProps.Border.Sides[rtf_side_Bottom].FWidthTw   := OutStruct.ParaProps.FBorders.BrBottom.FWidthTw;
  626.       RTFState.FParaProps.Border.Sides[rtf_side_Bottom].FColor     := OutStruct.ParaProps.FBorders.BrBottom.FColor;
  627.       RTFState.FParaProps.Border.Sides[rtf_side_Bottom].FSpaceTw   := OutStruct.ParaProps.FBorders.BrBottom.FSpaceTw;
  628.       // add some tabs if any
  629.       if (iTab = 0) and (OutStruct.ParaProps.FTabsCount>0) then begin
  630.         // make sure we have an empty tabs for this paragraph
  631.         if RTFState.FParaProps.FTabs <> nil then begin
  632.           RTFState.FParaProps.FTabs.Free;
  633.           RTFState.FParaProps.FTabs := nil;
  634.         end;
  635.         RTFState.FParaProps.FTabs := TRVRTFTabList.Create;
  636.         for i:=0 to OutStruct.ParaProps.FTabsCount-1 do begin
  637.           RTFState.FParaProps.FTabs.AddNew;
  638.           RTFState.FParaProps.FTabs.GetLastTab.FPositionTW := OutStruct.ParaProps.FTabsDescPtr[i].FPositionTW;
  639.           RTFState.FParaProps.FTabs.GetLastTab.FAlign := TRVRTFTabAlign(OutStruct.ParaProps.FTabsDescPtr[i].FAlign);
  640.         end;
  641.         RTFState.FParaProps.FTabs.AddNew;
  642.       end;
  643.       if (iTab >= OutStruct.ParaProps.FTabsCount) and (ParseRes=#09) then begin
  644.         if RTFState.FParaProps.FTabs = nil then
  645.            RTFState.FParaProps.FTabs := TRVRTFTabList.Create;
  646.         RTFState.FParaProps.FTabs.AddNew;
  647.         RTFState.FParaProps.FTabs.GetLastTab.FPositionTW := 720;
  648.         RTFState.FParaProps.FTabs.GetLastTab.FAlign := rtf_tab_Left;
  649.         RTFState.FParaProps.FTabs.AddNew;
  650.       end;
  651.       if (OutStruct.FontProps.SpChar<>'') then begin
  652.         TextW := OutStruct.FontProps.SpChar;
  653.         OutputChar(#0, False, True);
  654.       end
  655.       else begin
  656.         TextW := OutStruct.Text;
  657.         if (ParseRes = #12) then
  658.         begin
  659.           OutputChar(#10, True, True);
  660.           FOnRequiredPageBreak(Self);
  661.         end
  662.         else
  663.           OutputChar(ParseRes, False, False);
  664.         if ParseRes=#10 then
  665.           iTab := 0;
  666.         if ParseRes=#9 then
  667.           Inc(iTab);
  668.       end;
  669.       case TRVDOCTableEventKind(OutStruct.TableFlags) of
  670.         doc_tbl_TableStart:
  671.         begin
  672.           Position := rtf_ts_NewPara;
  673.           OnTable(Self, rvf_tbl_TableStart);
  674.         end;
  675.         doc_tbl_TableEnd:
  676.         begin
  677.           TGetRowProperties;
  678.           Position := rtf_ts_NewPara;
  679.           OnTable(Self, rvf_tbl_RowEnd);
  680.          OnTable(Self, rvf_tbl_TableEnd);
  681.         end;
  682.         doc_tbl_RowEnd:
  683.         begin
  684.           TGetRowProperties;
  685.           CheckTable(True);
  686.           Position := rtf_ts_NewPara;
  687.           OnTable(Self, rvf_tbl_RowEnd);
  688.         end;
  689.         doc_tbl_CellEnd:
  690.         begin
  691.           CheckTable(True);
  692.           OutputChar(ParseRes, True, True);
  693.           Position := rtf_ts_NewPara;
  694.           OnTable(Self, rvf_tbl_CellEnd);
  695.         end;
  696.       end;
  697.      end; // while...
  698.     WordDocumentFree(OutStruct);
  699.   end;
  700.   asm
  701.    mov al, InitResult
  702.    neg al
  703.    mov Result, al
  704.   end;
  705.   {$R+}
  706.   {$ENDIF}
  707. end;
  708. {$ENDIF}
  709. {------------------------------------------------------------------------------}
  710. // Isolate RTF keywords and send them to ParseRtfKeyword;
  711. // Push and pop state at the start and end of RTF groups;
  712. // Send text to ParseChar for further processing.
  713. function TRVRTFReader.Parse: TRVRTFErrorCode;
  714. var
  715.     cNibble,b,i: Integer;
  716.     ch: Char;
  717. begin
  718.     cNibble := 2;
  719.     b := 0;
  720.     while not IsEOF do begin
  721.       ch := GetC;
  722.       if (cGroup < 0) then begin
  723.         Result := rtf_ec_StackUnderflow;
  724.         exit;
  725.       end;
  726.       if (FRTFState.ris = risBin) then begin // if we're parsing binary data, handle it directly
  727.         Result := ParseChar(ch);
  728.         if (Result <> rtf_ec_OK) then
  729.           exit;
  730.         end
  731.       else begin
  732.         case (ch) of
  733.           '{':
  734.              begin
  735.                SkipNext := 0;
  736.                Result := PushRtfState;
  737.                if (Result <> rtf_ec_OK) then
  738.                  exit;
  739.              end;
  740.           '}':
  741.              begin
  742.                SkipNext := 0;
  743.                Result := PopRtfState;
  744.                if (Result <> rtf_ec_OK) then
  745.                  exit;
  746.                if (cGroup=0) then
  747.                  break;
  748.              end;
  749.           '':
  750.              begin
  751.                Result := ParseRtfKeyword;
  752.                if (Result <> rtf_ec_OK) then
  753.                  exit;
  754.              end;
  755.           #$0d, #$0a:          // cr and lf are noise characters...
  756.              begin
  757.              end;
  758.           else
  759.              begin
  760.                if (FRTFState.ris = risNorm) then begin
  761.                  if SkipNext=0 then
  762.                    Result := ParseChar(ch)
  763.                  else begin
  764.                    dec(SkipNext);
  765.                    Result := rtf_ec_OK;
  766.                  end;
  767.                  if (Result <> rtf_ec_OK) then
  768.                    exit;
  769.                  end
  770.                else begin // parsing hex data
  771.                  if (FRTFState.ris <> risHex) then begin
  772.                    Result := rtf_ec_Assertion;
  773.                    exit;
  774.                  end;
  775.                  b := b shl 4;
  776.                  if (ch in ['0'..'9']) then
  777.                    b := b + (ord(ch) - ord('0'))
  778.                  else begin
  779.                    if (ch in ['a'..'z']) then  begin
  780.                      if not (ch in ['a'..'f']) then begin
  781.                        Result := rtf_ec_InvalidHex;
  782.                        exit;
  783.                      end;
  784.                      b := b + 10+(ord(ch) - ord('a'));
  785.                      end
  786.                    else begin
  787.                      if not (ch in ['A'..'F']) then begin
  788.                        Result := rtf_ec_InvalidHex;
  789.                        exit;
  790.                      end;
  791.                      b := b + 10+(ord(ch) - ord('A'));
  792.                    end;
  793.                  end;
  794.                  dec(cNibble);
  795.                  if (cNibble=0) then begin
  796.                    if SkipNext=0 then
  797.                      Result := ParseChar(Char(b))
  798.                    else begin
  799.                      dec(SkipNext);
  800.                      Result := rtf_ec_OK;
  801.                    end;
  802.                    if (Result <> rtf_ec_OK) then
  803.                      exit;
  804.                    cNibble := 2;
  805.                    b := 0;
  806.                    FRTFState.ris := risNorm;
  807.                  end;
  808.                end                   // end else (ris != risNorm)
  809.              end;
  810.         end;       // case
  811.       end;           // else (ris != risBin)
  812.     end;               // while
  813.     UpdateMarker;
  814.     for i := CurrentNestingLevel downto 1 do
  815.       DoTable(rvf_tbl_TableEnd);
  816.     FColorTable.Finalize;
  817.     if (cGroup < 0) then
  818.       Result := rtf_ec_StackUnderflow
  819.     else if (cGroup > 0) then
  820.       Result := rtf_ec_UnmatchedBrace
  821.     else begin
  822.       if Text<>'' then
  823.         Result := OutputChar(#0,True,True)
  824.       else
  825.         Result := rtf_ec_OK;
  826.     end;
  827. end;
  828. {------------------------------------------------------------------------------}
  829. // Save relevant info on a linked list of SAVE structures.
  830. function TRVRTFReader.PushRtfState: TRVRTFErrorCode;
  831. var SaveItem: TRVRTFReaderState;
  832. begin
  833.   try
  834.     SaveItem := TRVRTFReaderState.Create;
  835.   except
  836.     SaveItem := nil;
  837.   end;
  838.   if (SaveItem=nil) then begin
  839.     Result := rtf_ec_StackOverflow;
  840.     exit;
  841.   end;
  842.   SaveItem.Assign(FRTFState);
  843.   SaveList.Add(SaveItem);
  844.   FRTFState.ris := risNorm;
  845.   inc(cGroup);
  846.   case FRTFState.rds of
  847.     rdsStyleSheet:
  848.       begin
  849.         FStyleSheet.AddPara(0);
  850.         FRTFState.rds := rdsStyleSheetEntry;
  851.       end;
  852.   end;
  853.   Result := rtf_ec_OK;
  854. end;
  855. {------------------------------------------------------------------------------}
  856. // If we're ending a destination (that is, the destination is changing),
  857. // call ecEndGroupAction.
  858. // Always restore relevant info from the top of the SAVE list.
  859. function TRVRTFReader.PopRtfState: TRVRTFErrorCode;
  860. var SaveItem: TRVRTFReaderState;
  861.     CurRds: TRTFrds;
  862.     b: Boolean;
  863. begin
  864.   if (SaveList.Count=0) then begin
  865.     Result := rtf_ec_StackUnderflow;
  866.     exit;
  867.   end;
  868.   if (SaveList.Count=1) then begin
  869.     UpdateMarker;
  870.     if Assigned(OnEndParsing) then
  871.       OnEndParsing(Self);
  872.   end;
  873.   SaveItem := TRVRTFReaderState(SaveList.Items[SaveList.Count-1]);
  874.   if (FRTFState.rds=rdsStyleSheetEntry) and (SaveItem.rds=rdsStyleSheet) then
  875.     FStyleSheet[FStyleSheet.Count-1].Assign(FRTFState);
  876.   if FRTFState.rds=rdsNorm then begin
  877.     Result := OutputChar(#0,False,False);
  878.     if Result<>rtf_ec_OK then
  879.       exit;
  880.   end;
  881.   CurRds := FRTFState.rds;
  882.   if CurRds <> SaveItem.rds then begin
  883.     Result := EndGroupAction(FRTFState.rds);
  884.     if (Result <> rtf_ec_OK) then
  885.       exit;
  886.   end;
  887.   if (FRTFState.FHFType<>SaveItem.FHFType) and
  888.      (FRTFState.FHFType in [rtf_hf_Header,rtf_hf_Footer]) and
  889.      Assigned(FOnHeaderFooter) then
  890.     FOnHeaderFooter(Self, FRTFState.FHFType, False, b);
  891.   FRTFState.Assign(SaveItem);
  892.   if (CurRds=rdsPN) and (FRTFState.rds<>rdsPN) and (FMarkerProps<>nil) then begin
  893.     FRTFState.ParaProps.MarkerProps.Assign(FMarkerProps, False);
  894.     FMarkerProps.Free;
  895.     FMarkerProps := nil;
  896.   end;
  897.   SaveList.Delete(SaveList.Count-1);
  898.   dec(cGroup);
  899.   Result := rtf_ec_OK;
  900. end;
  901. {------------------------------------------------------------------------------}
  902. // get a control word (and its associated value) and
  903. // call TranslateKeyword to dispatch the control.
  904. function TRVRTFReader.ParseRtfKeyword: TRVRTFErrorCode;
  905. var ch: Char;
  906.     fParam, fNeg: Boolean;
  907.     Keyword, szParameter: String;
  908.     {$IFDEF RVTEXTFOOTNOTES}
  909.     footnotetext : String;
  910.     footkeyword : String;
  911.     isym : Integer;
  912.     {$ENDIF}
  913. begin
  914.   fParam := False;
  915.   fNeg   := False;
  916.   lParam  := 0;
  917.   //char *pch;
  918.   Keyword  := '';
  919.   szParameter := '';
  920.   if IsEOF then begin
  921.     Result := rtf_ec_EndOfFile;
  922.     exit;
  923.   end;
  924.   ch := GetC;
  925.   if (not (ch in ['a'..'z','A'..'Z'])) then begin
  926.     // a control symbol; no delimiter.
  927.     Keyword := ch;
  928.     Result := TranslateKeyword(Keyword, 0, fParam);
  929.     exit;
  930.   end;
  931.   repeat
  932.     Keyword := Keyword + ch;
  933.     ch := GetC;
  934.   until (not (ch in ['a'..'z','A'..'Z'])) or IsEOF ;
  935.   if (ch = '-') then begin
  936.     fNeg  := True;
  937.     ch := GetC;
  938.   end;
  939.   if (ch in ['0'..'9']) then begin
  940.     fParam := True;         // a digit after the control means we have a parameter
  941.     repeat
  942.       szParameter := szParameter + ch;
  943.       ch := GetC;
  944.     until (not (ch in ['0'..'9'])) or IsEOF ;
  945.     lParam := StrToInt(szParameter);
  946.     if (fNeg) then
  947.       lParam := -lParam;
  948.   end;
  949.   {$IFDEF RVTEXTFOOTNOTES}
  950.   if keyword='footnote' then begin
  951.     repeat
  952.       ch := GetC;
  953.     until (ch=' ') or (ch='}');
  954.     footnotetext := '';
  955.     if ch <> '}' then begin
  956.       repeat
  957.         //need to parse any special characters out.
  958.         if ch = '' then begin
  959.           footKeyWord:='';
  960.           ch :=' ';
  961.           repeat
  962.             footKeyword := footKeyword + ch;
  963.             ch := GetC;
  964.           until (not (ch in ['a'..'z','A'..'Z'])) or IsEOF ;
  965.           isym := FindKeyword(trim(footKeyword));
  966.           ch := chr(rgsymRtf[isym].idx);
  967.          end;
  968.          footnotetext := footnotetext + ch;
  969.          ch := GetC;
  970.       until ch = '}';
  971.       trim(footnotetext);
  972.     end;
  973.     UngetC;
  974.     FRTFState.FCharProps.FFootnote:=footnotetext;
  975.     param:=1;
  976.   end;
  977.   {$ENDIF}
  978.   if (ch <> ' ') then
  979.     UngetC;
  980.   Result := TranslateKeyword(Keyword, lParam, fParam)
  981. end;
  982. {------------------------------------------------------------------------------}
  983. // Route the character to the appropriate destination stream.
  984. function TRVRTFReader.ParseChar(ch: Char): TRVRTFErrorCode;
  985.   {..............................................}
  986.   function AddChar(Stream: TMemoryStream; ch: Char): Boolean;
  987.   begin
  988.     Result := False;
  989.     PicHexVal := PicHexVal shl 4;
  990.     if (ch in ['0'..'9']) then
  991.       PicHexVal := PicHexVal + (ord(ch) - ord('0'))
  992.     else begin
  993.       if (ch in ['a'..'z']) then  begin
  994.         if not (ch in ['a'..'f']) then
  995.           exit;
  996.         PicHexVal := PicHexVal + 10+(ord(ch) - ord('a'));
  997.       end
  998.       else begin
  999.         if not (ch in ['A'..'F']) then
  1000.           exit;
  1001.           PicHexVal := PicHexVal + 10+(ord(ch) - ord('A'));
  1002.       end;
  1003.     end;
  1004.     if not PicHexStrt then begin
  1005.       Stream.WriteBuffer(PicHexVal,1);
  1006.       PicHexVal := 0;
  1007.     end;
  1008.     PicHexStrt := not PicHexStrt;
  1009.     Result := True;
  1010.   end;
  1011.   {..............................................}
  1012. begin
  1013.   Result := rtf_ec_OK;
  1014.   case (FRTFState.rds) of
  1015.     rdsSkip:
  1016.       ;
  1017.     rdsStyleSheetEntry:
  1018.       begin
  1019.         if ch<>';' then
  1020.           FStyleSheet[FStyleSheet.Count-1].FName := FStyleSheet[FStyleSheet.Count-1].Name+ch;
  1021.       end;
  1022.     rdsNorm:
  1023.       begin
  1024.         if (ch in [#$0a, #$0d]) and Assigned(FOnUpdateMarker) then
  1025.           UpdateMarker;
  1026.         Result := OutputChar(ch,True,True);
  1027.         if (ch in [#$0a, #$0d]) and Assigned(FOnUpdateMarker) then
  1028.           UpdateMarker;
  1029.       end;
  1030.     rdsFontTable:
  1031.       begin
  1032.         if ch<>';' then
  1033.           FFontTable[FFontTable.Count-1].Name := FFontTable[FFontTable.Count-1].Name+ch;
  1034.       end;
  1035.     rdsColorTable:
  1036.       begin
  1037.         if ch=';' then
  1038.           FColorTable.Add;
  1039.       end;
  1040.     rdsObjData:
  1041.       begin
  1042.         if FObject<>nil then
  1043.           if FRTFState.ris = risBin then
  1044.             FObject.FData.WriteBuffer(ch,1)
  1045.           else if not AddChar(FObject.FData, ch) then
  1046.             Result := rtf_ec_InvalidPicture;
  1047.       end;
  1048.     rdsPict:
  1049.       begin
  1050.         if FPicture<>nil then
  1051.           if FRTFState.ris = risBin then
  1052.             FPicture.FData.WriteBuffer(ch,1)
  1053.           else if not AddChar(FPicture.FData, ch) then
  1054.             Result := rtf_ec_InvalidPicture;
  1055.       end;
  1056.     rdsFldInst:
  1057.       FRTFState.FFieldCode := FRTFState.FFieldCode+ch;
  1058.     rdsPNTextAfter:
  1059.       FMarkerProps.FTextAfter := FMarkerProps.FTextAfter+ch;
  1060.     rdsPNTextBefore:
  1061.       FMarkerProps.FTextBefore := FMarkerProps.FTextBefore+ch;
  1062.     rdsListName:
  1063.       FListTable.GetLastList.FName := FListTable.GetLastList.FName+ch;
  1064.     rdsListLevelText:
  1065.       with FListTable.GetLastList.GetLastLevel do begin
  1066.         FText := FText+ch;
  1067.         if FTextW<>'' then
  1068.           {$IFDEF RICHVIEWCBDEF3}
  1069.           FTextW := FTextW+AnsiToUnicode(ch, FCodePage);
  1070.           {$ELSE}
  1071.           FTextW := FTextW+ch;
  1072.           {$ENDIF}
  1073.       end;
  1074.     rdsListLevelNumbers:
  1075.       FListTable.GetLastList.GetLastLevel.FNumbers := FListTable.GetLastList.GetLastLevel.FNumbers+ch;
  1076.   end;
  1077.   if (FRTFState.ris = risBin) then begin
  1078.     dec(cbBin);
  1079.     if cbBin <= 0 then
  1080.         FRTFState.ris := risNorm;
  1081.   end;
  1082. end;
  1083. {------------------------------------------------------------------------------}
  1084. procedure TRVRTFReader.UpdateMarker;
  1085. begin
  1086.   if not Assigned(FOnUpdateMarker) then
  1087.     exit;
  1088.   if RTFState.ParaProps.HasMarker then
  1089.     RTFState.ParaProps.MarkerProps.UpdateFrom(RTFState.CharProps);
  1090.   FOnUpdateMarker(Self);
  1091. end;
  1092. {------------------------------------------------------------------------------}
  1093. function TRVRTFReader.FlushOutput(var NextPosition: TRVRTFPosition): TRVRTFErrorCode;
  1094. begin
  1095.   {$IFDEF RICHVIEWCBDEF3}
  1096.   if Length(TextW)>0 then
  1097.     OutputWideChar(#0);
  1098.   {$ENDIF}
  1099.   Result := DoNewText(Position, NextPosition);
  1100. end;
  1101. {------------------------------------------------------------------------------}
  1102. {$IFDEF RICHVIEWCBDEF3}
  1103. function TRVRTFReader.OutputWideChar(ch: WideChar): TRVRTFErrorCode;
  1104. begin
  1105.   Result := rtf_ec_OK;
  1106.   case RTFState.rds of
  1107.     rdsNorm:
  1108.       begin
  1109.         CheckTable(True);
  1110.         if Assigned(FOnNewUnicodeText) then begin
  1111.           if Text<>'' then
  1112.             OutputChar(#0, False, False);
  1113.           if ord(ch)>0 then begin
  1114.             TextW := TextW+WideString(ch);
  1115.           end;
  1116.         end;
  1117.       end;
  1118.     rdsListLevelText:
  1119.       begin
  1120.         if FListTable.GetLastList.GetLastLevel.TextW='' then
  1121.           FListTable.GetLastList.GetLastLevel.FTextW := AnsiToUnicode(FListTable.GetLastList.GetLastLevel.FText, FCodePage);
  1122.         FListTable.GetLastList.GetLastLevel.FTextW := FListTable.GetLastList.GetLastLevel.FTextW+WideString(ch);
  1123.         FListTable.GetLastList.GetLastLevel.FText := FListTable.GetLastList.GetLastLevel.FText+UnicodeToAnsi(ch);
  1124.       end;
  1125.   end;
  1126. end;
  1127. {$ENDIF}
  1128. {------------------------------------------------------------------------------}
  1129. function TRVRTFReader.OutputChar(ch: Char; ACheckTableEnd, ACheckTable: Boolean): TRVRTFErrorCode;
  1130. var NextPosition: TRVRTFPosition;
  1131. begin
  1132.   if AcheckTable then
  1133.     CheckTable(ACheckTableEnd);
  1134.   if TabAsSeparateChar and (ch=#09) then begin
  1135.     Result := OutputChar(#0, False, False);
  1136.     if Result<>rtf_ec_OK then
  1137.       exit;
  1138.     Text := Text+ch;
  1139.     Result := OutputChar(#0, False, False);
  1140.     exit;
  1141.   end;
  1142.   if ch in [#0,#10,#13]then begin
  1143.     case ch of
  1144.       #10:
  1145.         NextPosition := rtf_ts_NewPara;
  1146.       #13:
  1147.         NextPosition := rtf_ts_NewLine;
  1148.       else
  1149.         NextPosition := rtf_ts_ContinuePara;
  1150.     end;
  1151.     Result := FlushOutput(NextPosition);
  1152.     if Result<>rtf_ec_OK then
  1153.       exit;
  1154.     if NextPosition<>rtf_ts_ContinuePara then
  1155.       Position := NextPosition
  1156.     else
  1157.       case ch of
  1158.         #10:
  1159.           Position := rtf_ts_NewPara;
  1160.         #13:
  1161.           Position := rtf_ts_NewLine;
  1162.         else
  1163.           Position := rtf_ts_ContinuePara;
  1164.       end;
  1165.     end
  1166.   else begin
  1167.     {$IFDEF RICHVIEWCBDEF3}
  1168.     if (TextW<>'') then begin
  1169.       OutputChar(#0, False, False);
  1170.     end;
  1171.     {$ENDIF}
  1172.     Text := Text+ch;
  1173.   end;
  1174.   Result := rtf_ec_OK;
  1175. end;
  1176. {------------------------------------------------------------------------------}
  1177. function TRVRTFReader.DoNewText(Position: TRVRTFPosition;
  1178.                                  var NextPosition: TRVRTFPosition): TRVRTFErrorCode;
  1179. begin
  1180.   Result := rtf_ec_OK;
  1181.   if not ForceEvenEmptyNewLine and (Text='')
  1182.     {$IFDEF RICHVIEWCBDEF3}
  1183.      and (TextW='')
  1184.     {$ENDIF}
  1185.   then begin
  1186.      if Position=rtf_ts_ContinuePara then
  1187.        exit;
  1188.      if NextPosition=rtf_ts_ContinuePara then begin
  1189.        NextPosition := Position;
  1190.        exit;
  1191.      end;
  1192.   end;
  1193.   FRTFState.ParaProps.Finalize;
  1194.   try
  1195.     {$IFDEF RICHVIEWCBDEF3}
  1196.     if Assigned(FOnNewUnicodeText) and (TextW<>'') then
  1197.       FOnNewUnicodeText(Self,TextW,Position)
  1198.     else
  1199.     {$ENDIF}
  1200.       if Assigned(FOnNewText) then
  1201.         FOnNewText(Self, Text, Position);
  1202.   except
  1203.     Result := rtf_ec_Aborted;
  1204.   end;
  1205.   Text := '';
  1206.   {$IFDEF RICHVIEWCBDEF3}
  1207.   TextW := '';
  1208.   {$ENDIF}
  1209. end;
  1210. {------------------------------------------------------------------------------}
  1211. function TRVRTFReader.ReadFromFile(const AFileName: String): TRVRTFErrorCode;
  1212. var Stream: TFileStream;
  1213. begin
  1214.   Result := rtf_ec_FileOpenError;
  1215.   try
  1216.     Stream := TFileStream.Create(AFileName, fmOpenRead);
  1217.   except
  1218.     Stream := nil;
  1219.   end;
  1220.   if Stream<>nil then begin
  1221.     Result := ReadFromStream(Stream);
  1222.     Stream.Free;
  1223.   end;
  1224. end;
  1225. {------------------------------------------------------------------------------}
  1226. {$IFDEF RVUSEWORDDOC}
  1227. function TRVRTFReader.ReadFromWordDocFile(const AFileName: String): TRVRTFErrorCode;
  1228. begin
  1229.   Result := ParseWordDocFile(AFileName);
  1230. end;
  1231. {$ENDIF}
  1232. {------------------------------------------------------------------------------}
  1233. const BUFFERSIZE=4096;
  1234. function TRVRTFReader.ReadFromStream(AStream: TStream): TRVRTFErrorCode;
  1235. begin
  1236.   Stream := AStream;
  1237.   StreamSize := Stream.Size;
  1238.   Clear;
  1239.   SetLength(InputString, BUFFERSIZE);
  1240.   InputStringIndex := BUFFERSIZE+1;
  1241.   FCallProgress := (StreamSize>BUFFERSIZE*5) and Assigned(FOnProgress);
  1242.   if FCallProgress then
  1243.     FOnProgress(Self, rvprtfprStarting, 0);
  1244.   try
  1245.     Result := Parse;
  1246.   except
  1247.     Result := rtf_ec_Exception;
  1248.   end;
  1249.   InputString := '';
  1250.   if FCallProgress then
  1251.     FOnProgress(Self, rvprtfprEnding, 0);
  1252. end;
  1253. {------------------------------------------------------------------------------}
  1254. function TRVRTFReader.GetC: Char;
  1255. begin
  1256.   if UseLastChar then begin
  1257.     Result :=  LastChar;
  1258.     UseLastChar := False;
  1259.     exit;
  1260.   end;
  1261.   if InputStringIndex>Length(InputString) then begin
  1262.     if FCallProgress then
  1263.       FOnProgress(Self, rvprtfprRunning,
  1264.         MulDiv(Stream.Position, 100, StreamSize));
  1265.     if StreamSize-Stream.Position>=BUFFERSIZE then
  1266.       Stream.ReadBuffer(PChar(InputString)^, BUFFERSIZE)
  1267.     else begin
  1268.       SetLength(InputString,StreamSize-Stream.Position);
  1269.       Stream.ReadBuffer(PChar(InputString)^, Length(InputString))
  1270.     end;
  1271.     InputStringIndex := 1;
  1272.   end;
  1273.   Result := InputString[InputStringIndex];
  1274.   LastChar := Result;
  1275.   inc(InputStringIndex);
  1276. end;
  1277. {------------------------------------------------------------------------------}
  1278. procedure TRVRTFReader.UngetC;
  1279. begin
  1280.   UseLastChar := True;
  1281. end;
  1282. {------------------------------------------------------------------------------}
  1283. function TRVRTFReader.IsEOF: Boolean;
  1284. begin
  1285.   Result := not UseLastChar and (InputStringIndex>Length(InputString)) and (Stream.Position>=StreamSize);
  1286. end;
  1287. {------------------------------------------------------------------------------}
  1288. {$IFDEF RICHVIEWCBDEF3}
  1289. function TRVRTFReader.AnsiToUnicode(const s: String; CodePage: Cardinal): WideString;
  1290. var l: Integer;
  1291. begin
  1292.   if Length(s)=0 then begin
  1293.     Result := '';
  1294.     exit;
  1295.   end;
  1296.   l := MultiByteToWideChar(CodePage,MB_PRECOMPOSED or MB_USEGLYPHCHARS, PChar(s), Length(s),
  1297.                            nil, 0);
  1298.   if (l=0) and (CodePage<>CP_ACP) then begin
  1299.     CodePage := CP_ACP;
  1300.     l := MultiByteToWideChar(CodePage, MB_PRECOMPOSED or MB_USEGLYPHCHARS, PChar(s), Length(s),
  1301.                            nil, 0);
  1302.   end;
  1303.   if l<>0 then begin
  1304.     SetLength(Result, l);
  1305.     MultiByteToWideChar(CodePage, MB_PRECOMPOSED or MB_USEGLYPHCHARS, PChar(s), Length(s),
  1306.                              Pointer(Result), l);
  1307.     end
  1308.   else begin
  1309.     SetLength(Result, Length(s));
  1310.     for l := 0 to Length(s)-1 do
  1311.       Result[l] := '?';
  1312.   end;
  1313. end;
  1314. {------------------------------------------------------------------------------}
  1315. function TRVRTFReader.UnicodeToAnsi(const s: WideString): String;
  1316. var l: Integer;
  1317.     DefChar: Char;
  1318.     Flags: Integer;
  1319.     Len: Integer;
  1320.     CodePage: Cardinal;
  1321. begin
  1322.   if Length(s)=0 then begin
  1323.     Result := '';
  1324.     exit;
  1325.   end;
  1326.   CodePage := FCodePage;
  1327.   DefChar := '?';
  1328.   Flags := WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR;
  1329.   Len := Length(s);
  1330.   l := WideCharToMultiByte(CodePage, Flags, Pointer(s), Len, nil, 0, @DefChar, nil);
  1331.   if (l=0) and (CodePage<>CP_ACP) then begin
  1332.     CodePage := CP_ACP;
  1333.     l := WideCharToMultiByte(CodePage, Flags, Pointer(s), Len, nil, 0, @DefChar, nil);
  1334.   end;
  1335.   if l<>0 then begin
  1336.     SetLength(Result, l);
  1337.     WideCharToMultiByte(CodePage, Flags, Pointer(s), Len, PChar(Result), l, @DefChar, nil);
  1338.     end
  1339.   else begin
  1340.     SetLength(Result, Len);
  1341.     FillChar(PChar(Result)^, Len, '?');
  1342.   end;
  1343. end;
  1344. {$ENDIF}
  1345. {============================ TRVRTFColorList =================================}
  1346. procedure TRVRTFColorList.Add;
  1347. begin
  1348.   inherited Add(Pointer(clWindowText));
  1349. end;
  1350. {------------------------------------------------------------------------------}
  1351. procedure TRVRTFColorList.Finalize;
  1352. begin
  1353.   if Count>0 then
  1354.    Delete(Count-1);
  1355. end;
  1356. {------------------------------------------------------------------------------}
  1357. function TRVRTFColorList.Get(Index: Integer): TColor;
  1358. begin
  1359.   Result := TColor(inherited Get(Index));
  1360. end;
  1361. {------------------------------------------------------------------------------}
  1362. procedure TRVRTFColorList.Put(Index: Integer; const Value: TColor);
  1363. begin
  1364.   inherited Put(Index, Pointer(Value));
  1365. end;
  1366. {------------------------------------------------------------------------------}
  1367. procedure TRVRTFColorList.ResetLast;
  1368. begin
  1369.   if Items[Count-1]=clWindowText then
  1370.      Items[Count-1] := 0;
  1371. end;
  1372. {------------------------------------------------------------------------------}
  1373. procedure TRVRTFColorList.SetLastBlue(Value: Integer);
  1374. begin
  1375.   ResetLast;
  1376.   Items[Count-1] := Items[Count-1] or (Value shl 16);
  1377. end;
  1378. {------------------------------------------------------------------------------}
  1379. procedure TRVRTFColorList.SetLastGreen(Value: Integer);
  1380. begin
  1381.   ResetLast;
  1382.   Items[Count-1] := Items[Count-1] or (Value shl 8);
  1383. end;
  1384. {------------------------------------------------------------------------------}
  1385. procedure TRVRTFColorList.SetLastRed(Value: Integer);
  1386. begin
  1387.   ResetLast;
  1388.   Items[Count-1] := Items[Count-1] or Value;
  1389. end;
  1390. {============================= TRVRTFFontList =================================}
  1391. function TRVRTFFontList.Get(Index: Integer): TRVRTFFont;
  1392. begin
  1393.   Result := TRVRTFFont(inherited Get(Index));
  1394. end;
  1395. {------------------------------------------------------------------------------}
  1396. procedure TRVRTFFontList.Put(Index: Integer; const Value: TRVRTFFont);
  1397. begin
  1398.   inherited Put(Index, Value);
  1399. end;
  1400. {------------------------------------------------------------------------------}
  1401. procedure TRVRTFFontList.RemoveChasetFromNames;
  1402. {$IFDEF RICHVIEWCBDEF3}
  1403. var i: Integer;
  1404.     fontname,csname: String;
  1405. {$ENDIF}
  1406. begin
  1407.   {$IFDEF RICHVIEWCBDEF3}
  1408.   csname := '';
  1409.   for i := 0 to Count-1 do begin
  1410.     case Items[i].Charset of
  1411.       RUSSIAN_CHARSET:
  1412.         csname := 'cyr';
  1413.       EASTEUROPE_CHARSET:
  1414.         csname := 'ce';
  1415.       GREEK_CHARSET:
  1416.         csname := 'greek';
  1417.       TURKISH_CHARSET:
  1418.         csname := 'tur';
  1419.       BALTIC_CHARSET:
  1420.         csname := 'baltic';
  1421.       else
  1422.         continue;
  1423.     end;
  1424.     fontname := Items[i].Name;
  1425.     if Length(fontname)<=Length(csname) then
  1426.       continue;
  1427.     if AnsiLowerCase(Copy(fontname, Length(fontname)-Length(csname), Length(csname)+1))=' '+csname then
  1428.       Items[i].Name := Copy(fontname, 1, Length(fontname)-Length(csname)-1);
  1429.   end;
  1430.   {$ENDIF}
  1431. end;
  1432. {------------------------------------------------------------------------------}
  1433. function TRVRTFFontList.GetFontIndex(Number, Default: Integer): Integer;
  1434. var i: Integer;
  1435. begin
  1436.   Result := -1;
  1437.   for i := 0 to Count-1 do
  1438.     if Items[i].Number=Number then begin
  1439.       Result := i;
  1440.       exit;
  1441.     end;
  1442.   if Number<>Default then
  1443.     Result := GetFontIndex(Default, Default);
  1444.   if Result<0 then
  1445.     Result := 0;
  1446. end;
  1447. {------------------------------------------------------------------------------}
  1448. procedure TRVRTFFontList.Add(Number: Integer);
  1449. var Item:TRVRTFFont;
  1450. begin
  1451.   Item := TRVRTFFont.Create;
  1452.   Item.Number := Number;
  1453.   inherited Add(Item);
  1454. end;
  1455. {========================= TRVRTFTextProperties ================================}
  1456. constructor TRVRTFCharProperties.Create;
  1457. begin
  1458.   inherited Create;
  1459.   Reset(0,0);
  1460. end;
  1461. {------------------------------------------------------------------------------}
  1462. procedure TRVRTFCharProperties.Assign(Source: TRVRTFCharProperties);
  1463. begin
  1464.   FSize      := Source.Size;
  1465.   FColor     := Source.Color;
  1466.   FBackColor := Source.BackColor;
  1467.   FFontIndex := Source.FontIndex;
  1468.   FStyle     := Source.Style;
  1469.   FStyleEx   := Source.StyleEx;
  1470.   FCharScaleX := Source.CharScaleX;
  1471.   FSScriptType := Source.SScriptType;
  1472.   FCharSpacingTw := Source.CharSpacingTw;
  1473.   FHidden    := Source.Hidden;
  1474.   {$IFDEF RVTEXTFOOTNOTES}
  1475.   FFootNote  := Source.FootNote;
  1476.   {$ENDIF}
  1477. end;
  1478. {------------------------------------------------------------------------------}
  1479. procedure TRVRTFCharProperties.Reset(DefLanguage: Cardinal; DefFontIndex: Integer);
  1480. begin
  1481.   FSize      := 12;
  1482.   FColor     := clWindowText;
  1483.   FBackColor := clNone;
  1484.   FFontIndex := DefFontIndex;
  1485.   FStyle     := [];
  1486.   FStyleEx   := [];
  1487.   FCharScaleX := 100;
  1488.   FSScriptType := rtf_ss_Normal;
  1489.   FCharSpacingTw := 0;
  1490.   FHidden    := False;
  1491.   FFontName := '';
  1492.   FLanguage  := DefLanguage;
  1493.   {$IFDEF RVTEXTFOOTNOTES}
  1494.   FFootNote  := '';
  1495.   {$ENDIF}
  1496. end;
  1497. {========================== TRVRTFParaProperties ==============================}
  1498. constructor TRVRTFParaProperties.Create;
  1499. begin
  1500.   inherited Create;
  1501.   Reset;
  1502. end;
  1503. {------------------------------------------------------------------------------}
  1504. destructor TRVRTFParaProperties.Destroy;
  1505. begin
  1506.   FBorder.Free;
  1507.   FMarkerProps.Free;
  1508.   {$IFNDEF RVDONOTUSETABS}
  1509.   FTabs.Free;
  1510.   {$ENDIF}
  1511.   inherited Destroy;
  1512. end;
  1513. {------------------------------------------------------------------------------}
  1514. procedure TRVRTFParaProperties.Assign(Source: TRVRTFParaProperties);
  1515. begin
  1516.   FLeftIndentTw  := Source.LeftIndentTw;
  1517.   FRightIndentTw := Source.RightIndentTw;
  1518.   FFirstIndentTw := Source.FirstIndentTw;
  1519.   FSpaceBeforeTw := Source.SpaceBeforeTw;
  1520.   FSpaceAfterTw  := Source.SpaceAfterTw;
  1521.   FAlignment     := Source.Alignment;
  1522.   FColor         := Source.Color;
  1523.   FLineSpacing   := Source.LineSpacing;
  1524.   FLineSpacingMulti := Source.LineSpacingMulti;
  1525.   if Source.FBorder<>nil then
  1526.     Border.Assign(Source.FBorder)
  1527.   else begin
  1528.     FBorder.Free;
  1529.     FBorder := nil;
  1530.   end;
  1531.   if Source.FMarkerProps<>nil then
  1532.     MarkerProps.Assign(Source.FMarkerProps, False)
  1533.   else begin
  1534.     FMarkerProps.Free;
  1535.     FMarkerProps := nil;
  1536.   end;
  1537.   FCurBorderSide := Source.FCurBorderSide;
  1538.   FNestingLevel  := Source.NestingLevel;
  1539.   FInTable       := Source.InTable;
  1540.   NoTableEv      := Source.NoTableEv;
  1541.   NoResetLev     := Source.NoResetLev;
  1542.   FListOverrideIndex := Source.ListOverrideIndex;
  1543.   FListLevel     := Source.ListLevel;
  1544.   Shading        := Source.Shading;
  1545.   ForeColor      := Source.ForeColor;
  1546.   FKeepLinesTogether := Source.KeepLinesTogether;
  1547.   FKeepWithNext  := Source.KeepWithNext;
  1548.   {$IFNDEF RVDONOTUSETABS}
  1549.   if Source.HasTabs then
  1550.     Tabs.Assign(Source.FTabs)
  1551.   else begin
  1552.     FTabs.Free;
  1553.     FTabs := nil;
  1554.   end;
  1555.   FTabsReady := Source.FTabsReady;
  1556.   {$ENDIF}
  1557. end;
  1558. {------------------------------------------------------------------------------}
  1559. procedure TRVRTFParaProperties.Reset;
  1560. begin
  1561.   FLeftIndentTw  := 0;
  1562.   FRightIndentTw := 0;
  1563.   FFirstIndentTw := 0;
  1564.   FSpaceBeforeTw := 0;
  1565.   FSpaceAfterTw  := 0;
  1566.   FAlignment     := rtf_al_Left;
  1567.   FBorder.Free;
  1568.   FBorder        := nil;
  1569.   FMarkerProps.Free;
  1570.   FMarkerProps   := nil;
  1571.   FCurBorderSide := rtf_side_Left;
  1572.   FColor         := clNone;
  1573.   FLineSpacing   := 240;     //   single
  1574.   FLineSpacingMulti := True; // /  spacing
  1575.   if not NoResetLev then begin
  1576.     FNestingLevel  := 1;
  1577.     FInTable       := False;
  1578.   end;
  1579.   NoTableEv      := False;
  1580.   NoResetLev     := False;
  1581.   FListOverrideIndex := -1;
  1582.   FListLevel     := 0;
  1583.   Shading        := 0;
  1584.   ForeColor      := clBlack;
  1585.   FKeepLinesTogether := False;
  1586.   FKeepWithNext  := False;
  1587.   {$IFNDEF RVDONOTUSETABS}
  1588.   FTabs.Free;
  1589.   FTabs := nil;
  1590.   FTabsReady := False;
  1591.   {$ENDIF}
  1592. end;
  1593. {------------------------------------------------------------------------------}
  1594. {$IFNDEF RVDONOTUSETABS}
  1595. function TRVRTFParaProperties.GetTabs: TRVRTFTabList;
  1596. begin
  1597.   if FTabs=nil then
  1598.     FTabs := TRVRTFTabList.Create;
  1599.   Result := FTabs;
  1600. end;
  1601. {------------------------------------------------------------------------------}
  1602. function TRVRTFParaProperties.HasTabs: Boolean;
  1603. begin
  1604.   Result := (FTabs<>nil) and (FTabs.Count>0);
  1605. end;
  1606. {$ENDIF}
  1607. {------------------------------------------------------------------------------}
  1608. function TRVRTFParaProperties.GetBorder: TRVRTFParaBorder;
  1609. begin
  1610.   if FBorder=nil then
  1611.     FBorder := TRVRTFParaBorder.Create;
  1612.   Result := FBorder;
  1613. end;
  1614. {------------------------------------------------------------------------------}
  1615. function TRVRTFParaProperties.GetMarkerProps: TRVRTFMarkerProperties;
  1616. begin
  1617.   if FMarkerProps=nil then
  1618.     FMarkerProps := TRVRTFMarkerProperties.Create;
  1619.   Result := FMarkerProps;
  1620. end;
  1621. {------------------------------------------------------------------------------}
  1622. procedure TRVRTFParaProperties.Finalize;
  1623. {$IFNDEF RVDONOTUSETABS}
  1624. var i: Integer;
  1625. {$ENDIF}
  1626. begin
  1627.   if Shading<>0 then begin
  1628.     if (FColor=clNone) then
  1629.       FColor := clWhite;
  1630.     FColor := ShadeColor(ColorToRGB(Color), ColorToRGB(ForeColor), Shading);
  1631.     Shading := 0;
  1632.   end;
  1633.   {$IFNDEF RVDONOTUSETABS}
  1634.   if HasTabs and not FTabsReady then begin
  1635.     Tabs.Delete(Tabs.Count-1);
  1636.     for i := Tabs.Count-1 downto 0 do
  1637.       if Tabs[i].IsListTab then
  1638.         Tabs.Delete(i);
  1639.     FTabsReady := True;
  1640.   end;
  1641.   {$ENDIF}
  1642. end;
  1643. {------------------------------------------------------------------------------}
  1644. function TRVRTFParaProperties.HasBorder: Boolean;
  1645. var i: TRVRTFSide;
  1646. begin
  1647.   Result := (FBorder<>nil);
  1648.   if Result then begin
  1649.     Result := False;
  1650.     for i := Low(TRVRTFSide) to High(TRVRTFSide) do
  1651.       if (FBorder.FSides[i]<>nil) and (FBorder.FSides[i].FBorderType<>rtf_brdr_None) then begin
  1652.         Result := True;
  1653.         break;
  1654.       end;
  1655.   end;
  1656. end;
  1657. {------------------------------------------------------------------------------}
  1658. function TRVRTFParaProperties.HasMarker: Boolean;
  1659. begin
  1660.   Result := (FMarkerProps<>nil);
  1661. end;
  1662. {========================== TRVRTFSectionProperties ===========================}
  1663. constructor TRVRTFSectionProperties.Create;
  1664. begin
  1665.   inherited Create;
  1666.   Reset;
  1667. end;
  1668. {------------------------------------------------------------------------------}
  1669. destructor TRVRTFSectionProperties.Destroy;
  1670. begin
  1671.   FDefMarkerPropsList.Free;
  1672.   inherited;
  1673. end;
  1674. {------------------------------------------------------------------------------}
  1675. procedure TRVRTFSectionProperties.InitListDefaults;
  1676. var i: Integer;
  1677. begin
  1678.   if FDefMarkerPropsList= nil then begin
  1679.     FDefMarkerPropsList := TRVList.Create;
  1680.     for i := 1 to 11 do
  1681.       FDefMarkerPropsList.Add(TRVRTFMarkerProperties.Create);
  1682.   end;
  1683. end;
  1684. {------------------------------------------------------------------------------}
  1685. procedure TRVRTFSectionProperties.Assign(Source: TRVRTFSectionProperties);
  1686. var i: Integer;
  1687. begin
  1688.   FColumnCount      := Source.FColumnCount;
  1689.   FPageNumberXTw    := Source.FPageNumberXTw;
  1690.   FPageNumberYTw    := Source.FPageNumberYTw;
  1691.   FPageNumberFormat := Source.FPageNumberFormat;
  1692.   FSectionBreakType := Source.FSectionBreakType;
  1693.   if Source.FDefMarkerPropsList=nil then begin
  1694.     FDefMarkerPropsList.Free;
  1695.     FDefMarkerPropsList := nil;
  1696.     end
  1697.   else begin
  1698.     InitListDefaults;
  1699.     for i := 1 to 11 do
  1700.       TRVRTFMarkerProperties(FDefMarkerPropsList[i-1]).Assign(TRVRTFMarkerProperties(Source.FDefMarkerPropsList[i-1]), False);
  1701.   end;
  1702. end;
  1703. {------------------------------------------------------------------------------}
  1704. procedure TRVRTFSectionProperties.Reset;
  1705. begin
  1706.   FColumnCount      := 1;
  1707.   FPageNumberXTw    := 720;
  1708.   FPageNumberYTw    := 720;
  1709.   FPageNumberFormat := rtf_pg_Decimal;
  1710.   FSectionBreakType := rtf_sbk_Page;
  1711.   FFooterYTw        := 720;
  1712.   FHeaderYTw        := 720;
  1713.   FDefMarkerPropsList.Free;
  1714.   FDefMarkerPropsList := nil;
  1715. end;
  1716. {=========================== TRVRTFDocProperties ==============================}
  1717. constructor TRVRTFDocProperties.Create;
  1718. begin
  1719.   inherited Create;
  1720.   Reset;
  1721. end;
  1722. {------------------------------------------------------------------------------}
  1723. procedure TRVRTFDocProperties.Assign(Source: TRVRTFDocProperties);
  1724. begin
  1725.   FPaperWidthTw   := Source.FPaperWidthTw;
  1726.   FPaperHeightTw  := Source.FPaperHeightTw;
  1727.   FLeftMarginTw   := Source.FLeftMarginTw;
  1728.   FRightMarginTw  := Source.FRightMarginTw;
  1729.   FTopMarginTw    := Source.FTopMarginTw;
  1730.   FBottomMarginTw := Source.FBottomMarginTw;
  1731.   FPageNumberStart := Source.FPageNumberStart;
  1732.   FFacingPages    := Source.FFacingPages;
  1733.   FLandscape      := Source.FLandscape;
  1734. end;
  1735. {------------------------------------------------------------------------------}
  1736. procedure TRVRTFDocProperties.Reset;
  1737. begin
  1738.   FPaperWidthTw   := 12240;
  1739.   FPaperHeightTw  := 15480;
  1740.   FLeftMarginTw   := 1800;
  1741.   FRightMarginTw  := 1800;
  1742.   FTopMarginTw    := 1440;
  1743.   FBottomMarginTw := 1440;
  1744.   FPageNumberStart := 1;
  1745.   FFacingPages    := False;
  1746.   FLandscape      := False;
  1747. end;
  1748. {============================ TRVRTFStyleSheetEntry ============================}
  1749. constructor TRVRTFStyleSheetEntry.Create;
  1750. begin
  1751.   inherited Create;
  1752.   FParaProps := TRVRTFParaProperties.Create;
  1753.   FCharProps := TRVRTFCharProperties.Create;
  1754.   FAdditive := False;
  1755.   FHidden   := False;
  1756.   FStyleType := rtf_sst_Char;
  1757.   FNumber    := 0;
  1758.   FBasedOn   := nil;
  1759.   FNext      := Self;
  1760. end;
  1761. {------------------------------------------------------------------------------}
  1762. destructor TRVRTFStyleSheetEntry.Destroy;
  1763. begin
  1764.   FParaProps.Free;
  1765.   FCharProps.Free;
  1766.   inherited Destroy;
  1767. end;
  1768. {------------------------------------------------------------------------------}
  1769. procedure TRVRTFStyleSheetEntry.Assign(Source: TRVRTFReaderState);
  1770. begin
  1771.   FParaProps.Assign(Source.ParaProps);
  1772.   FCharProps.Assign(Source.CharProps);
  1773. end;
  1774. {============================ TRVRTFStyleSheet ================================}
  1775. procedure TRVRTFStyleSheet.AddPara(Number: Integer);
  1776. var item: TRVRTFStyleSheetEntry;
  1777. begin
  1778.   item := TRVRTFStyleSheetEntry.Create;
  1779.   item.FNumber := Number;
  1780.   item.FStyleType := rtf_sst_Par;
  1781.   Add(item);
  1782. end;
  1783. {------------------------------------------------------------------------------}
  1784. function TRVRTFStyleSheet.Get(Index: Integer): TRVRTFStyleSheetEntry;
  1785. begin
  1786.   Result := TRVRTFStyleSheetEntry(inherited Get(Index));
  1787. end;
  1788. {------------------------------------------------------------------------------}
  1789. function TRVRTFStyleSheet.GetEntry(Number: Integer): TRVRTFStyleSheetEntry;
  1790. var i: Integer;
  1791. begin
  1792.   Result := nil;
  1793.   for i := 0 to Count-1 do
  1794.     if Items[i].Number = Number then begin
  1795.       Result := Items[i];
  1796.       break;
  1797.     end;
  1798. end;
  1799. {------------------------------------------------------------------------------}
  1800. procedure TRVRTFStyleSheet.Put(Index: Integer;
  1801.   const Value: TRVRTFStyleSheetEntry);
  1802. begin
  1803.   inherited Put(Index, Value);
  1804. end;
  1805. {========================= TRVRTFReaderState ==================================}
  1806. constructor TRVRTFReaderState.Create;
  1807. begin
  1808.   inherited Create;
  1809.   FParaProps := TRVRTFParaProperties.Create;
  1810.   FCharProps := TRVRTFCharProperties.Create;
  1811.   FSectProps := TRVRTFSectionProperties.Create;
  1812.   FDocProps  := TRVRTFDocProperties.Create;
  1813. end;
  1814. {------------------------------------------------------------------------------}
  1815. destructor TRVRTFReaderState.Destroy;
  1816. begin
  1817.   FParaProps.Free;
  1818.   FCharProps.Free;
  1819.   FSectProps.Free;
  1820.   FDocProps.Free;
  1821.   FRowProps.Free;
  1822.   FInvalidFieldPicture.Free;
  1823.   inherited Destroy;
  1824. end;
  1825. {------------------------------------------------------------------------------}
  1826. procedure TRVRTFReaderState.Assign(Source: TRVRTFReaderState);
  1827. begin
  1828.   ParaProps.Assign(Source.ParaProps);
  1829.   CharProps.Assign(Source.CharProps);
  1830.   FSectProps.Assign(Source.SectProps);
  1831.   FDocProps.Assign(Source.DocProps);
  1832.   FDefLanguage := Source.FDefLanguage;
  1833.   if Source.FRowProps<>nil then begin
  1834.     if FRowProps=nil then
  1835.       FRowProps := TRVRTFRowProperties.Create;
  1836.     FRowProps.Assign(Source.FRowProps);
  1837.     end
  1838.   else begin
  1839.     FRowProps.Free;
  1840.     FRowProps := nil;
  1841.   end;
  1842.   rds        := Source.rds;
  1843.   ris        := Source.ris;
  1844.   FCurrentBorderType := Source.FCurrentBorderType;
  1845.   FHFType    := Source.FHFType;
  1846. end;
  1847. {------------------------------------------------------------------------------}
  1848. procedure TRVRTFReaderState.ChangeFontStyle(fs: TFontStyle; Val: Integer);
  1849. begin
  1850.   if Val=0 then
  1851.     Exclude(CharProps.FStyle, fs)
  1852.   else
  1853.     Include(CharProps.FStyle, fs);
  1854. end;
  1855. {------------------------------------------------------------------------------}
  1856. procedure TRVRTFReaderState.ChangeFontStyleEx(fs: TRVRTFFontStyleEx;
  1857.   Val: Integer);
  1858. begin
  1859.   if Val=0 then
  1860.     Exclude(CharProps.FStyleEx, fs)
  1861.   else
  1862.     Include(CharProps.FStyleEx, fs);
  1863. end;
  1864. {------------------------------------------------------------------------------}
  1865. procedure TRVRTFReaderState.Reset;
  1866. begin
  1867.   FDefLanguage := 0;
  1868.   CharProps.Reset(DefLanguage, 0);
  1869.   ParaProps.Reset;
  1870.   SectProps.Reset;
  1871.   DocProps.Reset;
  1872.   FRowProps.Free;
  1873.   FRowProps := nil;
  1874.   FFieldCode := '';
  1875.   FFieldPictureIncluded := False;
  1876.   FCurrentBorderType := rtf_bt_Para;
  1877.   DefFontNumber := 0;
  1878.   DefFontIndex  := -1;
  1879.   FHFType := rtf_hf_MainText;
  1880.   FInvalidFieldPicture.Free;
  1881.   FInvalidFieldPicture := nil;  
  1882. end;
  1883. {------------------------------------------------------------------------------}
  1884. function TRVRTFReaderState.GetRowProps: TRVRTFRowProperties;
  1885. begin
  1886.   if FRowProps=nil then
  1887.     FRowProps := TRVRTFRowProperties.Create;
  1888.   Result := FRowProps;
  1889. end;
  1890. {------------------------------------------------------------------------------}
  1891. function TRVRTFReaderState.GetCurrentBorderSide: TRVRTFBorderSide;
  1892. begin
  1893.   case FCurrentBorderType of
  1894.     rtf_bt_Row:
  1895.       Result := RowProps.Border.Sides[RowProps.FCurBorderSide];
  1896.     rtf_bt_Cell:
  1897.       Result := RowProps.GetLastCellProp.Border.Sides[RowProps.GetLastCellProp.FCurBorderSide];
  1898.     else
  1899.       Result := ParaProps.Border.Sides[ParaProps.FCurBorderSide];
  1900.   end;
  1901. end;
  1902. {============================== TRVRTFBorderSide ==============================}
  1903. procedure TRVRTFBorderSide.Assign(Source: TRVRTFBorderSide);
  1904. begin
  1905.   FBorderType := Source.BorderType;
  1906.   FWidthTw    := Source.WidthTw;
  1907.   FColor      := Source.Color;
  1908.   FSpaceTw    := Source.SpaceTw;
  1909. end;
  1910. {------------------------------------------------------------------------------}
  1911. procedure TRVRTFBorderSide.Reset;
  1912. begin
  1913.   FBorderType := rtf_brdr_None;
  1914.   FWidthTw    := 0;
  1915.   FColor      := clNone;
  1916.   FSpaceTw    := 0;
  1917. end;
  1918. {============================== TRVRTFParaBorder ==============================}
  1919. destructor TRVRTFParaBorder.Destroy;
  1920. var i: TRVRTFSide;
  1921. begin
  1922.   for i := Low(TRVRTFSide) to High(TRVRTFSide) do
  1923.     FSides[i].Free;
  1924. end;
  1925. {------------------------------------------------------------------------------}
  1926. procedure TRVRTFParaBorder.Assign(Source: TRVRTFParaBorder);
  1927. var i: TRVRTFSide;
  1928. begin
  1929.   for i := Low(TRVRTFSide) to High(TRVRTFSide) do
  1930.     if Source.FSides[i]=nil then begin
  1931.       FSides[i].Free;
  1932.       FSides[i] := nil;
  1933.       end
  1934.     else
  1935.       Sides[i].Assign(Source.FSides[i]);
  1936. end;
  1937. {------------------------------------------------------------------------------}
  1938. procedure TRVRTFParaBorder.Reset;
  1939. var i: TRVRTFSide;
  1940. begin
  1941.   for i := Low(TRVRTFSide) to High(TRVRTFSide) do
  1942.     if FSides[i]<>nil then
  1943.       FSides[i].Reset;
  1944. end;
  1945. {------------------------------------------------------------------------------}
  1946. function TRVRTFParaBorder.GetSides(Index: TRVRTFSide): TRVRTFBorderSide;
  1947. begin
  1948.   if FSides[Index]=nil then
  1949.     FSides[Index] := TRVRTFBorderSide.Create;
  1950.   Result := FSides[Index];
  1951. end;
  1952. {============================= TRVRTFPicture ==================================}
  1953. constructor TRVRTFPicture.Create;
  1954. begin
  1955.   inherited Create;
  1956.   FData := TMemoryStream.Create;
  1957.   FPicScaleX := 100;
  1958.   FPicScaleY := 100;
  1959.   FWBMBitsPixel := 1;
  1960.   FWBMPlanes    := 1;
  1961. end;
  1962. {------------------------------------------------------------------------------}
  1963. destructor TRVRTFPicture.Destroy;
  1964. begin
  1965.   FData.Free;
  1966.   inherited Destroy;
  1967. end;
  1968. {============================== TRVRTFObject ==================================}
  1969. constructor TRVRTFObject.Create;
  1970. begin
  1971.   inherited;
  1972.   FData := TMemoryStream.Create;
  1973. end;
  1974. {------------------------------------------------------------------------------}
  1975. destructor TRVRTFObject.Destroy;
  1976. begin
  1977.   FData.Free;
  1978.   inherited;
  1979. end;
  1980. {============================ TRVRTFRowProperties =============================}
  1981. constructor TRVRTFRowProperties.Create;
  1982. begin
  1983.   inherited Create;
  1984.   FBorder := TRVRTFParaBorder.Create;
  1985.   FCellProps := TRVRTFCellPropsList.Create;
  1986.   Reset;
  1987. end;
  1988. {------------------------------------------------------------------------------}
  1989. destructor TRVRTFRowProperties.Destroy;
  1990. begin
  1991.   FBorder.Free;
  1992.   CellProps.Free;
  1993.   inherited Destroy;
  1994. end;
  1995. {------------------------------------------------------------------------------}
  1996. procedure TRVRTFRowProperties.Reset;
  1997. var side: TRVRTFSide;
  1998. begin
  1999.   FGapHTw    := 0;
  2000.   FLeftTw    := 0;
  2001.   FHeightTw  := 0;
  2002.   FBestWidth := 0;
  2003.   for side := Low(TRVRTFSide) to High(TRVRTFSide) do begin
  2004.     FPaddingTw[side] := 0;
  2005.     FSpacingTw[side] := 0;
  2006.     FUsePadding[side] := False;
  2007.     FUseSpacing[side] := False;
  2008.   end;
  2009.   FCurBorderSide := rtf_side_Left;
  2010.   FBorder.Reset;
  2011.   FCellProps.Clear;
  2012.   FCellProps.AddNew;
  2013.   NewCellProps := True;
  2014.   AssumedLastCell := True;
  2015.   FHeading := False;
  2016.   {$IFDEF RICHVIEW}
  2017.   RichViewSpecial := False;
  2018.   {$ENDIF}
  2019. end;
  2020. {------------------------------------------------------------------------------}
  2021. procedure TRVRTFRowProperties.Assign(Source: TRVRTFRowProperties);
  2022. var side: TRVRTFSide;
  2023. begin
  2024.   FGapHTw    := Source.FGapHTw;
  2025.   FLeftTw    := Source.FLeftTw;
  2026.   FHeightTw  := Source.FHeightTw;
  2027.   FBestWidth := Source.FBestWidth;
  2028.   FCurBorderSide := Source.FCurBorderSide;
  2029.   for side := Low(TRVRTFSide) to High(TRVRTFSide) do begin
  2030.     FPaddingTw[side] := Source.FPaddingTw[side];
  2031.     FSpacingTw[side] := Source.FSpacingTw[side];
  2032.     FUsePadding[side] := Source.FUsePadding[side];
  2033.     FUseSpacing[side] := Source.FUseSpacing[side];
  2034.   end;
  2035.   NewCellProps    := Source.NewCellProps;
  2036.   AssumedLastCell := Source.AssumedLastCell;
  2037.   FBorder.Assign(Source.FBorder);
  2038.   FCellProps.AssignItems(Source.FCellProps);
  2039.   {$IFDEF RICHVIEW}
  2040.   RichViewSpecial := Source.RichViewSpecial;
  2041.   {$ENDIF}
  2042. end;
  2043. {------------------------------------------------------------------------------}
  2044. procedure TRVRTFRowProperties.Finalize;
  2045. var i: Integer;
  2046. begin
  2047.   if AssumedLastCell then begin
  2048.     CellProps.Delete(CellProps.Count-1);
  2049.     AssumedLastCell := False;
  2050.   end;
  2051.   if NewCellProps then begin
  2052.     for i := 0 to CellProps.Count-1 do
  2053.       CellProps[i].Finalize;
  2054.     NewCellProps := False;
  2055.   end;
  2056. end;
  2057. {------------------------------------------------------------------------------}
  2058. function TRVRTFRowProperties.GetPaddingTw(Index: TRVRTFSide): Integer;
  2059. begin
  2060.   Result := FPaddingTW[Index];
  2061. end;
  2062. {------------------------------------------------------------------------------}
  2063. function TRVRTFRowProperties.GetSpacingTw(Index: TRVRTFSide): Integer;
  2064. begin
  2065.   Result := FSpacingTW[Index];
  2066. end;
  2067. {------------------------------------------------------------------------------}
  2068. function TRVRTFRowProperties.GetUsePadding(Index: TRVRTFSide): Boolean;
  2069. begin
  2070.   Result := FUsePadding[Index];
  2071. end;
  2072. {------------------------------------------------------------------------------}
  2073. function TRVRTFRowProperties.GetUseSpacing(Index: TRVRTFSide): Boolean;
  2074. begin
  2075.   Result := FUseSpacing[Index];
  2076. end;
  2077. {------------------------------------------------------------------------------}
  2078. function TRVRTFRowProperties.GetLastCellProp: TRVRTFCellProperties;
  2079. begin
  2080.   //AssumedLastCell := False;
  2081.   Result := CellProps[CellProps.Count-1];
  2082. end;
  2083. {============================ TRVRTFCellProperties ============================}
  2084. constructor TRVRTFCellProperties.Create;
  2085. begin
  2086.   inherited Create;
  2087.   FBorder := TRVRTFParaBorder.Create;
  2088.   Reset;
  2089. end;
  2090. {------------------------------------------------------------------------------}
  2091. destructor TRVRTFCellProperties.Destroy;
  2092. begin
  2093.   FBorder.Free;
  2094.   inherited Destroy;
  2095. end;
  2096. {------------------------------------------------------------------------------}
  2097. procedure TRVRTFCellProperties.Reset;
  2098. begin
  2099.   FHMerge := rtf_cm_None;
  2100.   FVMerge := rtf_cm_None;
  2101.   FBestWidth := 0;
  2102.   FColor  := clNone;
  2103.   FVAlign := rtf_val_Top;
  2104.   FCurBorderSide := rtf_side_Left;
  2105.   FRightBoundaryTw := 0;
  2106.   ForeColor := clBlack;
  2107.   Shading   := 0;
  2108.   FBorder.Reset;
  2109.   {$IFDEF RICHVIEW}
  2110.   BestHeight := 0;
  2111.   {$ENDIF}
  2112. end;
  2113. {------------------------------------------------------------------------------}
  2114. procedure TRVRTFCellProperties.Assign(Source: TRVRTFCellProperties);
  2115. begin
  2116.   FHMerge := Source.FHMerge;
  2117.   FVMerge := Source.FVMerge;
  2118.   FBestWidth := Source.FBestWidth;
  2119.   FColor  := Source.FColor;
  2120.   FVAlign := Source.FVAlign;
  2121.   FCurBorderSide := Source.FCurBorderSide;
  2122.   FRightBoundaryTw := Source.FRightBoundaryTw;
  2123.   ForeColor := Source.ForeColor;
  2124.   Shading   := Source.Shading;
  2125.   FBorder.Assign(Source.FBorder);
  2126.   {$IFDEF RICHVIEW}
  2127.   BestHeight := Source.BestHeight;
  2128.   {$ENDIF}
  2129. end;
  2130. {------------------------------------------------------------------------------}
  2131. procedure TRVRTFCellProperties.Finalize;
  2132. begin
  2133.   if (Shading>0) then begin
  2134.     if (FColor=clNone) then
  2135.       FColor := clWhite;
  2136.     FColor := ShadeColor(ColorToRGB(Color), ColorToRGB(ForeColor), Shading);
  2137.     Shading := 0;
  2138.   end;
  2139. end;
  2140. {=========================== TRVRTFCellPropsList ==============================}
  2141. procedure TRVRTFCellPropsList.AddNew;
  2142. var item: TRVRTFCellProperties;
  2143. begin
  2144.   item := TRVRTFCellProperties.Create;
  2145.   Add(item);
  2146. end;
  2147. {------------------------------------------------------------------------------}
  2148. procedure TRVRTFCellPropsList.AssignItems(Source: TRVRTFCellPropsList);
  2149. var i: Integer;
  2150.     item: TRVRTFCellProperties;
  2151. begin
  2152.   Clear;
  2153.   Capacity := Source.Count;
  2154.   for i := 0 to Source.Count-1 do begin
  2155.     item := TRVRTFCellProperties.Create;
  2156.     item.Assign(Source[i]);
  2157.     Add(item);
  2158.   end;
  2159. end;
  2160. {------------------------------------------------------------------------------}
  2161. function TRVRTFCellPropsList.Get(Index: Integer): TRVRTFCellProperties;
  2162. begin
  2163.   Result := TRVRTFCellProperties(inherited Get(Index));
  2164. end;
  2165. {------------------------------------------------------------------------------}
  2166. procedure TRVRTFCellPropsList.Put(Index: Integer;
  2167.   const Value: TRVRTFCellProperties);
  2168. begin
  2169.   inherited Put(Index, Value);
  2170. end;
  2171. {============================ TRVRTFCustomMarkerProperties ====================}
  2172. constructor TRVRTFCustomMarkerProperties.Create;
  2173. begin
  2174.   inherited Create;
  2175.   Reset;
  2176. end;
  2177. {------------------------------------------------------------------------------}
  2178. procedure TRVRTFCustomMarkerProperties.Assign(Source: TRVRTFCustomMarkerProperties; FromDefaults: Boolean);
  2179.   procedure UpdateStyle(Fixed: TRVRTFMarkerProp; Style: TFontStyle);
  2180.   begin
  2181.     if not (Fixed in Source.FFixedProperties) then
  2182.       if Style in Source.FontStyle then
  2183.         Include(FFontStyle, Style)
  2184.       else
  2185.         Exclude(FFontStyle, Style);
  2186.   end;
  2187. begin
  2188.   FListType    := Source.FListType;
  2189.   FAlignment   := Source.FAlignment;
  2190.   FIndentTw    := Source.FIndentTw;
  2191.   FSpaceTw     := Source.FSpaceTw;
  2192.   FStart       := Source.FStart;
  2193.   FFixedProperties := Source.FFixedProperties;
  2194.   if not FromDefaults then begin
  2195.     FFontIndex   := Source.FFontIndex;
  2196.     FFontStyle   := Source.FFontStyle;
  2197.     FColor       := Source.FColor;
  2198.     FFontSize    := Source.FFontSize;
  2199.     end
  2200.   else begin
  2201.     if not (rtfmp_Color in FFixedProperties) then
  2202.       FColor := Source.Color;
  2203.     if not (rtfmp_FontIndex in FFixedProperties) then
  2204.       FFontIndex := Source.FontIndex;
  2205.     if not (rtfmp_Size in FFixedProperties) then
  2206.       FFontSize := Source.FontSize;
  2207.     UpdateStyle(rtfmp_Bold, fsBold);
  2208.     UpdateStyle(rtfmp_Italic, fsItalic);
  2209.     UpdateStyle(rtfmp_Underline, fsUnderline);
  2210.     UpdateStyle(rtfmp_StrikeOut, fsStrikeOut);
  2211.   end;
  2212. end;
  2213. {------------------------------------------------------------------------------}
  2214. procedure TRVRTFCustomMarkerProperties.Reset;
  2215. begin
  2216.   FListType   := rtf_pn_Default;
  2217.   FFontIndex  := -1;
  2218.   FFontStyle  := [];
  2219.   FColor      := clWindowText;
  2220.   FFontSize   := 12;
  2221.   FAlignment  := rtf_al_Left;
  2222.   FIndentTw   := 0;
  2223.   FSpaceTw    := 0;
  2224.   FStart      := 0;
  2225.   FFixedProperties := [];
  2226. end;
  2227. {------------------------------------------------------------------------------}
  2228. procedure TRVRTFCustomMarkerProperties.UpdateFrom(
  2229.   CharProps: TRVRTFCharProperties);
  2230.   procedure UpdateStyle(Fixed: TRVRTFMarkerProp; Style: TFontStyle);
  2231.   begin
  2232.     if not (Fixed in FFixedProperties) then
  2233.       if Style in CharProps.Style then
  2234.         Include(FFontStyle, Style)
  2235.       else
  2236.         Exclude(FFontStyle, Style);
  2237.   end;
  2238. begin
  2239.   if not (rtfmp_Color in FFixedProperties) then
  2240.     FColor := CharProps.Color;
  2241.   if not (rtfmp_FontIndex in FFixedProperties) then
  2242.     FFontIndex := CharProps.FontIndex;
  2243.   if not (rtfmp_Size in FFixedProperties) then
  2244.     FFontSize := CharProps.Size;
  2245.   UpdateStyle(rtfmp_Bold, fsBold);
  2246.   UpdateStyle(rtfmp_Italic, fsItalic);
  2247.   UpdateStyle(rtfmp_StrikeOut, fsStrikeOut);
  2248. end;
  2249. {------------------------------------------------------------------------------}
  2250. procedure TRVRTFCustomMarkerProperties.ChangeFontStyle(fs: TFontStyle;
  2251.   Val: Integer);
  2252. begin
  2253.   if Val=0 then
  2254.     Exclude(FFontStyle, fs)
  2255.   else
  2256.     Include(FFontStyle, fs);
  2257. end;
  2258. {=========================== TRVRTFMarkerProperties ===========================}
  2259. procedure TRVRTFMarkerProperties.Assign(Source: TRVRTFMarkerProperties; FromDefaults: Boolean);
  2260. begin
  2261.   inherited Assign(Source, FromDefaults);
  2262.   FTextAfter   := Source.FTextAfter;
  2263.   FTextBefore  := Source.FTextBefore;
  2264.   FHanging     := Source.FHanging;
  2265.   if not FromDefaults then
  2266.     FLevel  := Source.FLevel;
  2267. end;
  2268. {------------------------------------------------------------------------------}
  2269. procedure TRVRTFMarkerProperties.Reset;
  2270. begin
  2271.   inherited Reset;
  2272.   FLevel      := 0;
  2273.   FTextAfter  := '';
  2274.   FTextBefore := '';
  2275.   FHanging    := False;
  2276. end;
  2277. {============================== TRVRTFListLevel97 =============================}
  2278. procedure TRVRTFListLevel97.Assign(Source: TRVRTFListLevel97);
  2279. begin
  2280.   inherited Assign(Source, False);
  2281.   FOldStyle := Source.FOldStyle;
  2282.   FLegal    := Source.FLegal;
  2283.   FNoRestart:= Source.FNoRestart;
  2284.   FText     := Source.FText;
  2285.   FNumbers  := Source.FNumbers;
  2286.   FFollow   := Source.FFollow;
  2287.   FIndentsUpdated := Source.FIndentsUpdated;
  2288. end;
  2289. {------------------------------------------------------------------------------}
  2290. procedure TRVRTFListLevel97.Reset;
  2291. begin
  2292.   inherited;
  2293.   FOldStyle := False;
  2294.   FLegal    := False;
  2295.   FNoRestart:= False;
  2296.   FText     := '';
  2297.   FNumbers  := '';
  2298.   FFollow   := rtf_lf_Tab;
  2299.   FFontSizeDefined := False;
  2300.   FIndentsUpdated := False;
  2301. end;
  2302. {============================== TRVRTFList97 ==================================}
  2303. procedure TRVRTFList97.AddNew;
  2304. begin
  2305.   Add(TRVRTFListLevel97.Create);
  2306. end;
  2307. {------------------------------------------------------------------------------}
  2308. function TRVRTFList97.Get(Index: Integer): TRVRTFListLevel97;
  2309. begin
  2310.   Result := TRVRTFListLevel97(inherited Get(Index));
  2311. end;
  2312. {------------------------------------------------------------------------------}
  2313. function TRVRTFList97.GetLastLevel: TRVRTFListLevel97;
  2314. begin
  2315.   Result := Items[Count-1];
  2316. end;
  2317. {------------------------------------------------------------------------------}
  2318. procedure TRVRTFList97.Put(Index: Integer; const Value: TRVRTFListLevel97);
  2319. begin
  2320.   inherited Put(Index, Value);
  2321. end;
  2322. {============================== TRVRTFListTable97 =============================}
  2323. procedure TRVRTFListTable97.AddNew;
  2324. begin
  2325.   Add(TRVRTFList97.Create);
  2326. end;
  2327. {------------------------------------------------------------------------------}
  2328. function TRVRTFListTable97.FindList(ID: Integer): Integer;
  2329. var i: Integer;
  2330. begin
  2331.   for i := 0 to Count-1 do
  2332.     if Items[i].Id = ID then begin
  2333.       Result := i;
  2334.       exit;
  2335.     end;
  2336.   Result := -1;
  2337. end;
  2338. {------------------------------------------------------------------------------}
  2339. function TRVRTFListTable97.Get(Index: Integer): TRVRTFList97;
  2340. begin
  2341.   Result := TRVRTFList97(inherited Get(Index));
  2342. end;
  2343. {------------------------------------------------------------------------------}
  2344. function TRVRTFListTable97.GetLastList: TRVRTFList97;
  2345. begin
  2346.   Result := Items[Count-1];
  2347. end;
  2348. {------------------------------------------------------------------------------}
  2349. procedure TRVRTFListTable97.Put(Index: Integer; const Value: TRVRTFList97);
  2350. begin
  2351.   inherited Put(Index, Value);
  2352. end;
  2353. {============================ TRVRTFListOverrideLevel =========================}
  2354. constructor TRVRTFListOverrideLevel97.Create;
  2355. begin
  2356.   inherited Create;
  2357.   FStart := 1;
  2358. end;
  2359. {============================= TRVRTFListOverride97 ===========================}
  2360. procedure TRVRTFListOverride97.AddNew;
  2361. begin
  2362.   Add(TRVRTFListOverrideLevel97.Create);
  2363. end;
  2364. {------------------------------------------------------------------------------}
  2365. function TRVRTFListOverride97.GetLastLevel: TRVRTFListOverrideLevel97;
  2366. begin
  2367.   Result := Items[Count-1];
  2368. end;
  2369. {------------------------------------------------------------------------------}
  2370. function TRVRTFListOverride97.Get(Index: Integer): TRVRTFListOverrideLevel97;
  2371. begin
  2372.   Result := TRVRTFListOverrideLevel97(inherited Get(Index));
  2373. end;
  2374. {------------------------------------------------------------------------------}
  2375. procedure TRVRTFListOverride97.Put(Index: Integer;
  2376.   const Value: TRVRTFListOverrideLevel97);
  2377. begin
  2378.   inherited Put(Index, Value);
  2379. end;
  2380. {=========================== TRVRTFListOverrideTable97 ========================}
  2381. procedure TRVRTFListOverrideTable97.AddNew;
  2382. begin
  2383.   Add(TRVRTFListOverride97.Create);
  2384. end;
  2385. {------------------------------------------------------------------------------}
  2386. function TRVRTFListOverrideTable97.FindListOverride(Number: Integer): Integer;
  2387. var i: Integer;
  2388. begin
  2389.   for i := 0 to Count-1 do
  2390.     if Items[i].Number = Number then begin
  2391.       Result := i;
  2392.       exit;
  2393.     end;
  2394.   Result := -1;
  2395. end;
  2396. {------------------------------------------------------------------------------}
  2397. function TRVRTFListOverrideTable97.Get(
  2398.   Index: Integer): TRVRTFListOverride97;
  2399. begin
  2400.   Result := TRVRTFListOverride97(inherited Get(Index));
  2401. end;
  2402. {------------------------------------------------------------------------------}
  2403. function TRVRTFListOverrideTable97.GetLastListOverride: TRVRTFListOverride97;
  2404. begin
  2405.   Result := Items[Count-1];
  2406. end;
  2407. {------------------------------------------------------------------------------}
  2408. procedure TRVRTFListOverrideTable97.Put(Index: Integer;
  2409.   const Value: TRVRTFListOverride97);
  2410. begin
  2411.   inherited Put(Index, Value);
  2412. end;
  2413. {================================== TRVRTFFont ================================}
  2414. constructor TRVRTFFont.Create;
  2415. begin
  2416.   inherited;
  2417.   {$IFDEF RICHVIEWCBDEF3}
  2418.   Charset := DEFAULT_CHARSET;
  2419.   {$ENDIF}
  2420. end;
  2421. {================================ TRVRTFTab ===================================}
  2422. {$IFNDEF RVDONOTUSETABS}
  2423. procedure TRVRTFTab.Assign(Source: TRVRTFTab);
  2424. begin
  2425.   FPositionTW := Source.PositionTW;
  2426.   FAlign      := Source.Align;
  2427.   FLeader     := Source.Leader;
  2428.   FIsListTab    := Source.IsListTab;
  2429. end;
  2430. {============================== TRVRTFTabList =================================}
  2431. procedure TRVRTFTabList.AddNew;
  2432. var Item: TRVRTFTab;
  2433. begin
  2434.   Item := TRVRTFTab.Create;
  2435.   Add(Item);
  2436. end;
  2437. {------------------------------------------------------------------------------}
  2438. function TRVRTFTabList.GetLastTab: TRVRTFTab;
  2439. begin
  2440.   Result := Items[Count-1];
  2441. end;
  2442. {------------------------------------------------------------------------------}
  2443. function TRVRTFTabList.Get(Index: Integer): TRVRTFTab;
  2444. begin
  2445.   Result := TRVRTFTab(inherited Get(Index));
  2446. end;
  2447. {------------------------------------------------------------------------------}
  2448. procedure TRVRTFTabList.Put(Index: Integer; const Value: TRVRTFTab);
  2449. begin
  2450.   inherited Put(Index, Value);
  2451. end;
  2452. {------------------------------------------------------------------------------}
  2453. procedure TRVRTFTabList.Assign(Source: TRVRTFTabList);
  2454. var i: Integer;
  2455. begin
  2456.   Clear;
  2457.   if Source=nil then
  2458.     exit;
  2459.   Capacity := Source.Count;
  2460.   for i := 0 to Source.Count-1 do begin
  2461.     AddNew;
  2462.     Items[i].Assign(Source[i]);
  2463.   end;
  2464. end;
  2465. {$ENDIF}
  2466. {==============================================================================}
  2467. procedure QSort(L, R: Integer);
  2468. var
  2469.   I, J: Integer;
  2470.   P: TRVRTFsymbol;
  2471.   T: TRVRTFsymbol;
  2472. begin
  2473.   repeat
  2474.     I := L;
  2475.     J := R;
  2476.     P := rgsymRtf[(L + R) shr 1];
  2477.     repeat
  2478.       while rgsymRtf[I].Keyword < P.Keyword do
  2479.         inc(I);
  2480.       while rgsymRtf[J].Keyword > P.Keyword do
  2481.         dec(J);
  2482.       if I <= J then begin
  2483.         T := rgsymRtf[I];
  2484.         rgsymRtf[I] := rgsymRtf[J];
  2485.         rgsymRtf[J] := T;
  2486.         inc(I);
  2487.         dec(J);
  2488.       end;
  2489.     until I > J;
  2490.     if L < J then
  2491.       QSort(L, J);
  2492.     L := I;
  2493.   until I >= R;
  2494. end;
  2495. const KWSorted: Boolean = False;
  2496. procedure SortKeywords;
  2497. begin
  2498.   if KWSorted then
  2499.     exit;
  2500.   KWSorted := True;
  2501.   QSort(0,isymMax);
  2502. end;
  2503. {$IFNDEF RICHVIEW}
  2504. {------------------------------------------------------------------------------}
  2505. function RV_CreateGraphicsDefault(GraphicClass: TGraphicClass): TGraphic;
  2506. begin
  2507.   Result := GraphicClass.Create;
  2508. end;
  2509. {------------------------------------------------------------------------------}
  2510. procedure RV_AfterImportGraphicDefault(Graphic: TGraphic);
  2511. begin
  2512. end;
  2513. initialization
  2514.   RV_CreateGraphics := RV_CreateGraphicsDefault;
  2515.   RV_AfterImportGraphic := RV_AfterImportGraphicDefault;
  2516. {$ENDIF}
  2517. end.