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

RichEdit

开发平台:

Delphi

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