home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 October / Chip_2002-10_cd1.bin / zkuste / delphi / kolekce / d56 / FLEXCEL.ZIP / XLSAdapter / UXlsSheet.pas < prev    next >
Pascal/Delphi Source File  |  2002-07-03  |  13KB  |  403 lines

  1. unit UXlsSheet;
  2.  
  3. interface
  4. uses classes, sysutils, UXlsBaseRecords, UXlsBaseRecordLists, UXlsOtherRecords, UXlsChart,
  5.      USST, XlsMessages, UXlsSections, UXlsCondFmt, UXlsRowColEntries, UXlsEscher,
  6.      UXlsRangeRecords, UEscherRecords, UXlsWorkbookGlobals, UXlsNotes, UXlsBaseList,
  7.      UFlxMessages, UXlsCellRecords, UXlsFormula;
  8.  
  9. type
  10.   TSheet= class (TBaseSection)
  11.   protected
  12.     FWorkbookGlobals: TWorkbookGlobals;
  13.     FWindow2: TWindow2Record;
  14.     function GetSelected: boolean;
  15.     procedure SetSelected(const Value: boolean);
  16.   public
  17.     function CopyTo: TSheet; //This method cant be virtual
  18.     function DoCopyTo: TSheet; virtual;
  19.     procedure InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);virtual;abstract;
  20.     procedure DeleteRows(const aRow, aCount: word;const SheetInfo: TSheetInfo);virtual; abstract;
  21.     procedure ArrangeInsert(const InsPos, InsCount: integer ; const SheetInfo: TSheetInfo);virtual;abstract;
  22.  
  23.     constructor Create(const aWorkbookGlobals: TWorkbookGlobals);virtual;
  24.  
  25.     property Selected: boolean read GetSelected write SetSelected;
  26.   end;
  27.  
  28.   ClassOfTSheet= Class of TSheet;
  29.  
  30.   TChart = class (TSheet)
  31.   private
  32.     FChartRecords: TChartRecordList;
  33.   public
  34.  
  35.     constructor Create(const aWorkbookGlobals: TWorkbookGlobals);override;
  36.     destructor Destroy;override;
  37.     function DoCopyTo: TSheet; override;
  38.  
  39.     function TotalSize:int64; override;
  40.     procedure LoadFromStream( const DataStream: TStream; const First: TBOFRecord; const SST: TSST);override;
  41.     procedure SaveToStream(const DataStream: TStream);override;
  42.     procedure Clear; override;
  43.     procedure ArrangeInsert(const InsPos, InsCount: integer; const SheetInfo: TSheetInfo);override;
  44.     procedure InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);override;
  45.     procedure DeleteRows(const aRow, aCount: word; const SheetInfo: TSheetInfo);override;
  46.  
  47.   end;
  48.  
  49.   TChartList = class(TBaseList) //records are TChart
  50.     {$INCLUDE inc\TChartListHdr.inc}
  51.     procedure SaveToStream(const DataStream: TStream);
  52.     procedure ArrangeInsert(const InsPos, InsCount: integer; const SheetInfo: TSheetInfo);
  53.   end;
  54.  
  55.  
  56.   TWorkSheet = class (TSheet)
  57.   private
  58.     FMiscRecords1: TBaseRecordList;
  59.     FMiscRecords2: TBaseRecordList;
  60.     FDrawing: TDrawing;
  61.     FCells: TCells;
  62.     FRanges: TRangeList;
  63.     FNotes: TNoteList;
  64.  
  65.     function GetDrawingRow(index: integer): integer;
  66.     function GetDrawingName(index: integer): widestring;
  67.   public
  68.     constructor Create(const aWorkbookGlobals: TWorkbookGlobals);override;
  69.     destructor Destroy;override;
  70.     function DoCopyTo: TSheet; override;
  71.  
  72.     function TotalSize:int64; override;
  73.     procedure LoadFromStream( const DataStream: TStream; const First: TBOFRecord; const SST: TSST);override;
  74.     procedure SaveToStream(const DataStream: TStream); override;
  75.     procedure Clear; override;
  76.  
  77.     procedure InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);override;
  78.     procedure DeleteRows(const aRow, aCount: word; const SheetInfo: TSheetInfo);override;
  79.  
  80.     procedure ArrangeInsert(const InsPos, InsCount: integer; const SheetInfo: TSheetInfo);override;
  81.  
  82.     property Notes: TNoteList read FNotes;
  83.     property Cells: TCells read FCells;
  84.  
  85.     function DrawingCount: integer;
  86.     procedure AssignDrawing(const Index: integer; const Data: string; const DataType: TXlsImgTypes);
  87.     property DrawingRow[index: integer]: integer read GetDrawingRow;
  88.     property DrawingName[index: integer]: widestring read GetDrawingName;
  89.  
  90.   end;
  91.  
  92. implementation
  93.  
  94. { TSheet }
  95.  
  96. function TSheet.CopyTo: TSheet;
  97. begin
  98.   if Self= nil then Result:=nil else Result:= DoCopyTo;
  99. end;
  100.  
  101. constructor TSheet.Create(const aWorkbookGlobals: TWorkbookGlobals);
  102. begin
  103.   FWorkbookGlobals:=aWorkbookGlobals;
  104. end;
  105.  
  106. function TSheet.DoCopyTo: TSheet;
  107. begin
  108.   Result:= ClassOfTSheet(ClassType).Create(FWorkbookGlobals);
  109.   Result.BOF:= BOF.CopyTo as TBOFRecord;
  110.   Result.EOF:= EOF.CopyTo as TEOFRecord;
  111. end;
  112.  
  113. function TSheet.GetSelected: boolean;
  114. begin
  115.   if (FWindow2<>nil) then Result:=FWindow2.Selected else Result:=false;
  116. end;
  117.  
  118. procedure TSheet.SetSelected(const Value: boolean);
  119. begin
  120.   if (FWindow2<>nil) then FWindow2.Selected:=value;
  121. end;
  122.  
  123. { TChart }
  124.  
  125. procedure TChart.Clear;
  126. begin
  127.   inherited;
  128.   if FChartRecords<>nil then FChartRecords.Clear;
  129. end;
  130.  
  131. function TChart.DoCopyTo: TSheet;
  132. begin
  133.   Result:= inherited DoCopyTo;
  134.   (Result as TChart).FChartRecords.CopyFrom(FChartRecords);
  135. end;
  136.  
  137. constructor TChart.Create(const aWorkbookGlobals: TWorkbookGlobals);
  138. begin
  139.   inherited;
  140.   FChartRecords:= TChartRecordList.Create;
  141. end;
  142.  
  143. destructor TChart.Destroy;
  144. begin
  145.   FreeAndNil(FChartRecords);
  146.   inherited;
  147. end;
  148.  
  149. procedure TChart.LoadFromStream(const DataStream: TStream;
  150.   const First: TBOFRecord; const SST: TSST);
  151. var
  152.   RecordHeader: TRecordHeader;
  153.   R: TBaseRecord;
  154. begin
  155.   Clear;
  156.   repeat
  157.     if (DataStream.Read(RecordHeader, sizeof(RecordHeader)) <> sizeof(RecordHeader)) then
  158.       raise Exception.Create(ErrExcelInvalid);
  159.  
  160.     R:=LoadRecord(DataStream, RecordHeader);
  161.     try
  162.       if RecordHeader.Id=xlr_WINDOW2 then FWindow2:=R as TWindow2Record;
  163.       if (R is TLabelSSTRecord) then (R as TLabelSSTRecord).AttachToSST(SST);
  164.       if (R is TBofRecord) then raise Exception.Create(ErrExcelInvalid)
  165.       else if (R is TIgnoreRecord) then FreeAndNil(R)
  166.       else if (R is TEOFRecord) then EOF:=(R as TEOFRecord)
  167.       else FChartRecords.Add(R) ;
  168.     except
  169.       FreeAndNil(R);
  170.       Raise;
  171.     end; //Finally
  172.  
  173.   until RecordHeader.id = xlr_EOF;
  174.   BOF:=First; //Last statement
  175. end;
  176.  
  177. procedure TChart.SaveToStream(const DataStream: TStream);
  178. begin
  179.   if (BOF=nil)or(EOF=nil) then raise Exception.Create(ErrSectionNotLoaded);
  180.   BOF.SaveToStream(DataStream);
  181.   FChartRecords.SaveToStream(DataStream);
  182.   EOF.SaveToStream(DataStream);
  183. end;
  184.  
  185. function TChart.TotalSize: int64;
  186. begin
  187.   Result:= inherited TotalSize+
  188.     FChartRecords.TotalSize;
  189. end;
  190.  
  191. procedure TChart.ArrangeInsert(const InsPos, InsCount: integer; const SheetInfo: TSheetInfo);
  192. begin
  193.   FChartRecords.ArrangeInsert( InsPos, InsCount, SheetInfo);
  194. end;
  195.  
  196. { TChartList }
  197.  
  198. {$INCLUDE inc\TChartListImp.inc}
  199.  
  200. procedure TChartList.ArrangeInsert(const InsPos, InsCount: integer;
  201.   const SheetInfo: TSheetInfo);
  202. var
  203.   i: integer;
  204. begin
  205.   for i:=0 to Count -1 do Items[i].ArrangeInsert(InsPos, InsCount, SheetInfo);
  206. end;
  207.  
  208. procedure TChartList.SaveToStream(const DataStream: TStream);
  209. var
  210.   i:integer;
  211. begin
  212.   for i:=0 to Count-1 do Items[i].SaveToStream(DataStream);
  213. end;
  214.  
  215. procedure TChart.InsertAndCopyRows(const FirstRow, LastRow, DestRow,
  216.   aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);
  217. begin
  218.   //Nothing, we never insert rows in a chart sheet
  219. end;
  220.  
  221. procedure TChart.DeleteRows(const aRow, aCount: word; const SheetInfo: TSheetInfo);
  222. begin
  223.   //Nothing, we never delete rows in a chart sheet
  224. end;
  225.  
  226.  
  227. { TWorkSheet }
  228.  
  229. procedure TWorkSheet.Clear;
  230. begin
  231.   inherited;
  232.   if FMiscRecords1<>nil then FMiscRecords1.Clear;
  233.   if FMiscRecords2<>nil then FMiscRecords2.Clear;
  234.   if FDrawing<>nil then FDrawing.Clear;
  235.   if FCells<>nil then FCells.Clear;
  236.   if FRanges<>nil then FRanges.Clear;
  237.   if FNotes<>nil then FNotes.Clear;
  238. end;
  239.  
  240. function TWorkSheet.DoCopyTo: TSheet;
  241. begin
  242.   Result:= inherited DoCopyTo;
  243.   (Result as TWorkSheet).FMiscRecords1.CopyFrom(FMiscRecords1);
  244.   (Result as TWorkSheet).FMiscRecords2.CopyFrom(FMiscRecords2);
  245.   (Result as TWorkSheet).FDrawing.CopyFrom(FDrawing);
  246.   (Result as TWorkSheet).FCells.CopyFrom(FCells);
  247.   (Result as TWorkSheet).FRanges.CopyFrom(FRanges);
  248.   (Result as TWorkSheet).FNotes.CopyFrom(FNotes);
  249.   
  250.   (Result as TWorkSheet).FNotes.FixDwgIds((Result as TWorkSheet).FDrawing);
  251.  
  252. end;
  253.  
  254. constructor TWorkSheet.Create(const aWorkbookGlobals: TWorkbookGlobals);
  255. begin
  256.   inherited;
  257.   FMiscRecords1:= TBaseRecordList.Create;
  258.   FMiscRecords2:= TBaseRecordList.Create;
  259.   FDrawing:= TDrawing.Create(FWorkbookGlobals.DrawingGroup);
  260.   FCells:= TCells.Create(aWorkbookGlobals.SST);
  261.   FRanges :=TRangeList.Create;
  262.   FNotes:= TNoteList.Create;
  263. end;
  264.  
  265. destructor TWorkSheet.Destroy;
  266. begin
  267.   FreeAndNil(FRanges);
  268.   FreeAndNil(FCells);
  269.   FreeAndNil(FNotes);
  270.   //FDrawing should be freed after notes
  271.   FreeAndNil(FDrawing);
  272.   FreeAndNil(FMiscRecords1);
  273.   FreeAndNil(FMiscRecords2);
  274.   inherited;
  275. end;
  276.  
  277. procedure TWorkSheet.LoadFromStream(const DataStream: TStream;
  278.   const First: TBOFRecord; const SST: TSST);
  279. var
  280.   RecordHeader: TRecordHeader;
  281.   R: TBaseRecord;
  282.   MiscRecords: TBaseRecordList;
  283.   FShrFmlas: TShrFmlaRecordList;
  284. begin
  285.   Clear;
  286.   MiscRecords:=FMiscRecords1;
  287.   FShrFmlas:= TShrFmlaRecordList.Create;
  288.   try
  289.     repeat
  290.       if (DataStream.Read(RecordHeader, sizeof(RecordHeader)) <> sizeof(RecordHeader)) then
  291.         raise Exception.Create(ErrExcelInvalid);
  292.  
  293.       R:=LoadRecord(DataStream, RecordHeader);
  294.       try
  295.         if RecordHeader.Id=xlr_WINDOW2 then
  296.         begin
  297.           MiscRecords:=FMiscRecords2;
  298.           FWindow2:=R as TWindow2Record;
  299.         end;
  300.         if (R is TLabelSSTRecord) then (R as TLabelSSTRecord).AttachToSST(SST);
  301.         if (R is TBofRecord) then raise Exception.Create(ErrExcelInvalid)
  302.         else if (R is TDrawingRecord) then FDrawing.LoadFromStream(DataStream, R as TDrawingRecord, SST)
  303.         else if (R is TIgnoreRecord) then FreeAndNil(R)
  304.         else if (R is TNoteRecord) then FNotes.AddRecord(R as TNoteRecord, (R as TNoteRecord).Row)
  305.         else if (R is TCellRecord) then FCells.AddCell(R as TCellRecord, (R as TCellRecord).Row)
  306.         else if (R is TMultipleValueRecord) then begin FCells.AddMultipleCells(R as TMultipleValueRecord);FreeAndNil(R);end
  307.         else if (R is TRowRecord) then FCells.AddRow(R as TRowRecord)
  308.         else if (R is TCondFmtRecord) then FRanges[FRanges.Add(TCondFmt.Create)].LoadFromStream(DataStream, R as TCondFmtRecord)
  309.         else if (R is TCellMergingRecord) then FRanges[FRanges.Add(TMergedCells.Create)].LoadFromStream(DataStream, R as TCellMergingRecord)
  310.         else if (R is TShrFmlaRecord) then FShrFmlas.Add(R as TShrFmlaRecord)
  311.         else if (R is TEOFRecord) then EOF:=(R as TEOFRecord)
  312.         else MiscRecords.Add(R) ;
  313.  
  314.       except
  315.         FreeAndNil(R);
  316.         Raise;
  317.       end; //Finally
  318.  
  319.     until RecordHeader.id = xlr_EOF;
  320.  
  321.     FNotes.FixDwgIds(FDrawing);
  322.     FCells.CellList.FixFormulas(FShrFmlas);
  323.   finally
  324.     FreeAndNil(FShrFmlas);
  325.   end; //finally
  326.  
  327.   //this must be the last statment, so if there is an exception, we dont take First
  328.   BOF:= First;
  329. end;
  330.  
  331. procedure TWorkSheet.SaveToStream(const DataStream: TStream);
  332. begin
  333.   if (BOF=nil)or(EOF=nil) then raise Exception.Create(ErrSectionNotLoaded);
  334.   BOF.SaveToStream(DataStream);
  335.   FMiscRecords1.SaveToStream(DataStream);
  336.   FCells.SaveToStream(DataStream);
  337.   FDrawing.SaveToStream(DataStream);
  338.   FNotes.SaveToStream(DataStream);
  339.   FMiscRecords2.SaveToStream(DataStream);
  340.   FRanges.SaveToStream(DataStream);
  341.   EOF.SaveToStream(DataStream);
  342. end;
  343.  
  344. function TWorkSheet.TotalSize: int64;
  345. begin
  346.   Result:= inherited TotalSize+
  347.     FMiscRecords1.TotalSize +
  348.     FCells.TotalSize +
  349.     FRanges.TotalSize +
  350.     FDrawing.TotalSize +
  351.     FMiscRecords2.TotalSize+
  352.     FNotes.TotalSize;
  353. end;
  354.  
  355. procedure TWorkSheet.InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);
  356. begin
  357.    FCells.InsertAndCopyRows(FirstRow, LastRow, DestRow, aCount, SheetInfo, OnlyFormulas);
  358.    FDrawing.InsertAndCopyRows(FirstRow, LastRow, DestRow, aCount, SheetInfo);
  359.    FRanges.InsertAndCopyRows(FirstRow, LastRow, DestRow, aCount, SheetInfo);
  360.    FNotes.InsertAndCopyRows(FirstRow, LastRow, DestRow, aCount, SheetInfo, false);
  361. end;
  362.  
  363. procedure TWorkSheet.DeleteRows(const aRow, aCount: word; const SheetInfo: TSheetInfo);
  364. begin
  365.    FCells.DeleteRows(aRow, aCount, SheetInfo);
  366.    FDrawing.DeleteRows(aRow, aCount, SheetInfo);
  367.    FRanges.DeleteRows(aRow, aCount, SheetInfo);
  368.    FNotes.DeleteRows(aRow, aCount, SheetInfo);
  369. end;
  370.  
  371.  
  372. procedure TWorkSheet.ArrangeInsert(const InsPos, InsCount: integer; const SheetInfo: TSheetInfo);
  373. begin
  374.   //PENDING: Optimize this
  375.   FCells.ArrangeInsert(InsPos, InsCount, SheetInfo);
  376.   FDrawing.ArrangeInsert(InsPos, InsCount, SheetInfo);
  377. end;
  378.  
  379.  
  380.  
  381. procedure TWorkSheet.AssignDrawing(const Index: integer; const Data: string;
  382.   const DataType: TXlsImgTypes);
  383. begin
  384.   FDrawing.AssignDrawing( Index, Data, DataType);
  385. end;
  386.  
  387. function TWorkSheet.DrawingCount: integer;
  388. begin
  389.   Result:= FDrawing.DrawingCount;
  390. end;
  391.  
  392. function TWorkSheet.GetDrawingRow(index: integer): integer;
  393. begin
  394.   Result:= FDrawing.DrawingRow[index];
  395. end;
  396.  
  397. function TWorkSheet.GetDrawingName(index: integer): widestring;
  398. begin
  399.   Result:= FDrawing.DrawingName[index];
  400. end;
  401.  
  402. end.
  403.