home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / Chip_2003-01_cd1.bin / zkuste / delphi / kolekce / d567 / FLEXCEL.ZIP / XLSAdapter / UXlsChart.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-09-26  |  4.3 KB  |  150 lines

  1. unit UXlsChart;
  2.  
  3. interface
  4. uses UXlsBaseRecords, UXlsBaseRecordLists, UXlsOtherRecords,
  5.      XlsMessages, UXlsTokenArray, Classes, SysUtils, UXlsBaseList;
  6.  
  7. type
  8.   TChartRecord = class (TBaseRecord)
  9.   end;
  10.  
  11.   TChartAIRecord = class (TChartRecord)
  12.   private
  13.     Flags, Flen: word;
  14.  
  15.     procedure ArrangeTokensInsertRow(const  InsPos, InsOffset, CopyOffset: integer; const SheetInfo: TSheetInfo);
  16.  
  17.   public
  18.     constructor Create(const aId: word; const aData: PArrayOfByte; const aDataSize: integer);override;
  19.     procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);
  20.     procedure ArrangeCopySheet(const SheetInfo: TSheetInfo);
  21.     procedure ArrangeCopy(const NewRow, OldRow: Word);
  22.   end;
  23.  
  24.   TChartAIRecordCache = class (TBaseList)
  25.     {$INCLUDE TChartAIRecordCacheHdr.inc}
  26.     constructor Create;
  27.     procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);
  28.     procedure ArrangeCopySheet(const SheetInfo: TSheetInfo);
  29.   end;
  30.  
  31.   TChartRecordList = class (TBaseRecordList)
  32.   private
  33.     AICache: TChartAIRecordCache;
  34.   protected
  35.     procedure Notify(Ptr: Pointer; Action: TListNotification);override;
  36.   public
  37.     constructor Create;
  38.     destructor Destroy;override;
  39.     procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);
  40.     procedure ArrangeCopySheet(const SheetInfo: TSheetInfo);
  41.   end;
  42.  
  43. implementation
  44.  
  45. { TChartAIRecordCache }
  46. {$INCLUDE TChartAIRecordCacheImp.inc}
  47.  
  48. constructor TChartAIRecordCache.Create;
  49. begin
  50.   inherited Create(False) //We don't own the objects
  51. end;
  52.  
  53. procedure TChartAIRecordCache.ArrangeInsert(const aPos, aCount: integer;
  54.   const SheetInfo: TSheetInfo);
  55. var
  56.   i: integer;
  57. begin
  58.   for i:=0 to Count-1 do Items[i].ArrangeInsert(aPos, aCount,SheetInfo);
  59. end;
  60.  
  61. procedure TChartAIRecordCache.ArrangeCopySheet(const SheetInfo: TSheetInfo);
  62. var
  63.   i: integer;
  64. begin
  65.   for i:=0 to Count-1 do Items[i].ArrangeCopySheet(SheetInfo);
  66. end;
  67.  
  68. { TChartAIRecord }
  69.  
  70. //This doesn't make sense... all ranges in charts are absolute. But, anyway...
  71. procedure TChartAIRecord.ArrangeCopy(const NewRow, OldRow: Word);
  72. const
  73.   SheetInfo: TSheetInfo=(InsSheet:-1;FormulaSheet:-1;GetSheet:nil;SetSheet:nil);
  74. begin
  75.   if Flen>0 then ArrangeTokensInsertRow(0, 0, NewRow - OldRow,  SheetInfo); //Sheet info doesn't have meaninig on copy
  76. end;
  77.  
  78. procedure TChartAIRecord.ArrangeTokensInsertRow(const InsPos, InsOffset,
  79.   CopyOffset: integer; const SheetInfo: TSheetInfo);
  80. begin
  81.   try
  82.     UXlsTokenArray.ArrangeInsertRows(Data, 8, 8+FLen, InsPos, InsOffset, CopyOffset, SheetInfo);
  83.   except
  84.     on e: ETokenException do raise Exception.CreateFmt(ErrBadChartFormula,[e.Token]);
  85.     else raise;
  86.   end; //Except
  87. end;
  88.  
  89. constructor TChartAIRecord.Create(const aId: word; const aData: PArrayOfByte;
  90.   const aDataSize: integer);
  91. begin
  92.   inherited;
  93.   Flags:=GetWord(Data, 0);
  94.   FLen:=GetWord(Data, 6);
  95. end;
  96.  
  97. procedure TChartAIRecord.ArrangeCopySheet(const SheetInfo: TSheetInfo);
  98. begin
  99.   if Flen=0 then exit;
  100.   try
  101.     UXlsTokenArray.ArrangeInsertSheets(Data, 8, 8+FLen, SheetInfo);
  102.   except
  103.     on e: ETokenException do raise Exception.CreateFmt(ErrBadChartFormula,[e.Token]);
  104.     else raise;
  105.   end; //Except
  106. end;
  107.  
  108. procedure TChartAIRecord.ArrangeInsert(const aPos, aCount: integer;
  109.   const SheetInfo: TSheetInfo);
  110. begin
  111.   if Flen>0 then ArrangeTokensInsertRow(aPos, aCount, 0,  SheetInfo);
  112. end;
  113.  
  114. { TChartRecordList }
  115.  
  116. constructor TChartRecordList.Create;
  117. begin
  118.   inherited;
  119.   AICache:= TChartAIRecordCache.Create;
  120. end;
  121.  
  122. destructor TChartRecordList.Destroy;
  123. begin
  124.   FreeAndNil(AICache);
  125.   inherited;
  126. end;
  127.  
  128. procedure TChartRecordList.ArrangeInsert(const aPos, aCount: integer;
  129.   const SheetInfo: TSheetInfo);
  130. begin
  131.   AICache.ArrangeInsert(aPos, aCount, SheetInfo);
  132. end;
  133.  
  134. procedure TChartRecordList.ArrangeCopySheet(const SheetInfo: TSheetInfo);
  135. begin
  136.   AICache.ArrangeCopySheet(SheetInfo);
  137. end;
  138.  
  139. procedure TChartRecordList.Notify(Ptr: Pointer; Action: TListNotification);
  140. begin
  141.   if (Action = lnDeleted) and (AICache<>nil) then if (TBaseRecord(Ptr) is TChartAIRecord) then
  142.     AICache.Delete(AICache.IndexOf(TBaseRecord(Ptr)));
  143.   if Action = lnAdded then if (TBaseRecord(Ptr) is TChartAIRecord) then
  144.     AICache.Add(TChartAIRecord(Ptr));
  145.   inherited Notify(Ptr, Action);
  146. end;
  147.  
  148.  
  149. end.
  150.