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

  1. unit UXlsWorkbookGlobals;
  2.  
  3. interface
  4. uses classes, sysutils, UXlsBaseRecords, UXlsBaseRecordLists, UXlsOtherRecords, UXlsChart,
  5.      USST, XlsMessages, UXlsSections, UXlsReferences, USheetNameList, UXlsEscher,
  6.      UXlsFormula, UEscherRecords;
  7. type
  8.  
  9.   TBoundSheetList = class
  10.   private
  11.    FSheetNames: TSheetNameList;  //Cache with all the sheet names to speed up searching
  12.    FBoundSheets: TBoundSheetRecordList;
  13.   public
  14.     property BoundSheets: TBoundSheetRecordList read FBoundSheets;
  15.  
  16.     constructor Create;
  17.     destructor Destroy; override;
  18.     procedure Clear;
  19.  
  20.     procedure Add(const aRecord: TBoundSheetRecord);
  21.  
  22.     function TotalSize:int64;
  23.     procedure SaveToStream( const DataStream: TStream );
  24.  
  25.     procedure InsertSheet(const BeforeSheet: byte; const OptionFlags: word; const SheetName: WideString);
  26.   end;
  27.  
  28.   TWorkbookGlobals = class( TBaseSection)
  29.   private
  30.     FSST: TSST;
  31.     FReferences: TReferences;
  32.     FBoundSheets: TBoundSheetList;
  33.     FMiscRecords: TBaseRecordList;
  34.     FNames : TNameRecordList;
  35.     FDrawingGroup: TDrawingGroup;
  36.     FWindow1: TWindow1Record;
  37.     function GetSheetCount: integer;
  38.     function GetSheetName(const index: integer): Widestring;
  39.     procedure SetSheetName(const index: integer; const Value: Widestring);
  40.     function GetSheetOptionFlags(const index: integer): word;
  41.     function GetActivesheet: integer;
  42.     procedure SetActiveSheet(const Value: integer);
  43.   public
  44.     property SST: TSST read FSST;
  45.  
  46.     property SheetName[const index: integer]: Widestring read GetSheetName write SetSheetName;
  47.     property SheetCount: integer read GetSheetCount;
  48.     property SheetOptionFlags[const index: integer]: word read GetSheetOptionFlags;
  49.     procedure SheetSetOffset(const index: integer; const Offset: cardinal);
  50.  
  51.     property ActiveSheet: integer read GetActivesheet write SetActiveSheet;
  52.  
  53.     property DrawingGroup: TDrawingGroup read FDrawingGroup;
  54.     property References: TReferences read FReferences;
  55.     property Names: TNameRecordList read FNames;
  56.  
  57.     constructor Create;
  58.     destructor Destroy; override;
  59.     function TotalSize:int64; override;
  60.     procedure Clear; override;
  61.     procedure LoadFromStream( const DataStream: TStream; const First: TBOFRecord; const SST: TSST); override;
  62.     procedure SaveToStream(const DataStream: TStream);override;
  63.  
  64.     procedure InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const SheetInfo: TSheetInfo);
  65.     procedure DeleteRows(const aRow, aCount: word;const SheetInfo: TSheetInfo);
  66.  
  67.     procedure InsertSheets(const CopyFrom, BeforeSheet: byte; const OptionFlags: word; const Name: WideString; const SheetCount: byte);
  68.   end;
  69.  
  70.  
  71. implementation
  72. { TBoundSheetList }
  73.  
  74. procedure TBoundSheetList.Add(const aRecord: TBoundSheetRecord);
  75. begin
  76.   FBoundSheets.Add(aRecord);
  77.   FSheetNames.Add(aRecord.SheetName);
  78. end;
  79.  
  80. procedure TBoundSheetList.Clear;
  81. begin
  82.   if FSheetNames<>nil then FSheetNames.Clear;
  83.   if FBoundSheets<>nil then FBoundSheets.Clear;
  84. end;
  85.  
  86. constructor TBoundSheetList.Create;
  87. begin
  88.   inherited;
  89.   FSheetNames:= TSheetNameList.Create;
  90.   FBoundSheets:= TBoundSheetRecordList.Create;
  91. end;
  92.  
  93. destructor TBoundSheetList.Destroy;
  94. begin
  95.   FreeAndNil(FSheetNames);
  96.   FreeAndNil(FBoundSheets);
  97.   inherited;
  98. end;
  99.  
  100. procedure TBoundSheetList.InsertSheet(const BeforeSheet: byte;
  101.   const OptionFlags: word; const SheetName: WideString);
  102. var
  103.   NewName: WideString;
  104. begin
  105.   NewName:= FSheetNames.AddUniqueName(SheetName);
  106.   FBoundSheets.Insert(BeforeSheet, TBoundSheetRecord.CreateNew(OptionFlags, NewName));
  107. end;
  108.  
  109. procedure TBoundSheetList.SaveToStream(const DataStream: TStream);
  110. begin
  111.   FBoundSheets.SaveToStream(DataStream);
  112. end;
  113.  
  114. function TBoundSheetList.TotalSize: int64;
  115. begin
  116.   TotalSize:= FBoundSheets.TotalSize;
  117. end;
  118.  
  119. { TWorkbookGlobals }
  120.  
  121. procedure TWorkbookGlobals.Clear;
  122. begin
  123.   inherited;
  124.   if FSST<>nil then FSST.Clear;
  125.   if FReferences<>nil then FReferences.Clear;
  126.   if FBoundSheets<>nil then FBoundSheets.Clear;
  127.   if FMiscRecords<>nil then FMiscRecords.Clear;
  128.   if FNames<>nil then FNames.Clear;
  129.   if FDrawingGroup<>nil then FDrawingGroup.Clear;
  130. end;
  131.  
  132. constructor TWorkbookGlobals.Create;
  133. begin
  134.   inherited;
  135.   FSST:= TSST.Create;
  136.   FReferences:= TReferences.Create;
  137.   FBoundSheets:= TBoundSheetList.Create;
  138.   FMiscRecords:= TBaseRecordList.Create;
  139.   FNames:=TNameRecordList.Create;
  140.   FDrawingGroup:= TDrawingGroup.Create;
  141. end;
  142.  
  143. procedure TWorkbookGlobals.DeleteRows(const aRow, aCount: word; const SheetInfo: TSheetInfo);
  144. begin
  145.   FNames.ArrangeInsert(aRow, -aCount, SheetInfo);
  146. end;
  147.  
  148. destructor TWorkbookGlobals.Destroy;
  149. begin
  150.   FreeAndNil(FSST);
  151.   FreeAndNil(FReferences);
  152.   FreeAndNil(FBoundSheets);
  153.   FreeAndNil(FMiscRecords);
  154.   FreeAndNil(FNames);
  155.   FreeAndNil(FDrawingGroup);
  156.   inherited;
  157. end;
  158.  
  159. function TWorkbookGlobals.GetActivesheet: integer;
  160. begin
  161.   if FWindow1<>nil then Result:= FWindow1.ActiveSheet else Result:=0;
  162. end;
  163.  
  164. function TWorkbookGlobals.GetSheetCount: integer;
  165. begin
  166.   Result:= FBoundSheets.BoundSheets.Count;
  167. end;
  168.  
  169. function TWorkbookGlobals.GetSheetName(const index: integer): Widestring;
  170. begin
  171.   Result:= FBoundSheets.BoundSheets.SheetName[index];
  172. end;
  173.  
  174. function TWorkbookGlobals.GetSheetOptionFlags(const index: integer): word;
  175. begin
  176.   Result:= FBoundSheets.BoundSheets[index].OptionFlags;
  177. end;
  178.  
  179. procedure TWorkbookGlobals.InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const SheetInfo: TSheetInfo);
  180. begin
  181.   FNames.ArrangeInsert(DestRow, (LastRow -FirstRow +1)* aCount, SheetInfo);
  182. end;
  183.  
  184. procedure TWorkbookGlobals.InsertSheets(const CopyFrom, BeforeSheet: byte;
  185.   const OptionFlags: word; const Name: WideString; const SheetCount: byte);
  186. var
  187.   i: integer;
  188.   SheetInfo: TSheetInfo;
  189. begin
  190.   for i:=0 to SheetCount-1 do
  191.     FBoundSheets.InsertSheet(BeforeSheet, OptionFlags, Name);
  192.   FReferences.InsertSheets(BeforeSheet, SheetCount);
  193.  
  194.   SheetInfo.InsSheet:=-1;
  195.   SheetInfo.FormulaSheet:=CopyFrom;
  196.   SheetInfo.GetSheet:= FReferences.GetSheet;
  197.   SheetInfo.SetSheet:= FReferences.SetSheet;
  198.   FNames.InsertSheets(CopyFrom, BeforeSheet, SheetCount, SheetInfo );
  199. end;
  200.  
  201. procedure TWorkbookGlobals.LoadFromStream(const DataStream: TStream;
  202.   const First: TBOFRecord; const SST: TSST);
  203. var
  204.   RecordHeader: TRecordHeader;
  205.   R: TBaseRecord;
  206. begin
  207.   Clear;
  208.   repeat
  209.     if (DataStream.Read(RecordHeader, sizeof(RecordHeader)) <> sizeof(RecordHeader)) then
  210.       raise Exception.Create(ErrExcelInvalid);
  211.  
  212.     R:=LoadRecord(DataStream, RecordHeader);
  213.     try
  214.       if (R is TBofRecord) then raise Exception.Create(ErrExcelInvalid)
  215.       else if (R is TIgnoreRecord) then FreeAndNil(R)
  216.       else if (R is TBoundSheetRecord) then FBoundSheets.Add(R as TBoundSheetRecord)
  217.       else if (R is TNameRecord) then FNames.Add(R as TNameRecord)
  218.       else if (R is TEOFRecord) then EOF:=(R as TEOFRecord)
  219.       else if (R is TSSTRecord) then begin FSST.Load(R as TSSTRecord); FreeAndNil(R);end
  220.       else if (R is TSupBookRecord) then FReferences.AddSupbook(R as TSupBookRecord)
  221.       else if (R is TExternSheetRecord) then begin; FReferences.AddExternRef(R as TExternSheetRecord); FreeAndNil(R);end
  222.       else if (R is TDrawingGroupRecord) then FDrawingGroup.LoadFromStream(DataStream, R as TDrawingGroupRecord)
  223.       else if (R is TWindow1Record) then begin; FWindow1:=R as TWindow1Record; FMiscRecords.Add(R); end
  224.  
  225.       else FMiscRecords.Add(R);
  226.  
  227.     except
  228.       FreeAndNil(R);
  229.       Raise;
  230.     end; //Finally
  231.  
  232.   until RecordHeader.id = xlr_EOF;
  233.  
  234.   BOF:=First; //Last statement
  235. end;
  236.  
  237. procedure TWorkbookGlobals.SaveToStream(const DataStream: TStream);
  238. begin
  239.   if (BOF=nil)or(EOF=nil) then raise Exception.Create(ErrSectionNotLoaded);
  240.  
  241.   BOF.SaveToStream(DataStream);
  242.   FMiscRecords.SaveToStream(DataStream);
  243.   FBoundSheets.SaveToStream(DataStream);
  244.   FReferences.SaveToStream(DataStream);
  245.   FNames.SaveToStream(DataStream); //Should be after FBoundSheets.SaveToStream
  246.   FDrawingGroup.SaveToStream(DataStream);
  247.   FSST.SaveToStream(DataStream);
  248.   EOF.SaveToStream(DataStream);
  249. end;
  250.  
  251. procedure TWorkbookGlobals.SetActiveSheet(const Value: integer);
  252. begin
  253.   if FWindow1<>nil then FWindow1.ActiveSheet:=Value;
  254. end;
  255.  
  256. procedure TWorkbookGlobals.SetSheetName(const index: integer;
  257.   const Value: Widestring);
  258. begin
  259.    FBoundSheets.BoundSheets.SheetName[index]:=Value;
  260. end;
  261.  
  262. procedure TWorkbookGlobals.SheetSetOffset(const index: integer; const Offset: cardinal);
  263. begin
  264.   FBoundSheets.BoundSheets[index].SetOffset(Offset);
  265. end;
  266.  
  267. function TWorkbookGlobals.TotalSize: int64;
  268. begin
  269.   Result:= inherited TotalSize +
  270.       FSST.TotalSize +
  271.       FReferences.TotalSize +
  272.       FBoundSheets.TotalSize +
  273.       FMiscRecords.TotalSize +
  274.       FNames.TotalSize+
  275.       FDrawingGroup.TotalSize;
  276. end;
  277.  
  278.  
  279. end.
  280.