Fwd: Re: [GSOC] Using cached formula results during ODS import
Daniel Bankston
daniel.dev.libreoffice at gmail.com
Wed Jul 4 09:55:55 PDT 2012
Sorry, I meant to also CC Kohei and mailing list.
>> I having trouble trying to think of a way to prevent ScFormulaCells from
>> being set dirty without my hackish ScDocument libreoffice-generated-doc
>> flag.
>>
>> During the import of the functions.ods unit test file, ScFormulaCells are
>> set dirty at three different times in three different ways.
>>
>> 1) ScMyTables::SetMatrix() uses a call chain down to
>> ScFormulaCell::SetMatColsRows() which sets the ScFormulaCell dirty.
> This one might be legitimate. We need to check if we can also import
> the cached values of matrix formulas.
In my first attempted implementation, I prevented the formula cells from
being set dirty in this case, and the cached values still worked. So I
think I just need to change the way ScMyTables::SetMatrix() works to
avoid setting cells dirty.
>> 2) ScDocument::CompileXML() uses a SetDirty call chain.
>> 3) ScDocShell::AfterXMLLoading() eventually calls ScFormulaCell::Notify
>> which sets the ScFormulaCell to dirty.
> As discussed on IRC we can change these two to follow the design we
> discussed. CompileXML and AfterXMLLoading are only called when we load
> the document and can therefore follow the new concept with the hard
> recalculation at the end. We may need to think a bit about the
> SetDocumentModified behavior and think about good ways to call the
> correct update methods without setting the formula cells dirty but I
> hink this is possible and cleaner than manipulating directly
> ScFormulaCell.
Yes, CompileXML is no problem. Yes, I'll have to do more in-depth
thought about SetDocumentModified behavior.
>> I MAY be able to do something about 1; I'm not sure yet.
>> I can probably stop 2 from setting dirty since it is only used in import.
>> I don't see anyway to change 3 since ScFormulaCell::Notify() is so widely
>> used.
>>
>> Backtraces for 1, 2, and 3 are attached.
>>
>> I know Markus said we are trying to get away from flags like ScDocument's
>> IsImportingXML, but if I slightly modify the order of things in
>> ScDocShell::AfterXMLLoading(), I think I can check if IsImportingXML is set
>> to stop ScFormulaCell::SetDirty() from actually setting the cell dirty.
>> That would solve 1, 2, and 3, and it would prevent me from adding my own
>> ScDocument libreoffice-generated-doc flag.
>>
> We don't even like adding new callers to IsImportingXML if not really
> necessary. We should first check if there is not really a cleaner and
> simpler solution to prevent these calls during import before we add
> such a check deep down in the formula part of calc.
I guess I was too tempted by the quick fix. ;-) I'll think a lot
harder about this and see what I can come up with.
More information about the LibreOffice
mailing list