home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 October / Chip_2002-10_cd1.bin / zkuste / delphi / kolekce / d56 / FLEXCEL.ZIP / XLSAdapter / UXlsChart.pas < prev    next >
Pascal/Delphi Source File  |  2002-07-01  |  4KB  |  123 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 ArrangeCopy(const NewRow, OldRow: Word);
  21.   end;
  22.  
  23.   TChartAIRecordCache = class (TBaseList)
  24.     {$INCLUDE inc\TChartAIRecordCacheHdr.inc}
  25.     constructor Create;
  26.     procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);
  27.   end;
  28.  
  29.   TChartRecordList = class (TBaseRecordList)
  30.   private
  31.     AICache: TChartAIRecordCache;
  32.   protected
  33.     procedure Notify(Ptr: Pointer; Action: TListNotification);override;
  34.   public
  35.     constructor Create;
  36.     destructor Destroy;override;
  37.     procedure ArrangeInsert(const aPos, aCount:integer; const SheetInfo: TSheetInfo);
  38.   end;
  39.  
  40. implementation
  41.  
  42. { TChartAIRecordCache }
  43. {$INCLUDE inc\TChartAIRecordCacheImp.inc}
  44.  
  45. constructor TChartAIRecordCache.Create;
  46. begin
  47.   inherited Create(False) //We don't own the objects
  48. end;
  49.  
  50. procedure TChartAIRecordCache.ArrangeInsert(const aPos, aCount: integer;
  51.   const SheetInfo: TSheetInfo);
  52. var
  53.   i: integer;
  54. begin
  55.   for i:=0 to Count-1 do Items[i].ArrangeInsert(aPos, aCount,SheetInfo);
  56. end;
  57.  
  58. { TChartAIRecord }
  59.  
  60. //This doesn't make sense... all ranges in charts are absolute. But, anyway...
  61. procedure TChartAIRecord.ArrangeCopy(const NewRow, OldRow: Word);
  62. const
  63.   SheetInfo: TSheetInfo=(InsSheet:-1;FormulaSheet:-1;GetSheet:nil;SetSheet:nil);
  64. begin
  65.   if Flen>0 then ArrangeTokensInsertRow(0, 0, NewRow - OldRow,  SheetInfo); //Sheet info doesn't have meaninig on copy
  66. end;
  67.  
  68. procedure TChartAIRecord.ArrangeTokensInsertRow(const InsPos, InsOffset,
  69.   CopyOffset: integer; const SheetInfo: TSheetInfo);
  70. begin
  71.   try
  72.     UXlsTokenArray.ArrangeInsertRows(Data, 8, 8+FLen, InsPos, InsOffset, CopyOffset, SheetInfo);
  73.   except
  74.     on e: ETokenException do raise Exception.CreateFmt(ErrBadChartFormula,[e.Token]);
  75.     else raise;
  76.   end; //Except
  77. end;
  78.  
  79. constructor TChartAIRecord.Create(const aId: word; const aData: PArrayOfByte;
  80.   const aDataSize: integer);
  81. begin
  82.   inherited;
  83.   Flags:=GetWord(Data, 0);
  84.   FLen:=GetWord(Data, 6);
  85. end;
  86.  
  87. procedure TChartAIRecord.ArrangeInsert(const aPos, aCount: integer;
  88.   const SheetInfo: TSheetInfo);
  89. begin
  90.   if Flen>0 then ArrangeTokensInsertRow(aPos, aCount, 0,  SheetInfo);
  91. end;
  92.  
  93. { TChartRecordList }
  94.  
  95. constructor TChartRecordList.Create;
  96. begin
  97.   inherited;
  98.   AICache:= TChartAIRecordCache.Create;
  99. end;
  100.  
  101. destructor TChartRecordList.Destroy;
  102. begin
  103.   FreeAndNil(AICache);
  104.   inherited;
  105. end;
  106.  
  107. procedure TChartRecordList.ArrangeInsert(const aPos, aCount: integer;
  108.   const SheetInfo: TSheetInfo);
  109. begin
  110.   AICache.ArrangeInsert(aPos, aCount, SheetInfo);
  111. end;
  112.  
  113. procedure TChartRecordList.Notify(Ptr: Pointer; Action: TListNotification);
  114. begin
  115.   if (Action = lnDeleted) and (AICache<>nil) then if (TBaseRecord(Ptr) is TChartAIRecord) then
  116.     AICache.Delete(AICache.IndexOf(TBaseRecord(Ptr)));
  117.   if Action = lnAdded then if (TBaseRecord(Ptr) is TChartAIRecord) then
  118.     AICache.Add(TChartAIRecord(Ptr));
  119.   inherited Notify(Ptr, Action);
  120. end;
  121.  
  122. end.
  123.