diff options
author | Kurt Zenker <kz@openoffice.org> | 2009-06-04 20:36:53 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2009-06-04 20:36:53 +0000 |
commit | adc000a73c3699f4d1d53ba7151eadd2ea5f8940 (patch) | |
tree | 62dafeef94488ac30450e312bdcce36c668a96cc /sc | |
parent | 7470d7bd81ab783f5d46cfc8391a9b8c301d6aff (diff) |
CWS-TOOLING: integrate CWS calclinkfixes
2009-04-27 11:47:56 +0200 nn r271258 : #i101273# Uno broadcasts in DoRecalc/DoHardRecalc
2009-04-24 17:20:19 +0200 nn r271226 : #i101304# don't load source file of external ref for empty cells in the cached data
2009-04-24 14:15:43 +0200 nn r271212 : #i101319# handle merged cells and row groups when loading cached data for external refs
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/brdcst.hxx | 1 | ||||
-rw-r--r-- | sc/inc/externalrefmgr.hxx | 4 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlexternaltabi.cxx | 45 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlexternaltabi.hxx | 24 | ||||
-rw-r--r-- | sc/source/filter/xml/xmltabi.cxx | 6 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh4.cxx | 8 | ||||
-rw-r--r-- | sc/source/ui/docshell/externalrefmgr.cxx | 31 | ||||
-rw-r--r-- | sc/source/ui/unoobj/cellsuno.cxx | 8 | ||||
-rw-r--r-- | sc/source/ui/unoobj/chart2uno.cxx | 10 |
10 files changed, 130 insertions, 9 deletions
diff --git a/sc/inc/brdcst.hxx b/sc/inc/brdcst.hxx index 4079a011d0ed..0d4b9aac9fa7 100644 --- a/sc/inc/brdcst.hxx +++ b/sc/inc/brdcst.hxx @@ -40,6 +40,7 @@ class ScBaseCell; #define SC_HINT_DYING SFX_HINT_DYING #define SC_HINT_DATACHANGED SFX_HINT_DATACHANGED #define SC_HINT_TABLEOPDIRTY SFX_HINT_USER00 +#define SC_HINT_CALCALL SFX_HINT_USER01 class ScHint : public SfxSimpleHint { diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx index b4c63101ec70..07c8a6a6697f 100644 --- a/sc/inc/externalrefmgr.hxx +++ b/sc/inc/externalrefmgr.hxx @@ -173,7 +173,7 @@ public: */ ScExternalRefCache::TokenRef getCellData( sal_uInt16 nFileId, const String& rTabName, SCCOL nCol, SCROW nRow, - bool bEmptyCellOnNull, sal_uInt32* pnFmtIndex = NULL); + bool bEmptyCellOnNull, bool bWriteEmpty, sal_uInt32* pnFmtIndex); /** * Get a cached cell range data. @@ -183,7 +183,7 @@ public: * guaranteed if the TokenArrayRef is properly used.. */ ScExternalRefCache::TokenArrayRef getCellRangeData( - sal_uInt16 nFileId, const String& rTabName, const ScRange& rRange, bool bEmptyCellOnNull); + sal_uInt16 nFileId, const String& rTabName, const ScRange& rRange, bool bEmptyCellOnNull, bool bWriteEmpty); ScExternalRefCache::TokenArrayRef getRangeNameTokens(sal_uInt16 nFileId, const String& rName); void setRangeNameTokens(sal_uInt16 nFileId, const String& rName, TokenArrayRef pArray); diff --git a/sc/source/filter/xml/xmlexternaltabi.cxx b/sc/source/filter/xml/xmlexternaltabi.cxx index 4eefbbc1a917..7eabdff07b9b 100644 --- a/sc/source/filter/xml/xmlexternaltabi.cxx +++ b/sc/source/filter/xml/xmlexternaltabi.cxx @@ -114,6 +114,49 @@ void ScXMLExternalRefTabSourceContext::EndElement() // ============================================================================ +ScXMLExternalRefRowsContext::ScXMLExternalRefRowsContext( + ScXMLImport& rImport, USHORT nPrefix, const OUString& rLName, + const Reference<XAttributeList>& /* xAttrList */, ScXMLExternalTabData& rRefInfo ) : + SvXMLImportContext( rImport, nPrefix, rLName ), + mrScImport(rImport), + mrExternalRefInfo(rRefInfo) +{ +} + +ScXMLExternalRefRowsContext::~ScXMLExternalRefRowsContext() +{ +} + +SvXMLImportContext* ScXMLExternalRefRowsContext::CreateChildContext( + USHORT nPrefix, const OUString& rLocalName, const Reference<XAttributeList>& xAttrList ) +{ + // #i101319# row elements inside group, rows or header-rows + // are treated like row elements directly in the table element + + const SvXMLTokenMap& rTokenMap = mrScImport.GetTableRowsElemTokenMap(); + sal_uInt16 nToken = rTokenMap.Get(nPrefix, rLocalName); + switch (nToken) + { + case XML_TOK_TABLE_ROWS_ROW_GROUP: + case XML_TOK_TABLE_ROWS_HEADER_ROWS: + case XML_TOK_TABLE_ROWS_ROWS: + return new ScXMLExternalRefRowsContext( + mrScImport, nPrefix, rLocalName, xAttrList, mrExternalRefInfo); + case XML_TOK_TABLE_ROWS_ROW: + return new ScXMLExternalRefRowContext( + mrScImport, nPrefix, rLocalName, xAttrList, mrExternalRefInfo); + default: + ; + } + return new SvXMLImportContext(GetImport(), nPrefix, rLocalName); +} + +void ScXMLExternalRefRowsContext::EndElement() +{ +} + +// ============================================================================ + ScXMLExternalRefRowContext::ScXMLExternalRefRowContext( ScXMLImport& rImport, USHORT nPrefix, const OUString& rLName, const Reference<XAttributeList>& xAttrList, ScXMLExternalTabData& rRefInfo ) : @@ -153,7 +196,7 @@ SvXMLImportContext* ScXMLExternalRefRowContext::CreateChildContext( { const SvXMLTokenMap& rTokenMap = mrScImport.GetTableRowElemTokenMap(); sal_uInt16 nToken = rTokenMap.Get(nPrefix, rLocalName); - if (nToken == XML_TOK_TABLE_ROW_CELL) + if (nToken == XML_TOK_TABLE_ROW_CELL || nToken == XML_TOK_TABLE_ROW_COVERED_CELL) return new ScXMLExternalRefCellContext(mrScImport, nPrefix, rLocalName, xAttrList, mrExternalRefInfo); return new SvXMLImportContext(GetImport(), nPrefix, rLocalName); diff --git a/sc/source/filter/xml/xmlexternaltabi.hxx b/sc/source/filter/xml/xmlexternaltabi.hxx index 504be153953d..567df13f1643 100644 --- a/sc/source/filter/xml/xmlexternaltabi.hxx +++ b/sc/source/filter/xml/xmlexternaltabi.hxx @@ -65,6 +65,30 @@ private: // ============================================================================ +class ScXMLExternalRefRowsContext : public SvXMLImportContext +{ +public: + ScXMLExternalRefRowsContext( ScXMLImport& rImport, USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLExternalTabData& rRefInfo ); + + virtual ~ScXMLExternalRefRowsContext(); + + virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLocalName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); + + virtual void EndElement(); +private: + ScXMLImport& mrScImport; + ScXMLExternalTabData& mrExternalRefInfo; +}; + +// ============================================================================ + class ScXMLExternalRefRowContext : public SvXMLImportContext { public: diff --git a/sc/source/filter/xml/xmltabi.cxx b/sc/source/filter/xml/xmltabi.cxx index 451c9b17118d..cc95e01be821 100644 --- a/sc/source/filter/xml/xmltabi.cxx +++ b/sc/source/filter/xml/xmltabi.cxx @@ -235,6 +235,12 @@ SvXMLImportContext *ScXMLTableContext::CreateChildContext( USHORT nPrefix, // external cache data. switch (nToken) { + case XML_TOK_TABLE_ROW_GROUP: + case XML_TOK_TABLE_HEADER_ROWS: + case XML_TOK_TABLE_ROWS: + // #i101319# don't discard rows in groups or header (repeat range) + return new ScXMLExternalRefRowsContext( + GetScImport(), nPrefix, rLName, xAttrList, *pExternalRefInfo); case XML_TOK_TABLE_ROW: return new ScXMLExternalRefRowContext( GetScImport(), nPrefix, rLName, xAttrList, *pExternalRefInfo); diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index af68160ebae8..e360e93bae5d 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -283,6 +283,7 @@ void ScDocShell::BeforeXMLLoading() pModificator = new ScDocShellModificator( *this ); aDocument.SetImportingXML( TRUE ); + aDocument.EnableExecuteLink( false ); // #i101304# to be safe, prevent nested loading from external references aDocument.EnableUndo( FALSE ); // prevent unnecessary broadcasts and "half way listeners" aDocument.SetInsertingFromOtherDoc( TRUE ); @@ -363,6 +364,7 @@ void ScDocShell::AfterXMLLoading(sal_Bool bRet) aDocument.SetInsertingFromOtherDoc( FALSE ); aDocument.SetImportingXML( FALSE ); + aDocument.EnableExecuteLink( true ); aDocument.EnableUndo( TRUE ); bIsEmpty = FALSE; diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx index 036efee976f7..f73389cb866f 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -1267,6 +1267,8 @@ void ScDocShell::DoRecalc( BOOL bApi ) if ( pSh ) pSh->UpdateCharts(TRUE); + aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); + // #47939# Wenn es Charts gibt, dann alles painten, damit nicht // PostDataChanged und die Charts nacheinander kommen und Teile // doppelt gepainted werden. @@ -1292,6 +1294,12 @@ void ScDocShell::DoHardRecalc( BOOL /* bApi */ ) GetDocFunc().DetectiveRefresh(); // erzeugt eigenes Undo if ( pSh ) pSh->UpdateCharts(TRUE); + + // CalcAll doesn't broadcast value changes, so SC_HINT_CALCALL is broadcasted globally + // in addition to SFX_HINT_DATACHANGED. + aDocument.BroadcastUno( SfxSimpleHint( SC_HINT_CALCALL ) ); + aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); + PostPaintGridAll(); } diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index d78aa6fe3d84..637093275bad 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -328,7 +328,7 @@ const String* ScExternalRefCache::getRealRangeName(sal_uInt16 nFileId, const Str ScExternalRefCache::TokenRef ScExternalRefCache::getCellData( sal_uInt16 nFileId, const String& rTabName, SCCOL nCol, SCROW nRow, - bool bEmptyCellOnNull, sal_uInt32* pnFmtIndex) + bool bEmptyCellOnNull, bool bWriteEmpty, sal_uInt32* pnFmtIndex) { DocDataType::const_iterator itrDoc = maDocs.find(nFileId); if (itrDoc == maDocs.end()) @@ -355,12 +355,16 @@ ScExternalRefCache::TokenRef ScExternalRefCache::getCellData( TokenRef pToken = pTableData->getCell(nCol, nRow, pnFmtIndex); if (!pToken && bEmptyCellOnNull) + { pToken.reset(new ScEmptyCellToken(false, false)); + if (bWriteEmpty) + pTableData->setCell(nCol, nRow, pToken); + } return pToken; } ScExternalRefCache::TokenArrayRef ScExternalRefCache::getCellRangeData( - sal_uInt16 nFileId, const String& rTabName, const ScRange& rRange, bool bEmptyCellOnNull) + sal_uInt16 nFileId, const String& rTabName, const ScRange& rRange, bool bEmptyCellOnNull, bool bWriteEmpty) { DocDataType::iterator itrDoc = maDocs.find(nFileId); if (itrDoc == maDocs.end()) @@ -413,7 +417,11 @@ ScExternalRefCache::TokenArrayRef ScExternalRefCache::getCellRangeData( if (!pToken) { if (bEmptyCellOnNull) + { pToken.reset(new ScEmptyCellToken(false, false)); + if (bWriteEmpty) + pTab->setCell(nCol, nRow, pToken); + } else return TokenArrayRef(); } @@ -1504,10 +1512,18 @@ ScExternalRefCache::TokenRef ScExternalRefManager::getSingleRefToken( if (pFmt) pFmt->mbIsSet = false; + bool bLoading = mpDoc->IsImportingXML(); + // Check if the given table name and the cell position is cached. + // #i101304# When loading a file, the saved cache (hidden sheet) + // is assumed to contain all data for the loaded formulas. + // No cache entries are created from empty cells in the saved sheet, + // so they have to be created here (bWriteEmpty parameter). + // Otherwise, later interpretation of the loaded formulas would + // load the source document even if the user didn't want to update. sal_uInt32 nFmtIndex = 0; ScExternalRefCache::TokenRef pToken = maRefCache.getCellData( - nFileId, rTabName, rCell.Col(), rCell.Row(), false, &nFmtIndex); + nFileId, rTabName, rCell.Col(), rCell.Row(), bLoading, bLoading, &nFmtIndex); if (pToken) { if (pFmt) @@ -1531,7 +1547,7 @@ ScExternalRefCache::TokenRef ScExternalRefManager::getSingleRefToken( // once again, but this time treat a non-cached cell as an empty cell // as long as the table itself is cached. pToken = maRefCache.getCellData( - nFileId, rTabName, rCell.Col(), rCell.Row(), true, &nFmtIndex); + nFileId, rTabName, rCell.Col(), rCell.Row(), true, false, &nFmtIndex); return pToken; } @@ -1580,8 +1596,11 @@ ScExternalRefCache::TokenArrayRef ScExternalRefManager::getDoubleRefTokens(sal_u maybeLinkExternalFile(nFileId); + bool bLoading = mpDoc->IsImportingXML(); + // Check if the given table name and the cell position is cached. - ScExternalRefCache::TokenArrayRef p = maRefCache.getCellRangeData(nFileId, rTabName, rRange, false); + // #i101304# When loading, put empty cells into cache, see getSingleRefToken. + ScExternalRefCache::TokenArrayRef p = maRefCache.getCellRangeData(nFileId, rTabName, rRange, bLoading, bLoading); if (p.get()) return p; @@ -1591,7 +1610,7 @@ ScExternalRefCache::TokenArrayRef ScExternalRefManager::getDoubleRefTokens(sal_u // Source document is not reachable. Try to get data from the cache // once again, but this time treat non-cached cells as empty cells as // long as the table itself is cached. - return maRefCache.getCellRangeData(nFileId, rTabName, rRange, true); + return maRefCache.getCellRangeData(nFileId, rTabName, rRange, true, false); } SCTAB nTab1; diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx index 17c10f63319e..c73f56dc55a4 100644 --- a/sc/source/ui/unoobj/cellsuno.cxx +++ b/sc/source/ui/unoobj/cellsuno.cxx @@ -1572,6 +1572,14 @@ void ScCellRangesBase::Notify( SfxBroadcaster&, const SfxHint& rHint ) bGotDataChangedHint = FALSE; } } + else if ( nId == SC_HINT_CALCALL ) + { + // broadcast from DoHardRecalc - set bGotDataChangedHint + // (SFX_HINT_DATACHANGED follows separately) + + if ( aValueListeners.Count() ) + bGotDataChangedHint = TRUE; + } } else if ( rHint.ISA( ScUnoRefUndoHint ) ) { diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index fbdf0706bf78..083dfc3f9374 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -2931,8 +2931,10 @@ void ScChart2DataSequence::BuildDataCache() break; if (pFCell->HasValueData()) + { rItem.mfValue = pFCell->GetValue(); rItem.mbIsValue = true; + } } break; #if DBG_UTIL @@ -3163,6 +3165,14 @@ void ScChart2DataSequence::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint m_bGotDataChangedHint = false; } } + else if ( nId == SC_HINT_CALCALL ) + { + // broadcast from DoHardRecalc - set m_bGotDataChangedHint + // (SFX_HINT_DATACHANGED follows separately) + + if ( m_aValueListeners.Count() ) + m_bGotDataChangedHint = true; + } } else if ( rHint.ISA( ScUpdateRefHint ) ) { |