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

RichEdit

开发平台:

Delphi

  1. begin
  2.   if ((FSelStartRow<0) or (FSelStartCol<0)) and
  3.      (rvtsSelExists in FState) then begin
  4.     Exclude(FState, rvtsSelExists);
  5.     TCustomRVFormattedData(FRows.FMainRVData).ReleaseMouseCapture(Self);
  6.     if (TCustomRVFormattedData(FRows.FMainRVData).GetChosenRVData<>nil) then
  7.       TCustomRVFormattedData(FRows.FMainRVData).SilentReplaceChosenRVData(nil);
  8.     FMakingSelection := False;
  9.   end;
  10.   if not (rvtsSelExists in FState) then begin
  11.     if IncludeEditedCell and (FInplaceEditor<>nil) then begin
  12.       TopRow := TRVTableInplaceEdit(FInplaceEditor).FRow;
  13.       LeftCol := TRVTableInplaceEdit(FInplaceEditor).FCol;
  14.       Cell := Cells[TopRow,LeftCol];
  15.       ColSpan := Cell.ColSpan;
  16.       RowSpan := Cell.RowSpan;
  17.       Result := True;
  18.       exit;
  19.       end
  20.     else
  21.       Result := False;
  22.     exit;
  23.   end;
  24.   Cell := Rows.GetMainCell(FSelStartRow,FSelStartCol,TopRow,LeftCol);
  25.   ColSpan := LeftCol+Cell.ColSpan-1;
  26.   RowSpan := TopRow+Cell.RowSpan-1;
  27.   Cell := Rows.GetMainCell(FSelStartRow+FSelRowOffs,
  28.                            FSelStartCol+FSelColOffs,
  29.                            r,c);
  30.   if r<TopRow then
  31.     TopRow := r;
  32.   if c<LeftCol then
  33.     LeftCol := c;
  34.   if r+Cell.RowSpan-1>RowSpan then
  35.     RowSpan := r+Cell.RowSpan-1;
  36.   if c+Cell.ColSpan-1>ColSpan then
  37.     ColSpan := c+Cell.ColSpan-1;
  38.   dec(ColSpan, LeftCol-1);
  39.   dec(RowSpan, TopRow-1);
  40.   Result   := True;
  41. end;
  42. {------------------------------------------------------------------------------}
  43. procedure TRVTableItemInfo.UpdateCellSel;
  44. var r,c: Integer;
  45. begin
  46.   for r := 0 to Rows.Count-1 do
  47.     with Rows[r] do
  48.       for c := 0 to Count-1 do
  49.         if Items[c]<>nil then begin
  50.           if IsCellSelected(r,c) then
  51.             Include(Items[c].State, rvstCompletelySelected)
  52.           else begin
  53.             if not ({not CanChange and} (r=FSelStartRow) and (c=FSelStartCol)) then
  54.               Items[c].Deselect(nil, True);
  55.             Exclude(Items[c].State, rvstCompletelySelected);
  56.           end;
  57.         end;
  58.   {$IFNDEF RVDONOTUSEANIMATION}
  59.   if Rows.FMainRVData is TCustomRVFormattedData then
  60.     TCustomRVFormattedData(Rows.FMainRVData).ResetAniBackground;
  61.   {$ENDIF}
  62. end;
  63. {------------------------------------------------------------------------------}
  64. procedure TRVTableItemInfo.DeselectPartial;
  65. begin
  66.   Deselect;
  67. end;
  68. {------------------------------------------------------------------------------}
  69. function TRVTableItemInfo.PartiallySelected: Boolean;
  70. begin
  71.   Result := rvtsSelExists in FState;
  72. end;
  73. {------------------------------------------------------------------------------}
  74. procedure TRVTableItemInfo.AdjustInserted(x, y: Integer; adjusty: Boolean);
  75. var r,c: Integer;
  76. begin
  77.   if (FInplaceEditor<>nil) and
  78.      (TRVTableInplaceEdit(FInplaceEditor).FCell<>nil) then
  79.     with TRVTableInplaceEdit(FInplaceEditor).FCell do begin
  80.       FInplaceEditor.Tag := y+Top+GetExtraVOffs;
  81.       SetInplaceBounds(x+Left, RV_GetYByTag(FInplaceEditor), Width, Height-GetExtraVOffs);
  82.       FInplaceEditor.RVData.Format_(True,False,False,0,FInplaceEditor.Canvas,
  83.       False,False,False);
  84.     end;
  85.   MyClientLeft := x;
  86.   MyClientTop  := y;
  87.   for r := 0 to Rows.Count-1 do begin
  88.     with Rows[r] do
  89.       for c := 0 to Count-1 do
  90.         if Items[c]<>nil then
  91.           Items[c].AdjustChildrenCoords;
  92.   end;
  93. end;
  94. {------------------------------------------------------------------------------}
  95. function TRVTableItemInfo.OwnsControl(AControl: TControl): Boolean;
  96. var r,c,i: Integer;
  97. begin
  98.   Result := GetCellWhichOwnsControl(AControl, r,c,i);
  99. end;
  100. {------------------------------------------------------------------------------}
  101. function TRVTableItemInfo.OwnsInplaceEditor(AEditor: TControl): Boolean;
  102. begin
  103.   Result := FInplaceEditor=AEditor;
  104. end;
  105. {------------------------------------------------------------------------------}
  106. function TRVTableItemInfo.GetCellWhichOwnsControl(AControl: TControl; var ARow,ACol,AItemNo: Integer): Boolean;
  107. var r,c: Integer;
  108. begin
  109.   for r := 0 to Rows.Count-1 do
  110.     with Rows[r] do
  111.       for c := 0 to Count-1 do
  112.         if (Items[c]<>nil) then begin
  113.           AItemNo := Items[c].GetRVData.FindControlItemNo(AControl);
  114.           if (AItemNo<>-1) then begin
  115.             ARow := r;
  116.             ACol := c;
  117.             Result := True;
  118.             exit;
  119.           end;
  120.         end;
  121.   Result := False;
  122. end;
  123. {------------------------------------------------------------------------------}
  124. procedure TRVTableItemInfo.MergeInplaceUndo(DestroyLists: Boolean);
  125.   {........................................................}
  126.   procedure AddList(var List: TRVUndoList; DestList: TRVUndoList; IsRedo: Boolean);
  127.   var ui: TRVUndoCellModify;
  128.       UndoLimit: Integer;
  129.   begin
  130. //    DestList.PopIfEmpty;
  131.     if List.Count>0 then begin
  132.       UndoLimit := List.Limit;
  133.       if IsRedo then
  134.         TRVEditRVData(FRows.FMainRVData).BeginRedoSequence(rvutModifyItem,'')
  135.       else
  136.         TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, False);
  137.       ui := TRVUndoCellModify.Create;
  138.       ui.Row := TRVTableInplaceEdit(FInplaceEditor).FRow;
  139.       ui.Col := TRVTableInplaceEdit(FInplaceEditor).FCol;
  140.       ui.CaretItemNo := FInplaceEditor.CurItemNo;
  141.       ui.CaretOffs   := FInplaceEditor.OffsetInCurItem;
  142.       ui.UndoList := List;
  143.       ui.Action := rvuModifyItem;
  144.       ui.ItemNo := GetEditorItemNoForUndo;
  145.       ui.IsRedo := IsRedo;
  146.       DestList.AddInfo(ui);
  147.       TRVUndoInfos(DestList.Items[DestList.Count-1]).CaretItemNo :=  TRVUndoInfos(List.Items[List.Count-1]).CaretItemNo;
  148.       TRVUndoInfos(DestList.Items[DestList.Count-1]).CaretOffs :=  TRVUndoInfos(List.Items[List.Count-1]).CaretOffs;
  149.       if DestroyLists then
  150.         List := nil
  151.       else begin
  152.         List  := TRVUndoList.Create(DestList.FRVData);
  153.         List.Limit := UndoLimit;
  154.       end;
  155.       end
  156.     else
  157.       DestList.PopIfEmpty;
  158.   end;
  159.   {........................................................}
  160. begin
  161.   if FInplaceEditor=nil then
  162.     exit;
  163.   AddList(TRVEditRVData(FInplaceEditor.RVData).UndoList,
  164.           TRVEditRVData(FRows.FMainRVData).UndoList, False);
  165.   AddList(TRVEditRVData(FInplaceEditor.RVData).RedoList,
  166.           TRVEditRVData(FRows.FMainRVData).RedoList, True);
  167. end;
  168. {------------------------------------------------------------------------------}
  169. procedure TRVTableItemInfo.InplaceDeleted(Clearing: Boolean);
  170. var Clr: Boolean;
  171.     strg: TRVTableInplaceParamStorage;
  172.     Cell: TCustomRVFormattedData;
  173.     RVData: TRichViewRVData;
  174.     Row, Col: Integer;
  175.     ie: TCustomRichViewEdit;
  176. begin
  177.   Clr := Clearing or (rvstClearing in TCustomRVFormattedData(Rows.FMainRVData).State) or
  178.          not FRows.FMainRVData.GetParentControl.HandleAllocated;
  179.   MergeInplaceUndo(True);
  180.   Cell := TRVTableInplaceEdit(FInplaceEditor).FCell;
  181.   Row  := TRVTableInplaceEdit(FInplaceEditor).FRow;
  182.   Col  := TRVTableInplaceEdit(FInplaceEditor).FCol;
  183.   StoreRVSelection(FInplaceEditor.RVData, strg);
  184.   Cell.DrainFrom(FInplaceEditor.RVData);
  185.   if not Clr then begin
  186.     TCustomRVFormattedData(Rows.FMainRVData).GetItemClientCoords(GetMyItemNo,MyClientLeft,MyClientTop);
  187.     ie := FInplaceEditor;
  188.     FInplaceEditor := nil;
  189.     Cell.Format(False);
  190.     FInplaceEditor := ie;
  191.     RestoreRVSelection(Cell, strg);
  192.   end;
  193.   FInplaceEditor := nil;
  194.   if not Clr then begin
  195.     TRVEditRVData(Rows.FMainRVData).Invalidate;
  196.     TCustomRichViewEdit(TRichViewRVData(Rows.FMainRVData.GetRootData).RichView).AfterCaretMove;
  197.     RVData := FRows.FMainRVData.GetRootData as TRichViewRVData;
  198.     if IsInEditor and TCustomRichViewEdit(RVData.RichView).ReadOnly then
  199.       TRVEditRVData(RVData).BuildJumpsCoords(True);
  200.   end;
  201.   if Assigned(FOnCellEndEdit) then
  202.     FOnCellEndEdit(Self, Row, Col, Clr);
  203. end;
  204. {------------------------------------------------------------------------------}
  205. procedure TRVTableItemInfo.MovingToUndoList(ItemNo: Integer;
  206.   RVData, AContainerUndoItem: TObject);
  207. begin
  208.   DestroyInplace(False);
  209.   if Rows.Count>0 then
  210.     Rows.MovingToUndoList(0,0,Rows[0].Count,Rows.Count, TRVUndoInfo(AContainerUndoItem));
  211.   Rows.FMainRVData := nil;
  212.   inherited MovingToUndoList(ItemNo, RVData, AContainerUndoItem);
  213. end;
  214. {------------------------------------------------------------------------------}
  215. procedure TRVTableItemInfo.MovingFromUndoList(ItemNo: Integer;
  216.   RVData: TObject);
  217. begin
  218.   Rows.FMainRVData := TCustomRVData(RVData);
  219.   if Rows.Count>0 then
  220.     Rows.MovingFromUndoList(0,0,Rows[0].Count,Rows.Count);
  221. end;
  222. {------------------------------------------------------------------------------}
  223. procedure TRVTableItemInfo.FinalizeUndoGroup;
  224. begin
  225.   MergeInplaceUndo(False);
  226. end;
  227. {------------------------------------------------------------------------------}
  228. procedure TRVTableItemInfo.InplaceEditorChange(Sender: TCustomRichViewEdit; ClearRedo: Boolean);
  229. var FullReformat: Boolean;
  230.     nwp: Integer;
  231.     L,T,W,H: Integer;
  232. begin
  233.   if not (rvtsInplaceIsReformatting in FState) and
  234.      (FInplaceEditor<>nil) and TRVTableInplaceEdit(FInplaceEditor).Resized then begin
  235.     Fmt.FWidth := 0;
  236.     Include(FState, rvtsInplaceIsReformatting);
  237.     L := FInplaceEditor.Left;
  238.     T := FInplaceEditor.Top;
  239.     W := FInplaceEditor.Width;
  240.     H := FInplaceEditor.Height;
  241.     try
  242.       nwp := FInplaceEditor.RVData.CalculateMinDocWidthPlus(nil,nil);
  243.       FullReformat := FInplaceMinWidthPlus<>nwp;
  244.       if FullReformat then begin
  245.         FInplaceMinWidthPlus := nwp;
  246.         nwp := TCustomRVFormattedData(Rows.FMainRVData).CalculateMinItemWidthPlusEx(GetMyItemNo);
  247.         FullReformat := (nwp<>FMinWidthPlus) and
  248.                         ((nwp>TCustomRVFormattedData(Rows.FMainRVData).DocumentWidth) or
  249.                         (FMinWidthPlus>=TCustomRVFormattedData(Rows.FMainRVData).DocumentWidth));
  250.         FMinWidthPlus := nwp;
  251.       end;
  252.       TRVEditRVData(Rows.FMainRVData).Reformat(FullReformat, False, True,
  253.                           GetMyItemNo,
  254.                           False);
  255.     finally
  256.       TRVTableInplaceEdit(FInplaceEditor).Resized;
  257.       Exclude(FState, rvtsInplaceIsReformatting);
  258.     end;
  259.     if (L<>FInplaceEditor.Left) or (T<>FInplaceEditor.Top) or
  260.        (W<>FInplaceEditor.Width) or (H<>FInplaceEditor.Height) then
  261.       TCustomRVFormattedData(Rows.FMainRVData).Refresh;
  262.   end;
  263.   ChangeEx(ClearRedo);
  264. end;
  265. {------------------------------------------------------------------------------}
  266. procedure TRVTableItemInfo.DestroyInplace(ReformatCell:Boolean);
  267. begin
  268.   if FInplaceEditor<>nil then begin
  269.     if csDestroying in FInplaceEditor.ComponentState then
  270.       exit;
  271.     if False and TRVTableInplaceEdit(FInplaceEditor).Busy then
  272.       raise ERVTableInplaceError.Create(errInplaceBusy);
  273.     if not ReformatCell then
  274.       TRVTableInplaceEdit(FInplaceEditor).SetClearingState
  275.     else
  276.       TCustomRVFormattedData(FRows.FMainRVData).UnassignChosenRVData(TRVTableInplaceEdit(FInplaceEditor).FCell);
  277.     FInplaceEditor.Free;
  278.     FInplaceEditor := nil;
  279.   end;
  280. end;
  281. {------------------------------------------------------------------------------}
  282. function TRVTableItemInfo.StartSelecting(Row,Col: Integer):Boolean;
  283. begin
  284.   Result := False;
  285.   if not (rvoAllowSelection in Rows.FMainRVData.Options) or
  286.      (rvtoNoCellSelect in Options) then
  287.     exit;
  288.   FSelStartCol := Col;
  289.   FSelStartRow := Row;
  290.   FSelColOffs := 0;
  291.   FSelRowOffs := 0;
  292.   Exclude(FState, rvtsSelExists);
  293.   TCustomRVFormattedData(FRows.FMainRVData).PartialSelectedItem := Self;
  294.   TCustomRVFormattedData(FRows.FMainRVData).SetMouseCapture(Self,MyLeft,MyTop);
  295.   UpdateCellSel;
  296.   FMakingSelection := True;
  297.   Result := True;
  298. end;
  299. {------------------------------------------------------------------------------}
  300. function TRVTableItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  301. begin
  302.   case Prop of
  303.     rvbpDrawingChangesFont, rvbpCanSaveUnicode,
  304.     rvbpAlwaysInText, rvbpHasSubRVData, rvbpNoHTML_P:
  305.       Result := True;
  306.     else
  307.       Result := inherited GetBoolValue(Prop);
  308.   end;
  309. end;
  310. {------------------------------------------------------------------------------}
  311. function TRVTableItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean;
  312. begin
  313.   case Prop of
  314.     rvbpPrintToBMP:
  315.       Result := False;
  316.     else
  317.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  318.   end;
  319. end;
  320. {------------------------------------------------------------------------------}
  321. procedure TRVTableItemInfo.StoreRVSelection(RVData: TCustomRVFormattedData;
  322.   var storage: TRVTableInplaceParamStorage);
  323. begin
  324.   with storage do begin
  325.     RVData.GetSelectionBoundsEx(StartNo, StartOffs, EndNo, EndOffs, False);
  326.     PartialSelected := RVData.PartialSelectedItem;
  327.   end;
  328. end;
  329. {------------------------------------------------------------------------------}
  330. procedure TRVTableItemInfo.RestoreRVSelection(RVData: TCustomRVFormattedData;
  331.   const storage: TRVTableInplaceParamStorage);
  332. begin
  333.   with storage do begin
  334.     RVData.SetSelectionBounds(StartNo, StartOffs, EndNo, EndOffs);
  335.     if PartialSelected<>nil then
  336.       RVData.PartialSelectedItem := PartialSelected;
  337.   end;
  338. end;
  339. {------------------------------------------------------------------------------}
  340. procedure TRVTableItemInfo.SaveInplace;
  341. begin
  342.   if FInplaceEditor<>nil then begin
  343.     if TRVTableInplaceEdit(FInplaceEditor).Busy then
  344.       raise ERVTableInplaceError.Create(errInplaceBusy);
  345.     StoreRVSelection(FInplaceEditor.RVData, FStoredInplace);
  346.     FStoredInplace.Row := TRVTableInplaceEdit(FInplaceEditor).FRow;
  347.     FStoredInplace.Col := TRVTableInplaceEdit(FInplaceEditor).FCol;
  348.     FStoredInplace.Stored := True;
  349.     DestroyInplace(True);
  350.     end
  351.   else begin
  352.     // FStoredInplace.Stored := False;
  353.   end;
  354. end;
  355. {------------------------------------------------------------------------------}
  356. procedure TRVTableItemInfo.RestoreInplace;
  357. begin
  358.   if FStoredInplace.Stored then begin
  359.     CreateInplace(-1, FStoredInplace.Row, FStoredInplace.Col, False, True, False, False, True);
  360.     if FInplaceEditor=nil then
  361.       exit;
  362.     RestoreRVSelection(FInplaceEditor.RVData, FStoredInplace);
  363.     FInplaceEditor.Invalidate;
  364.     FStoredInplace.Stored := False;
  365.   end;
  366. end;
  367. {------------------------------------------------------------------------------}
  368. procedure TRVTableItemInfo.InplaceEditorCaretGetout(Sender: TCustomRichViewEdit;
  369.   Direction: TRVGetOutDirection);
  370. var Dir: TRVCellDirection;
  371. begin
  372.   Dir := TRVCellDirection(ord(Direction));
  373.   PostMessage(FInplaceEditor.Handle,  WM_RVMOVEEDITOR, ord(Dir),  0);
  374. end;
  375. {------------------------------------------------------------------------------}
  376. procedure TRVTableItemInfo.InplaceEditorControlAction(Sender: TCustomRichView;
  377.   ControlAction: TRVControlAction; ItemNo: Integer; var ctrl: TControl);
  378. begin
  379.   Rows.FMainRVData.ControlAction2(ControlAction,
  380.     TRVTableInplaceEdit(FInplaceEditor).FTableItemNo, ctrl);
  381. end;
  382. {------------------------------------------------------------------------------}
  383. procedure TRVTableItemInfo.InplaceEditorMouseDown(Sender: TCustomRichView;
  384.   Button: TMouseButton; Shift: TShiftState; ItemNo, X, Y: Integer);
  385. var p: TPoint;
  386.     data: TRVMouseUpDownMessageData;
  387. begin
  388.   if (Rows.FMainRVData is TCustomRVFormattedData) then begin
  389.     p := FInplaceEditor.ClientToScreen(Point(X,Y));
  390.     p := TCustomRVFormattedData(Rows.FMainRVData).GetParentControl.ScreenToClient(p);
  391.     data := TRVMouseUpDownMessageData.Create;
  392.     data.Event  := rvetRVMouseDown;
  393.     data.X      := p.X;
  394.     data.Y      := p.Y;
  395.     data.ItemNo := GetItemNoInRootDocument;
  396.     data.Shift  := Shift;
  397.     data.Button := Button;
  398.     PostMessage(TCustomRVFormattedData(Rows.FMainRVData).GetParentControl.Handle,
  399.       WM_RVEVENT, Integer(data), 0);
  400.   end;
  401. end;
  402. {------------------------------------------------------------------------------}
  403. procedure TRVTableItemInfo.InplaceEditorMouseUp(Sender: TCustomRichView;
  404.   Button: TMouseButton; Shift: TShiftState; ItemNo, X, Y: Integer);
  405. var p: TPoint;
  406.     data: TRVMouseUpDownMessageData;
  407. begin
  408.   if (Rows.FMainRVData is TCustomRVFormattedData) then begin
  409.     p := FInplaceEditor.ClientToScreen(Point(X,Y));
  410.     p := TCustomRVFormattedData(Rows.FMainRVData).GetParentControl.ScreenToClient(p);
  411.     data := TRVMouseUpDownMessageData.Create;
  412.     data.Event  := rvetRVMouseUp;
  413.     data.X      := p.X;
  414.     data.Y      := p.Y;
  415.     data.ItemNo := GetItemNoInRootDocument;
  416.     data.Shift  := Shift;
  417.     data.Button := Button;
  418.     PostMessage(TCustomRVFormattedData(Rows.FMainRVData).GetParentControl.Handle,
  419.       WM_RVEVENT, Integer(data), 0);
  420.   end;
  421. end;
  422. {------------------------------------------------------------------------------}
  423. procedure TRVTableItemInfo.InplaceEditorMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  424. var editor: TCustomRichViewEdit;
  425. begin
  426.   editor := TCustomRichViewEdit(TRVEditRVData(Rows.FMainRVData).RichView);
  427.   if Assigned(editor.OnMouseMove) then
  428.     editor.OnMouseMove(editor, Shift, X+TControl(Sender).Left, Y+TControl(Sender).Top);
  429. end;
  430. {------------------------------------------------------------------------------}
  431. procedure TRVTableItemInfo.InplaceEditorDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
  432. var editor: TCustomRichViewEdit;
  433. begin
  434.   editor := TCustomRichViewEdit(TRVEditRVData(Rows.FMainRVData).RichView);
  435.   if Assigned(editor.OnDragOver) then
  436.     editor.OnDragOver(editor, Source, X+TControl(Sender).Left, Y+TControl(Sender).Top, State, Accept);
  437. end;
  438. {------------------------------------------------------------------------------}
  439. procedure TRVTableItemInfo.InplaceEditorDragDrop(Sender, Source: TObject; X, Y: Integer);
  440. var editor: TCustomRichViewEdit;
  441. begin
  442.   editor := TCustomRichViewEdit(TRVEditRVData(Rows.FMainRVData).RichView);
  443.   if Assigned(editor.OnDragDrop) then
  444.     editor.OnDragDrop(editor, Source, X+TControl(Sender).Left, Y+TControl(Sender).Top);
  445. end;
  446. {------------------------------------------------------------------------------}
  447. type
  448.   TD = class (TComponent)
  449.     private
  450.       FCellCount: Integer;
  451.       FRVTableSW: TComponent;
  452.     protected
  453.       procedure Loaded; override;
  454.     public
  455.       FCell: TRVTableCellData;
  456.       constructor Create(AOwner: TComponent); override;
  457.       procedure DecRef;
  458.     published
  459.       property C: TRVTableCellData read FCell write FCell;
  460.   end;
  461.   TRVTableSW = class (TComponent)
  462.     public
  463.       FTable: TRVTableItemInfo;
  464.       FTD: TD;
  465.     protected
  466.        procedure DefineProperties(Filer: TFiler); override;
  467.        procedure RowVAlignWriter(Writer: TWriter);
  468.        procedure RowVAlignReader(Reader: TReader);
  469.        function RowVAlignHasData: Boolean;
  470.     public
  471.       constructor Create(AOwner: TComponent); override;
  472.       destructor Destroy; override;
  473.     published
  474.       property T: TRVTableItemInfo read FTable write FTable;
  475.   end;
  476. constructor TD.Create(AOwner: TComponent);
  477. begin
  478.   inherited;
  479.   FCellCount := 1;
  480. end;
  481. procedure TD.Loaded;
  482. begin
  483.   inherited;
  484.   DecRef;
  485. end;
  486. procedure TD.DecRef;
  487. begin
  488.   dec(FCellCount);
  489.   if FCellCount=0 then
  490.     FRVTableSW.Free;
  491. end;
  492. constructor TRVTableSW.Create(AOwner: TComponent);
  493. begin
  494.   inherited Create(AOwner);
  495.   FTD := TD.Create(nil);
  496.   FTD.FRVTableSW := Self;
  497. end;
  498. destructor TRVTableSW.Destroy;
  499. begin
  500.   FTD.Free;
  501.   inherited Destroy;
  502. end;
  503. function TRVTableSW.RowVAlignHasData: Boolean;
  504. var r, count: Integer;
  505. begin
  506.   Result := False;
  507.   if T.StreamSaveHeadingRows then begin
  508.     count := T.HeadingRowCount;
  509.     if count>T.Rows.Count then
  510.       count := T.Rows.Count;
  511.     for r := 0 to count-1 do
  512.       if T.Rows[r].VAlign<>rvcTop then begin
  513.         Result := True;
  514.         exit;
  515.       end;
  516.   end;
  517.   for r := T.StreamStartRow to T.StreamStartRow+T.StreamSaveRowCount-1 do
  518.     if T.Rows[r].VAlign<>rvcTop then begin
  519.       Result := True;
  520.       exit;
  521.     end;
  522. end;
  523. procedure TRVTableSW.RowVAlignReader(Reader: TReader);
  524. var r: Integer;
  525. begin
  526.   Reader.ReadListBegin;
  527.   for r := 0 to T.Rows.Count-1 do
  528.     T.Rows[T.StreamStartRow+r].VAlign := TRVCellVAlign(Reader.ReadInteger);
  529.   Reader.ReadListEnd;
  530. end;
  531. procedure TRVTableSW.RowVAlignWriter(Writer: TWriter);
  532. var r, count: Integer;
  533. begin
  534.   Writer.WriteListBegin;
  535.   if T.StreamSaveHeadingRows then begin
  536.     count := T.HeadingRowCount;
  537.     if count>T.Rows.Count then
  538.       count := T.Rows.Count;
  539.     for r := 0 to count-1 do
  540.       Writer.WriteInteger(Integer(T.Rows[r].VAlign));
  541.   end;
  542.   for r := T.StreamStartRow to T.StreamStartRow+T.StreamSaveRowCount-1 do
  543.     Writer.WriteInteger(Integer(T.Rows[r].VAlign));
  544.   Writer.WriteListEnd;
  545. end;
  546. procedure TRVTableSW.DefineProperties(Filer: TFiler);
  547. begin
  548.   inherited;
  549.   Filer.DefineProperty('C', T.CellsReader, T.CellsWriter, True);
  550.   Filer.DefineProperty('RowVAlign', RowVAlignReader, RowVAlignWriter, RowVAlignHasData);
  551. end;
  552. {------------------------------------------------------------------------------}
  553. procedure TRVTableItemInfo.SaveRVF(Stream: TStream; RVData: TPersistent;
  554.   ItemNo, ParaNo: Integer; const Name: String; Part: TRVMultiDrawItemPart;
  555.   ForceSameAsPrev: Boolean);
  556. var SaveType, LineCount: Integer;
  557.     StreamWrapper: TRVTableSW;
  558. begin
  559.   LineCount := 3+GetRVFExtraPropertyCount;
  560.   if rvfoSaveBinary in TCustomRVData(RVData).RVFOptions then
  561.     SaveType := 2 // save binary
  562.   else
  563.     SaveType := 0; // save hex dump
  564.   RVFWriteLine(Stream,
  565.    Format('%d %d %s %d %d %s %s',
  566.           [StyleNo, LineCount,
  567.            RVFSavePara(TCustomRVData(RVData).GetRVStyle,
  568.                         rvfoUseStyleNames in TCustomRVData(RVData).RVFOptions,
  569.                         ParaNo),
  570.            Byte(ItemOptions) and RVItemOptionsMask,
  571.            SaveType,
  572.            RVFSaveTag(rvoTagsArePChars in TCustomRVData(RVData).Options,Tag),
  573.            SaveRVFHeaderTail(RVData)]));
  574.    RVFWriteLine(Stream, Name);
  575.    SaveRVFExtraProperties(Stream);
  576.    RVFWriteLine(Stream, '1');
  577.    StreamWrapper := TRVTableSW.Create(nil);
  578.    try
  579.      if (Part=nil) or not (Part is TRVTablePrintPart) then begin
  580.        StreamSaveHeadingRows := False;
  581.        StreamStartRow := 0;
  582.        StreamSaveRowCount := Rows.Count;
  583.        end
  584.      else begin
  585.        StreamSaveHeadingRows := True;
  586.        StreamStartRow := TRVTablePrintPart(Part).StartRow;
  587.        StreamSaveRowCount := TRVTablePrintPart(Part).RowCount;
  588.      end;
  589.      StreamWrapper.T := Self;
  590.      if rvfoSaveBinary in TCustomRVData(RVData).RVFOptions then
  591.        RVFSaveControlBinary(Stream, StreamWrapper)
  592.      else
  593.        RVFWriteLine(Stream, RVFSaveControl(StreamWrapper));
  594.    finally
  595.      StreamWrapper.Free;
  596.    end;
  597. end;
  598. {------------------------------------------------------------------------------}
  599. function TRVTableItemInfo.ReadRVFLine(const s: String; RVData: TPersistent;
  600.   ReadType, LineNo, LineCount: Integer; var Name: String; var ReadMode: TRVFReadMode;
  601.   var ReadState: TRVFReadState): Boolean;
  602. var StreamWrapper: TRVTableSW;
  603. begin
  604.   Result := True;
  605.   if LineNo=0 then begin
  606.     Name := s;
  607.     exit;
  608.   end;
  609.   case LineCount-LineNo of
  610.     2:
  611.       begin
  612.         //  do nothing; this line contains version of table stream format; currently '1'
  613.         if ReadType=2 then
  614.           ReadMode := rmBeforeBinary;
  615.       end;
  616.     1:
  617.       begin
  618.         StreamWrapper := TRVTableSW.Create(nil);
  619.         try
  620.           StreamWrapper.T := Self;
  621.           StreamStartRow := 0;
  622.           if ReadType=2 then
  623.             Result := RVFLoadControlBinary(s, TComponent(StreamWrapper), '', nil)
  624.           else
  625.             Result := RVFLoadControl(s, TComponent(StreamWrapper), '', nil);
  626.           ReadState := rstSkip;
  627.         finally
  628.           StreamWrapper.FTD.DecRef;
  629.         end;
  630.       end;
  631.     else
  632.       SetExtraPropertyFromRVFStr(s);
  633.   end;
  634. end;
  635. {------------------------------------------------------------------------------}
  636. // rvtsJustCreated is set in constructor. This method is called just after
  637. // constructor when loading table from RTF or RVF.
  638. procedure TRVTableItemInfo.BeforeLoading(FileFormat: TRVLoadFormat);
  639. begin
  640.   if FileFormat in [rvlfRVF, rvlfRTF, rvlfOther] then
  641.     Exclude(FState, rvtsJustCreated);
  642. end;
  643. {------------------------------------------------------------------------------}
  644. {$IFNDEF RVDONOTUSELISTS}
  645. // This function is used to update list of marker when table is inserted from
  646. // RVF or RTF
  647. // When inserting nested tables, this method is called only for root table
  648. // See also comments to Inserted
  649. procedure TRVTableItemInfo.AfterLoading(FileFormat: TRVLoadFormat);
  650. var r,c,i: Integer;
  651. begin
  652.   for r := 0 to Rows.Count-1 do
  653.     for c := 0 to Rows[r].Count-1 do
  654.       if Cells[r,c]<>nil then
  655.         with Cells[r,c].GetRVData do
  656.           for i := 0 to Items.Count-1 do begin
  657.             AddMarkerInList(i);
  658.             GetItem(i).AfterLoading(FileFormat);
  659.           end;
  660. end;
  661. {$ENDIF}
  662. {------------------------------------------------------------------------------}
  663. procedure ReadError;
  664. begin
  665.   raise EReadError.Create(errReadCells);
  666. end;
  667. {------------------------------------------------------------------------------}
  668. procedure TRVTableItemInfo.CellsReader(Reader: TReader);
  669. var r,c, RowCount, ColCount, colspan,rowspan: Integer;
  670.     CellWrapper:TD;
  671. begin
  672.   ClearTemporal;
  673.   RowCount := Reader.ReadInteger;
  674.   if RowCount=0 then begin
  675.     Rows.Reset(0,0);
  676.     exit;
  677.   end;
  678.   ColCount := Reader.ReadInteger;
  679.   if StreamStartRow=0 then
  680.     Rows.Reset(RowCount,ColCount)
  681.   else
  682.     if ColCount>Rows[0].Count then
  683.       ReadError;
  684.   Reader.ReadListBegin;
  685.   CellWrapper := (Reader.Root as TRVTableSW).FTD;
  686.   for r := StreamStartRow to StreamStartRow+RowCount-1 do
  687.     for c := 0 to ColCount-1 do
  688.       if Cells[r,c]<>nil then begin
  689.         if Reader.EndOfList then
  690.           ReadError;
  691.         colspan := Reader.ReadInteger;
  692.         rowspan := Reader.ReadInteger;
  693.         Rows.MergeCells(r,c,colspan,rowspan,True,True);
  694.         CellWrapper.C := Cells[r,c];
  695.         Reader.ReadComponent(CellWrapper);
  696.         inc(CellWrapper.FCellCount);
  697.       end;
  698.   if not Reader.EndOfList then
  699.     ReadError;
  700.   Reader.ReadListEnd;
  701. end;
  702. {------------------------------------------------------------------------------}
  703. procedure TRVTableItemInfo.CellsWriter(Writer: TWriter);
  704. var CellWrapper:TD;
  705.     r, count: Integer;
  706.     {........................................................}
  707.     procedure WriteRow(r: Integer);
  708.     var c: Integer;
  709.     begin
  710.       for c := 0 to Rows[r].Count-1 do
  711.         if Cells[r,c]<>nil then begin
  712.           CellWrapper.C := Cells[r,c];
  713.           Writer.WriteInteger(CellWrapper.C.ColSpan);
  714.           Writer.WriteInteger(CellWrapper.C.RowSpan);
  715.           Writer.WriteComponent(CellWrapper);
  716.         end;
  717.     end;
  718.     {........................................................}
  719. begin
  720.   StartExport;
  721.   try
  722.     if StreamSaveHeadingRows then begin
  723.       count := HeadingRowCount;
  724.       if count>Rows.Count then
  725.         count := Rows.Count;
  726.       end
  727.     else
  728.       count := 0;
  729.     Writer.WriteInteger(StreamSaveRowCount+count);      
  730.     if StreamSaveRowCount+count>0 then begin
  731.       Writer.WriteInteger(Rows[0].Count);
  732.       Writer.WriteListBegin;
  733.       CellWrapper := (Writer.Root as TRVTableSW).FTD;
  734.       for r := 0 to count-1 do
  735.         WriteRow(r);
  736.       for r := StreamStartRow to StreamStartRow+StreamSaveRowCount-1 do
  737.         WriteRow(r);
  738.       Writer.WriteListEnd;
  739.     end;
  740.   finally
  741.     EndExport;
  742.   end;
  743. end;
  744. {------------------------------------------------------------------------------}
  745. procedure TRVTableItemInfo.Print(Canvas: TCanvas; x, y, x2: Integer;
  746.   Preview, Correction: Boolean; const sad: TRVScreenAndDevice;
  747.   RichView: TRVScroller; dli: TRVDrawLineInfo;
  748.   Part: Integer; ColorMode: TRVColorMode; RVData: TPersistent);
  749. var State: TRVItemDrawStates;
  750.     TablePart : TRVTablePrintPart;
  751.     StartRow, RowCount: Integer;
  752.     UHRC: Boolean;
  753. begin
  754.   if Part>=0 then begin
  755.     TablePart := TRVTablePrintPart((dli as TRVTablePrintInfo).PartsList[Part]);
  756.     StartRow := TablePart.StartRow;
  757.     RowCount := TablePart.RowCount;
  758.     UHRC := TRVTablePrintInfo(dli).FUseHeadingRowCount;
  759.     end
  760.   else begin
  761.     StartRow := 0;
  762.     RowCount := Rows.Count;
  763.     UHRC := False;
  764.   end;
  765.   State := [rvidsPrinting];
  766.   if Preview then
  767.     Include(State, rvidsPreview);
  768.   if Correction then
  769.     Include(State, rvidsPreviewCorrection);
  770.   cursad := @(TRVTablePrintInfo(dli).sad);
  771.   try
  772.     PaintTo(x,x2,y, StartRow, RowCount, Canvas, State, nil,
  773.       TRVTablePrintInfo(dli).Fmt, UHRC,
  774.       Rect(x,y,x+TRVTablePrintInfo(dli).Fmt.FWidth,y+TRVTablePrintInfo(dli).Fmt.FHeight),
  775.       ColorMode, TCustomPrintableRVData(RVData));
  776.   finally
  777.     cursad := nil;
  778.   end;
  779. end;
  780. {------------------------------------------------------------------------------}
  781. function TRVTableItemInfo.CreatePrintingDrawItem(RVData: TObject; const sad: TRVScreenAndDevice): TRVDrawLineInfo;
  782. var r,c: Integer;
  783.     item : TCellPtblRVData;
  784.     data: TCustomRVFormattedData;
  785.     Cell: TRVTableCellData;
  786. begin
  787.   Result := TRVTablePrintInfo.Create(Self);
  788.   TRVTablePrintInfo(Result).sad := sad;
  789.   TRVTablePrintInfo(Result).Fmt.Rows.Capacity := Rows.Count*Rows[0].Count;
  790.   for r := 0 to Rows.Count-1 do
  791.     for c := 0 to Rows[r].Count-1 do begin
  792.       Cell := Cells[r,c];
  793.       if (Cell<>nil) then begin
  794.         data := TCustomRVFormattedData(Cell.GetRVData);
  795.         if (Cell.ColSpan=1) and (Cell.RowSpan=1) and not Cell.HasData(True) then
  796.           data := nil;
  797.         if data<>nil then begin
  798.           item := TCellPtblRVData.Create(
  799.                   (TCustomRVData(RVData).GetRootData as TCustomMainPtblRVData).RichView,
  800.                   data, RVData as TCustomPrintableRVData);
  801.           item.FColor := GetCellColor(Cell);
  802.           item.ParentDrawsBack := True;
  803.           item.Transparent := Cell.IsTransparent;
  804.           end
  805.         else
  806.           item := nil;
  807.         end
  808.       else
  809.         item := nil;
  810.       TRVTablePrintInfo(Result).Fmt.Rows.Add(item);
  811.     end;
  812. end;
  813. {------------------------------------------------------------------------------}
  814. procedure TRVTableItemInfo.DrawBackgroundForPrinting(Canvas: TCanvas;
  815.   const Rect, FullRect: TRect; ColorMode: TRVColorMode; ItemBackgroundLayer: Integer);
  816. var Clr: TColor;
  817.     r: TRect;
  818. begin
  819.   if ItemBackgroundLayer=0 then
  820.     exit;
  821.   if FColor=clNone then
  822.     Clr := clNone
  823.   else if (rvtoWhiteBackground in PrintOptions) then
  824.     Clr := clWhite
  825.   else
  826.     Clr := RV_GetBackColor(FColor, ColorMode);
  827.   if FBackground<>nil then begin
  828.     FBackground.Draw(Canvas, Rect, 0, 0, FullRect.Left, FullRect.Top,
  829.       FullRect.Right-FullRect.Left, FullRect.Bottom-FullRect.Top, Clr, False);
  830.     end
  831.   else if Clr<>clNone then begin
  832.     Canvas.Brush.Color := Clr;
  833.     Canvas.Brush.Style := bsSolid;
  834.     Canvas.FillRect(Rect);
  835.   end;
  836.   if (ItemBackgroundLayer=1) or (FPrintCell=nil) then
  837.     exit;
  838.   if FPrintCell.Color=clNone then
  839.     Clr := clNone
  840.   else if (rvtoWhiteBackground in PrintOptions) then
  841.     Clr := clWhite
  842.   else
  843.     Clr := RV_GetBackColor(FPrintCell.Color, ColorMode);
  844.   if FPrintCell.FBackground<>nil then begin
  845.     r := FPrintCellRect;
  846.     OffsetRect(r, -Rect.Left+FullRect.Left, -Rect.Top+FullRect.Top);
  847.     FPrintCell.FBackground.Draw(Canvas, Rect, 0, 0, r.Left, r.Top,
  848.       r.Right-r.Left, r.Bottom-r.Top, Clr, True);
  849.     end
  850.   else if Clr<>clNone then begin
  851.     Canvas.Brush.Color := Clr;
  852.     Canvas.Brush.Style := bsSolid;
  853.     Canvas.FillRect(Rect);
  854.   end;
  855. end;
  856. {------------------------------------------------------------------------------}
  857. function TRVTableItemInfo.GetDevX(x: Integer): Integer;
  858. begin
  859.   if cursad=nil then
  860.     Result := x
  861.   else
  862.     Result := MulDiv(x, cursad.ppixDevice, cursad.ppixScreen);
  863. end;
  864. {------------------------------------------------------------------------------}
  865. function TRVTableItemInfo.GetDevY(y: Integer): Integer;
  866. begin
  867.   if cursad=nil then
  868.     Result := y
  869.   else
  870.     Result := MulDiv(y, cursad.ppiyDevice, cursad.ppiyScreen);
  871. end;
  872. {------------------------------------------------------------------------------}
  873. procedure TRVTableItemInfo.LoadFromStreamEx(Stream: TStream; StartRow: Integer);
  874. var StreamWrapper :TRVTableSW;
  875. begin
  876.    StreamStartRow := StartRow;
  877.    StreamWrapper := TRVTableSW.Create(nil);
  878.    try
  879.      StreamWrapper.T := Self;
  880.      Stream.ReadComponent(StreamWrapper);
  881.    finally
  882.      StreamWrapper.FTD.DecRef;
  883.    end;
  884. end;
  885. {------------------------------------------------------------------------------}
  886. procedure TRVTableItemInfo.LoadFromStream(Stream: TStream);
  887. begin
  888.   LoadFromStreamEx(Stream, 0);
  889. end;
  890. {------------------------------------------------------------------------------}
  891. procedure TRVTableItemInfo.SaveRowsToStream(Stream: TStream; Index,
  892.   Count: Integer);
  893. var StreamWrapper :TRVTableSW;
  894. begin
  895.   StreamSaveHeadingRows := False;
  896.   StreamStartRow := Index;
  897.   StreamSaveRowCount := Count;
  898.   StreamWrapper := TRVTableSW.Create(nil);
  899.   try
  900.     StreamWrapper.T := Self;
  901.     Stream.WriteComponent(StreamWrapper);
  902.   finally
  903.     StreamWrapper.Free;
  904.   end;
  905. end;
  906. {------------------------------------------------------------------------------}
  907. procedure TRVTableItemInfo.SaveToStream(Stream: TStream);
  908. begin
  909.   SaveRowsToStream(Stream, 0, Rows.Count);
  910. end;
  911. {------------------------------------------------------------------------------}
  912. procedure TRVTableItemInfo.StartExport;
  913. begin
  914.   inc(BusyCount);
  915. end;
  916. {------------------------------------------------------------------------------}
  917. procedure TRVTableItemInfo.EndExport;
  918. begin
  919.   dec(BusyCount);
  920. end;
  921. {------------------------------------------------------------------------------}
  922. procedure TRVTableItemInfo.Inserting(RVData: TObject; var Text: String; Safe: Boolean);
  923. var r,c: Integer;
  924. begin
  925.   Rows.FMainRVData := TCustomRVData(RVData);
  926.   if RVData<>nil then
  927.     Include(FState, rvtsInserted)
  928.   else
  929.     Exclude(FState, rvtsInserted);
  930.   if (rvtsInserted in FState) and (TCustomRVData(RVData).GetRootData is TRVEditRVData) then
  931.     Include(FState, rvtsEditMode)
  932.   else
  933.     Exclude(FState, rvtsEditMode);
  934.   for r := 0 to Rows.Count-1 do begin
  935.     for c := 0 to Rows[r].Count-1 do
  936.       if (Cells[r,c]<>nil) then begin
  937.         if Cells[r,c].ItemCount=0 then
  938.           Cells[r,c].AddNL('',0,0);
  939.         Cells[r,c].FList := Rows[r];
  940.         Cells[r,c].Inserting(Cells[r,c], Safe);
  941.       end;
  942.   end;
  943.   inherited Inserting(RVData, Text, Safe);
  944. end;
  945. {------------------------------------------------------------------------------}
  946. {$IFNDEF RVDONOTUSELISTS}
  947. // This method is called after the table is inserted in RVData.
  948. // We processing only the first direct inserting
  949. // For RVF and RTF, we use AfterLoading
  950. procedure TRVTableItemInfo.Inserted(RVData: TObject; ItemNo: Integer);
  951. var r,c,i: Integer;
  952.     CellRVData: TCustomRVData;
  953.     Location: TRVStoreSubRVData;
  954. begin
  955.   inherited;
  956.   if not (rvtsJustCreated in FState) then
  957.     exit;
  958.       
  959.   // May be this table was inserted in table that was not inserted yet?
  960.   // If yes, exiting (this procedure will be called later again recursively when
  961.   // the parent table will be inserted).
  962.   if not (rvflRoot in TCustomRVData(RVData).Flags) then begin
  963.     TCustomRVData(RVData).GetParentInfo(i, Location);
  964.     Location.Free;
  965.     if i<0 then
  966.       exit;
  967.   end;
  968.   try
  969.     for r := 0 to Rows.Count-1 do
  970.       for c := 0 to Rows[r].Count-1 do
  971.         if Cells[r,c]<>nil then begin
  972.           CellRVData := Cells[r,c].GetRVData;
  973.           for i := 0 to CellRVData.Items.Count-1 do begin
  974.             CellRVData.AddMarkerInList(i);
  975.             CellRVData.GetItem(i).Inserted(CellRVData, i);
  976.           end;
  977.         end;
  978.   finally
  979.     Exclude(FState, rvtsJustCreated);
  980.   end;
  981. end;
  982. {$ENDIF}
  983. {------------------------------------------------------------------------------}
  984. procedure TRVTableItemInfo.BackgroundImageReader(Stream: TStream);
  985. var s: String;
  986.     v: Integer;
  987.     gr: TGraphic;
  988. begin
  989.   Stream.ReadBuffer(v, sizeof(v));
  990.   SetLength(s, v);
  991.   Stream.ReadBuffer(PChar(s)^, v);
  992.   gr := RV_CreateGraphics(TGraphicClass(GetClass(s)));
  993.   RVFLoadPictureBinary2(Stream, gr);
  994.   BackgroundImage := gr;
  995.   gr.Free;
  996. end;
  997. {------------------------------------------------------------------------------}
  998. procedure TRVTableItemInfo.BackgroundImageWriter(Stream: TStream);
  999. var s: String;
  1000.     v: Integer;
  1001. begin
  1002.   s := FBackground.Image.ClassName;
  1003.   v := Length(s);
  1004.   Stream.WriteBuffer(v, sizeof(v));
  1005.   Stream.WriteBuffer(PChar(s)^, v);
  1006.   RVFSavePictureBinary(Stream, FBackground.Image);
  1007. end;
  1008. {------------------------------------------------------------------------------}
  1009. procedure TRVTableItemInfo.DefineProperties(Filer: TFiler);
  1010. begin
  1011.   inherited;
  1012.   Filer.DefineBinaryProperty('BackgroundImg', BackgroundImageReader, BackgroundImageWriter,
  1013.     (FBackground<>nil) and not FBackground.Empty);
  1014. end;
  1015. {------------------------------------------------------------------------------}
  1016. procedure TRVTableItemInfo.SetBestWidth(const Value: TRVHTMLLength);
  1017. begin
  1018.   if rvtsInserted in FState then
  1019.     SetProperty('BestWidth', ord(Value), True, True)
  1020.   else
  1021.     FBestWidth := Value;
  1022. end;
  1023. {------------------------------------------------------------------------------}
  1024. procedure TRVTableItemInfo.SetBorderColor(const Value: TColor);
  1025. begin
  1026.   if rvtsInserted in FState then
  1027.     SetProperty('BorderColor', ord(Value), False, False)
  1028.   else
  1029.     FBorderColor := Value;
  1030. end;
  1031. procedure TRVTableItemInfo.SetBorderHSpacing(const Value: Integer);
  1032. begin
  1033.   if rvtsInserted in FState then
  1034.     SetProperty('BorderHSpacing', ord(Value), True, True)
  1035.   else
  1036.     FBorderHSpacing := Value;
  1037. end;
  1038. procedure TRVTableItemInfo.SetBorderLightColor(const Value: TColor);
  1039. begin
  1040.   if rvtsInserted in FState then
  1041.     SetProperty('BorderLightColor', ord(Value), False, False)
  1042.   else
  1043.     FBorderLightColor := Value;
  1044. end;
  1045. procedure TRVTableItemInfo.SetBorderStyle(const Value: TRVTableBorderStyle);
  1046. begin
  1047.   if rvtsInserted in FState then
  1048.     SetProperty('BorderStyle', ord(Value), False, False)
  1049.   else
  1050.     FBorderStyle := Value;
  1051. end;
  1052. procedure TRVTableItemInfo.SetBorderVSpacing(const Value: Integer);
  1053. begin
  1054.   if rvtsInserted in FState then
  1055.     SetProperty('BorderVSpacing', ord(Value), True, False)
  1056.   else
  1057.     FBorderVSpacing := Value;
  1058. end;
  1059. procedure TRVTableItemInfo.SetBorderWidth(const Value: Integer);
  1060. begin
  1061.   if rvtsInserted in FState then
  1062.     SetProperty('BorderWidth', ord(Value), True, True)
  1063.   else
  1064.     FBorderWidth := Value;
  1065. end;
  1066. procedure TRVTableItemInfo.SetCellBorderColorProp(const Value: TColor);
  1067. begin
  1068.   if rvtsInserted in FState then
  1069.     SetProperty('CellBorderColor', ord(Value), False, False)
  1070.   else
  1071.     FCellBorderColor := Value;
  1072. end;
  1073. procedure TRVTableItemInfo.SetCellBorderLightColorProp(const Value: TColor);
  1074. begin
  1075.   if rvtsInserted in FState then
  1076.     SetProperty('CellBorderLightColor', ord(Value), False, False)
  1077.   else
  1078.     FCellBorderLightColor := Value;
  1079. end;
  1080. procedure TRVTableItemInfo.SetCellBorderWidth(const Value: Integer);
  1081. begin
  1082.   if rvtsInserted in FState then
  1083.     SetProperty('CellBorderWidth', ord(Value), True, True)
  1084.   else
  1085.     FCellBorderWidth := Value;
  1086. end;
  1087. procedure TRVTableItemInfo.SetCellHSpacing(const Value: Integer);
  1088. begin
  1089.   if rvtsInserted in FState then
  1090.     SetProperty('CellHSpacing', ord(Value), True, True)
  1091.   else
  1092.     FCellHSpacing := Value;
  1093. end;
  1094. procedure TRVTableItemInfo.SetCellPadding(const Value: Integer);
  1095. begin
  1096.   if FInplaceEditor<>nil then begin
  1097.     FInplaceEditor.LeftMargin   := Value;
  1098.     FInplaceEditor.TopMargin    := Value;
  1099.     FInplaceEditor.RightMargin  := Value;
  1100.     FInplaceEditor.BottomMargin := Value;
  1101.     Include(FState, rvtsFormatInplace);
  1102.   end;
  1103.   if rvtsInserted in FState then
  1104.     SetProperty('CellPadding', ord(Value), True, True)
  1105.   else
  1106.     FCellPadding := Value;
  1107. end;
  1108. procedure TRVTableItemInfo.SetCellVSpacing(const Value: Integer);
  1109. begin
  1110.   if rvtsInserted in FState then
  1111.     SetProperty('CellVSpacing', ord(Value), True, False)
  1112.   else
  1113.     FCellVSpacing := Value;
  1114. end;
  1115. procedure TRVTableItemInfo.SetColor(const Value: TColor);
  1116. begin
  1117.   if rvtsInserted in FState then
  1118.     SetProperty('Color', ord(Value), False, False)
  1119.   else
  1120.     FColor := Value;
  1121.   if FInplaceEditor<>nil then begin
  1122.     FInplaceEditor.Color := GetCellColor(TRVTableInplaceEdit(FInplaceEditor).FCell);
  1123.     TRVTableInplaceEdit(FInplaceEditor).Transparent :=
  1124.       CanSeeBackgroundThroughCell(TRVTableInplaceEdit(FInplaceEditor).FCell);
  1125.   end;
  1126.   {$IFNDEF RVDONOTUSEANIMATION}
  1127.   if Rows.FMainRVData is TCustomRVFormattedData then
  1128.     TCustomRVFormattedData(Rows.FMainRVData).ResetAniBackground;
  1129.   {$ENDIF}
  1130. end;
  1131. procedure TRVTableItemInfo.SetHeadingRowCount(const Value: Integer);
  1132. begin
  1133.   if rvtsInserted in FState then
  1134.     SetProperty('HeadingRowCount', ord(Value), False, False)
  1135.   else
  1136.     FHeadingRowCount := Value;
  1137. end;
  1138. procedure TRVTableItemInfo.SetHOutermostRule(const Value: Boolean);
  1139. begin
  1140.   if rvtsInserted in FState then
  1141.     SetProperty('HOutermostRule', ord(Value), False, False)
  1142.   else
  1143.     FHOutermostRule := Value;
  1144. end;
  1145. procedure TRVTableItemInfo.SetHRuleColor(const Value: TColor);
  1146. begin
  1147.   if rvtsInserted in FState then
  1148.     SetProperty('HRuleColor', ord(Value), False, False)
  1149.   else
  1150.     FHRuleColor := Value;
  1151. end;
  1152. procedure TRVTableItemInfo.SetHRuleWidth(const Value: Integer);
  1153. begin
  1154.   if rvtsInserted in FState then
  1155.     SetProperty('HRuleWidth', ord(Value), False, False)
  1156.   else
  1157.     FHRuleWidth := Value;
  1158. end;
  1159. procedure TRVTableItemInfo.SetVOutermostRule(const Value: Boolean);
  1160. begin
  1161.   if rvtsInserted in FState then
  1162.     SetProperty('VOutermostRule', ord(Value), False, False)
  1163.   else
  1164.     FVOutermostRule := Value;
  1165. end;
  1166. procedure TRVTableItemInfo.SetVRuleColor(const Value: TColor);
  1167. begin
  1168.   if rvtsInserted in FState then
  1169.     SetProperty('VRuleColor', ord(Value), False, False)
  1170.   else
  1171.     FVRuleColor := Value;
  1172. end;
  1173. procedure TRVTableItemInfo.SetVRuleWidth(const Value: Integer);
  1174. begin
  1175.   if rvtsInserted in FState then
  1176.     SetProperty('VRuleWidth', ord(Value), False, False)
  1177.   else
  1178.     FVRuleWidth := Value;
  1179. end;
  1180. procedure TRVTableItemInfo.SetCellBorderStyle(
  1181.   const Value: TRVTableBorderStyle);
  1182. begin
  1183.   if rvtsInserted in FState then
  1184.     SetProperty('CellBorderStyle', ord(Value), False, False)
  1185.   else
  1186.     FCellBorderStyle := Value;
  1187. end;
  1188. {------------------------------------------------------------------------------}
  1189. procedure TRVTableItemInfo.SetCellProperty(ItemNo: Integer; const PropertyName: String;
  1190.   Value: LongInt; Row, Col: Integer; AffectSize, AffectWidth: Boolean);
  1191. var fi:Boolean;
  1192.     ui: TRVUndoModifyCellIntProperty;
  1193. begin
  1194.   if (rvtsInserted in FState) and IsInEditor then
  1195.     try
  1196.       Exclude(FState, rvtsInserted);
  1197.       if ItemNo=-1 then
  1198.         ItemNo := GetMyItemNo;
  1199.       TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  1200.       ui := TRVEditRVData(FRows.FMainRVData).Do_ModifyItemIntProperty(
  1201.         ItemNo, Cells[Row,Col], PropertyName, Value,
  1202.         AffectSize, AffectWidth, TRVUndoModifyCellIntProperty) as  TRVUndoModifyCellIntProperty;
  1203.       if ui<>nil then begin
  1204.         ui.Row := Row;
  1205.         ui.Col := Col;
  1206.       end;
  1207.     finally
  1208.       Include(FState, rvtsInserted);
  1209.     end
  1210.   else begin
  1211.     fi := rvtsInserted in FState;
  1212.     try
  1213.       Exclude(FState, rvtsInserted);
  1214.       SetOrdProp(Cells[Row,Col], GetPropInfo(Cells[Row,Col].ClassInfo,  PropertyName), Value);
  1215.     finally
  1216.       if fi then
  1217.         Include(FState, rvtsInserted);
  1218.     end;
  1219.   end;
  1220.   Changed;
  1221. end;
  1222. {------------------------------------------------------------------------------}
  1223. procedure TRVTableItemInfo.AssignCellAttributes(ItemNo,Row, Col: Integer;
  1224.   SourceCell: TRVTableCellData;IncludeSize: Boolean;
  1225.   DivColSpan, DivRowSpan: Integer);
  1226. var ui: TRVUndoModifyCellIntProperties;
  1227.     Cell: TRVTableCellData;
  1228.     PropList: TStringList;
  1229. begin
  1230.   Cell := Cells[Row,Col];
  1231.   if (rvtsInserted in FState) and IsInEditor then
  1232.     try
  1233.       if ItemNo=-1 then
  1234.         ItemNo := GetMyItemNo;
  1235.       with SourceCell.VisibleBorders do
  1236.         SetCellVisibleBorders_(ItemNo, Left,Top,Right,Bottom,Row,Col);
  1237.       SetCellBackgroundImage(SourceCell.BackgroundImage, Row,Col);
  1238.       PropList := TStringList.Create;
  1239.       try
  1240.         PropList.AddObject('Color', TObject(SourceCell.Color));
  1241.         PropList.AddObject('BorderColor', TObject(SourceCell.BorderColor));
  1242.         PropList.AddObject('BorderLightColor', TObject(SourceCell.BorderLightColor));
  1243.         PropList.AddObject('VAlign', TObject(SourceCell.VAlign));
  1244.         PropList.AddObject('BackgroundStyle', TObject(SourceCell.BackgroundStyle));        
  1245.         if IncludeSize then begin
  1246.           PropList.AddObject('BestWidth', TObject(SourceCell.BestWidth div DivColSpan));
  1247.           PropList.AddObject('BestHeight', TObject(SourceCell.BestHeight div DivRowSpan));
  1248.         end;
  1249.         TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  1250.         ui := TRVEditRVData(FRows.FMainRVData).Do_ModifyItemIntProperties(
  1251.         ItemNo, Cell, PropList,
  1252.         IncludeSize, IncludeSize, TRVUndoModifyCellIntProperties) as TRVUndoModifyCellIntProperties;
  1253.         if ui<>nil then begin
  1254.           ui.Row := Row;
  1255.           ui.Col := Col;
  1256.         end;
  1257.       finally
  1258.         PropList.Free;
  1259.       end;
  1260.     finally
  1261.       Include(FState, rvtsInserted);
  1262.     end
  1263.   else begin
  1264.     Cells[Row,Col].AssignAttributesFrom(SourceCell, IncludeSize, DivColSpan, DivRowSpan);
  1265.   end;
  1266.   Changed;
  1267. end;
  1268. {------------------------------------------------------------------------------}
  1269. procedure TRVTableItemInfo.SetProperty(const PropertyName: String; Value: LongInt;
  1270.                                        AffectSize, AffectWidth: Boolean);
  1271. var fi:Boolean;
  1272. begin
  1273.   if (rvtsInserted in FState) and IsInEditor then
  1274.     try
  1275.       MergeInplaceUndo(False);
  1276.       Exclude(FState, rvtsInserted);
  1277.       TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  1278.       TRVEditRVData(FRows.FMainRVData).Do_ModifyItemIntProperty(
  1279.         GetMyItemNo, Self, PropertyName, Value,
  1280.         AffectSize, AffectWidth, TRVUndoModifyItemIntProperty);
  1281.       TCustomRVFormattedData(Rows.FMainRVData).Invalidate;
  1282.     finally
  1283.       Include(FState, rvtsInserted);
  1284.     end
  1285.   else begin
  1286.     fi := rvtsInserted in FState;
  1287.     try
  1288.       Exclude(FState, rvtsInserted);
  1289.       SetOrdProp(Self, GetPropInfo(Self.ClassInfo,  PropertyName), Value);
  1290.     finally
  1291.       if fi then
  1292.         Include(FState, rvtsInserted);
  1293.     end;
  1294.   end;
  1295.   Changed;
  1296. end;
  1297. {------------------------------------------------------------------------------}
  1298. procedure TRVTableItemInfo.BeforeUndoChangeProperty;
  1299. begin
  1300.   Exclude(FState, rvtsInserted)
  1301. end;
  1302. {------------------------------------------------------------------------------}
  1303. procedure TRVTableItemInfo.AfterUndoChangeProperty;
  1304. begin
  1305.   Include(FState, rvtsInserted);
  1306.   Changed;
  1307. end;
  1308. {------------------------------------------------------------------------------}
  1309. procedure TRVTableItemInfo.SplitSelectedCellsVertically(ColCount: Integer);
  1310. var r,c,cs,rs: Integer;
  1311.     ColsAdded: Integer;
  1312. begin
  1313.   if not GetNormalizedSelectionBounds(True, r,c,cs,rs) then
  1314.     exit;
  1315.   DestroyInplace(True);
  1316.   InitUndo;
  1317.   try
  1318.     ColsAdded := Rows.SplitCellsVertically(r,c,cs,rs, ColCount);
  1319.     Select(r,c,rs-1,cs+ColsAdded-1);    
  1320.   finally
  1321.     DoneUndo;
  1322.   end;
  1323.   ResetLiveSpell;
  1324.   Changed;
  1325. end;
  1326. {------------------------------------------------------------------------------}
  1327. procedure TRVTableItemInfo.SplitSelectedCellsHorizontally(
  1328.   RowCount: Integer);
  1329. var r,c,cs,rs: Integer;
  1330.     RowsAdded: Integer;
  1331. begin
  1332.   if not GetNormalizedSelectionBounds(True, r,c,cs,rs) then
  1333.     exit;
  1334.   DestroyInplace(True);
  1335.   InitUndo;
  1336.   try
  1337.     RowsAdded := Rows.SplitCellsHorizontally(r,c,cs,rs, RowCount);
  1338.     Select(r,c,rs+RowsAdded-1,cs-1);
  1339.   finally
  1340.     DoneUndo;
  1341.   end;
  1342.   ResetLiveSpell;
  1343.   Changed;
  1344. end;
  1345. {------------------------------------------------------------------------------}
  1346. function TRVTableItemInfo.CanMergeSelectedCells(AllowMergeRC: Boolean): Boolean;
  1347. var r,c,cs,rs: Integer;
  1348. begin
  1349.   Result := False;
  1350.   if not (rvtsSelExists in FState) then
  1351.     exit;
  1352.   GetNormalizedSelectionBounds(False, r,c,cs,rs);
  1353.   Result := Rows.CanMergeCells(r,c,cs,rs, AllowMergeRC);
  1354. end;
  1355. {------------------------------------------------------------------------------}
  1356. function TRVTableItemInfo.CanMergeCells(TopRow, LeftCol, ColSpan,
  1357.   RowSpan: Integer; AllowMergeRC: Boolean): Boolean;
  1358. begin
  1359.   Result := Rows.CanMergeCells(TopRow, LeftCol, ColSpan, RowSpan, AllowMergeRC);
  1360. end;
  1361. {------------------------------------------------------------------------------}
  1362. procedure TRVTableItemInfo.MergeCells(TopRow, LeftCol, ColSpan,
  1363.   RowSpan: Integer; AllowMergeRC: Boolean);
  1364. begin
  1365.   DestroyInplace(True);
  1366.   InitUndo;
  1367.   try
  1368.     Rows.MergeCells(TopRow, LeftCol, ColSpan, RowSpan, AllowMergeRC, True);
  1369.   finally
  1370.     DoneUndo;
  1371.   end;
  1372.   ResetLiveSpell;
  1373.   Changed;
  1374. end;
  1375. {------------------------------------------------------------------------------}
  1376. procedure TRVTableItemInfo.MergeSelectedCells(AllowMergeRC: Boolean);
  1377. var r,c,cs,rs: Integer;
  1378. begin
  1379.   if not (rvtsSelExists in FState) then
  1380.     exit;
  1381.   GetNormalizedSelectionBounds(False, r,c,cs,rs);
  1382.   MergeCells(r,c,cs,rs,AllowMergeRC);
  1383. end;
  1384. {------------------------------------------------------------------------------}
  1385. procedure TRVTableItemInfo.UnmergeCells(TopRow, LeftCol, ColSpan,
  1386.   RowSpan: Integer; UnmergeRows, UnmergeCols: Boolean);
  1387. begin
  1388.   SaveInplace;
  1389.   InitUndo;
  1390.   try
  1391.     Rows.UnmergeCells(TopRow, LeftCol, ColSpan, RowSpan, UnmergeRows, UnmergeCols);
  1392.   finally
  1393.     DoneUndo;
  1394.     RestoreInplace;
  1395.     ResetLiveSpell;
  1396.     Changed;
  1397.   end;
  1398. end;
  1399. {------------------------------------------------------------------------------}
  1400. procedure TRVTableItemInfo.UnmergeSelectedCells(UnmergeRows, UnmergeCols: Boolean);
  1401. var r,c,cs,rs: Integer;
  1402. begin
  1403.   if not GetNormalizedSelectionBounds(True, r,c,cs,rs) then
  1404.     exit;
  1405.   UnmergeCells(r,c,cs,rs,UnmergeRows, UnmergeCols);
  1406. end;
  1407. {------------------------------------------------------------------------------}
  1408. function TRVTableItemInfo.GetEditedCell(var Row, Col: Integer): TCustomRichViewEdit;
  1409. begin
  1410.   if FInplaceEditor<>nil then begin
  1411.     Result := FInplaceEditor;
  1412.     Row := TRVTableInplaceEdit(FInplaceEditor).FRow;
  1413.     Col := TRVTableInplaceEdit(FInplaceEditor).FCol;
  1414.     end
  1415.   else begin
  1416.     Result := nil;
  1417.     Row := -1;
  1418.     Col := -1;
  1419.   end;
  1420. end;
  1421. {------------------------------------------------------------------------------}
  1422. procedure TRVTableItemInfo.Change;
  1423. begin
  1424.   ChangeEx(True);
  1425. end;
  1426. {------------------------------------------------------------------------------}
  1427. procedure TRVTableItemInfo.ChangeEx(ClearRedo: Boolean);
  1428. begin
  1429.   if (rvtsInserted in FState) and (Rows.FMainRVData is TRVEditRVData) then
  1430.     TRVEditRVData(Rows.FMainRVData).ChangeEx(ClearRedo);
  1431. end;
  1432. {------------------------------------------------------------------------------}
  1433. function TRVTableItemInfo.BeginModify(ItemNo: Integer): Integer;
  1434. begin
  1435.   if (rvtsInserted in FState) and (Rows.FMainRVData is TRVEditRVData) then
  1436.     TRVEditRVData(Rows.FMainRVData).BeginItemModify(ItemNo, Result)
  1437.   else
  1438.     Result := 0;
  1439. end;
  1440. {------------------------------------------------------------------------------}
  1441. procedure TRVTableItemInfo.EndModify(ItemNo, Data: Integer);
  1442. begin
  1443.   if (rvtsInserted in FState) and (Rows.FMainRVData is TRVEditRVData) then
  1444.     TRVEditRVData(Rows.FMainRVData).EndItemModify(ItemNo, data);
  1445. end;
  1446. {------------------------------------------------------------------------------}
  1447. function TRVTableItemInfo.CreateTemporalEditor: TCustomRichViewEdit;
  1448. var ParentEditor: TCustomRichViewEdit;
  1449. begin
  1450.   Result := TCustomRichViewEdit.Create(nil);
  1451.   ParentEditor := TRVEditRVData(Rows.FMainRVData).RichView as TCustomRichViewEdit;
  1452.   Result.Visible := False;
  1453.   Result.Parent := ParentEditor;
  1454.   Result.Options := ParentEditor.Options;
  1455.   Result.EditorOptions := ParentEditor.EditorOptions;
  1456.   Result.Style := ParentEditor.Style;
  1457.   if ParentEditor.UndoLimit=0 then
  1458.     Result.UndoLimit := 0
  1459.   else
  1460.     Result.UndoLimit := -1;
  1461. end;
  1462. {------------------------------------------------------------------------------}
  1463. procedure TRVTableItemInfo.ApplyToCells(ConvType: TRVEStyleConversionType;
  1464.   UserData: Integer; SelectedOnly: Boolean);
  1465. var tr,lc,rs,cs,r,c,i: Integer;
  1466.     ItemNo, Data: Integer;
  1467.     Editor: TCustomRichViewEdit;
  1468.     ParentEditor: TCustomRichViewEdit;
  1469.     ui: TRVUndoMultiCellsModify;
  1470. begin
  1471.   if not (rvtoEditing in Options) then
  1472.     exit;
  1473.   ItemNo := GetMyItemNo;
  1474.   Data := 0;
  1475.   if SelectedOnly then begin
  1476.     if not GetNormalizedSelectionBounds(False, tr, lc,cs,rs) or not BeforeChange then
  1477.       exit;
  1478.     Data := BeginModify(ItemNo);
  1479.     InitUndo;
  1480.   end;
  1481.   Editor := CreateTemporalEditor;
  1482.   try
  1483.     ParentEditor := TCustomRichViewEdit(TRVEditRVData(Rows.FMainRVData).RichView);
  1484.     ui := TRVUndoMultiCellsModify(
  1485.              AddTableUndoInfo(TRVEditRVData(Rows.FMainRVData), TRVUndoMultiCellsModify,
  1486.                              ItemNo, True, True));
  1487.     if ui<>nil then begin
  1488.       ui.ItemNo := ItemNo;
  1489.       ui.UndoList  := TRVUndoList.Create(TCustomRVFormattedData(ParentEditor.RVData.GetAbsoluteRootData));
  1490.       ui.RowList   := TRVIntegerList.Create;
  1491.       ui.ColList   := TRVIntegerList.Create;
  1492.       ui.CountList := TRVIntegerList.Create;
  1493.     end;
  1494.     case ConvType of
  1495.       rvscParaStyleConversion:
  1496.         Editor.OnParaStyleConversion := ParentEditor.OnParaStyleConversion;
  1497.       rvscTextStyleConversion:
  1498.         Editor.OnStyleConversion := ParentEditor.OnStyleConversion;
  1499.     end;
  1500.     for r := 0 to Rows.Count-1 do
  1501.       with Rows[r] do
  1502.         for c := 0 to Count-1 do
  1503.           if (Items[c]<>nil) and (not SelectedOnly or IsCellSelected(r,c)) and
  1504.              DoOnCellEditing(r,c,True) then begin
  1505.             Editor.RVData.Clear;
  1506.             Editor.RVData.DrainFrom(Items[c]);
  1507.             Editor.Format;
  1508.             Editor.SelectAll;
  1509.             Editor.RVData.State := Editor.RVData.State + [rvstSkipFormatting];
  1510.             case ConvType of
  1511.               rvscParaStyle:
  1512.                 Editor.ApplyParaStyle(UserData);
  1513.               rvscTextStyle:
  1514.                 Editor.ApplyTextStyle(UserData);
  1515.               rvscParaStyleConversion:
  1516.                 Editor.ApplyParaStyleConversion(UserData);
  1517.               rvscTextStyleConversion:
  1518.                 Editor.ApplyStyleConversion(UserData);
  1519.               {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1520.               rvscParaStyleTemplate:
  1521.                 Editor.ApplyParaStyleTemplate(UserData);
  1522.               rvscTextStyleTemplate:
  1523.                 Editor.ApplyTextStyleTemplate(UserData, False);
  1524.               {$ENDIF}
  1525.             end;
  1526.             Editor.RVData.State := Editor.RVData.State - [rvstSkipFormatting];
  1527.             if TRVEditRVData(Editor.RVData).UndoList.Count>0 then begin
  1528.               if ui<>nil then begin
  1529.                 ui.RowList.Add(r);
  1530.                 ui.ColList.Add(c);
  1531.                 ui.CountList.Add(TRVEditRVData(Editor.RVData).UndoList.Count);
  1532.                 for i := 0 to TRVEditRVData(Editor.RVData).UndoList.Count-1 do
  1533.                   ui.UndoList.AddInfos(TObject(TRVEditRVData(Editor.RVData).UndoList.Items[i]) as TRVUndoInfos);
  1534.                 for i := TRVEditRVData(Editor.RVData).UndoList.Count-1 downto 0 do
  1535.                   TRVEditRVData(Editor.RVData).UndoList.DeleteAsPointer(i);
  1536.               end;
  1537.               Changed;
  1538.             end;
  1539.             Items[c].DrainFrom(Editor.RVData);
  1540.           end;
  1541.   finally
  1542.     Editor.Free;
  1543.   end;
  1544.   if ConvType in [rvscTextStyle, rvscTextStyleConversion, rvscTextStyleTemplate] then
  1545.     ResetLiveSpell;
  1546.   if SelectedOnly then begin
  1547.     if rvtsModified in FState then
  1548.       EndModify(ItemNo, Data);
  1549.     DoneUndo;
  1550.     Change;
  1551.   end;
  1552. end;
  1553. {------------------------------------------------------------------------------}
  1554. procedure TRVTableItemInfo.ApplyStyleConversionToSubRVDatas(UserData: Integer;
  1555.   SelectedOnly: Boolean; ConvType: TRVEStyleConversionType);
  1556. begin
  1557.   ApplyToCells(ConvType, UserData, SelectedOnly);
  1558. end;
  1559. {------------------------------------------------------------------------------}
  1560. function TRVTableItemInfo.CanDeletePartiallySelected: Boolean;
  1561. var tr,lc,rs,cs,r,c: Integer;
  1562. begin
  1563.   Result := rvtoEditing in Options;
  1564.   if not Result then
  1565.     exit;
  1566.   if not GetNormalizedSelectionBounds(False, tr, lc,cs,rs) then
  1567.     exit;
  1568.   if not (Rows.FMainRVData is TRVEditRVData) then
  1569.     exit;
  1570.   for r := 0 to Rows.Count-1 do
  1571.     with Rows[r] do
  1572.       for c := 0 to Count-1 do
  1573.         if (Items[c]<>nil) and IsCellSelected(r,c) then
  1574.           if not Items[c].CanClear then begin
  1575.             Result := False;
  1576.             exit;
  1577.           end;
  1578. end;
  1579. {------------------------------------------------------------------------------}
  1580. procedure TRVTableItemInfo.DeletePartiallySelected;
  1581. var tr,lc,rs,cs,r,c: Integer;
  1582.     ItemNo, Data: Integer;
  1583.     RowList, ColList: TRVIntegerList;
  1584.     CellsList: TList;
  1585.     ui: TRVUndoInfo;
  1586. begin
  1587.   if not GetNormalizedSelectionBounds(False, tr, lc,cs,rs) or not BeforeChange then
  1588.     exit;
  1589.   ItemNo := GetMyItemNo;
  1590.   RowList := TRVIntegerList.Create;
  1591.   ColList := TRVIntegerList.Create;
  1592.   try
  1593.     for r := 0 to Rows.Count-1 do
  1594.       with Rows[r] do
  1595.         for c := 0 to Count-1 do
  1596.           if (Items[c]<>nil) and IsCellSelected(r,c) and
  1597.              DoOnCellEditing(r,c, True) then begin
  1598.              RowList.Add(r);
  1599.              ColList.Add(c);
  1600.           end;
  1601.     if RowList.Count>0 then begin
  1602.       Data := BeginModify(ItemNo);
  1603.       InitUndo;
  1604.       try
  1605.         ui := Rows.Do_BeforeClearCells(ItemNo, RowList, ColList, CellsList);
  1606.         Rows.Do_ClearCells(CellsList, RowList, ColList, ui);
  1607.       finally
  1608.         DoneUndo;
  1609.         EndModify(ItemNo,Data);
  1610.         ResetLiveSpell;
  1611.         Change;
  1612.       end;
  1613.     end;
  1614.   finally
  1615.     RowList.Free;
  1616.     ColList.Free;
  1617.   end;
  1618. end;
  1619. {------------------------------------------------------------------------------}
  1620. procedure TRVTableItemInfo.DoAfterFillingRows(Row, Count: Integer);
  1621. var r,c: Integer;
  1622.     ItemNo: Integer;
  1623.     RowList, ColList: TRVIntegerList;
  1624.     CellsList: TList;
  1625.     ui: TRVUndoInfo;
  1626. begin
  1627.   if (Count=0) or (Row>=Rows.Count) then
  1628.     exit;
  1629.   if Row+Count>Rows.Count then
  1630.     Count := Rows.Count-Row;
  1631.   ItemNo := GetEditorItemNoForUndo;
  1632.   RowList := TRVIntegerList.Create;
  1633.   ColList := TRVIntegerList.Create;
  1634.   try
  1635.     for r := Row to Row+Count-1 do
  1636.       for c := 0 to Rows[r].Count-1 do
  1637.         if Cells[r,c]<>nil then begin
  1638.           RowList.Add(r);
  1639.           ColList.Add(c);
  1640.         end;
  1641.     if RowList.Count>0 then begin
  1642.       InitUndo;
  1643.       try
  1644.         ui := Rows.Do_BeforeClearCells(ItemNo, RowList, ColList, CellsList);
  1645.         if ui<>nil then begin
  1646.           TRVUndoCellsClear(ui).CellsList.Free;
  1647.           TRVUndoCellsClear(ui).CellsList := nil;
  1648.           TRVUndoCellsClear(ui).Flag := True;
  1649.         end;
  1650.       finally
  1651.         DoneUndo;
  1652.         Change;
  1653.       end;
  1654.     end;
  1655.   finally
  1656.     RowList.Free;
  1657.     ColList.Free;
  1658.   end;
  1659. end;
  1660. {------------------------------------------------------------------------------}
  1661. function TRVTableItemInfo.GetCellTo(Row, Col: Integer;
  1662.   Dir: TRVCellDirection; var NewRow, NewCol: Integer;
  1663.   Quiet: Boolean): Boolean;
  1664. var r,c: Integer;
  1665. begin
  1666.   case Dir of
  1667.     rvcdUp:
  1668.       begin
  1669.         Result := Row>0;
  1670.         if Result then
  1671.           Rows.GetMainCell(Row-1,Col,NewRow,NewCol);
  1672.       end;
  1673.     rvcdLeft:
  1674.       begin
  1675.         Result := (Col>0) or (Row>0) ;
  1676.         if Result then
  1677.           if Col>0 then
  1678.             Rows.GetMainCell(Row,Col-1,NewRow,NewCol)
  1679.           else
  1680.             Result := GetCellTo(Row, Col, rvcdPrev, NewRow,NewCol, True);
  1681.       end;
  1682.     rvcdRight:
  1683.       begin
  1684.         Result := (Col+Cells[Row,Col].ColSpan<Rows[Row].Count) or
  1685.                   (Row+Cells[Row,Col].RowSpan<Rows.Count);
  1686.         if Result then
  1687.           if (Col+Cells[Row,Col].ColSpan<Rows[Row].Count) then
  1688.             Rows.GetMainCell(Row,Col+Cells[Row,Col].ColSpan,NewRow,NewCol)
  1689.           else
  1690.             Result := GetCellTo(Row, Col, rvcdNext, NewRow,NewCol, True);
  1691.       end;
  1692.     rvcdDown:
  1693.       begin
  1694.         Result := Row+Cells[Row,Col].RowSpan<Rows.Count;
  1695.         if Result then
  1696.           Rows.GetMainCell(Row+Cells[Row,Col].RowSpan,Col,NewRow,NewCol);
  1697.       end;
  1698.     rvcdNext:
  1699.       begin
  1700.         NewRow := Row;
  1701.         NewCol := Col+1;
  1702.         Result := True;
  1703.         while NewCol<Rows[NewRow].Count do begin
  1704.           if Cells[NewRow,NewCol]<>nil then
  1705.             exit;
  1706.           inc(NewCol);
  1707.         end;
  1708.         for r := Row+1 to Rows.Count-1 do
  1709.           for c := 0 to Rows[r].Count-1 do
  1710.             if (Cells[r,c]<>nil) then begin
  1711.               NewRow := r;
  1712.               NewCol := c;
  1713.               exit;
  1714.             end;
  1715.         Result := False;
  1716.         if not Quiet then Beep;
  1717.       end;
  1718.     rvcdPrev:
  1719.       begin
  1720.         NewRow := Row;
  1721.         NewCol := Col-1;
  1722.         Result := True;
  1723.         while NewCol>=0 do begin
  1724.           if Cells[NewRow,NewCol]<>nil then
  1725.             exit;
  1726.           dec(NewCol);
  1727.         end;
  1728.         for r := Row-1 downto 0 do
  1729.           for c := Rows[r].Count-1 downto 0 do
  1730.             if (Cells[r,c]<>nil) then begin
  1731.               NewRow := r;
  1732.               NewCol := c;
  1733.               exit;
  1734.             end;
  1735.         Result := False;
  1736.         if not Quiet then Beep;
  1737.       end;
  1738.     else
  1739.       Result := False;
  1740.   end;
  1741. end;
  1742. {------------------------------------------------------------------------------}
  1743. function TRVTableItemInfo.CanSeeBackgroundThroughCell(Cell: TRVTableCellData): Boolean;
  1744. begin
  1745.   Result := (Cell.Color=clNone) and (Color=clNone);
  1746.   if Result and (Rows.FMainRVData is TCustomRVFormattedData) then
  1747.     Result := Rows.FMainRVData.GetRVStyle.ParaStyles[ParaNo].Background.Color=clNone;
  1748. end;
  1749. {------------------------------------------------------------------------------}
  1750. function TRVTableItemInfo.GetTableColor(UseParentBackground: Boolean): TColor;
  1751. begin
  1752.   Result := Color;
  1753.   if Result=clNone then
  1754.     if Rows.FMainRVData is TCustomRVFormattedData then begin
  1755.       Result := Rows.FMainRVData.GetRVStyle.ParaStyles[ParaNo].Background.Color;
  1756.       if UseParentBackground and (Result=clNone) then
  1757.         Result := TCustomRVFormattedData(Rows.FMainRVData).GetColor;
  1758.     end;
  1759. end;
  1760. {------------------------------------------------------------------------------}
  1761. function TRVTableItemInfo.GetCellColor(Cell: TRVTableCellData): TColor;
  1762. begin
  1763.   Result := Cell.Color;
  1764.   if Result=clNone then begin
  1765.     Result := Color;
  1766.     if Result=clNone then
  1767.       if Rows.FMainRVData is TCustomRVFormattedData then begin
  1768.         Result := Rows.FMainRVData.GetRVStyle.ParaStyles[ParaNo].Background.Color;
  1769.         if Result=clNone then
  1770.           Result := TCustomRVFormattedData(Rows.FMainRVData).GetColor;
  1771.       end;
  1772.   end;
  1773. end;
  1774. {------------------------------------------------------------------------------}
  1775. function TRVTableItemInfo.GetSplitRowBelow(Row: Integer): Integer;
  1776. var r,c,mr,mc: Integer;
  1777.     Cell:TRVTableCellData;
  1778.     CanSplit:Boolean;
  1779. begin
  1780.   r := Row;
  1781.   while r<Rows.Count-1 do begin
  1782.     c := Rows[r].Count-1;
  1783.     CanSplit := True;
  1784.     while c>=0 do begin
  1785.       Cell := Rows.GetMainCell(r,c,mr,mc);
  1786.       mr := mr+Cell.RowSpan-1;
  1787.       if mr>r then begin
  1788.         r := mr;
  1789.         CanSplit := False;
  1790.         break;
  1791.       end;
  1792.       c := mc-1;
  1793.     end;
  1794.     if CanSplit then
  1795.       break;
  1796.   end;
  1797.   Result := r;
  1798. end;
  1799. {------------------------------------------------------------------------------}
  1800. function TRVTableItemInfo.GetSplitRowAbove(Row: Integer): Integer;
  1801. var r,c,mr,mc: Integer;
  1802.     CanSplit:Boolean;
  1803. begin
  1804.   r := Row;
  1805.   while r>0 do begin
  1806.     c := Rows[r].Count-1;
  1807.     CanSplit := True;
  1808.     while c>=0 do begin
  1809.       Rows.GetMainCell(r,c,mr,mc);
  1810.       if mr<r then begin
  1811.         r := mr;
  1812.         CanSplit := False;
  1813.         break;
  1814.       end;
  1815.       c := mc-1;
  1816.     end;
  1817.     if CanSplit then
  1818.       break;
  1819.   end;
  1820.   Result := r;
  1821. end;
  1822. {------------------------------------------------------------------------------}
  1823. {$IFNDEF RVDONOTUSERTF}
  1824. procedure TRVTableItemInfo.FillRTFTables(ColorList: TRVColorList;
  1825.   ListOverrideCountList: TRVIntegerList; RVData: TPersistent); 
  1826. var r,c: Integer;
  1827. begin
  1828.   ColorList.AddUnique(Color);
  1829.   case BorderStyle of
  1830.     rvtbRaised, rvtbLowered:
  1831.       begin
  1832.         ColorList.AddUnique(clBtnHighlight);
  1833.         ColorList.AddUnique(clBtnShadow);
  1834.         ColorList.AddUnique(clBtnFace);
  1835.       end;
  1836.     rvtbColor:
  1837.       ColorList.AddUnique(BorderColor);
  1838.     rvtbRaisedColor, rvtbLoweredColor:
  1839.       begin
  1840.         ColorList.AddUnique(BorderColor);
  1841.         ColorList.AddUnique(BorderLightColor);
  1842.       end;
  1843.   end;
  1844.   case CellBorderStyle of
  1845.     rvtbRaised, rvtbLowered:
  1846.       begin
  1847.         ColorList.AddUnique(clBtnHighlight);
  1848.         ColorList.AddUnique(clBtnShadow);
  1849.         ColorList.AddUnique(clBtnFace);
  1850.       end;
  1851.     rvtbColor:
  1852.       ColorList.AddUnique(CellBorderColor);
  1853.     rvtbRaisedColor, rvtbLoweredColor:
  1854.       begin
  1855.         ColorList.AddUnique(CellBorderColor);
  1856.         ColorList.AddUnique(CellBorderLightColor);
  1857.       end;
  1858.   end;
  1859.   if VRuleWidth>0 then
  1860.     ColorList.AddUnique(VRuleColor);
  1861.   if HRuleWidth>0 then
  1862.     ColorList.AddUnique(HRuleColor);
  1863.   for r := 0 to Rows.Count-1 do
  1864.     with Rows[r] do
  1865.       for c := 0 to Count-1 do
  1866.         if (Items[c]<>nil) then begin
  1867.           ColorList.AddUnique(Items[c].Color);
  1868.           ColorList.AddUnique(Items[c].BorderColor);
  1869.           ColorList.AddUnique(Items[c].BorderLightColor);
  1870.           Items[c].MakeRTFTables(ColorList, ListOverrideCountList, False);
  1871.         end;
  1872. end;
  1873. {------------------------------------------------------------------------------}
  1874. procedure TRVTableItemInfo.SaveRTF(Stream: TStream; const Path: String;
  1875.   RVData: TPersistent; ItemNo: Integer; const Name: String; TwipsPerPixel: Double;
  1876.   Level: Integer; ColorList: TRVColorList;
  1877.   StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  1878.   FontTable: TRVList);
  1879.   {......................................................}
  1880.   function GetBorderString(BorderStyle:TRVTableBorderStyle; Width: Integer;  Color: Integer): String;
  1881.   begin
  1882.     case BorderStyle of
  1883.       rvtbColor:
  1884.         Result := Format('brdrsbrdrw%dbrdrcf%d',[Width,ColorList.IndexOf(Pointer(Color))]);
  1885.       rvtbLowered:
  1886.         Result := Format('brdrinsetbrdrw%d',[Width]);
  1887.       rvtbRaised:
  1888.         Result := Format('brdroutsetbrdrw%d',[Width]);
  1889.       rvtbLoweredColor:
  1890.         Result := Format('brdrsbrdrw%dbrdrcf%d',[Width,ColorList.IndexOf(Pointer(Color))]);
  1891.       rvtbRaisedColor:
  1892.         Result := Format('brdrsbrdrw%dbrdrcf%d',[Width,ColorList.IndexOf(Pointer(Color))]);
  1893.     end;
  1894.   end;
  1895.   {......................................................}
  1896.   procedure SaveBorder(BorderStyle:TRVTableBorderStyle; Width: Integer; Color, LightColor: TColor;
  1897.                        VisibleBorders: TRVBooleanRect;
  1898.                        const prefix: String; MainRow, MainCol, Row, Col: Integer);
  1899.   var LTColor,RBColor: TColor;
  1900.     function IsLeftSideVisible: Boolean;
  1901.     begin
  1902.       Result := (VisibleBorders=nil);
  1903.       if Result then
  1904.         exit;
  1905.       Result := {(Col=MainCol) and }VisibleBorders.Left;
  1906.     end;
  1907.     function IsTopSideVisible: Boolean;
  1908.     begin
  1909.       Result := (VisibleBorders=nil);
  1910.       if Result then
  1911.         exit;
  1912.       Result := {(Row=MainRow) and }VisibleBorders.Top;
  1913.     end;
  1914.     function IsRightSideVisible: Boolean;
  1915.     begin
  1916.       Result := (VisibleBorders=nil);
  1917.       if Result then
  1918.         exit;
  1919.       Result := {(Col=MainCol+Cells[MainRow,MainCol].ColSpan-1) and }VisibleBorders.Right;
  1920.     end;
  1921.     function IsBottomSideVisible: Boolean;
  1922.     begin
  1923.       Result := (VisibleBorders=nil);
  1924.       if Result then
  1925.         exit;
  1926.       Result := {(Row=MainRow+Cells[MainRow,MainCol].RowSpan-1) and }VisibleBorders.Bottom;
  1927.     end;
  1928.   begin
  1929.     if Width<=0 then
  1930.       exit;
  1931.     Width := Round(Width*TwipsPerPixel);
  1932.     case BorderStyle of
  1933.       rvtbRaisedColor:
  1934.         begin
  1935.           LTColor := LightColor;
  1936.           RBColor := Color;
  1937.         end;
  1938.       rvtbLoweredColor:
  1939.         begin
  1940.           LTColor := Color;
  1941.           RBColor := LightColor;
  1942.         end;
  1943.       else
  1944.         begin
  1945.           LTColor := Color;
  1946.           RBColor := Color;
  1947.         end;
  1948.     end;
  1949.     if IsLeftSideVisible then
  1950.       RVFWrite(Stream, Format('%sbrdrl%s', [prefix, GetBorderString(BorderStyle, Width, LTColor)]));
  1951.     if IsTopSideVisible then
  1952.       RVFWrite(Stream, Format('%sbrdrt%s', [prefix, GetBorderString(BorderStyle, Width, LTColor)]));
  1953.     if IsRightSideVisible then
  1954.       RVFWrite(Stream, Format('%sbrdrr%s', [prefix, GetBorderString(BorderStyle, Width, RBColor)]));
  1955.     if IsBottomSideVisible then
  1956.       RVFWrite(Stream, Format('%sbrdrb%s', [prefix, GetBorderString(BorderStyle, Width, RBColor)]));
  1957.   end;
  1958.   {......................................................}
  1959. var r,c,mr,mc,h: Integer;
  1960.   Nested: Boolean;
  1961.   NestS,s: String;
  1962.   Right: Integer;
  1963.   Cell: TRVTableCellData;
  1964.   val1,val2, gaph2: Integer;
  1965.   BColor, BLColor: TColor;
  1966. begin
  1967.   if (Fmt.FWidth=0) then
  1968.     OnDocWidthChange(600, nil, False,nil,nil,nil,r,r,False,False);
  1969.   Nested := Level>0;
  1970.   NestS := '';
  1971.   for r := 0 to Rows.Count-1 do begin
  1972.     if Nested then
  1973.       NestS := '*nesttableprops';
  1974.     RVFWrite(Stream, Format('{%s',[NestS]));
  1975.     case TCustomRVData(RVData).GetRVStyle.ParaStyles[TCustomRVData(RVData).GetItemPara(ItemNo)].Alignment of
  1976.       rvaRight:
  1977.         s := 'trqr';
  1978.       rvaCenter:
  1979.         s := 'trqc';
  1980.     end;
  1981.     gaph2 := (CellHSpacing+(CellPadding+CellBorderWidth)*2);
  1982.     RVFWrite(Stream, Format('trowd%strgaph%dtrleft%ditap%d',
  1983.       [s, Round(gaph2*TwipsPerPixel/2), 0, Level+1]));
  1984.     if r<HeadingRowCount then
  1985.       RVFWrite(Stream, 'trhdr');
  1986.     h := Rows[r].GetBestHeight;
  1987.     if h>0 then
  1988.       RVFWrite(Stream, Format('trrh%d',[Round(h*TwipsPerPixel)]));
  1989.     val1 := Round(CellPadding*TwipsPerPixel);
  1990.     RVFWrite(Stream, Format('trpaddl%dtrpaddt%dtrpaddr%dtrpaddb%dtrpaddfl3trpaddft3trpaddfr3trpaddfb3',
  1991.                      [val1,val1,val1,val1]));
  1992.     val1 := Round(CellHSpacing*TwipsPerPixel/2);
  1993.     //if val1>=0 then
  1994.       RVFWrite(Stream, Format('trspdl%dtrspdr%dtrspdfl3trspdfr3',[val1,val1]));
  1995.     // not sure about dividing by 2 below, but result looks much better:
  1996.     if r=0 then
  1997.       val1 := Round(BorderVSpacing*TwipsPerPixel/2)
  1998.     else
  1999.       val1 := Round(CellVSpacing*TwipsPerPixel/2);
  2000.     if r=Rows.Count-1 then
  2001.       val2 := Round(BorderVSpacing*TwipsPerPixel/2)
  2002.     else
  2003.       val2 := Round(CellVSpacing*TwipsPerPixel/2);
  2004.     //if val1>=0 then
  2005.       RVFWrite(Stream, Format('trspdt%dtrspdft3',[val1]));
  2006.     //if val2>=0 then
  2007.       RVFWrite(Stream, Format('trspdb%dtrspdfb3',[val2]));
  2008.     { does not work...
  2009.     val1 := Round(BorderHSpacing*TwipsPerPixel);
  2010.     RVFWrite(Stream, Format('trftsWidthB3trftsWidthB3trwWidthB%dtrwWidthA%d',[val1,val1]));
  2011.     }
  2012.     if BestWidth>0 then
  2013.       RVFWrite(Stream, Format('trwWidth%dtrftsWidth3',[Round((BestWidth+BorderWidth*2)*TwipsPerPixel)]))
  2014.     else if BestWidth<0 then
  2015.       RVFWrite(Stream, Format('trwWidth%dtrftsWidth2',[-BestWidth*50]))
  2016.     else begin
  2017.       RVFWrite(Stream, 'trftsWidth1');
  2018.       if RichViewTableDefaultRTFAutofit or (rvtoRTFAllowAutofit in Options) then
  2019.         RVFWrite(Stream, 'trautofit1');
  2020.     end;
  2021.     if not (rvtoRowsSplit in PrintOptions) then
  2022.       RVFWrite(Stream, 'trkeeptrkeepfollow');
  2023.     RVFWrite(Stream, Format('richviewtbw%d',[BestWidth])); // for RichView only
  2024.     SaveBorder(BorderStyle, BorderWidth, BorderColor, BorderLightColor, VisibleBorders, 'tr',
  2025.       -1, -1, -1, -1);
  2026.     RVFWrite(Stream, Rows.FMainRVData.GetExtraRTFCode(rv_rtfs_RowProps, Self, r, -1, False));
  2027.     with Rows[r] do begin
  2028.       for c := 0 to Count-1 do begin
  2029.         Cell := Rows.GetMainCell(r,c,mr,mc);
  2030.         if c>mc then
  2031.           continue;
  2032.         if Items[c]=nil then begin
  2033.           if (r=mr) and (Cell.RowSpan>1) then
  2034.             RVFWrite(Stream, 'clvmgf');
  2035.           if (r>mr)  then
  2036.             RVFWrite(Stream, 'clvmrg');
  2037.           end
  2038.         else begin
  2039.           if (Cell.RowSpan>1) then
  2040.             RVFWrite(Stream, 'clvmgf');
  2041.         end;
  2042.         if Items[c]<>nil then begin
  2043.           if Cell.BestWidth>0 then begin
  2044.             if rvtoRTFSaveCellPixelBestWidth in Options then
  2045.               RVFWrite(Stream,Format('clwWidth%dclftsWidth3',[Round(Cell.BestWidth*TwipsPerPixel)]))
  2046.             else
  2047.               RVFWrite(Stream, 'clwWidth0')
  2048.             end
  2049.           else if Cell.BestWidth<0 then
  2050.             RVFWrite(Stream,Format('clwWidth%dclftsWidth2',[-Cell.BestWidth*50]))
  2051.           else
  2052.             RVFWrite(Stream,'clftsWidth1');
  2053.          RVFWrite(Stream, Format('richviewcbw%drichviewcbh%d',[Cell.BestWidth,Cell.BestHeight])); // for RichView only
  2054.         end;
  2055.         if Cell.BorderColor<>clNone then
  2056.           BColor := Cell.BorderColor
  2057.         else
  2058.           BColor := CellBorderColor;
  2059.         if Cell.BorderLightColor<>clNone then
  2060.           BLColor := Cell.BorderLightColor
  2061.         else
  2062.           BLColor := CellBorderLightColor;
  2063.         SaveBorder(CellBorderStyle, CellBorderWidth, BColor, BLColor, Cell.VisibleBorders, 'cl',
  2064.           mr, mc, r, c);
  2065.         if GetCellColor(Cell)<>clNone then
  2066.           RVFWrite(Stream, Format('clcbpat%d',[ColorList.IndexOf(Pointer(GetCellColor(Cell)))]));
  2067.         case Cell.GetRealVAlign of
  2068.           //rvcTop: {default}
  2069.           //  RVFWrite(Stream, 'clvertalt');
  2070.           rvcMiddle:
  2071.             RVFWrite(Stream, 'clvertalc');
  2072.           rvcBottom:
  2073.             RVFWrite(Stream, 'clvertalb');
  2074.         end;
  2075.         RVFWrite(Stream, Rows.FMainRVData.GetExtraRTFCode(rv_rtfs_CellProps, Self, r, c, False));
  2076.         //Right := Fmt.ColStarts[c]+Fmt.ColWidths[c];
  2077.         Right := Fmt.ColStarts[mc+Cell.ColSpan-1]+Fmt.ColWidths[mc+Cell.ColSpan-1];
  2078.         RVFWrite(Stream,Format('cellx%d',[Round(Right*TwipsPerPixel+CellHSpacing*TwipsPerPixel/2)]));
  2079.       end;
  2080.       RVFWrite(Stream, Format('pardintblitap%d{',[Level+1]));
  2081.       for c := 0 to Count-1 do begin
  2082.         Rows.GetMainCell(r,c,mr,mc);
  2083.         if c>mc then
  2084.           continue;
  2085.         RVFWrite(Stream, '{');
  2086.         if (Items[c]<>nil) then begin
  2087.           Items[c].GetRVData.SaveRTFToStream(Stream, Path, False, Level+1, clNone, nil,
  2088.           ColorList, StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2,
  2089.           TRVRTFFontTable(FontTable), TwipsPerPixel);
  2090.         end;
  2091.         if Nested then
  2092.           NestS := 'nest';
  2093.         RVFWrite(Stream,Format('%scell}',[NestS]));
  2094.       end;
  2095.     end;
  2096.     RVFWrite(Stream, Format('}pardintblitap%d',[Level+1]));
  2097.     if Nested then
  2098.       NestS := 'nest';
  2099.     RVFWrite(Stream,Format('%srow}',[NestS]));
  2100.   end;
  2101.   Include(TCustomRVData(RVData).State, rvstRTFSkipPar);
  2102. end;
  2103. {$ENDIF}
  2104. {------------------------------------------------------------------------------}
  2105. {$IFNDEF RVDONOTUSEHTML}
  2106. procedure TRVTableItemInfo.SaveToHTML(Stream: TStream; RVData: TPersistent;
  2107.   ItemNo: Integer;
  2108.   const Text, Path, imgSavePrefix: String; var imgSaveNo: Integer;
  2109.   CurrentFileColor: TColor; SaveOptions: TRVSaveOptions; UseCSS: Boolean;
  2110.   Bullets: TRVList);
  2111. var ThisUseCSS: Boolean;
  2112.     CellSpacing: Integer;
  2113. const VAlignStr: array[TRVCellVAlign] of String =
  2114.     ('top', 'middle', 'bottom', '');
  2115.   {.....................................................}
  2116.   function GetHTMLLength(v: TRVHTMLLength; Quotes: Boolean): String;
  2117.   begin
  2118.     if v=0 then
  2119.       Result := ''
  2120.     else if v>0 then
  2121.       Result := IntToStr(v)
  2122.     else begin
  2123.       Result := IntToStr(-v)+'%';
  2124.       if Quotes then
  2125.         Result := '"'+Result+'"';    
  2126.     end;
  2127.   end;
  2128.   {.....................................................}
  2129.   function GetCellCSS(Cell: TRVTableCellData): String;
  2130.   var BColor, BLColor: TColor;
  2131.   begin
  2132.     Result := '';
  2133.     if not ThisUseCSS then
  2134.       exit;
  2135.     if (Cell<>nil) and (Cell.BorderColor<>clNone) then
  2136.       BColor := Cell.BorderColor
  2137.     else
  2138.       BColor := CellBorderColor;
  2139.     if (Cell<>nil) and (Cell.BorderLightColor<>clNone) then
  2140.       BLColor := Cell.BorderLightColor
  2141.     else
  2142.       BLColor := CellBorderLightColor;
  2143.     if ((CellBorderWidth<>BorderWidth) or (BorderWidth>1)) and
  2144.        not ((CellBorderWidth=1) and (BorderWidth>1)) then
  2145.       Result := Format('border-width : %dpx;', [CellBorderWidth]);
  2146.     if CellBorderWidth>0 then
  2147.       case CellBorderStyle of
  2148.         rvtbColor:
  2149.           {
  2150.           if BorderWidth=0 then
  2151.             RV_AddStr(Result, Format('border-color: %s; border-style: solid;',
  2152.                 [RV_GetHTMLRGBStr(BColor, False)]))
  2153.           else
  2154.           }
  2155.             RV_AddStr(Result, Format('border-color: %s;',
  2156.                 [RV_GetHTMLRGBStr(BColor, False)]));
  2157.         rvtbRaisedColor:
  2158.           RV_AddStr(Result, Format('border-color : %s %s %s %s; border-style: solid;',
  2159.             [RV_GetHTMLRGBStr(BLColor, False),RV_GetHTMLRGBStr(BColor, False),
  2160.              RV_GetHTMLRGBStr(BColor, False),RV_GetHTMLRGBStr(BLColor, False)]));
  2161.         rvtbLoweredColor:
  2162.           if (BColor<>BorderColor) or (BLColor<>BorderLightColor) or
  2163.              not (BorderStyle in [rvtbLoweredColor,rvtbRaisedColor]) then
  2164.             RV_AddStr(Result, Format('border-color : %s %s %s %s; border-style: solid;',
  2165.               [RV_GetHTMLRGBStr(BColor, False),RV_GetHTMLRGBStr(BLColor, False),
  2166.                RV_GetHTMLRGBStr(BLColor, False), RV_GetHTMLRGBStr(BColor, False)]));
  2167.         rvtbRaised:
  2168.           RV_AddStr(Result, 'border-style: outset;');
  2169.         rvtbLowered:
  2170.           RV_AddStr(Result, 'border-style: inset;');
  2171.       end;
  2172.   end;
  2173.   {.....................................................}
  2174.   function GetBackgroundFileName(Background: TRVBackground; Color: TColor;
  2175.     ItemNo: Integer; ARVData: TCustomRVData;
  2176.     const BackgroundImageFileName: String) : String;
  2177.   var Location: String;
  2178.       DoDefault: Boolean;
  2179.   begin
  2180.     Result := '';
  2181.     if (Background=nil) or not Background.Visible then
  2182.       exit;
  2183.     if Color=clNone then
  2184.       Color := CurrentFileColor;
  2185.     if (BackgroundImageFileName<>'') and (rvsoUseItemImageFileNames in SaveOptions) then
  2186.       Location := ExtractRelativePath(Path, BackgroundImageFileName)
  2187.     else
  2188.       Location := '';
  2189.     ARVData.HTMLSaveImage(ARVData, ItemNo, Path, Color, Location, DoDefault);
  2190.     if DoDefault then begin
  2191.       if (BackgroundImageFileName<>'') and (rvsoUseItemImageFileNames in SaveOptions) then
  2192.         Location := ExtractRelativePath(Path, BackgroundImageFileName)
  2193.       else
  2194.         Location := TCustomRVData(RVData).DoSavePicture(rvsfHTML, imgSavePrefix, Path,
  2195.           imgSaveNo, rvsoOverrideImages in SaveOptions, Color, Background.Image);
  2196.     end;
  2197.     if Location<>'' then
  2198.       Result := RV_GetHTMLPath(Location, SaveOptions, ARVData.GetRVStyle.DefCodePage);
  2199.   end;
  2200.   {.....................................................}
  2201.   function GetThisCellCSS(Cell : TRVTableCellData; const DefCss: String): String;
  2202.   var bss, s: String;
  2203.   begin
  2204.     if (Cell.BorderColor<>clNone) or (Cell.BorderLightColor<>clNone) then
  2205.       Result := GetCellCSS(Cell)
  2206.     else
  2207.       Result := DefCss;
  2208.     if not ThisUseCSS then
  2209.       exit;
  2210.     if (Cell.FBackground=nil) or not Cell.FBackground.Visible then
  2211.       bss := ''
  2212.     else begin
  2213.       if Cell.BackgroundStyle in [rvbsCentered, rvbsStretched] then
  2214.         bss := 'background-position: center center; background-repeat: no-repeat;'
  2215.       else if BackgroundStyle in [rvbsCentered, rvbsStretched] then
  2216.         bss := 'background-position: left top; background-repeat: repeat;'
  2217.       else
  2218.         bss := '';
  2219.       if UseCSS then begin
  2220.         s := GetBackgroundFileName (Cell.FBackground, GetCellColor(Cell), -1, Cell,
  2221.           Cell.BackgroundImageFileName);
  2222.         if s<>'' then
  2223.           RV_AddStr(bss, Format('background-image: url(''%s'');', [s]));
  2224.       end;
  2225.     end;
  2226.     RV_AddStr(Result, bss);
  2227.     if CellBorderWidth>0 then begin
  2228.       if not Cell.VisibleBorders.Top then
  2229.         RV_AddStr(Result, 'border-top: none;');
  2230.       if not Cell.VisibleBorders.Right then
  2231.         RV_AddStr(Result, 'border-right: none;');
  2232.       if not Cell.VisibleBorders.Bottom then
  2233.         RV_AddStr(Result, 'border-bottom: none;');
  2234.       if not Cell.VisibleBorders.Left then
  2235.         RV_AddStr(Result, 'border-left: none;');
  2236.     end;
  2237.     if Cell.Color<>Color then begin
  2238.       s := RV_GetHTMLRGBStr(Cell.Color, False);
  2239.       if s<>'' then
  2240.         RV_AddStr(Result, Format('background-color: %s;', [s]));
  2241.     end;
  2242.     if UseCSS and (rvsoXHTML in SaveOptions) then begin
  2243.       s := GetHTMLLength(Cell.BestWidth, False);
  2244.       if s<>'' then
  2245.         RV_AddStr(Result, Format('width: %s;', [s]));
  2246.       s := GetHTMLLength(Cell.BestHeight, False);
  2247.       if s<>'' then
  2248.         RV_AddStr(Result, Format('height: %s;', [s]));
  2249.     end;
  2250.     if Result<>'' then
  2251.       Result := Format(' style="{%s}"',[Result]);
  2252.   end;
  2253.   {.....................................................}
  2254.   function GetRules: String;
  2255.   begin
  2256.     {
  2257.     if HRuleWidth>0 then
  2258.      if VRuleWidth>0 then
  2259.        Result := 'all'
  2260.      else
  2261.        Result := 'cols'
  2262.     else
  2263.      if VRuleWidth>0 then
  2264.        Result := 'rows'
  2265.      else
  2266.     }
  2267.        Result := ''
  2268.    end;
  2269.   {.....................................................}
  2270.   function AddAttribute(const Name, Value, DefValue: String): String;
  2271.   begin
  2272.     if (Value<>DefValue) and (Value<>'') then
  2273.       Result := Format(' %s=%s',[Name, RV_HTMLGetStrAttrVal(Value, SaveOptions)])
  2274.     else
  2275.       Result := '';
  2276.   end;
  2277.   {.....................................................}
  2278.   function AddBorderColorAttr(BorderStyle: TRVTableBorderStyle;
  2279.     BorderColor, BorderLightColor: TColor): String;
  2280.   begin
  2281.     Result := '';
  2282.     if UseCSS then
  2283.       exit;
  2284.     case BorderStyle of
  2285.       rvtbColor:
  2286.         Result := AddAttribute('bordercolor', RV_GetHTMLRGBStr(BorderColor, True), '');
  2287.       rvtbRaisedColor:
  2288.         begin
  2289.           Result := AddAttribute('bordercolorlight', RV_GetHTMLRGBStr(BorderLightColor, True), '')+
  2290.                     AddAttribute('bordercolordark', RV_GetHTMLRGBStr(BorderColor, True), '');
  2291.         end;
  2292.       rvtbLoweredColor:
  2293.         begin
  2294.           Result := AddAttribute('bordercolorlight', RV_GetHTMLRGBStr(BorderColor, True), '')+
  2295.                     AddAttribute('bordercolordark', RV_GetHTMLRGBStr(BorderLightColor, True), '');
  2296.         end;
  2297.     end;
  2298.   end;
  2299.   {.....................................................}
  2300.   function GetTableCSS: String;
  2301.   var s: String;
  2302.   begin
  2303.     Result := '';
  2304.     if not ThisUseCSS then
  2305.       exit;
  2306.     case BorderStyle of
  2307.       rvtbLoweredColor:
  2308.         Result := Format('border-color: %s %s %s %s; border-style: solid;',
  2309.           [RV_GetHTMLRGBStr(BorderColor, False),RV_GetHTMLRGBStr(BorderLightColor, False),
  2310.            RV_GetHTMLRGBStr(BorderLightColor, False), RV_GetHTMLRGBStr(BorderColor, False)]);
  2311.       rvtbRaisedColor:
  2312.         Result := Format('border-color: %s %s %s %s; border-style: solid;',
  2313.           [RV_GetHTMLRGBStr(BorderLightColor, False),RV_GetHTMLRGBStr(BorderColor, False),
  2314.            RV_GetHTMLRGBStr(BorderColor, False), RV_GetHTMLRGBStr(BorderLightColor, False)]);
  2315.       rvtbLowered:
  2316.         Result := 'border-style: inset;';
  2317.       rvtbColor:
  2318.         if UseCSS then
  2319.           Result := Format('border-color: %s;', [RV_GetHTMLRGBStr(BorderColor, False)]);
  2320.     end;
  2321.     if BackgroundStyle in [rvbsCentered, rvbsStretched] then
  2322.       RV_AddStr(Result, 'background-position: center center; background-repeat: no-repeat;');
  2323.     if UseCSS and (FBackground<>nil) and FBackground.Visible then begin
  2324.       s := GetBackgroundFileName(FBackground, Color, ItemNo, TCustomRVData(RVData),
  2325.         BackgroundImageFileName);
  2326.       if s<>'' then
  2327.         RV_AddStr(Result, Format('background-image: url(''%s'');', [s]));
  2328.     end;
  2329.     s := RV_GetHTMLRGBStr(Color, False);
  2330.     if s<>'' then
  2331.       RV_AddStr(Result, Format('background-color: %s;', [s]));    
  2332.     if CellSpacing<0 then
  2333.       RV_AddStr(Result, 'border-collapse: collapse;');
  2334.     if BorderWidth>0 then begin
  2335.       if not VisibleBorders.Top then
  2336.         RV_AddStr(Result, 'border-top: none;');
  2337.       if not VisibleBorders.Right then
  2338.         RV_AddStr(Result, 'border-right: none;');
  2339.       if not VisibleBorders.Bottom then
  2340.         RV_AddStr(Result, 'border-bottom: none;');
  2341.       if not VisibleBorders.Left then
  2342.         RV_AddStr(Result, 'border-left: none;');
  2343.     end;
  2344.     if Result<>'' then
  2345.       Result := Format(' style="{%s}"',[Result]);
  2346.   end;
  2347.   {.....................................................}
  2348.   function AddTableBorderAttribute: String;
  2349.   begin
  2350.     if not ThisUseCSS or (BorderWidth>0) or (CellBorderWidth=0) then
  2351.       Result := Format(' border=%s', [RV_HTMLGetIntAttrVal(BorderWidth, SaveOptions)])
  2352.     else
  2353.       Result := Format(' border=%s style="{border-width : 0px}"', [RV_HTMLGetIntAttrVal(1, SaveOptions)])
  2354.   end;
  2355.   {.....................................................}
  2356.   function AddBackgroundAttribute(Background: TRVBackground; RealColor, Color, DefColor: TColor;
  2357.     ItemNo: Integer; ARVData: TCustomRVData;
  2358.     const BackgroundImageFileName: String) : String;
  2359.   var Location: String;
  2360.   begin
  2361.     Result := '';
  2362.     if not UseCSS then
  2363.       Result := AddAttribute('bgcolor', RV_GetHTMLRGBStr(Color, True), RV_GetHTMLRGBStr(DefColor, True));
  2364.     if UseCSS or (Background=nil) or not Background.Visible then
  2365.       exit;
  2366.     Location := GetBackgroundFileName(Background, RealColor, ItemNo, ARVData, BackgroundImageFileName);
  2367.     if Location<>'' then
  2368.       Result := Result+Format(' background="%s"', [Location]);
  2369.   end;
  2370.   {.....................................................}
  2371.   function AddWidthAndHeightAttrs(Cell: TRVTableCellData): String;
  2372.   begin
  2373.     if not UseCSS or not (rvsoXHTML in SaveOptions) then
  2374.       Result := AddAttribute('width', GetHTMLLength(Cell.BestWidth, True), '')+
  2375.                 AddAttribute('height', GetHTMLLength(Cell.BestHeight, True), '');
  2376.   end;
  2377.   {.....................................................}
  2378.   {
  2379.   function GetTableAlign: String;
  2380.   begin
  2381.     case TCustomRVData(Rows.FMainRVData).GetRVStyle.ParaStyles[ParaNo].Alignment of
  2382.       rvaCenter:
  2383.         Result := 'center';
  2384.       rvaRight:
  2385.         Result := 'right';
  2386.       else
  2387.         Result := 'left';
  2388.     end;
  2389.   end;
  2390.   }
  2391. var
  2392.   Cell: TRVTableCellData;
  2393.   r,c: Integer;
  2394.   Options:TRVSaveOptions;
  2395.   CellCSS: String;
  2396. begin
  2397.   ThisUseCSS := UseCSS or (rvsoForceNonTextCSS in SaveOptions);
  2398.   CellCSS := GetCellCSS(nil);
  2399.   Options  := SaveOptions;
  2400.   Include(Options, rvsoMiddleOnly);
  2401.   Exclude(Options, rvsoFirstOnly);
  2402.   Exclude(Options, rvsoLastOnly);
  2403.   CellSpacing := Round((CellVSpacing+CellHSpacing)/2);
  2404.   RVFWriteLine(Stream, Format('<table%s%s%s%s%s%s%s%s>',
  2405.     [
  2406.      //AddAttribute('align', GetTableAlign, ''),
  2407.      AddAttribute('width', GetHTMLLength(BestWidth, True), ''),
  2408.      AddTableBorderAttribute,
  2409.      AddAttribute('cellpadding', IntToStr(CellPadding), ''),
  2410.      AddBorderColorAttr(BorderStyle, BorderColor, BorderLightColor),
  2411.      AddAttribute('cellspacing', IntToStr(CellSpacing), ''),
  2412.      AddAttribute('rules',GetRules,''),
  2413.      AddBackgroundAttribute(FBackground, Color, Color, clNone, ItemNo, TCustomRVData(RVData),
  2414.        BackgroundImageFileName),
  2415.      GetTableCSS]));
  2416.   for r := 0 to Rows.Count-1 do begin
  2417.     RVFWriteLine(Stream, Format('<tr%s>',[AddAttribute('valign', VAlignStr[Rows[r].VAlign], '')]));
  2418.     for c := 0 to Rows[r].Count-1 do
  2419.       if Cells[r,c]<>nil then begin
  2420.         Cell := Cells[r,c];
  2421.         RVFWrite(Stream, Format('<td%s%s%s%s%s%s>',
  2422.           [
  2423.           AddAttribute('colspan', IntToStr(Cell.ColSpan), '1'),
  2424.           AddAttribute('rowspan', IntToStr(Cell.RowSpan), '1'),
  2425.           AddWidthAndHeightAttrs(Cell),
  2426.           AddAttribute('valign', VAlignStr[Cell.VAlign], ''),
  2427.           AddBackgroundAttribute(Cell.FBackground, GetCellColor(Cell),
  2428.             Cell.Color, Color, -1, Cell, Cell.BackgroundImageFileName),
  2429.           GetThisCellCSS(Cell, CellCSS)
  2430.           ]));
  2431.         if Cell.HasData(True) then
  2432.           if UseCSS then
  2433.             Cell.GetRVData.SaveHTMLToStreamEx(Stream, Path, '', imgSavePrefix, '','', '',Options,
  2434.                                     GetCellColor(Cell), CurrentFileColor, imgSaveNo,
  2435.                                     0,0,0,0,nil,Bullets)
  2436.           else
  2437.             Cell.GetRVData.SaveHTMLToStream(Stream,Path, '', imgSavePrefix,  Options,
  2438.                                   GetCellColor(Cell), imgSaveNo,
  2439.                                   0,0,0,0,nil,Bullets)
  2440.         else
  2441.           RVFWriteLine(Stream, Format('<br%s>',[RV_HTMLGetEndingSlash(SaveOptions)]));
  2442.         RVFWriteLine(Stream, '</td>');
  2443.       end;
  2444.     RVFWriteLine(Stream, '</tr>');
  2445.   end;
  2446.   RVFWriteLine(Stream, '</table>');
  2447. end;
  2448. {$ENDIF}
  2449. {------------------------------------------------------------------------------}
  2450. function TRVTableItemInfo.AsText(LineWidth: Integer; RVData: TPersistent;
  2451.   const Text, Path: String; TextOnly,Unicode: Boolean): String;
  2452. var r,c: Integer;
  2453.     Stream: TMemoryStream;
  2454.     RSep,CSep:String;
  2455.     {$IFNDEF RVDONOTUSEUNICODE}
  2456.     CP: TRVCodePage;
  2457.     {$ENDIF}
  2458. begin
  2459.   Result := '';
  2460.   {$IFNDEF RVDONOTUSEUNICODE}
  2461.   if Unicode then begin
  2462.     CP := TCustomRVData(RVData).GetRVStyle.DefCodePage;
  2463.     RSep := RVU_AnsiToUnicode(cp, TextRowSeparator);
  2464.     CSep := RVU_AnsiToUnicode(cp, TextColSeparator);
  2465.     end
  2466.   else
  2467.   {$ENDIF}
  2468.   begin
  2469.     RSep := TextRowSeparator;
  2470.     CSep := TextColSeparator;
  2471.   end;
  2472.   Stream := TMemoryStream.Create;
  2473.   try
  2474.     for r := 0 to Rows.Count-1 do begin
  2475.       for c := 0 to Rows[r].Count-1 do begin
  2476.         if Cells[r,c]<>nil then
  2477.           Cells[r,c].GetRVData.SaveTextToStream(Path, Stream, LineWidth,  False,
  2478.             TextOnly, Unicode, False);
  2479.         if c<Rows[r].Count-1 then
  2480.           RVFWrite(Stream, CSep);
  2481.       end;
  2482.       RVFWrite(Stream, RSep);
  2483.     end;
  2484.     Stream.Position := 0;
  2485.     SetLength(Result,Stream.Size);
  2486.     Stream.ReadBuffer(PChar(Result)^,Stream.Size);
  2487.   finally
  2488.     Stream.Free;
  2489.   end;
  2490. end;
  2491. {------------------------------------------------------------------------------}
  2492. function TRVTableItemInfo.BeforeChange: Boolean;
  2493. begin
  2494.   Result := IsInEditor and
  2495.             TCustomRichViewEdit(TRVEditRVData(Rows.FMainRVData).RichView).BeforeChange(True);
  2496. end;
  2497. {------------------------------------------------------------------------------}
  2498. function TRVTableItemInfo.CanChange: Boolean;
  2499. begin
  2500.   Result := IsInEditor;
  2501. end;
  2502. {------------------------------------------------------------------------------}
  2503. procedure TRVTableItemInfo.SetCellBestHeight_(ItemNo, Value, Row,
  2504.   Col: Integer);
  2505. begin
  2506.   SetCellProperty(ItemNo, 'BestHeight', LongInt(Value), Row, Col, True, False);
  2507. end;
  2508. {------------------------------------------------------------------------------}
  2509. procedure TRVTableItemInfo.SetCellBestWidth_(ItemNo: Integer;
  2510.   Value: TRVHTMLLength; Row, Col: Integer);
  2511. begin
  2512.   SetCellProperty(ItemNo, 'BestWidth', LongInt(Value), Row, Col, True, True);
  2513. end;
  2514. {------------------------------------------------------------------------------}
  2515. procedure TRVTableItemInfo.SetCellColor_(ItemNo: Integer; Value: TColor;
  2516.   Row, Col: Integer);
  2517. begin
  2518.   SetCellProperty(ItemNo, 'Color', LongInt(Value), Row, Col, False, False);
  2519. end;
  2520. {------------------------------------------------------------------------------}
  2521. procedure TRVTableItemInfo.SetCellBackgroundStyle_(ItemNo: Integer;
  2522.   Value: TRVItemBackgroundStyle; Row,Col: Integer);
  2523. begin
  2524.   SetCellProperty(ItemNo, 'BackgroundStyle', LongInt(Value), Row, Col, False, False);
  2525. end;
  2526. {------------------------------------------------------------------------------}
  2527. procedure TRVTableItemInfo.SetCellVisibleBorders_(ItemNo: Integer; Left, Top, Right, Bottom: Boolean; Row,Col: Integer);
  2528. var ui: TRVUndoModifyVisibleBorders;
  2529.     Cell: TRVTableCellData;
  2530. begin
  2531.   Cell := Cells[Row, Col];
  2532.   if Cell.VisibleBorders.IsEqual2(Left,Top,Right,Bottom) then
  2533.     exit;
  2534.   if (rvtsInserted in FState) and IsInEditor then begin
  2535.     if ItemNo=-1 then
  2536.       ItemNo := GetMyItemNo;
  2537.     TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  2538.     ui := TRVUndoModifyVisibleBorders(AddTableUndoInfo(TRichViewRVData(FRows.FMainRVData), TRVUndoModifyVisibleBorders, ItemNo, False, False));
  2539.     if ui<>nil then begin
  2540.       ui.Row    := Row;
  2541.       ui.Col    := Col;
  2542.       ui.Left   := Cell.VisibleBorders.Left;
  2543.       ui.Top    := Cell.VisibleBorders.Top;
  2544.       ui.Right  := Cell.VisibleBorders.Right;
  2545.       ui.Bottom := Cell.VisibleBorders.Bottom;
  2546.     end;
  2547.   end;
  2548.   Cell.VisibleBorders.SetValues(Left,Top,Right,Bottom);
  2549.   Changed;
  2550. end;
  2551. {------------------------------------------------------------------------------}
  2552. procedure TRVTableItemInfo.SetTableVisibleBorders(Left, Top, Right, Bottom: Boolean);
  2553. var ui: TRVUndoModifyVisibleBorders;
  2554.     ItemNo: Integer;
  2555. begin
  2556.   if VisibleBorders.IsEqual2(Left,Top,Right,Bottom) then
  2557.     exit;
  2558.   if (rvtsInserted in FState) and IsInEditor then begin
  2559.     ItemNo := GetMyItemNo;
  2560.     TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  2561.     ui := TRVUndoModifyVisibleBorders(AddTableUndoInfo(TRichViewRVData(FRows.FMainRVData), TRVUndoModifyVisibleBorders, ItemNo, False, False));
  2562.     if ui<>nil then begin
  2563.       ui.Row    := -1;
  2564.       ui.Col    := -1;
  2565.       ui.Left   := VisibleBorders.Left;
  2566.       ui.Top    := VisibleBorders.Top;
  2567.       ui.Right  := VisibleBorders.Right;
  2568.       ui.Bottom := VisibleBorders.Bottom;
  2569.     end;
  2570.   end;
  2571.   VisibleBorders.SetValues(Left,Top,Right,Bottom);
  2572.   Changed;
  2573. end;
  2574. {------------------------------------------------------------------------------}
  2575. procedure TRVTableItemInfo.SetCellBorderColor_(ItemNo: Integer; Value: TColor;
  2576.   Row, Col: Integer);
  2577. begin
  2578.   SetCellProperty(ItemNo, 'BorderColor', LongInt(Value), Row, Col, False, False);
  2579. end;
  2580. {------------------------------------------------------------------------------}
  2581. procedure TRVTableItemInfo.SetCellBorderLightColor_(ItemNo: Integer; Value: TColor;
  2582.   Row, Col: Integer);
  2583. begin
  2584.   SetCellProperty(ItemNo, 'BorderLightColor', LongInt(Value), Row, Col, False, False);
  2585. end;
  2586. {------------------------------------------------------------------------------}
  2587. procedure TRVTableItemInfo.SetCellVAlign_(ItemNo: Integer; Value: TRVCellVAlign; Row,Col: Integer);
  2588. begin
  2589.   SetCellProperty(ItemNo, 'VAlign', LongInt(Value), Row, Col, True, False);
  2590. end;
  2591. {------------------------------------------------------------------------------}
  2592. procedure TRVTableItemInfo.SetRowVAlign_(ItemNo: Integer;
  2593.   Value: TRVCellVAlign; Row: Integer);
  2594. var
  2595.     ui: TRVUndoRowVAlign;
  2596. begin
  2597.   if Rows[Row].VAlign<>Value then begin
  2598.     if (rvtsInserted in FState) and IsInEditor then begin
  2599.       MergeInplaceUndo(False);
  2600.       TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  2601.       if ItemNo=-1 then
  2602.         ItemNo := GetMyItemNo;
  2603.       ui := TRVUndoRowVAlign(AddTableUndoInfo(TRVEditRVData(FRows.FMainRVData), TRVUndoRowVAlign, ItemNo, True, False));
  2604.       if ui<>nil then begin
  2605.         ui.OldVAlign := Rows[Row].VAlign;
  2606.         ui.Row       := Row;
  2607.       end;
  2608.     end;
  2609.     Rows[Row].VAlign := Value;
  2610.   end;
  2611. end;
  2612. {------------------------------------------------------------------------------}
  2613. procedure TRVTableItemInfo.SetCellBestHeight(Value, Row, Col: Integer);
  2614. begin
  2615.   SetCellBestHeight_(-1, Value, Row, Col);
  2616. end;
  2617. {------------------------------------------------------------------------------}
  2618. procedure TRVTableItemInfo.SetCellBestWidth(Value: TRVHTMLLength; Row,
  2619.   Col: Integer);
  2620. begin
  2621.   SetCellBestWidth_(-1, Value, Row, Col);
  2622. end;
  2623. {------------------------------------------------------------------------------}
  2624. procedure TRVTableItemInfo.SetCellColor(Value: TColor; Row, Col: Integer);
  2625. begin
  2626.   SetCellColor_(-1, Value, Row, Col);
  2627. end;
  2628. {------------------------------------------------------------------------------}
  2629. procedure TRVTableItemInfo.SetCellBackgroundStyle(Value: TRVItemBackgroundStyle; Row,Col: Integer);
  2630. begin
  2631.   SetCellBackgroundStyle_(-1, Value, Row, Col);
  2632. end;
  2633. {------------------------------------------------------------------------------}
  2634. procedure TRVTableItemInfo.SetCellVisibleBorders(Left, Top, Right, Bottom: Boolean; Row,Col: Integer);
  2635. begin
  2636.   SetCellVisibleBorders_(-1, Left, Top, Right, Bottom, Row,Col);
  2637. end;
  2638. {------------------------------------------------------------------------------}
  2639. procedure TRVTableItemInfo.SetCellBorderColor(Value: TColor; Row, Col: Integer);
  2640. begin
  2641.   SetCellBorderColor_(-1, Value, Row, Col);
  2642. end;
  2643. {------------------------------------------------------------------------------}
  2644. procedure TRVTableItemInfo.SetCellBorderLightColor(Value: TColor; Row, Col: Integer);
  2645. begin
  2646.   SetCellBorderLightColor_(-1, Value, Row, Col);
  2647. end;
  2648. {------------------------------------------------------------------------------}
  2649. procedure TRVTableItemInfo.SetCellVAlign(Value: TRVCellVAlign; Row,
  2650.   Col: Integer);
  2651. begin
  2652.   SetCellVAlign_(-1, Value, Row, Col);
  2653. end;
  2654. {------------------------------------------------------------------------------}
  2655. procedure TRVTableItemInfo.SetRowVAlign(Value: TRVCellVAlign; Row: Integer);
  2656. begin
  2657.   SetRowVAlign_(-1, Value, Row);
  2658. end;
  2659. {------------------------------------------------------------------------------}
  2660. procedure TRVTableItemInfo.DoneUndo;
  2661. begin
  2662.   if (rvtsInserted in FState) and (FRows.FMainRVData is TRVEditRVData) then
  2663.     TRVEditRVData(FRows.FMainRVData).SetUndoGroupMode(False);
  2664. end;
  2665. {------------------------------------------------------------------------------}
  2666. procedure TRVTableItemInfo.InitUndo;
  2667. begin
  2668.   if (rvtsInserted in FState) and (FRows.FMainRVData is TRVEditRVData) then begin
  2669.     TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  2670.     TRVEditRVData(FRows.FMainRVData).SetUndoGroupMode(True);
  2671.   end;
  2672. end;
  2673. {------------------------------------------------------------------------------}
  2674. function TRVTableItemInfo.GetEditorItemNoForUndo: Integer;
  2675. begin
  2676.   if (rvtsInserted in FState) and IsInEditor and UndoEnabled then
  2677.     Result := GetMyItemNo
  2678.   else
  2679.     Result := -1;
  2680. end;
  2681. {------------------------------------------------------------------------------}
  2682. function TRVTableItemInfo.IsInEditor: Boolean;
  2683. begin
  2684.   Result := FRows.FMainRVData is TRVEditRVData;
  2685. end;
  2686. {------------------------------------------------------------------------------}
  2687. function TRVTableItemInfo.GetMyItemNo: Integer;
  2688. begin
  2689.   if (CachedItemNo<0) or (CachedItemNo>=FRows.FMainRVData.Items.Count) or
  2690.      (FRows.FMainRVData.GetItem(CachedItemNo)<>Self) then
  2691.     CachedItemNo := FRows.FMainRVData.GetItemNo(Self);
  2692.   Result := CachedItemNo;
  2693. end;
  2694. {------------------------------------------------------------------------------}
  2695. procedure TRVTableItemInfo.EditCell_(Row,Col: Integer; Unquestioning: Boolean);
  2696. var PRow,PCol: Integer;
  2697.     Ptable : TRVTableItemInfo;
  2698. begin
  2699.   if not (rvtsInserted in FState) then
  2700.     exit;
  2701.   if not (rvtsEditMode in FState) then begin
  2702.     if FRows.FMainRVData is TCustomRVFormattedData then
  2703.       TCustomRVFormattedData(FRows.FMainRVData).AssignChosenRVData(Cells[Row,Col], Self);
  2704.     exit;
  2705.   end;
  2706.   if not Unquestioning and not (rvtoEditing in Options) then
  2707.     exit;
  2708.   if FRows.FMainRVData is TRVTableCellData then begin
  2709.     Ptable := TRVTableCellData(FRows.FMainRVData).GetTable;
  2710.     Ptable.GetCellPosition(TRVTableCellData(FRows.FMainRVData), PRow, PCol);
  2711.     if PRow=-1 then
  2712.       ERichViewError.Create(errInternalError);
  2713.     Ptable.EditCell_(PRow, PCol, Unquestioning);
  2714.   end;
  2715.   if FRows.FMainRVData is TRVTableCellData then
  2716.     exit;
  2717.   CreateInplace(-1, Row, Col, False, True, False, False, Unquestioning);
  2718. end;
  2719. {------------------------------------------------------------------------------}
  2720. procedure TRVTableItemInfo.EditCell(Row, Col: Integer);
  2721. begin
  2722.   EditCell_(Row,Col,False);
  2723. end;
  2724. {------------------------------------------------------------------------------}
  2725. function TRVTableItemInfo.EnterItem(From: TRVEnterDirection; Coord: Integer): Boolean;
  2726. var r,c: Integer;
  2727. begin
  2728.   Result := False;
  2729.   if Rows.Empty or not (rvtoEditing in Options) then
  2730.     exit;
  2731.   case From of
  2732.     rvedLeft:
  2733.       begin
  2734.         CreateInplace(-1, 0, 0, False, True, False, False, False);
  2735.         Result := True;
  2736.       end;
  2737.     rvedRight:
  2738.       begin
  2739.         Rows.GetMainCell(Rows.Count-1, Rows[0].Count-1, r,c);
  2740.         CreateInplace(-1, r,c, False, False, True, False, False);
  2741.         Result := True;
  2742.       end;
  2743.     rvedTop:
  2744.       begin
  2745.         c := GetColNo(Coord);
  2746.         if c<0 then exit;
  2747.         Rows.GetMainCell(0,c, r,c);
  2748.         CreateInplace(-1, r,c, False, True, True, False, False);
  2749.         Result := True;
  2750.       end;
  2751.     rvedBottom:
  2752.       begin
  2753.         c := GetColNo(Coord);
  2754.         if c<0 then exit;
  2755.         Rows.GetMainCell(Rows.Count-1,c, r,c);
  2756.         CreateInplace(-1, r,c, False, False, True, False, False);
  2757.         Result := True;
  2758.       end;
  2759.   end;
  2760. end;
  2761. {------------------------------------------------------------------------------}
  2762. procedure TRVTableItemInfo.BuildJumps(Left,Top: Integer; var StartJumpNo: Integer;
  2763.   jumps: TList);
  2764. var r,c, i, cnt: Integer;
  2765. begin
  2766.   for r := 0 to Rows.Count-1 do
  2767.     for c := 0 to Rows[r].Count-1 do
  2768.       if Cells[r,c]<>nil then begin
  2769.         cnt := jumps.Count;
  2770.         Cells[r,c].FirstJumpNo := FRows.FMainRVData.FirstJumpNo ;//StartJumpNo;
  2771.         if (FInplaceEditor<>nil) and (TRVTableInplaceEdit(FInplaceEditor).FCell=Cells[r,c]) then begin
  2772.           FInplaceEditor.FirstJumpNo := StartJumpNo+FRows.FMainRVData.FirstJumpNo;
  2773.           StartJumpNo := FInplaceEditor.FirstJumpNo+TRVTableInplaceRVData(TRVTableInplaceEdit(FInplaceEditor).RVData).ReallyBuildJumpsCoords-FRows.FMainRVData.FirstJumpNo;
  2774.           end
  2775.         else begin
  2776.           Cells[r,c].BuildJumpsCoords(StartJumpNo, jumps);
  2777.           for i := cnt to jumps.Count-1 do
  2778.             with TRVJumpInfo(jumps.Items[i]) do begin
  2779.               inc(l, Left+Cells[r,c].Left+CellPadding);
  2780.               inc(t, Top+Cells[r,c].Top+CellPadding+Cells[r,c].GetExtraVOffs);
  2781.             end;
  2782.         end;
  2783.       end;
  2784. end;
  2785. {------------------------------------------------------------------------------}
  2786. procedure TRVTableItemInfo.Changed;
  2787. begin
  2788.   Include(FState, rvtsModified);
  2789. end;
  2790. {------------------------------------------------------------------------------}
  2791. procedure TRVTableItemInfo.ValidateFocused;
  2792. begin
  2793.   if (FocusedCellRow<0) or (FocusedCellRow>=Rows.Count) or
  2794.      (FocusedCellCol<0) or (FocusedCellCol>=Rows[0].Count) then begin
  2795.     FocusedCellRow := -1;
  2796.     FocusedCellCol := -1;
  2797.   end;
  2798. end;
  2799. {------------------------------------------------------------------------------}
  2800. procedure TRVTableItemInfo.ValidateChosen;
  2801. begin
  2802.   if (ChosenCellRow<0) or (ChosenCellRow>=Rows.Count) or
  2803.      (ChosenCellCol<0) or (ChosenCellCol>=Rows[0].Count) then begin
  2804.     ChosenCellRow := -1;
  2805.     ChosenCellCol := -1;
  2806.   end;
  2807.   if (ChosenCellRow<>-1) and (ChosenCellCol<>-1) then
  2808.     Rows.GetMainCell(ChosenCellRow, ChosenCellCol, ChosenCellRow, ChosenCellCol);
  2809. end;
  2810. {------------------------------------------------------------------------------}
  2811. function TRVTableItemInfo.MoveFocus(GoForward: Boolean;
  2812.                                     var TopLevelRVData: TPersistent;
  2813.                                     var TopLevelItemNo: Integer): Boolean;
  2814. var Cell: TCustomRVFormattedData;
  2815.     Dir: TRVCellDirection;
  2816. begin
  2817.   ValidateFocused;
  2818.   Result := False;
  2819.   if (FocusedCellRow=-1) then
  2820.   if GoForward then begin
  2821.     FocusedCellRow := 0;
  2822.     FocusedCellCol := 0;
  2823.     end
  2824.   else
  2825.     Rows.GetMainCell(Rows.Count-1, Rows[0].Count-1,FocusedCellRow,FocusedCellCol);
  2826.   if GoForward then
  2827.     Dir := rvcdNext
  2828.   else
  2829.     Dir := rvcdPrev;
  2830.   while True do begin
  2831.     Cell := Cells[FocusedCellRow,FocusedCellCol];
  2832.     Cell.FocusedItemNo := Cell.GetNextFocusedItem(Cell.FocusedItemNo, GoForward, TCustomRVFormattedData(TopLevelRVData), TopLevelItemNo);
  2833.     if Cell.FocusedItemNo<>-1 then begin
  2834.       Result := True;
  2835.       exit;
  2836.     end;
  2837.     if not GetCellTo(FocusedCellRow, FocusedCellCol, Dir, FocusedCellRow, FocusedCellCol, True) then begin
  2838.       FocusedCellRow := -1;
  2839.       FocusedCellCol := -1;
  2840.       exit;
  2841.     end;
  2842.   end;
  2843. end;
  2844. {------------------------------------------------------------------------------}
  2845. procedure TRVTableItemInfo.ClearFocus;
  2846. begin
  2847.   ValidateFocused;
  2848.   if (FocusedCellRow<>-1) then begin
  2849.     Cells[FocusedCellRow,FocusedCellCol].ClearFocus;
  2850.     FocusedCellRow := -1;
  2851.     FocusedCellCol := -1;
  2852.   end;
  2853. end;
  2854. {------------------------------------------------------------------------------}
  2855. function TRVTableItemInfo.CellIsChosen: Boolean;
  2856. begin
  2857.   Result := False;
  2858.   ValidateChosen;
  2859.   if ChosenCellRow=-1 then
  2860.     exit;
  2861.   Result := Cells[ChosenCellRow,ChosenCellCol].SelectionExists(False,True);
  2862. end;
  2863. {------------------------------------------------------------------------------}
  2864. procedure TRVTableItemInfo.GetCellPosition(Cell: TRVTableCellData; var Row,
  2865.   Col: Integer);
  2866. var r: Integer;
  2867. begin
  2868.   Row := -1;
  2869.   Col := -1;
  2870.   for r := 0 to Rows.Count-1 do begin
  2871.     Col := Rows[r].IndexOf(Cell);
  2872.     if Col<>-1 then begin
  2873.       Row := r;
  2874.       exit;
  2875.     end;
  2876.   end;
  2877. end;
  2878. {------------------------------------------------------------------------------}
  2879. procedure TRVTableItemInfo.AdjustFocus(Row, Col: Integer;
  2880.   TopLevelRVData: TPersistent; TopLevelItemNo: Integer);
  2881. begin
  2882.   FocusedCellRow := Row;
  2883.   FocusedCellCol := Col;
  2884.   TCustomRVFormattedData(FRows.FMainRVData).AdjustFocus(GetMyItemNo,TopLevelRVData,TopLevelItemNo);
  2885. end;
  2886. {------------------------------------------------------------------------------}
  2887. function TRVTableItemInfo.AdjustFocusToControl(Control: TControl;
  2888.   var TopLevelRVData: TPersistent; var TopLevelItemNo: Integer): Boolean;
  2889. var r,c,ItemNo: Integer;
  2890.     item: TCustomRVItemInfo;
  2891. begin
  2892.   Result := GetCellWhichOwnsControl(Control, r, c, ItemNo);
  2893.   if Result then begin
  2894.     FocusedCellRow := r;
  2895.     FocusedCellCol := c;
  2896.     Cells[r,c].FocusedItemNo := ItemNo;
  2897.     item := TCustomRVItemInfo(Cells[r,c].Items.Objects[ItemNo]);
  2898.     item.AdjustFocusToControl(Control,TopLevelRVData,TopLevelItemNo);
  2899.     if item.GetBoolValue(rvbpImmediateControlOwner) then begin
  2900.       TopLevelItemNo := ItemNo;
  2901.       TopLevelRVData := Cells[r,c];
  2902.     end;
  2903.   end;
  2904. end;
  2905. {------------------------------------------------------------------------------}
  2906. function TRVTableItemInfo.UndoEnabled: Boolean;
  2907. begin
  2908.   Result := (rvtsInserted in FState) and
  2909.             (Rows.FMainRVData.GetRootData is TRVEditRVData) and
  2910.             (TCustomRichViewEdit(TRVEditRVData(Rows.FMainRVData.GetRootData).RichView).UndoLimit<>0);
  2911. end;
  2912. {------------------------------------------------------------------------------}
  2913. procedure TRVTableItemInfo.MarkStylesInUse(Data: TRVDeleteUnusedStylesData);
  2914. var r,c: Integer;
  2915. begin
  2916.   inherited MarkStylesInUse(Data);
  2917.   for r := 0 to Rows.Count-1 do
  2918.     for c := 0 to Rows[r].Count-1 do
  2919.       if Cells[r,c]<>nil then
  2920.         Cells[r,c].GetRVData.DoMarkStylesInUse(Data);
  2921. end;
  2922. {------------------------------------------------------------------------------}
  2923. procedure TRVTableItemInfo.UpdateStyles(Data: TRVDeleteUnusedStylesData);
  2924. var r,c: Integer;
  2925. begin
  2926.   inherited UpdateStyles(Data);
  2927.   for r := 0 to Rows.Count-1 do
  2928.     for c := 0 to Rows[r].Count-1 do
  2929.       if Cells[r,c]<>nil then
  2930.         Cells[r,c].GetRVData.DoUpdateStyles(Data);
  2931. end;
  2932. {------------------------------------------------------------------------------}
  2933. function TRVTableItemInfo.CompletelySelected: Boolean;
  2934. var SN,EN,SO,EO,No: Integer;
  2935. begin
  2936.   Result := Rows.FMainRVData is TCustomRVFormattedData;
  2937.   if not Result then
  2938.     exit;
  2939.   if rvstCompletelySelected in Rows.FMainRVData.State then
  2940.     exit;
  2941.   TCustomRVFormattedData(Rows.FMainRVData).GetSelectionBounds(SN,SO,EN,EO,True);
  2942.   Result := SN<>-1;
  2943.   if not Result then
  2944.     exit;
  2945.   No := GetMyItemNo;
  2946.   Result := ((No>SN) or ((No=SN) and (SO=0))) and
  2947.             ((No<EN) or ((No=EN) and (EO=1)));
  2948. end;
  2949. {------------------------------------------------------------------------------}
  2950. function TRVTableItemInfo.GetSubRVDataAt(X, Y: Integer): TPersistent;
  2951. var Row, Col: Integer;
  2952. begin
  2953.   if GetCellAt(X, Y, Row, Col) then
  2954.     Result := Cells[Row,Col].GetRVData
  2955.   else
  2956.     Result := nil;
  2957. end;
  2958. {------------------------------------------------------------------------------}
  2959. procedure TRVTableItemInfo.UnAssignActiveCell;
  2960. begin
  2961.   ValidateChosen;
  2962.   if (ChosenCellRow<>-1) and (ChosenCellCol<>-1) and
  2963.      (Rows.FMainRVData is TCustomRVFormattedData) then
  2964.     TCustomRVFormattedData(Rows.FMainRVData).UnassignChosenRVData(Cells[ChosenCellRow,ChosenCellCol]);
  2965.   ChosenCellRow := -1;
  2966.   ChosenCellCol := -1;
  2967. end;
  2968. {------------------------------------------------------------------------------}
  2969. procedure TRVTableItemInfo.CleanUpChosen;
  2970. begin
  2971.   ValidateChosen;
  2972.   if ChosenCellRow<>-1 then
  2973.     TCustomRVFormattedData(Cells[ChosenCellRow,ChosenCellCol].GetRVData).Deselect(nil,False);
  2974.   ChosenCellRow := -1;
  2975.   ChosenCellCol := -1;
  2976.   DestroyInplace(True);
  2977. end;
  2978. {------------------------------------------------------------------------------}
  2979. function TRVTableItemInfo.GetSubRVData(var StoreState: TRVStoreSubRVData;
  2980.   Position: TRVSubRVDataPos): TPersistent;
  2981. var r,c,cs,rs: Integer;
  2982.     Dir: TRVCellDirection;
  2983. begin
  2984.   Result := nil;
  2985.   case Position of
  2986.     rvdFirst:
  2987.       begin
  2988.         StoreState := TRVTableStoreSubRVData.Create(0,0);
  2989.         Result := Cells[0,0];
  2990.       end;
  2991.     rvdLast:
  2992.       begin
  2993.         r := Rows.Count-1;
  2994.         c := Rows[r].Count-1;
  2995.         StoreState := TRVTableStoreSubRVData.Create(r,c);
  2996.         Result := FRows.GetMainCell(r,c,r,c);
  2997.       end;
  2998.     rvdChosenUp,rvdChosenDown:
  2999.       begin
  3000.         StoreState := nil;
  3001.         if GetNormalizedSelectionBounds(True,r,c,cs,rs) then begin
  3002.           if Position=rvdChosenUp then begin
  3003.             inc(r,rs-1);
  3004.             inc(c,cs-1);
  3005.           end;
  3006.           Result := FRows.GetMainCell(r,c,r,c);
  3007.           StoreState := TRVTableStoreSubRVData.Create(r,c);
  3008.           end
  3009.         else begin
  3010.           ValidateChosen;
  3011.           if ChosenCellRow<>-1 then begin
  3012.             StoreState := TRVTableStoreSubRVData.Create(ChosenCellRow,ChosenCellCol);
  3013.             Result := Cells[ChosenCellRow,ChosenCellCol];
  3014.           end;
  3015.         end;
  3016.       end;
  3017.     rvdNext, rvdPrev:
  3018.       begin
  3019.         if Position=rvdNext then
  3020.           Dir := rvcdNext
  3021.         else
  3022.           Dir := rvcdPrev;
  3023.         r := TRVTableStoreSubRVData(StoreState).Row;
  3024.         c := TRVTableStoreSubRVData(StoreState).Col;
  3025.         if GetCellTo(r,c, Dir, r, c, True) then begin
  3026.           TRVTableStoreSubRVData(StoreState).Row := r;
  3027.           TRVTableStoreSubRVData(StoreState).Col := c;
  3028.           Result := Cells[r,c];
  3029.         end;
  3030.       end;
  3031.   end;
  3032. end;
  3033. {------------------------------------------------------------------------------}
  3034. procedure TRVTableItemInfo.ChooseSubRVData_(r, c: Integer);
  3035. var no, no1,no2,off1,off2: Integer;
  3036. begin
  3037.   if (ChosenCellRow=r) and (ChosenCellCol=c) then
  3038.     exit;
  3039.   TCustomRVFormattedData(Cells[r,c].GetRVData).GetSelectionBounds(no1,off1,no2,off2,False);
  3040.   no := GetMyItemNo;
  3041.   TCustomRVFormattedData(FRows.FMainRVData).SetSelectionBounds(no,1,no,1);
  3042.   (FRows.FMainRVData as TCustomRVFormattedData).AssignChosenRVData(Cells[r,c], Self);
  3043.   ChosenCellRow := r;
  3044.   ChosenCellCol := c;
  3045.   if (rvtsEditMode in FState) and (rvtsInserted in FState) then
  3046.     EditCell(ChosenCellRow,ChosenCellCol);
  3047.   TCustomRVFormattedData(Cells[r,c].GetRVData).SetSelectionBounds(no1,off1,no2,off2);
  3048.   TCustomRVFormattedData(Cells[r,c].GetRVData).Invalidate;
  3049. end;
  3050. {------------------------------------------------------------------------------}
  3051. procedure TRVTableItemInfo.ChooseSubRVData(StoreState: TRVStoreSubRVData);
  3052. begin
  3053.   ChooseSubRVData_(TRVTableStoreSubRVData(StoreState).Row,
  3054.                    TRVTableStoreSubRVData(StoreState).Col);
  3055. end;
  3056. {------------------------------------------------------------------------------}
  3057. procedure TRVTableItemInfo.ResetSubCoords;
  3058. begin
  3059.   if FRows.FMainRVData is TCustomRVFormattedData then
  3060.     TCustomRVFormattedData(FRows.FMainRVData).GetItemClientCoords(GetMyItemNo,
  3061.       MyClientLeft, MyClientTop);
  3062. end;
  3063. {------------------------------------------------------------------------------}
  3064. function TRVTableItemInfo.GetSoftPageBreakDY(Data: Integer): Integer;
  3065. begin
  3066.   if Data>=Fmt.RowStarts.Count then
  3067.     Result := Fmt.FHeight
  3068.   else
  3069.     Result := Fmt.RowStarts[Data];
  3070. end;
  3071. {------------------------------------------------------------------------------}
  3072. procedure TRVTableItemInfo.SetInplaceBounds(Left, Top, Width,
  3073.   Height: Integer);
  3074. begin
  3075.   TRVTableInplaceEdit(FInplaceEditor).NormalScrolling := Height>10000;
  3076.   TRVTableInplaceEdit(FInplaceEditor).FullRedraw := TRVTableInplaceEdit(FInplaceEditor).NormalScrolling;
  3077.   if Height>10000 then
  3078.     Height := 10000;
  3079.   FInplaceEditor.SetBounds(Left, Top, Width, Height);
  3080.   if rvtsFormatInplace in FState then begin
  3081.     FInplaceEditor.RVData.TextWidth := -1;
  3082.     FInplaceEditor.RVData.DocumentWidth := -1;
  3083.     FInplaceEditor.RVData.Format_(True,False,True,0,FInplaceEditor.Canvas,
  3084.       False,False,False);
  3085.   end;
  3086.   if (FInplaceEditor.RVData.DocumentHeight>0) and
  3087.      (Height<FInplaceEditor.RVData.DocumentHeight) then
  3088.     TRVTableInplaceEdit(FInplaceEditor).NormalScrolling := True;
  3089.   Exclude(FState, rvtsFormatInplace);
  3090. end;
  3091. {------------------------------------------------------------------------------}
  3092. function TRVTableItemInfo.CanUseHeadingRowCount: Boolean;
  3093. var c,hrc, mr, mc: Integer;
  3094.     cell: TRVTableCellData;
  3095. begin
  3096.   Result := False;
  3097.   hrc := HeadingRowCount;
  3098.   if hrc>Rows.Count then
  3099.     hrc := Rows.Count;
  3100.   if hrc=0 then
  3101.     exit;
  3102.   for c := 0 to Rows[hrc-1].Count-1 do begin
  3103.     cell := Rows.GetMainCell(hrc-1,c,mr,mc);
  3104.     if mr+cell.RowSpan>hrc then
  3105.       exit;
  3106.   end;
  3107.   Result := True;
  3108. end;
  3109. {------------------------------------------------------------------------------}
  3110. function TRVTableItemInfo.GetBackgroundImage: TGraphic;
  3111. begin
  3112.   if FBackground<>nil then
  3113.     Result := FBackground.Image
  3114.   else
  3115.     Result := nil;
  3116. end;
  3117. {------------------------------------------------------------------------------}
  3118. procedure TRVTableItemInfo.SetBackgroundImage_(const Value: TGraphic; Copy: Boolean);
  3119. begin
  3120.   if Value=BackgroundImage then
  3121.     exit;
  3122.   if (FBackground=nil) and (Value<>nil) and not Value.Empty then
  3123.     FBackground := TRVBackground.Create(False);
  3124.   if FBackground<>nil then begin
  3125.     FBackground.AssignImage(Value, Rows.FMainRVData, Copy);
  3126.     if FBackground.Empty then begin
  3127.       FBackground.Free;
  3128.       FBackground := nil;
  3129.     end
  3130.   end;
  3131.   if FInplaceEditor<>nil then
  3132.     FInplaceEditor.Invalidate;
  3133.   {$IFNDEF RVDONOTUSEANIMATION}
  3134.   if Rows.FMainRVData is TCustomRVFormattedData then
  3135.     TCustomRVFormattedData(Rows.FMainRVData).ResetAniBackground;
  3136.   {$ENDIF}
  3137. end;
  3138. {------------------------------------------------------------------------------}
  3139. procedure TRVTableItemInfo.SetBackgroundImage(const Value: TGraphic);
  3140. var ui: TRVUndoModifyBackgroundImage;
  3141. begin
  3142.   if Value=BackgroundImage then
  3143.     exit;
  3144.   if (rvtsInserted in FState) and IsInEditor then begin
  3145.     MergeInplaceUndo(False);
  3146.     TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  3147.     ui := TRVUndoModifyBackgroundImage(
  3148.              AddTableUndoInfo(TRVEditRVData(FRows.FMainRVData), TRVUndoModifyBackgroundImage,
  3149.              GetMyItemNo, False, False));
  3150.     if ui<>nil then begin
  3151.       ui.Row := -1;
  3152.       ui.Col := -1;
  3153.       ui.Image := GetBackgroundImage;
  3154.       SetBackgroundImage_(nil, False);
  3155.     end;
  3156.   end;
  3157.   SetBackgroundImage_(Value, True);
  3158. end;
  3159. {------------------------------------------------------------------------------}
  3160. procedure TRVTableItemInfo.SetVisibleBorders(const Value: TRVBooleanRect);
  3161. begin
  3162.   FVisibleBorders.Assign(Value);
  3163. end;
  3164. {------------------------------------------------------------------------------}
  3165. function TRVTableItemInfo.StoreVisibleBorders: Boolean;
  3166. begin
  3167.   Result := not FVisibleBorders.IsAllEqual(True);
  3168. end;
  3169. {------------------------------------------------------------------------------}
  3170. procedure TRVTableItemInfo.SetCellBackgroundImage(Value: TGraphic; Row,Col: Integer);
  3171. var ui: TRVUndoModifyBackgroundImage;
  3172.     Cell: TRVTableCellData;
  3173. begin
  3174.   Cell := Cells[Row,Col];
  3175.   if Value=Cell.BackgroundImage then
  3176.     exit;
  3177.   if (rvtsInserted in FState) and IsInEditor then begin
  3178.     MergeInplaceUndo(False);
  3179.     TRVEditRVData(FRows.FMainRVData).BeginUndoSequence(rvutModifyItem, True);
  3180.     ui := TRVUndoModifyBackgroundImage(
  3181.              AddTableUndoInfo(TRVEditRVData(FRows.FMainRVData), TRVUndoModifyBackgroundImage,
  3182.              GetMyItemNo, False, False));
  3183.     if ui<>nil then begin
  3184.       ui.Row := Row;
  3185.       ui.Col := Col;
  3186.       ui.Image := Cell.GetBackgroundImage;
  3187.       Cell.SetBackgroundImage_(nil, False);
  3188.     end;
  3189.   end;
  3190.   Cell.SetBackgroundImage_(Value, True);
  3191. end;
  3192. {------------------------------------------------------------------------------}
  3193. function TRVTableItemInfo.GetBackgroundStyle: TRVItemBackgroundStyle;
  3194. begin
  3195.   if FBackground<>nil then
  3196.     Result := FBackground.ItemBackStyle
  3197.   else
  3198.     Result := rvbsColor;
  3199. end;
  3200. {------------------------------------------------------------------------------}
  3201. procedure TRVTableItemInfo.SetBackgroundStyle(
  3202.   const Value: TRVItemBackgroundStyle);
  3203. begin
  3204.   if Value=BackgroundStyle then
  3205.     exit;
  3206.   if rvtsInserted in FState then begin
  3207.     SetProperty('BackgroundStyle', ord(Value), False, False);
  3208.     exit;
  3209.   end;
  3210.   if (FBackground=nil) and (Value<>rvbsColor) then
  3211.     FBackground := TRVBackground.Create(False);
  3212.   if FBackground<>nil then begin
  3213.     FBackground.ItemBackStyle := Value;
  3214.     if FBackground.Empty then begin
  3215.       FBackground.Free;
  3216.       FBackground := nil;
  3217.     end
  3218.   end;
  3219.   if FInplaceEditor<>nil then
  3220.     FInplaceEditor.Invalidate;
  3221.   {$IFNDEF RVDONOTUSEANIMATION}
  3222.   if Rows.FMainRVData is TCustomRVFormattedData then
  3223.     TCustomRVFormattedData(Rows.FMainRVData).ResetAniBackground;
  3224.   {$ENDIF}        
  3225. end;
  3226. {------------------------------------------------------------------------------}
  3227. function TRVTableItemInfo.GetRVFExtraPropertyCount: Integer;
  3228. begin
  3229.   Result := inherited GetRVFExtraPropertyCount;
  3230.   if BackgroundImageFileName<>'' then
  3231.     inc(Result);
  3232. end;
  3233. {------------------------------------------------------------------------------}
  3234. procedure TRVTableItemInfo.SaveRVFExtraProperties(Stream: TStream);
  3235. begin
  3236.   inherited SaveRVFExtraProperties(Stream);
  3237.   if BackgroundImageFileName<>'' then
  3238.     WriteRVFExtraStrPropertyStr(Stream, rvespImageFileName,
  3239.       BackgroundImageFileName);
  3240. end;
  3241. {------------------------------------------------------------------------------}
  3242. function TRVTableItemInfo.GetExtraStrProperty(
  3243.   Prop: TRVExtraItemStrProperty; var Value: String): Boolean;
  3244. begin
  3245.   case Prop of
  3246.     rvespImageFileName:
  3247.       begin
  3248.         Value := BackgroundImageFileName;
  3249.         Result := True;
  3250.       end;
  3251.     else
  3252.       Result := inherited GetExtraStrProperty(Prop, Value);
  3253.   end;
  3254. end;
  3255. {------------------------------------------------------------------------------}
  3256. function TRVTableItemInfo.SetExtraStrProperty(
  3257.   Prop: TRVExtraItemStrProperty; const Value: String): Boolean;
  3258. begin
  3259.   case Prop of
  3260.     rvespImageFileName:
  3261.       begin
  3262.         BackgroundImageFileName := Value;
  3263.         Result := True;
  3264.       end;
  3265.     else
  3266.       Result := inherited SetExtraStrProperty(Prop, Value);
  3267.   end;
  3268. end;
  3269. {------------------------------------------------------------------------------}
  3270. function TRVTableItemInfo.GetItemNoInRootDocument: Integer;
  3271. var RVData: TCustomRVData;
  3272.     Location: TRVStoreSubRVData;
  3273.     ParentItemNo: Integer;
  3274. begin
  3275.   RVData := Rows.FMainRVData;
  3276.   ParentItemNo := GetMyItemNo;
  3277.   Result := ParentItemNo;
  3278.   repeat
  3279.     RVData.GetParentInfo(ParentItemNo, Location);
  3280.     Location.Free;
  3281.     if ParentItemNo>=0 then begin
  3282.       Result := ParentItemNo;
  3283.       RVData := RVData.GetAbsoluteParentData;
  3284.     end;
  3285.   until ParentItemNo<0;
  3286. end;
  3287. {------------------------------------------------------------------------------}
  3288. procedure TRVTableItemInfo.AssignProperties(Source: TRVTableItemInfo);
  3289. begin
  3290.   Options := Source.Options;
  3291.   PrintOptions := Source.PrintOptions;
  3292.   BestWidth := Source.BestWidth;
  3293.   Color := Source.Color;
  3294.   BackgroundImage := Source.BackgroundImage;
  3295.   BackgroundStyle := Source.BackgroundStyle;
  3296.   BackgroundImageFileName := Source.BackgroundImageFileName;
  3297.   HeadingRowCount := Source.HeadingRowCount;
  3298.   TextRowSeparator := Source.TextRowSeparator;
  3299.   TextColSeparator := Source.TextColSeparator;
  3300.   BorderWidth := Source.BorderWidth;
  3301.   BorderColor := Source.BorderColor;
  3302.   BorderLightColor := Source.BorderLightColor;
  3303.   BorderStyle := Source.BorderStyle;
  3304.   BorderVSpacing := Source.BorderVSpacing;
  3305.   BorderHSpacing := Source.BorderHSpacing;
  3306.   CellBorderWidth := Source.CellBorderWidth;
  3307.   CellBorderColor := Source.CellBorderColor;
  3308.   CellBorderLightColor := Source.CellBorderLightColor;
  3309.   CellPadding := Source.CellPadding;
  3310.   CellBorderStyle := Source.CellBorderStyle;
  3311.   VRuleWidth := Source.VRuleWidth;
  3312.   VRuleColor := Source.VRuleColor;
  3313.   HRuleWidth := Source.HRuleWidth;
  3314.   HRuleColor := Source.HRuleColor;
  3315.   CellVSpacing := Source.CellVSpacing;
  3316.   CellHSpacing := Source.CellHSpacing;
  3317.   VOutermostRule := Source.VOutermostRule;
  3318.   HOutermostRule := Source.HOutermostRule;
  3319. end;
  3320. procedure TRVTableItemInfo.ResetLiveSpell;
  3321. begin
  3322.   {$IFNDEF RVDONOTUSELIVESPELL}
  3323.   if GetMyItemNo>=0 then
  3324.     TCustomRichView(Rows.FMainRVData.GetAbsoluteRootData.GetParentControl).
  3325.       LaterSetBackLiveSpellingTo(Rows.FMainRVData.GetSourceRVData, GetMyItemNo, 0);
  3326.   {$ENDIF}
  3327. end;
  3328. initialization
  3329.   RegisterRichViewItemClass(rvsTable, TRVTableItemInfo);
  3330. end.