summaryrefslogtreecommitdiff
path: root/sw/source/uibase/dbui/dbmgr.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/uibase/dbui/dbmgr.cxx')
-rw-r--r--sw/source/uibase/dbui/dbmgr.cxx100
1 files changed, 88 insertions, 12 deletions
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx
index 9171bcd03055..fcb47c6c4b11 100644
--- a/sw/source/uibase/dbui/dbmgr.cxx
+++ b/sw/source/uibase/dbui/dbmgr.cxx
@@ -128,6 +128,10 @@
#include <unomid.h>
#include <section.hxx>
#include <rootfrm.hxx>
+#include <fmtpdsc.hxx>
+#include <ndtxt.hxx>
+#include <calc.hxx>
+#include <dbfld.hxx>
#include <boost/scoped_ptr.hpp>
@@ -442,7 +446,15 @@ bool SwDBManager::MergeNew(const SwMergeDescriptor& rMergeDesc )
break;
}
- EndMerge();
+ DELETEZ( pImpl->pMergeData );
+
+ // Recalculate original section visibility states, as field changes aren't
+ // tracked (not undo-able). Has to be done, after pImpl->pMergeData is
+ // gone, otherwise merge data is used for calculation!
+ rMergeDesc.rSh.SwViewShell::UpdateFlds();
+
+ bInMerge = false;
+
return bRet;
}
@@ -1060,7 +1072,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
pWorkDoc->SetDBManager( this );
pWorkDoc->getIDocumentLinksAdministration().EmbedAllLinks();
- // #i69485# lock fields to prevent access to the result set while calculating layout
+ // #i69458# lock fields to prevent access to the result set while calculating layout
rWorkShell.LockExpFlds();
rWorkShell.CalcLayout();
rWorkShell.UnlockExpFlds();
@@ -1729,15 +1741,6 @@ OUString SwDBManager::GetDBField(uno::Reference<XPropertySet> xColumnProps,
return sRet;
}
-// releases the merge data source table or query after merge is completed
-void SwDBManager::EndMerge()
-{
- OSL_ENSURE(bInMerge, "merge is not active");
- bInMerge = false;
- delete pImpl->pMergeData;
- pImpl->pMergeData = 0;
-}
-
// checks if a desired data source table or query is open
bool SwDBManager::IsDataSourceOpen(const OUString& rDataSource,
const OUString& rTableOrQuery, bool bMergeOnly)
@@ -1849,6 +1852,79 @@ bool SwDBManager::ToNextMergeRecord()
return ToNextRecord(pImpl->pMergeData);
}
+bool SwDBManager::FillCalcWithMergeData( SvNumberFormatter *pDocFormatter,
+ sal_uInt16 nLanguage, bool asString, SwCalc &rCalc )
+{
+ if (!(pImpl->pMergeData && pImpl->pMergeData->xResultSet.is()))
+ return false;
+
+ uno::Reference< XColumnsSupplier > xColsSupp( pImpl->pMergeData->xResultSet, UNO_QUERY );
+ if(xColsSupp.is())
+ {
+ uno::Reference<XNameAccess> xCols = xColsSupp->getColumns();
+ const Sequence<OUString> aColNames = xCols->getElementNames();
+ const OUString* pColNames = aColNames.getConstArray();
+ OUString aString;
+
+ const bool bExistsNextRecord = ExistsNextRecord();
+
+ for( int nCol = 0; nCol < aColNames.getLength(); nCol++ )
+ {
+ const OUString &rColName = pColNames[nCol];
+
+ // empty variables, if no more records;
+ if( !bExistsNextRecord )
+ {
+ rCalc.VarChange( rColName, 0 );
+ continue;
+ }
+
+ double aNumber = DBL_MAX;
+ if( lcl_GetColumnCnt(pImpl->pMergeData, rColName, nLanguage, aString, &aNumber) )
+ {
+ // get the column type
+ sal_Int32 nColumnType;
+ Any aCol = xCols->getByName( pColNames[nCol] );
+ uno::Reference<XPropertySet> xCol;
+ aCol >>= xCol;
+ Any aType = xCol->getPropertyValue( "Type" );
+ aType >>= nColumnType;
+
+ sal_uInt32 nFmt;
+ if( !GetMergeColumnCnt(pColNames[nCol], nLanguage, aString, &aNumber, &nFmt) )
+ continue;
+
+ // aNumber is overwritten by SwDBField::FormatValue, so store initial status
+ bool colIsNumber = aNumber != DBL_MAX;
+ bool bValidValue = SwDBField::FormatValue( pDocFormatter, aString, nFmt,
+ aNumber, nColumnType, NULL );
+ if( colIsNumber )
+ {
+ if( bValidValue )
+ {
+ SwSbxValue aValue;
+ if( !asString )
+ aValue.PutDouble( aNumber );
+ else
+ aValue.PutString( aString );
+ SAL_INFO( "sw.dbmgr", "'" << pColNames[nCol] << "': " << aNumber << " / " << aString );
+ rCalc.VarChange( pColNames[nCol], aValue );
+ }
+ }
+ else
+ {
+ SwSbxValue aValue;
+ aValue.PutString( aString );
+ SAL_INFO( "sw.dbmgr", "'" << pColNames[nCol] << "': " << aString );
+ rCalc.VarChange( pColNames[nCol], aValue );
+ }
+ }
+ }
+ return bExistsNextRecord;
+ }
+ return false;
+}
+
bool SwDBManager::ToNextRecord(
const OUString& rDataSource, const OUString& rCommand, sal_Int32 /*nCommandType*/)
{
@@ -2829,7 +2905,7 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig,
}
}
- // #i69485# lock fields to prevent access to the result set while calculating layout
+ // #i69458# lock fields to prevent access to the result set while calculating layout
rWorkShell.LockExpFlds();
// create a layout
rWorkShell.CalcLayout();