diff options
-rw-r--r-- | sc/inc/externalrefmgr.hxx | 29 | ||||
-rw-r--r-- | sc/source/core/data/documen2.cxx | 24 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 28 | ||||
-rw-r--r-- | sc/source/core/tool/token.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh.cxx | 16 | ||||
-rw-r--r-- | sc/source/ui/docshell/externalrefmgr.cxx | 52 |
6 files changed, 125 insertions, 26 deletions
diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx index e39ac2ed6077..b3a640e9cc78 100644 --- a/sc/inc/externalrefmgr.hxx +++ b/sc/inc/externalrefmgr.hxx @@ -33,9 +33,11 @@ #include "address.hxx" #include "sfx2/objsh.hxx" #include "sfx2/lnkbase.hxx" +#include "sfx2/event.hxx" #include "tools/time.hxx" #include "vcl/timer.hxx" #include "svl/zforlist.hxx" +#include "svl/lstner.hxx" #include "scmatrix.hxx" #include "rangelst.hxx" #include "formula/token.hxx" @@ -46,6 +48,7 @@ #include <vector> #include <list> #include <set> +#include <iostream> #include <formula/ExternalReferenceHelper.hxx> class ScDocument; @@ -353,7 +356,7 @@ private: mutable DocDataType maDocs; }; -class SC_DLLPUBLIC ScExternalRefManager : public formula::ExternalReferenceHelper +class SC_DLLPUBLIC ScExternalRefManager : public formula::ExternalReferenceHelper, SfxListener { public: @@ -426,6 +429,7 @@ public: ::rtl::OUString maRelativeName; ::rtl::OUString maFilterName; ::rtl::OUString maFilterOptions; + bool bUnsaved; void maybeCreateRealFileName(const String& rOwnDocName); }; @@ -673,6 +677,16 @@ public: */ bool isFileLoadable(const ::rtl::OUString& rFile) const; + /** + * If in maUnsavedDocShells move it to maDocShells and create a correct + * external reference entry + * + * @param Pointer to the newly saved DocumentShell + */ + void transformUnsavedRefToSavedRef( SfxObjectShell* pShell ); + + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); + private: ScExternalRefManager(); ScExternalRefManager(const ScExternalRefManager&); @@ -749,6 +763,13 @@ private: sal_uInt32 getMappedNumberFormat(sal_uInt16 nFileId, sal_uInt32 nNumFmt, const ScDocument* pSrcDoc); + /** + * If we still contain unsaved files we should warn the user before saving + * + * @return true if the document still contains references to an unsaved file + */ + bool containsUnsavedReferences() { return !maUnsavedDocShells.empty(); } + private: /** cache of referenced ranges and names from source documents. */ ScExternalRefCache maRefCache; @@ -761,6 +782,12 @@ private: */ DocShellMap maDocShells; + /** + * DocShells to unsaved but referenced documents. If not empty ask before saving! + * Move to maDocShells if document referenced here is saved + */ + DocShellMap maUnsavedDocShells; + /** list of source documents that are managed by the link manager. */ LinkedDocMap maLinkedDocs; diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index 37005ee37298..aa99070d9b77 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -41,6 +41,7 @@ #include <svx/svdobj.hxx> #include <sfx2/bindings.hxx> #include <sfx2/objsh.hxx> +#include <sfx2/docfile.hxx> #include <sfx2/printer.hxx> #include <svl/zforlist.hxx> #include <svl/zformat.hxx> @@ -48,6 +49,7 @@ #include <comphelper/processfactory.hxx> #include <svl/PasswordHelper.hxx> #include <tools/tenccvt.hxx> +#include <tools/urlobj.hxx> #include <rtl/crc.h> #include <basic/basmgr.hxx> @@ -920,8 +922,21 @@ sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos, bool bResultsOnly ) { sal_uLong nRetVal = 1; // 0 => Fehler 1 = ok - // 2 => RefBox, 3 => NameBox + // 3 => NameBox // 4 => beides + + if (pSrcDoc->pShell->GetMedium()) + { + pSrcDoc->maFileURL = pSrcDoc->pShell->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI); + // for unsaved files use the title name and adjust during save of file + if (pSrcDoc->maFileURL.isEmpty()) + pSrcDoc->maFileURL = pSrcDoc->pShell->GetName(); + } + else + { + pSrcDoc->maFileURL = pSrcDoc->pShell->GetName(); + } + bool bValid = true; if (bInsertNew) // neu einfuegen { @@ -1046,15 +1061,8 @@ sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos, maTabs[nDestPos]->UpdateReference(URM_COPY, 0, 0, nDestPos, MAXCOL, MAXROW, nDestPos, 0, 0, nDz, NULL); - // Test for outside absolute references for info box - bool bIsAbsRef = pSrcDoc->maTabs[nSrcPos]->TestTabRefAbs(nSrcPos); // Readjust self-contained absolute references to this sheet maTabs[nDestPos]->TestTabRefAbs(nSrcPos); - if (bIsAbsRef) - { - nRetVal += 1; - // InfoBox AbsoluteRefs sind moeglicherweise nicht mehr korrekt!! - } if (bNamesLost) { nRetVal += 2; diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index d12601fe992e..9796cebde95a 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -1919,9 +1919,6 @@ void ScDocument::CopyToClip(const ScClipParam& rClipParam, // for unsaved files use the title name and adjust during save of file if (pClipDoc->maFileURL.isEmpty()) pClipDoc->maFileURL = pShell->GetName(); - - std::cout << pClipDoc->maFileURL << std::endl; - std::cout << "GetName: " << rtl::OUString(pShell->GetName()) << std::endl; } else { @@ -1991,6 +1988,31 @@ void ScDocument::CopyTabToClip(SCCOL nCol1, SCROW nRow1, { if (!bIsClip) { + if (pShell->GetMedium()) + { + pClipDoc->maFileURL = pShell->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI); + // for unsaved files use the title name and adjust during save of file + if (pClipDoc->maFileURL.isEmpty()) + pClipDoc->maFileURL = pShell->GetName(); + } + else + { + pClipDoc->maFileURL = pShell->GetName(); + } + + //init maTabNames + for (TableContainer::iterator itr = maTabs.begin(); itr != maTabs.end(); ++itr) + { + if( *itr ) + { + rtl::OUString aTabName; + (*itr)->GetName(aTabName); + pClipDoc->maTabNames.push_back(aTabName); + } + else + pClipDoc->maTabNames.push_back(rtl::OUString()); + } + PutInOrder( nCol1, nCol2 ); PutInOrder( nRow1, nRow2 ); if (!pClipDoc) diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 0e5433881458..35d635808cc1 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -1829,6 +1829,8 @@ void GetExternalTableData(const ScDocument* pOldDoc, const ScDocument* pNewDoc, std::cout << aFileName << std::endl; rFileId = pNewDoc->GetExternalRefManager()->getExternalFileId(aFileName); rTabName = pOldDoc->GetCopyTabName(nTab); + if (rTabName.isEmpty()) + pOldDoc->GetName(nTab, rTabName); std::cout << "TabName: " << rTabName << std::endl; } diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 9fa5769ee1ff..26cea1451242 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -926,21 +926,11 @@ void ScDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint ) pSheetSaveData->SetInSupportedSave(true); break; case SFX_EVENT_SAVEDOCDONE: + case SFX_EVENT_SAVEASDOCDONE: { - if ( IsDocShared() && !SC_MOD()->IsInSharedDocSaving() ) - { - } + // new positions are used after "save" and "save as", but not "save to" UseSheetSaveEntries(); // use positions from saved file for next saving - if (pSheetSaveData) - pSheetSaveData->SetInSupportedSave(false); - } - break; - case SFX_EVENT_SAVEASDOCDONE: - // new positions are used after "save" and "save as", but not "save to" - UseSheetSaveEntries(); // use positions from saved file for next saving - if (pSheetSaveData) - pSheetSaveData->SetInSupportedSave(false); - break; + } // fall through case SFX_EVENT_SAVETODOCDONE: // only reset the flag, don't use the new positions if (pSheetSaveData) diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 6d23ab9fbf2b..bec7700e56ee 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -2092,7 +2092,7 @@ const ScDocument* ScExternalRefManager::getInMemorySrcDocument(sal_uInt16 nFileI while (pShell) { SfxMedium* pMedium = pShell->GetMedium(); - if (pMedium) + if (pMedium && pMedium->GetName().Len()) { OUString aName = pMedium->GetName(); // TODO: We should make the case sensitivity platform dependent. @@ -2103,6 +2103,21 @@ const ScDocument* ScExternalRefManager::getInMemorySrcDocument(sal_uInt16 nFileI break; } } + else + { + // handle unsaved documents here + OUString aName = pShell->GetName(); + if (pFileName->equalsIgnoreAsciiCase(aName)) + { + // Found ! + SrcShell aSrcDoc; + aSrcDoc.maShell = pShell; + maUnsavedDocShells.insert(DocShellMap::value_type(nFileId, aSrcDoc)); + StartListening(*pShell); + pSrcDoc = pShell->GetDocument(); + break; + } + } pShell = static_cast<ScDocShell*>(SfxObjectShell::GetNext(*pShell, &aType, false)); } @@ -2644,6 +2659,41 @@ sal_uInt32 ScExternalRefManager::getMappedNumberFormat(sal_uInt16 nFileId, sal_u return nNumFmt; } +void ScExternalRefManager::transformUnsavedRefToSavedRef( SfxObjectShell* pShell ) +{ + for(DocShellMap::iterator itr = maUnsavedDocShells.begin(); + itr != maUnsavedDocShells.end(); ++itr) + { + if (&(itr->second.maShell) == pShell) + { + // found that the shell is marked as unsaved + rtl::OUString aFileURL = pShell->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI); + switchSrcFile(itr->first, aFileURL, rtl::OUString()); + EndListening(*pShell); + } + } +} + +void ScExternalRefManager::Notify( SfxBroadcaster&, const SfxHint& rHint ) +{ + if ( rHint.ISA( SfxEventHint ) ) + { + sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId(); + switch ( nEventId ) + { + case SFX_EVENT_SAVEDOCDONE: + case SFX_EVENT_SAVEASDOCDONE: + { + SfxObjectShell* pObjShell = static_cast<const SfxEventHint&>( rHint ).GetObjShell(); + transformUnsavedRefToSavedRef(pObjShell); + } + break; + default: + break; + } + } +} + IMPL_LINK(ScExternalRefManager, TimeOutHdl, AutoTimer*, pTimer) { if (pTimer == &maSrcDocTimer) |