fpspreadsheet: Add element array with conditional format indexes to TCell record. Needed by ODS writer and for visual controls.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7502 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-06-28 21:37:30 +00:00
parent 72986ddc75
commit ea76276469
3 changed files with 66 additions and 1 deletions

View File

@ -84,6 +84,8 @@ type
end;
TsConditionalFormatList = class(TFPObjectList)
private
FWorksheet: TsBasicWorksheet;
protected
function AddRule(ARange: TsCellRange; ARule: TsCFRule): Integer;
public
@ -95,12 +97,16 @@ type
AParam1, AParam2: Variant; ACellFormatIndex: Integer): Integer; overload;
procedure AddColorRangeRule(ARange: TsCellRange);
procedure AddDataBarRule(ARange: TsCellRange);
procedure Delete(AIndex: Integer);
function Find(ARange: TsCellRange): Integer;
end;
implementation
uses
fpSpreadsheet;
procedure TsCFCellRule.Assign(ASource: TsCFRule);
begin
if ASource is TsCFCellRule then
@ -265,6 +271,34 @@ begin
end;
{@@ ----------------------------------------------------------------------------
Deletes the conditional format at the given index from the list.
Iterates also through all cell in the range of the CF and removess the
format index from the cell's ConditionalFormatIndex array.
-------------------------------------------------------------------------------}
procedure TsConditionalFormatList.Delete(AIndex: Integer);
var
CF: TsConditionalFormat;
r, c: Cardinal;
i: Integer;
cell: PCell;
begin
CF := TsConditionalFormat(Items[AIndex]);
for r := CF.CellRange.Row1 to CF.CellRange.Row2 do
for c := CF.CellRange.Col1 to CF.CellRange.Col2 do
begin
cell := TsWorksheet(FWorksheet).FindCell(r, c);
if Assigned(cell) and (Length(cell^.ConditionalFormatIndex) > 0) then begin
for i := AIndex+1 to High(cell^.ConditionalFormatIndex) do
cell^.ConditionalFormatIndex[i-1] := cell^.ConditionalFormatIndex[i];
SetLength(cell^.ConditionalFormatIndex, Length(cell^.ConditionalFormatIndex)-1);
end;
end;
inherited Delete(AIndex);
end;
{@@ ----------------------------------------------------------------------------
The conditional format list must be unique regarding cell ranges.
This function searches all format item whether a given cell ranges is

View File

@ -15,33 +15,61 @@ begin
Result := TsConditionalFormat(FConditionalFormats[AIndex]);
end;
procedure StoreCFIndexInCells(AWorksheet: TsWorksheet; AIndex: Integer;
ARange: TsCellRange);
var
r, c: Cardinal;
n: Integer;
cell: PCell;
begin
for r := ARange.Row1 to ARange.Row2 do
for c := ARange.Col1 to ARange.Col2 do
begin
cell := AWorksheet.GetCell(r, c);
n := Length(cell^.ConditionalFormatIndex);
SetLength(cell^.ConditionalFormatIndex, n+1);
cell^.ConditionalFormatIndex[n] := AIndex;
end;
end;
{@@ ----------------------------------------------------------------------------
Creates a conditional format item for the cells given by ARange.
The condition specified must not require parameters, e.g. cfcEmpty
The condition specified here must not require parameters, e.g. cfcEmpty
The format is primarily stored in the worksheet's ConditionalFormats list,
but the format index is also stored in the cell's ConditionalFormatIndex list.
Returns the index of the conditional format in the workbook's CF list.
-------------------------------------------------------------------------------}
function TsWorksheet.WriteConditionalCellFormat(ARange: TsCellRange;
ACondition: TsCFCondition; ACellFormatIndex: Integer): Integer;
begin
Result := FConditionalFormats.AddCellRule(ARange, ACondition,
ACellFormatIndex);
StoreCFIndexInCells(self, Result, ARange);
end;
{@@ ----------------------------------------------------------------------------
Creates a conditional format item for the cells given by ARange.
The condition specified must require one parameter, e.g. cfcEqual,
and the parameter must be specified as AParam.
The format is primarily stored in the worksheet's ConditionalFormats list,
but the format index is also stored in the cell's ConditionalFormatIndex list.
Returns the index of the conditional format in the workbook's CF list.
-------------------------------------------------------------------------------}
function TsWorksheet.WriteConditionalCellFormat(ARange: TsCellRange;
ACondition: TsCFCondition; AParam: Variant; ACellFormatIndex: Integer): Integer;
begin
Result := FConditionalFormats.AddCellRule(ARange, ACondition,
AParam, ACellFormatIndex);
StoreCFIndexInCells(self, Result, ARange);
end;
{@@ ----------------------------------------------------------------------------
Creates a conditional format item for the cells given by ARange.
The condition specified must requored two parameters, e.g. cfcBetween,
and the parameters must be specified as AParam1 and AParam2.
The format is primarily stored in the worksheet's ConditionalFormats list,
but the format index is also stored in the cell's ConditionalFormatIndex list.
Returns the index of the conditional format in the workbook's CF list.
-------------------------------------------------------------------------------}
function TsWorksheet.WriteConditionalCellFormat(ARange: TsCellRange;
ACondition: TsCFCondition; AParam1, AParam2: Variant;
@ -49,5 +77,6 @@ function TsWorksheet.WriteConditionalCellFormat(ARange: TsCellRange;
begin
Result := FConditionalFormats.AddCellRule(ARange, ACondition,
AParam1, AParam2, ACellFormatIndex);
StoreCFIndexInCells(self, Result, ARange);
end;

View File

@ -750,6 +750,8 @@ type
Flags: TsCellFlags;
{ Index of format record in the workbook's CellFormatList }
FormatIndex: Integer;
{ Indexes to worksheet's ConditionalFormats list needed for conditional formatting }
ConditionalFormatIndex: array of Integer;
{ Cell content }
UTF8StringValue: String; // Strings cannot be part of a variant record
RichTextParams: TsRichTextParams; // Formatting of individual text ranges