summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/externalrefmgr.hxx4
-rw-r--r--sc/source/core/data/documen8.cxx56
-rw-r--r--sc/source/ui/docshell/externalrefmgr.cxx30
3 files changed, 67 insertions, 23 deletions
diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx
index 1c7fcc1d4adf..bbb3094eae2a 100644
--- a/sc/inc/externalrefmgr.hxx
+++ b/sc/inc/externalrefmgr.hxx
@@ -689,6 +689,8 @@ public:
void insertRefCell(sal_uInt16 nFileId, const ScAddress& rCell);
+ void enableDocTimer( bool bEnable );
+
private:
ScExternalRefManager();
ScExternalRefManager(const ScExternalRefManager&);
@@ -822,6 +824,8 @@ private:
*/
bool mbUserInteractionEnabled:1;
+ bool mbDocTimerEnabled:1;
+
AutoTimer maSrcDocTimer;
DECL_LINK(TimeOutHdl, AutoTimer*);
};
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index 316738ab16cb..4563b02364c3 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -780,6 +780,9 @@ bool ScDocument::IsInLinkUpdate() const
void ScDocument::UpdateExternalRefLinks(Window* pWin)
{
+ if (!pExternalRefMgr.get())
+ return;
+
sfx2::LinkManager* pMgr = GetDocLinkManager().getLinkManager(bAutoCalc);
if (!pMgr)
return;
@@ -788,33 +791,48 @@ void ScDocument::UpdateExternalRefLinks(Window* pWin)
sal_uInt16 nCount = rLinks.size();
bool bAny = false;
+
+ // Collect all the external ref links first.
+ std::vector<ScExternalRefLink*> aRefLinks;
for (sal_uInt16 i = 0; i < nCount; ++i)
{
::sfx2::SvBaseLink* pBase = *rLinks[i];
ScExternalRefLink* pRefLink = dynamic_cast<ScExternalRefLink*>(pBase);
if (pRefLink)
+ aRefLinks.push_back(pRefLink);
+ }
+
+ pExternalRefMgr->enableDocTimer(false);
+ ScProgress aProgress(GetDocumentShell(), "Updating external links", aRefLinks.size());
+ for (size_t i = 0, n = aRefLinks.size(); i < n; ++i)
+ {
+ aProgress.SetState(i);
+
+ ScExternalRefLink* pRefLink = aRefLinks[i];
+ if (pRefLink->Update())
{
- if (pRefLink->Update())
- bAny = true;
- else
- {
- // Update failed. Notify the user.
-
- OUString aFile;
- pMgr->GetDisplayNames(pRefLink, NULL, &aFile, NULL, NULL);
- // Decode encoded URL for display friendliness.
- INetURLObject aUrl(aFile,INetURLObject::WAS_ENCODED);
- aFile = aUrl.GetMainURL(INetURLObject::DECODE_UNAMBIGUOUS);
-
- OUStringBuffer aBuf;
- aBuf.append(OUString(ScResId(SCSTR_EXTDOC_NOT_LOADED)));
- aBuf.appendAscii("\n\n");
- aBuf.append(aFile);
- ErrorBox aBox(pWin, WB_OK, aBuf.makeStringAndClear());
- aBox.Execute();
- }
+ bAny = true;
+ continue;
}
+
+ // Update failed. Notify the user.
+
+ OUString aFile;
+ pMgr->GetDisplayNames(pRefLink, NULL, &aFile, NULL, NULL);
+ // Decode encoded URL for display friendliness.
+ INetURLObject aUrl(aFile,INetURLObject::WAS_ENCODED);
+ aFile = aUrl.GetMainURL(INetURLObject::DECODE_UNAMBIGUOUS);
+
+ OUStringBuffer aBuf;
+ aBuf.append(OUString(ScResId(SCSTR_EXTDOC_NOT_LOADED)));
+ aBuf.appendAscii("\n\n");
+ aBuf.append(aFile);
+ ErrorBox aBox(pWin, WB_OK, aBuf.makeStringAndClear());
+ aBox.Execute();
}
+
+ pExternalRefMgr->enableDocTimer(true);
+
if (bAny)
{
TrackFormulas();
diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx
index 549549a64c42..ded749f222d4 100644
--- a/sc/source/ui/docshell/externalrefmgr.cxx
+++ b/sc/source/ui/docshell/externalrefmgr.cxx
@@ -71,8 +71,8 @@ using ::std::list;
using ::std::unary_function;
using namespace formula;
-#define SRCDOC_LIFE_SPAN 6000 // 1 minute (in 100th of a sec)
-#define SRCDOC_SCAN_INTERVAL 1000*5 // every 5 seconds (in msec)
+#define SRCDOC_LIFE_SPAN 30000 // 5 minutes (in 100th of a sec)
+#define SRCDOC_SCAN_INTERVAL 1000*30 // every 30 seconds (in msec)
namespace {
@@ -1537,7 +1537,8 @@ static ScTokenArray* lcl_fillEmptyMatrix(const ScRange& rRange)
ScExternalRefManager::ScExternalRefManager(ScDocument* pDoc) :
mpDoc(pDoc),
mbInReferenceMarking(false),
- mbUserInteractionEnabled(true)
+ mbUserInteractionEnabled(true),
+ mbDocTimerEnabled(true)
{
maSrcDocTimer.SetTimeoutHdl( LINK(this, ScExternalRefManager, TimeOutHdl) );
maSrcDocTimer.SetTimeout(SRCDOC_SCAN_INTERVAL);
@@ -2009,6 +2010,27 @@ void ScExternalRefManager::insertRefCell(sal_uInt16 nFileId, const ScAddress& rC
itr->second.insert(pCell);
}
+void ScExternalRefManager::enableDocTimer( bool bEnable )
+{
+ if (mbDocTimerEnabled == bEnable)
+ return;
+
+ mbDocTimerEnabled = bEnable;
+ if (mbDocTimerEnabled)
+ {
+ if (!maDocShells.empty())
+ {
+ DocShellMap::iterator it = maDocShells.begin(), itEnd = maDocShells.end();
+ for (; it != itEnd; ++it)
+ it->second.maLastAccess = Time(Time::SYSTEM);
+
+ maSrcDocTimer.Start();
+ }
+ }
+ else
+ maSrcDocTimer.Stop();
+}
+
void ScExternalRefManager::fillCellFormat(sal_uLong nFmtIndex, ScExternalRefCache::CellFormat* pFmt) const
{
if (!pFmt)
@@ -2331,7 +2353,7 @@ SfxObjectShellRef ScExternalRefManager::loadSrcDocument(sal_uInt16 nFileId, OUSt
ScDocument* ScExternalRefManager::cacheNewDocShell( sal_uInt16 nFileId, SrcShell& rSrcShell )
{
- if (maDocShells.empty())
+ if (mbDocTimerEnabled && maDocShells.empty())
// If this is the first source document insertion, start up the timer.
maSrcDocTimer.Start();