Kaydet (Commit) 55654acd authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski

MM: don't try to save the source MM document

Just create in internal copy, if the source document is modified.

Change-Id: I4587b3df5ff0b42c98f1b69fe18b4f11f5c9b8e4
üst 2a6cd03f
...@@ -167,6 +167,13 @@ const sal_Char cActiveConnection[] = "ActiveConnection"; ...@@ -167,6 +167,13 @@ const sal_Char cActiveConnection[] = "ActiveConnection";
enum class SwDBNextRecord { NEXT, FIRST }; enum class SwDBNextRecord { NEXT, FIRST };
static bool lcl_ToNextRecord( SwDSParam* pParam, const SwDBNextRecord action = SwDBNextRecord::NEXT ); static bool lcl_ToNextRecord( SwDSParam* pParam, const SwDBNextRecord action = SwDBNextRecord::NEXT );
enum class WorkingDocType { SOURCE, TARGET, COPY };
static SfxObjectShell* lcl_CreateWorkingDocument(
const WorkingDocType aType, const SwWrtShell &rSourceWrtShell,
const vcl::Window *pSourceWindow,
SwDBManager** const pDBManager,
SwView** const pView, SwWrtShell** const pWrtShell, SwDoc** const pDoc );
static bool lcl_getCountFromResultSet( sal_Int32& rCount, const uno::Reference<sdbc::XResultSet>& xResultSet ) static bool lcl_getCountFromResultSet( sal_Int32& rCount, const uno::Reference<sdbc::XResultSet>& xResultSet )
{ {
uno::Reference<beans::XPropertySet> xPrSet(xResultSet, uno::UNO_QUERY); uno::Reference<beans::XPropertySet> xPrSet(xResultSet, uno::UNO_QUERY);
...@@ -416,6 +423,35 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP ...@@ -416,6 +423,35 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP
{ {
assert( !bInMerge && !pImpl->pMergeData && "merge already activated!" ); assert( !bInMerge && !pImpl->pMergeData && "merge already activated!" );
SfxObjectShellLock xWorkObjSh;
SwWrtShell *pWorkShell = nullptr;
SwDoc *pWorkDoc = nullptr;
SwDBManager *pWorkDocOrigDBManager = nullptr;
switch( rMergeDesc.nMergeType )
{
case DBMGR_MERGE_PRINTER:
case DBMGR_MERGE_EMAIL:
case DBMGR_MERGE_FILE:
case DBMGR_MERGE_SHELL:
{
SwDocShell *pSourceDocSh = rMergeDesc.rSh.GetView().GetDocShell();
if( pSourceDocSh->IsModified() )
{
pWorkDocOrigDBManager = this;
xWorkObjSh = lcl_CreateWorkingDocument(
WorkingDocType::SOURCE, rMergeDesc.rSh, nullptr,
&pWorkDocOrigDBManager, nullptr, &pWorkShell, &pWorkDoc );
}
// fall through
}
default:
if( !xWorkObjSh.Is() )
pWorkShell = &rMergeDesc.rSh;
break;
}
SwDBData aData; SwDBData aData;
aData.nCommandType = sdb::CommandType::TABLE; aData.nCommandType = sdb::CommandType::TABLE;
uno::Reference<sdbc::XResultSet> xResSet; uno::Reference<sdbc::XResultSet> xResSet;
...@@ -477,7 +513,7 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP ...@@ -477,7 +513,7 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP
lcl_InitNumberFormatter(*pImpl->pMergeData, xSource); lcl_InitNumberFormatter(*pImpl->pMergeData, xSource);
rMergeDesc.rSh.ChgDBData(aData); pWorkShell->ChgDBData(aData);
bInMerge = true; bInMerge = true;
if (IsInitDBFields()) if (IsInitDBFields())
...@@ -485,13 +521,13 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP ...@@ -485,13 +521,13 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP
// with database fields without DB-Name, use DB-Name from Doc // with database fields without DB-Name, use DB-Name from Doc
std::vector<OUString> aDBNames; std::vector<OUString> aDBNames;
aDBNames.push_back(OUString()); aDBNames.push_back(OUString());
SwDBData aInsertData = rMergeDesc.rSh.GetDBData(); SwDBData aInsertData = pWorkShell->GetDBData();
OUString sDBName = aInsertData.sDataSource; OUString sDBName = aInsertData.sDataSource;
sDBName += OUString(DB_DELIM); sDBName += OUString(DB_DELIM);
sDBName += aInsertData.sCommand; sDBName += aInsertData.sCommand;
sDBName += OUString(DB_DELIM); sDBName += OUString(DB_DELIM);
sDBName += OUString::number(aInsertData.nCommandType); sDBName += OUString::number(aInsertData.nCommandType);
rMergeDesc.rSh.ChangeDBFields( aDBNames, sDBName); pWorkShell->ChangeDBFields( aDBNames, sDBName);
SetInitDBFields(false); SetInitDBFields(false);
} }
...@@ -499,10 +535,10 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP ...@@ -499,10 +535,10 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP
switch(rMergeDesc.nMergeType) switch(rMergeDesc.nMergeType)
{ {
case DBMGR_MERGE: case DBMGR_MERGE:
rMergeDesc.rSh.StartAllAction(); pWorkShell->StartAllAction();
rMergeDesc.rSh.SwViewShell::UpdateFields( true ); pWorkShell->SwViewShell::UpdateFields( true );
rMergeDesc.rSh.SetModified(); pWorkShell->SetModified();
rMergeDesc.rSh.EndAllAction(); pWorkShell->EndAllAction();
break; break;
case DBMGR_MERGE_PRINTER: case DBMGR_MERGE_PRINTER:
...@@ -510,18 +546,24 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP ...@@ -510,18 +546,24 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc, vcl::Window* pP
case DBMGR_MERGE_FILE: case DBMGR_MERGE_FILE:
case DBMGR_MERGE_SHELL: case DBMGR_MERGE_SHELL:
// save files and send them as e-Mail if required // save files and send them as e-Mail if required
bRet = MergeMailFiles(&rMergeDesc.rSh, rMergeDesc, pParent); bRet = MergeMailFiles(pWorkShell, rMergeDesc, pParent);
break; break;
default: default:
// insert selected entries // insert selected entries
// (was: InsertRecord) // (was: InsertRecord)
ImportFromConnection(&rMergeDesc.rSh); ImportFromConnection(pWorkShell);
break; break;
} }
DELETEZ( pImpl->pMergeData ); DELETEZ( pImpl->pMergeData );
if( xWorkObjSh.Is() )
{
pWorkDoc->SetDBManager( pWorkDocOrigDBManager );
xWorkObjSh->DoClose();
}
bInMerge = false; bInMerge = false;
return bRet; return bRet;
...@@ -904,8 +946,6 @@ static void lcl_PreparePrinterOptions( ...@@ -904,8 +946,6 @@ static void lcl_PreparePrinterOptions(
} }
} }
enum class WorkingDocType { SOURCE, TARGET, COPY };
static SfxObjectShell* lcl_CreateWorkingDocument( static SfxObjectShell* lcl_CreateWorkingDocument(
// input // input
const WorkingDocType aType, const SwWrtShell &rSourceWrtShell, const WorkingDocType aType, const SwWrtShell &rSourceWrtShell,
...@@ -1107,21 +1147,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, ...@@ -1107,21 +1147,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
} }
} }
SwDocShell* pSourceDocSh = pSourceShell->GetView().GetDocShell(); SwDocShell *pSourceDocSh = pSourceShell->GetView().GetDocShell();
uno::Reference<document::XDocumentProperties> xSourceDocProps;
{
uno::Reference<document::XDocumentPropertiesSupplier>
xDPS(pSourceDocSh->GetModel(), uno::UNO_QUERY);
xSourceDocProps.set(xDPS->getDocumentProperties());
assert( xSourceDocProps.is() && "DocumentProperties is null" );
}
// Try saving the source document
SfxDispatcher* pSfxDispatcher = pSourceShell->GetView().GetViewFrame()->GetDispatcher();
if( !bMT_SHELL && pSourceDocSh->IsModified() )
pSfxDispatcher->Execute( pSourceDocSh->HasName() ? SID_SAVEDOC : SID_SAVEASDOC, SfxCallMode::SYNCHRON|SfxCallMode::RECORD);
if( bMT_SHELL || !pSourceDocSh->IsModified() )
{ {
// setup the output format // setup the output format
std::shared_ptr<const SfxFilter> pStoreToFilter = SwIoSystem::GetFileFilter( std::shared_ptr<const SfxFilter> pStoreToFilter = SwIoSystem::GetFileFilter(
...@@ -2819,15 +2846,8 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh, ...@@ -2819,15 +2846,8 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh,
{ {
{ {
{ {
SwWrtShell *pWorkShell;
SwDoc *pWorkDoc;
SwDBManager *pWorkDocOrigDBManager = this;
SfxObjectShellLock xWorkDocSh = lcl_CreateWorkingDocument(
WorkingDocType::SOURCE, rSh, nullptr,
&pWorkDocOrigDBManager, nullptr, &pWorkShell, &pWorkDoc );
// prepare mail merge descriptor // prepare mail merge descriptor
SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), *pWorkShell, aDescriptor ); SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), rSh, aDescriptor );
aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter(); aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter();
aMergeDesc.bCreateSingleFile = pImpl->pMergeDialog->IsSaveSingleDoc(); aMergeDesc.bCreateSingleFile = pImpl->pMergeDialog->IsSaveSingleDoc();
aMergeDesc.sPath = pImpl->pMergeDialog->GetTargetURL(); aMergeDesc.sPath = pImpl->pMergeDialog->GetTargetURL();
...@@ -2837,9 +2857,6 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh, ...@@ -2837,9 +2857,6 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh,
} }
MergeNew( aMergeDesc ); MergeNew( aMergeDesc );
pWorkDoc->SetDBManager( pWorkDocOrigDBManager );
xWorkDocSh->DoClose();
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment