diff options
Diffstat (limited to 'sw/source/ui/dbui/dbmgr.cxx')
-rw-r--r-- | sw/source/ui/dbui/dbmgr.cxx | 2589 |
1 files changed, 2589 insertions, 0 deletions
diff --git a/sw/source/ui/dbui/dbmgr.cxx b/sw/source/ui/dbui/dbmgr.cxx new file mode 100644 index 0000000000..684d801676 --- /dev/null +++ b/sw/source/ui/dbui/dbmgr.cxx @@ -0,0 +1,2589 @@ +/************************************************************************* + * + * $RCSfile: dbmgr.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#ifdef PRECOMPILED +#include "ui_pch.hxx" +#endif + +#pragma hdrstop + +#if STLPORT_VERSION>=321 +#include <cstdarg> +#endif + +#include <stdio.h> + +#ifndef _UCBHELPER_CONTENT_HXX +#include <ucbhelper/content.hxx> +#endif +#ifndef _COM_SUN_STAR_UCB_XCOMMANDENVIRONMENT_HPP_ +#include <com/sun/star/ucb/XCommandEnvironment.hpp> +#endif +#ifndef _COM_SUN_STAR_UCB_TRANSFERINFO_HPP_ +#include <com/sun/star/ucb/TransferInfo.hpp> +#endif +#ifndef _COM_SUN_STAR_UCB_NAMECLASH_HPP_ +#include <com/sun/star/ucb/NameClash.hpp> +#endif +#ifndef _LSTBOX_HXX //autogen +#include <vcl/lstbox.hxx> +#endif +#ifndef _TOOLS_TEMPFILE_HXX +#include <tools/tempfile.hxx> +#endif +#ifndef SVTOOLS_URIHELPER_HXX +#include <svtools/urihelper.hxx> +#endif +#ifndef _SVSTDARR_HXX +#define _SVSTDARR_STRINGSDTOR +#include <svtools/svstdarr.hxx> +#endif +#ifndef _ZFORLIST_HXX //autogen +#include <svtools/zforlist.hxx> +#endif +#ifndef _ZFORMAT_HXX //autogen +#include <svtools/zformat.hxx> +#endif +#ifndef _SFXSTRITEM_HXX //autogen +#include <svtools/stritem.hxx> +#endif +#ifndef _SFXENUMITEM_HXX //autogen +#include <svtools/eitem.hxx> +#endif +#ifndef _SFX_PRINTER_HXX //autogen +#include <sfx2/printer.hxx> +#endif +#ifndef _SFXDOCFILE_HXX //autogen +#include <sfx2/docfile.hxx> +#endif +#ifndef _SFX_PROGRESS_HXX //autogen +#include <sfx2/progress.hxx> +#endif +#ifndef _SFX_DOCFILT_HACK_HXX //autogen +#include <sfx2/docfilt.hxx> +#endif +#ifndef _SFXDISPATCH_HXX //autogen +#include <sfx2/dispatch.hxx> +#endif +#ifndef _SBAOBJ_HXX //autogen +#include <offmgr/sbaobj.hxx> +#endif +#ifndef _SBA_SBADB_HXX //autogen +#include <offmgr/sbadb.hxx> +#endif +#ifndef _SBAITEMS_HRC +#include <offmgr/sbaitems.hrc> +#endif +#ifndef _SBAITEMS_HXX +#include <offmgr/sbaitems.hxx> +#endif +#ifndef _OFF_APP_HXX //autogen +#include <offmgr/app.hxx> +#endif +#ifndef _SDB_SDBCURS_HXX //autogen +#include <sdb/sdbcurs.hxx> +#endif +#ifndef _MAILENUM_HXX //autogen +#include <goodies/mailenum.hxx> +#endif + +#ifndef _SWTYPES_HXX +#include <swtypes.hxx> +#endif +#ifndef _SWMODULE_HXX +#include <swmodule.hxx> +#endif +#ifndef _VIEW_HXX +#include <view.hxx> +#endif +#ifndef _DOCSH_HXX +#include <docsh.hxx> +#endif +#ifndef _EDTWIN_HXX +#include <edtwin.hxx> +#endif +#ifndef _WRTSH_HXX +#include <wrtsh.hxx> +#endif +#ifndef _FLDBAS_HXX +#include <fldbas.hxx> +#endif +#ifndef _FINDER_HXX +#include <finder.hxx> +#endif +#ifndef _INITUI_HXX +#include <initui.hxx> +#endif +#ifndef _SWUNDO_HXX +#include <swundo.hxx> +#endif +#ifndef _FLDDAT_HXX +#include <flddat.hxx> +#endif +#ifndef _SWMODULE_HXX +#include <swmodule.hxx> +#endif +#ifndef _MODCFG_HXX +#include <modcfg.hxx> +#endif +#ifndef _SWPRTOPT_HXX +#include <swprtopt.hxx> +#endif +#ifndef _SHELLIO_HXX +#include <shellio.hxx> +#endif +#ifndef _DBUI_HXX +#include <dbui.hxx> +#endif +#ifndef _DBMGR_HXX +#include <dbmgr.hxx> +#endif +#ifndef _DOC_HXX +#include <doc.hxx> +#endif +#ifndef _SWWAIT_HXX +#include <swwait.hxx> +#endif + +#ifndef _DBUI_HRC +#include <dbui.hrc> +#endif +#ifndef _GLOBALS_HRC +#include <globals.hrc> +#endif +#ifndef _STATSTR_HRC +#include <statstr.hrc> +#endif + +#ifdef REPLACE_OFADBMGR +#ifndef _SFXREQUEST_HXX +#include <sfx2/request.hxx> +#endif +#ifndef _HINTIDS_HXX +#include <hintids.hxx> +#endif +#ifndef _UTL_DB_CONVERSION_HXX_ +#include <unotools/dbconversion.hxx> +#endif +#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#endif +#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_ +#include <com/sun/star/container/XNameAccess.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_ +#include <com/sun/star/sdbc/XDataSource.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_ +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_ +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#endif +#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_ +#include <com/sun/star/sdb/XQueriesSupplier.hpp> +#endif +#ifndef _COM_SUN_STAR_SDB_XCOLUMN_HPP_ +#include <com/sun/star/sdb/XColumn.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_ +#include <com/sun/star/sdbc/DataType.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_XSTATEMENT_HPP_ +#include <com/sun/star/sdbc/XStatement.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_RESULTSETTYPE_HPP_ +#include <com/sun/star/sdbc/ResultSetType.hpp> +#endif +//#ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_ +//#include <com/sun/star/sdb/XDatabaseAccess.hpp> +//#endif +#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ +#include <com/sun/star/beans/XPropertySet.hpp> +#endif +#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_ +#include <unotools/processfactory.hxx> +#endif +#ifndef _ISOLANG_HXX +#include <tools/isolang.hxx> +#endif +#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_ +#include <com/sun/star/util/XNumberFormatTypes.hpp> +#endif +#ifndef _UTL_UNO3_DB_TOOLS_HXX_ +#include <unotools/dbtools.hxx> +#endif +#ifndef _SVX_LANGITEM_HXX +#include <svx/langitem.hxx> +#endif +#ifndef _SVX_UNOMID_HXX +#include <svx/unomid.hxx> +#endif +#ifndef _NUMUNO_HXX +#include <svtools/numuno.hxx> +#endif +#else + +#endif //REPLACE_OFADBMGR + +#ifdef REPLACE_OFADBMGR +using namespace rtl; +using namespace com::sun::star::container; +using namespace com::sun::star::lang; +using namespace com::sun::star::sdb; +using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdbcx; +using namespace com::sun::star::beans; +using namespace com::sun::star::util; +#define C2S(cChar) String::CreateFromAscii(cChar) +#endif + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::ucb; + +#define C2U(char) rtl::OUString::createFromAscii(char) + +#define DB_SEP_SPACE 0 +#define DB_SEP_TAB 1 +#define DB_SEP_RETURN 2 +#define DB_SEP_NEWLINE 3 + +#ifdef REPLACE_OFADBMGR +SV_IMPL_PTRARR(SwDSParamArr, SwDSParamPtr); + +/* -----------------------------17.07.00 17:04-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL lcl_MoveAbsolute(SwDSParam* pParam, long nAbsPos) +{ + BOOL bRet = FALSE; + try + { + if(pParam->bScrollable) + { + bRet = pParam->xResultSet->absolute( nAbsPos ); + } + else + { + pParam->nSelectionIndex = 0; + pParam->xResultSet = pParam->xStatement->executeQuery( pParam->sStatement ); + bRet = TRUE; + while(nAbsPos >= 0 && bRet) + { + bRet &= !pParam->xResultSet->next(); + pParam->nSelectionIndex++; + nAbsPos--; + } + bRet &= nAbsPos != -1; + } + } + catch(Exception aExcept) + { + DBG_ERROR("exception caught") + } + return bRet; +} +/* -----------------------------17.07.00 17:23-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL lcl_GetColumnCnt(SwDSParam* pParam, + const String& rColumnName, long nLanguage, String& rResult, double* pNumber) +{ + Reference< XColumnsSupplier > xColsSupp( pParam->xResultSet, UNO_QUERY ); + Reference <XNameAccess> xCols = xColsSupp->getColumns(); + if(!xCols->hasByName(rColumnName)) + return FALSE; + Any aCol = xCols->getByName(rColumnName); + Reference< XPropertySet > xColumnProps; + if(aCol.hasValue()) + xColumnProps = *(Reference< XPropertySet >*)aCol.getValue(); + + SwDBFormatData aFormatData; + aFormatData.aNullDate = pParam->aNullDate; + aFormatData.xFormatter = pParam->xFormatter; + + String sLanguage, sCountry; + ::ConvertLanguageToIsoNames( nLanguage, sLanguage, sCountry ); + aFormatData.aLocale.Language = sLanguage; + aFormatData.aLocale.Country = sCountry; + + DBG_ERROR("pFormat unset!") + rResult = SwNewDBMgr::GetDBField( xColumnProps, aFormatData, pNumber); + return TRUE; +}; +#endif +/*-------------------------------------------------------------------- + Beschreibung: Daten importieren + --------------------------------------------------------------------*/ + +BOOL SwNewDBMgr::Merge( USHORT nOpt, SwWrtShell* pSh, + const String& rStatement, + const SbaSelectionListRef xSelectionList, +#ifdef REPLACE_OFADBMGR + const String& rDataSource, + const String& rTableOrQuery, +#else + const String& rDBName, +#endif + const String *pPrinter) +{ +#ifdef REPLACE_OFADBMGR + ChgDBName(pSh, rDataSource, rTableOrQuery,rStatement); +#else + ChgDBName(pSh, rDBName, rStatement); +#endif + // Falls noch nicht offen, spaetestens hier + +#ifdef REPLACE_OFADBMGR + if(!OpenMergeSource(rDataSource, rTableOrQuery, rStatement, xSelectionList)) + return FALSE; +#else + if(!OpenDB(FALSE, pSh->GetDBDesc())) + return FALSE; +#endif + + if (IsInitDBFields()) + { + // Bei Datenbankfeldern ohne DB-Name DB-Name von Dok einsetzen + SvStringsDtor aDBNames(1, 1); + aDBNames.Insert( new String(), 0); + pSh->ChangeDBFields( aDBNames, pSh->GetDBName()); + SetInitDBFields(FALSE); + } +#ifdef REPLACE_OFADBMGR + const SbaSelectionList* pSelList = 0; + if( xSelectionList.Is() && (long)xSelectionList->GetObject(0) != -1L ) + { + if( xSelectionList->Count() ) + pSelList = &xSelectionList; + } +#else + OfaDBParam& rParam = GetDBData(FALSE); + ChangeStatement(FALSE, rStatement); + const SbaSelectionList* pSelList = 0; + rParam.pSelectionList->Clear(); + if( xSelectionList.Is() && (long)xSelectionList->GetObject(0) != -1L ) + { + *rParam.pSelectionList = *xSelectionList; + if( xSelectionList->Count() ) + pSelList = &xSelectionList; + } +#endif + + BOOL bRet = TRUE; + switch(nOpt) + { + case DBMGR_MERGE: + bRet = Merge(pSh); // Mischen + break; + + case DBMGR_MERGE_MAILMERGE: // Serienbrief + { + SfxDispatcher *pDis = pSh->GetView().GetViewFrame()->GetDispatcher(); + if (pPrinter) // Aufruf kommt aus dem Basic + { + SfxBoolItem aSilent( SID_SILENT, TRUE ); + if (pPrinter) + { + SfxStringItem aPrinterName(SID_PRINTER_NAME, *pPrinter); + pDis->Execute( SID_PRINTDOC, SFX_CALLMODE_SYNCHRON, + &aPrinterName, &aSilent, 0L ); + } + else + { + pDis->Execute( SID_PRINTDOC, SFX_CALLMODE_SYNCHRON, + &aSilent, 0L ); + } + } + else + pDis->Execute(SID_PRINTDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD); + } + break; + + case DBMGR_MERGE_MAILING: + bRet = MergeMailing(pSh); // Mailing + break; + + case DBMGR_MERGE_MAILFILES: + bRet = MergeMailFiles(pSh); // Serienbriefe als Dateien abspeichern + break; + + default: // Einfuegen der selektierten Eintraege + // (war: InsertRecord) +#ifdef REPLACE_OFADBMGR + ImportFromConnection(pSh ); +#else + ImportFromConnection(pSh, pSelList ); +#endif + break; + } + +#ifdef REPLACE_OFADBMGR + EndMerge(); +#else + CloseAll(); +#endif + return bRet; +} +/*-------------------------------------------------------------------- + Beschreibung: Daten importieren + --------------------------------------------------------------------*/ + + +BOOL SwNewDBMgr::Merge(SwWrtShell* pSh) +{ + pSh->StartAllAction(); +#ifdef REPLACE_OFADBMGR +#else + bInMerge = TRUE; + + // 1. Satz positionieren, Evaluierung ueber die Felder + for (USHORT i = 0; i < aDBDataArr.Count(); i++) + { + OfaDBParam* pParam = aDBDataArr[i]; + + // Alle Im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren + if (OpenDB(FALSE, pParam->GetDBName())) + { + if (pParam->GetCursor()) + Flush(FALSE); // Cursor initialisieren + ToFirstSelectedRecord(FALSE); + } + } +#endif + +/* for (ULONG i = 0 ; i < GetDBData().pSelectionList->Count(); i++) + { + ULONG nIndex = (ULONG)GetDBData().pSelectionList->GetObject(i); + DBG_TRACE(String(nIndex)); + }*/ + + pSh->ViewShell::UpdateFlds(TRUE); + pSh->SetModified(); + +#ifdef REPLACE_OFADBMGR +#else + bInMerge = FALSE; +#endif + + pSh->EndAllAction(); + + return TRUE; +} + +/*-------------------------------------------------------------------- + Beschreibung: Daten importieren + --------------------------------------------------------------------*/ + + +/*void SwNewDBMgr::UpdateImport( const BOOL bBasic, SwWrtShell* pSh, + const String& rDBName, + const String& rStatement, + const SbaSelectionListRef xSelectionList ) +{ + ChgDBName(pSh, rDBName, rStatement); + + if( OpenDB( bBasic, pSh->GetDBDesc()) ) + { + OfaDBParam& rParam = GetDBData(bBasic); + + ChangeStatement(bBasic, rStatement); + + const SbaSelectionList* pSelList = 0; + rParam.pSelectionList->Clear(); + if( xSelectionList.Is() && -1L != (long)xSelectionList->GetObject(0) ) + { + *rParam.pSelectionList = *xSelectionList; + if( xSelectionList->Count() ) + pSelList = &xSelectionList; + } + + ImportFromConnection( bBasic, pSh, pSelList ); + } +} */ + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +#ifdef REPLACE_OFADBMGR +void SwNewDBMgr::ImportFromConnection( SwWrtShell* pSh ) +#else +void SwNewDBMgr::ImportFromConnection( SwWrtShell* pSh, + const SbaSelectionList* pSelList ) +#endif +{ +#ifdef REPLACE_OFADBMGR + if(pMergeData && !pMergeData->bEndOfDB) +#else + OfaDBParam& rParam = GetDBData(FALSE); + ASSERT(rParam.GetCursor(), "Cursor"); + + if( ToFirstSelectedRecord( FALSE ) && IsSuccessful( FALSE ) ) +#endif + { +#ifdef REPLACE_OFADBMGR +#else + // Spaltenkoepfe + SbaDBDataDefRef aDBDef = OpenColumnNames(FALSE); + if( aDBDef.Is() ) +#endif + { + pSh->StartAllAction(); + pSh->StartUndo(0); + BOOL bGroupUndo(pSh->DoesGroupUndo()); + pSh->DoGroupUndo(FALSE); + + if( pSh->HasSelection() ) + pSh->DelRight(); + + SwWait *pWait = 0; + +#ifdef REPLACE_OFADBMGR +#else + if( pSelList ) + { + for( ULONG i = 0; i < pSelList->Count(); ++i ) + { + + ULONG nIndex = (ULONG)pSelList->GetObject( i ); + + ASSERT(nIndex >= rParam.CurrentPos(), + "Zu lesender Datensatz < vorhergehender Datensatz!"); + + // N„chsten zu lesenden Datensatz ansteuern + GotoRecord( nIndex ); + ImportDBEntry(&aDBDef, pSh); + + if( i == 10 ) + pWait = new SwWait( *pSh->GetView().GetDocShell(), TRUE ); + } + } + else +#endif + { + ULONG i = 0; + do { + +#ifdef REPLACE_OFADBMGR + ImportDBEntry(pSh); +#else + ImportDBEntry(&aDBDef, pSh); + rParam.GetCursor()->Next(); + rParam.CurrentPos()++; +#endif + if( 10 == ++i ) + pWait = new SwWait( *pSh->GetView().GetDocShell(), TRUE); + +#ifdef REPLACE_OFADBMGR + } while(ToNextMergeRecord()); +#else + } while( !rParam.GetCursor()->IsOffRange() ); +#endif + } + + pSh->DoGroupUndo(bGroupUndo); + pSh->EndUndo(0); + pSh->EndAllAction(); + delete pWait; + } + } +#ifdef REPLACE_OFADBMGR +#else + CloseAll(); +#endif +} + + +/*-----------------24.02.97 10.30------------------- + +--------------------------------------------------*/ + +String lcl_FindColumn(const String& sFormatStr,USHORT &nUsedPos, BYTE &nSeparator) +{ + String sReturn; + USHORT nLen = sFormatStr.Len(); + nSeparator = 0xff; + while(nUsedPos < nLen && nSeparator == 0xff) + { + sal_Unicode cAkt = sFormatStr.GetChar(nUsedPos); + switch(cAkt) + { + case ',': + nSeparator = DB_SEP_SPACE; + break; + case ';': + nSeparator = DB_SEP_RETURN; + break; + case ':': + nSeparator = DB_SEP_TAB; + break; + case '#': + nSeparator = DB_SEP_NEWLINE; + break; + default: + sReturn += cAkt; + } + nUsedPos++; + + } + return sReturn; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +#ifdef REPLACE_OFADBMGR +void SwNewDBMgr::ImportDBEntry(SwWrtShell* pSh) +#else +void SwNewDBMgr::ImportDBEntry(SbaDBDataDef* pDef, SwWrtShell* pSh) +#endif +{ +#ifdef REPLACE_OFADBMGR + if(pMergeData && !pMergeData->bEndOfDB) +#else + OfaDBParam& rParam = GetDBData(FALSE); + if( !rParam.GetCursor()->IsOffRange() ) +#endif + { +#ifdef REPLACE_OFADBMGR + Reference< XColumnsSupplier > xColsSupp( pMergeData->xResultSet, UNO_QUERY ); + Reference <XNameAccess> xCols = xColsSupp->getColumns(); + String sSymDBName(pMergeData->sDataSource); + sSymDBName += DB_DELIM; + sSymDBName += pMergeData->sTableOrQuery; + String sFormatStr = pPathFinder->GetDBInsertMode(sSymDBName); +#else + const ODbRowRef& xRow = rParam.GetCursor()->GetRow(); + ULONG nCount = (UINT16)xRow->size(); + String sFormatStr = pPathFinder->GetDBInsertMode(rParam.GetSymDBName()); +#endif + USHORT nFmtLen = sFormatStr.Len(); + if( nFmtLen ) + { + const char cSpace = ' '; + const char cTab = '\t'; + USHORT nUsedPos = 0; + BYTE nSeparator; + String sColumn = lcl_FindColumn(sFormatStr, nUsedPos, nSeparator); + while( sColumn.Len() ) + { +#ifdef REPLACE_OFADBMGR + if(!xCols->hasByName(sColumn)) + return; + Any aCol = xCols->getByName(sColumn); + Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();; + if(xColumnProp.is()) + { + SwDBFormatData aDBFormat; + String sInsert = GetDBField( xColumnProp, aDBFormat); +#else + int nColumn = GetColumnPos(DBMGR_STD, sColumn); + if(nColumn > 0) + { + String sInsert = ImportDBField(nColumn, pDef, xRow); +#endif + if( DB_SEP_SPACE == nSeparator ) + sInsert += cSpace; + else if( DB_SEP_TAB == nSeparator) + sInsert += cTab; + pSh->Insert(sInsert); + if( DB_SEP_RETURN == nSeparator) + pSh->SplitNode(); + else if(DB_SEP_NEWLINE == nSeparator) + pSh->InsertLineBreak(); + } + else + { + // Spalte nicht gefunden -> Fehler anzeigen + String sInsert = '?'; + sInsert += sColumn; + sInsert += '?'; + pSh->Insert(sInsert); + } + sColumn = lcl_FindColumn(sFormatStr, nUsedPos, nSeparator); + } + pSh->SplitNode(); + } + else + { + String sStr; +#ifdef REPLACE_OFADBMGR + Sequence<OUString> aColNames = xCols->getElementNames(); + const OUString* pColNames = aColNames.getConstArray(); + long nLength = aColNames.getLength(); + for(long i = 0; i < nLength; i++) + { + Any aCol = xCols->getByName(pColNames[i]); + Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();; + SwDBFormatData aDBFormat; + sStr += GetDBField( xColumnProp, aDBFormat); + if (i < nLength - 1) + sStr += '\t'; + } +#else + for (ULONG i = 1; i < nCount; i++) // 0 = Bookmark + { + sStr += ImportDBField(i, pDef, xRow); + if (i < nCount - 1) + sStr += '\t'; + } +#endif + pSh->SwEditShell::Insert(sStr); + pSh->SwFEShell::SplitNode(); // Zeilenvorschub + } + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + + +void SwNewDBMgr::ChgDBName(SwWrtShell* pSh, +#ifdef REPLACE_OFADBMGR + const String& rDataSource, + const String& rTableOrQuery, +#else + const String& rDBName, +#endif + const String& rStatement) +{ + if (pSh) + { +#ifdef REPLACE_OFADBMGR + String sNewDBName(rDataSource); + sNewDBName += DB_DELIM; + sNewDBName += rTableOrQuery; +#else + String sNewDBName(ExtractDBName(rDBName)); +#endif + sNewDBName += ';'; + sNewDBName += rStatement; + pSh->ChgDBName(sNewDBName); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: Listbox mit Tabellenliste fuellen + --------------------------------------------------------------------*/ +#ifdef REPLACE_OFADBMGR +BOOL SwNewDBMgr::GetTableNames(ListBox* pListBox, const String& rDBName) +#else +BOOL SwNewDBMgr::GetTableNames(ListBox* pListBox, String sDBName) +#endif +{ + BOOL bRet = FALSE; + String sOldTableName(pListBox->GetSelectEntry()); + pListBox->Clear(); +#ifdef REPLACE_OFADBMGR + Reference< XDataSource> xSource; + Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource); + if(xConnection.is()) + { + Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY); + if(xTSupplier.is()) + { + Reference<XNameAccess> xTbls = xTSupplier->getTables(); + Sequence<OUString> aTbls = xTbls->getElementNames(); + const OUString* pTbls = aTbls.getConstArray(); + for(long i = 0; i < aTbls.getLength(); i++) + pListBox->InsertEntry(pTbls[i]); + } + Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY); + if(xQSupplier.is()) + { + Reference<XNameAccess> xQueries = xQSupplier->getQueries(); + Sequence<OUString> aQueries = xQueries->getElementNames(); + const OUString* pQueries = aQueries.getConstArray(); + for(long i = 0; i < aQueries.getLength(); i++) + pListBox->InsertEntry(pQueries[i]); + } + if (sOldTableName.Len()) + pListBox->SelectEntry(sOldTableName); + bRet = TRUE; + } +#else + + sDBName = OFF_APP()->LocalizeDBName(NATIONAL2INI, sDBName); + if (sDBName.Len()) + { + SbaDatabaseRef pConnection = pSbaObject->GetDatabase(sDBName, TRUE); + + if (pConnection) + { + String sTableName; + + USHORT nCount = pConnection->GetObjectCount(dbTable); + + for (USHORT i = 0; i < nCount; i++) + { + sTableName = pConnection->GetObjectName(dbTable, i); + pListBox->InsertEntry(sTableName); + } + + nCount = pConnection->GetObjectCount(dbQuery); + + for (i = 0; i < nCount; i++) + { + sTableName = pConnection->GetObjectName(dbQuery, i); + pListBox->InsertEntry(sTableName); + } + + if (sOldTableName.Len()) + pListBox->SelectEntry(sOldTableName); + if (!pListBox->GetSelectEntryCount()) + pListBox->SelectEntryPos(0); + bRet = TRUE; + } + } +#endif + return bRet; +} + +/*-------------------------------------------------------------------- + Beschreibung: Listbox mit Spaltennamen einer Datenbank fuellen + --------------------------------------------------------------------*/ +#ifdef REPLACE_OFADBMGR +BOOL SwNewDBMgr::GetColumnNames(ListBox* pListBox, + const String& rDBName, const String& rTableName, BOOL bAppend) +#else +BOOL SwNewDBMgr::GetColumnNames(ListBox* pListBox, String sDBName, BOOL bAppend) +#endif +{ + if (!bAppend) + pListBox->Clear(); +#ifdef REPLACE_OFADBMGR + Reference< XDataSource> xSource; + Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource); + Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName); + if(xColsSupp.is()) + { + Reference <XNameAccess> xCols = xColsSupp->getColumns(); + const Sequence<OUString> aColNames = xCols->getElementNames(); + const OUString* pColNames = aColNames.getConstArray(); + for(int nCol = 0; nCol < aColNames.getLength(); nCol++) + { + pListBox->InsertEntry(pColNames[nCol]); + } + } +#else + if (!sDBName.Len() || (!IsDBOpen(DBMGR_STD, sDBName) && !OpenDB(DBMGR_STD, sDBName, TRUE))) + return(FALSE); + + SbaDBDataDefRef aDBDef = OpenColumnNames(DBMGR_STD); + + if (aDBDef.Is()) + { + const SbaColumnList& rCols = aDBDef->GetOriginalColumns(); + + for (USHORT i = 1; i <= rCols.Count(); i++) + { + const SbaNameItem* pNameItem = (const SbaNameItem*)&rCols.GetObject(i-1)->Get(SBA_DEF_FLTNAME); + pListBox->InsertEntry(pNameItem->GetValue()); + } + + pListBox->SelectEntryPos(0); + } +#endif + return(TRUE); +} + +/*-------------------------------------------------------------------- + Beschreibung: CTOR + --------------------------------------------------------------------*/ + +SwNewDBMgr::SwNewDBMgr() : +#ifdef REPLACE_OFADBMGR + pMergeData(0), + bInMerge(FALSE), +#else + OfaDBMgr(), +#endif + nMergeType(DBMGR_INSERT), + bInitDBFields(FALSE) +{ + pMergeList = new SbaSelectionList; +} +/* -----------------------------18.07.00 08:56-------------------------------- + + ---------------------------------------------------------------------------*/ +#ifdef REPLACE_OFADBMGR +SwNewDBMgr::~SwNewDBMgr() +{ +} +#endif +/*-------------------------------------------------------------------- + Beschreibung: Serienbrief drucken + --------------------------------------------------------------------*/ + + +BOOL SwNewDBMgr::MergePrint( SwView& rView, + SwPrtOptions& rOpt, SfxProgress& rProgress ) +{ + SwWrtShell* pSh = &rView.GetWrtShell(); + //check if the doc is synchronized and contains at least one linked section + BOOL bSynchronizedDoc = pSh->IsLabelDoc() && pSh->GetSectionFmtCount() > 1; +#ifdef REPLACE_OFADBMGR + //merge source is already open + rOpt.nMergeCnt = pMergeData && pMergeData->xSelectionList.Is() ? + pMergeData->xSelectionList->Count() : 0; +#else + OfaDBParam& rParam = GetDBData(FALSE); + + // 1. Satz positionieren, Evaluierung ueber die Felder + for (USHORT i = 0; i < aDBDataArr.Count(); i++) + { + OfaDBParam* pParam = aDBDataArr[i]; + + // Alle Im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren + if (OpenDB(FALSE, pParam->GetDBName())) + { + if (pParam->GetCursor()) + Flush(FALSE); // Cursor initialisieren + ToFirstSelectedRecord(FALSE); + } + } + + OpenDB(FALSE, rParam.GetDBName()); + if (!ToFirstSelectedRecord(FALSE)) + return(FALSE); + ODbRowRef xRow = GetCurSelectedRecord(FALSE); + // keine Arme keine Kekse + if(!xRow.is()) + return FALSE; + + bInMerge = TRUE; + + rOpt.nMergeCnt = GetDBData(FALSE).pSelectionList.Is() + ? GetDBData(FALSE).pSelectionList->Count() + : 0; + rOpt.nMergeAct = 0; + + Flush(FALSE); // Cursor initialisieren +#endif + +// if (IsPrintFromBasicDB()) +// rOpt.bSinglePrtJobs = IsSingleJobs(); +// else +// { + SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig(); + rOpt.bSinglePrtJobs = pModOpt->IsSinglePrintJob(); +// } + + SfxPrinter *pPrt = pSh->GetPrt(); + Link aSfxSaveLnk = pPrt->GetEndPrintHdl(); + if( rOpt.bSinglePrtJobs ) + pPrt->SetEndPrintHdl( Link() ); + + BOOL bNewJob = FALSE, + bUserBreak = FALSE, + bRet = FALSE; + + do { +#ifdef REPLACE_OFADBMGR + +#else + xRow = GetCurSelectedRecord(FALSE); // Naechste Selektion holen + ULONG nOldRec = GetCurRecordId(FALSE); // Alte Position merken + if(xRow.Is()) +#endif + { + pSh->ViewShell::UpdateFlds(); + ++rOpt.nMergeAct; + rView.SfxViewShell::Print( rProgress ); // ggf Basic-Macro ausfuehren + + if( rOpt.bSinglePrtJobs && bRet ) + { + //rOpt.bJobStartet = FALSE; + bRet = FALSE; + } + + if( pSh->Prt( rOpt, rProgress ) ) + bRet = TRUE; + + if( !pPrt->IsJobActive() ) + { + bUserBreak = TRUE; + bRet = FALSE; + break; + } + if( !rOpt.bSinglePrtJobs ) + { + String& rJNm = (String&)rOpt.GetJobName(); + rJNm.Erase(); + } + } +#ifdef REPLACE_OFADBMGR + } while( bSynchronizedDoc ? ExistsNextRecord() : ToNextMergeRecord()); +#else + // Kontext fuer ToNextSelectedRecord auf richtige Datenbank stellen: + GetDBData(FALSE, &rParam.GetDBName()); + // Endlosschleifen durch "Erster Datensatz" verhindern: + if (GetCurRecordId(FALSE) < nOldRec) + ToSelectedRecord(FALSE, nOldRec); // Alte Position restaurieren + } while( xRow.is() && GotoNextSelectedRecord( bSynchronizedDoc) ); +#endif + + if( rOpt.bSinglePrtJobs ) + { + pSh->GetPrt()->SetEndPrintHdl( aSfxSaveLnk ); + if ( !bUserBreak && !pSh->GetPrt()->IsJobActive() ) //Schon zu spaet? + aSfxSaveLnk.Call( pSh->GetPrt() ); + } + + rOpt.nMergeCnt = 0; + rOpt.nMergeAct = 0; + + bInMerge = FALSE; + + nMergeType = DBMGR_INSERT; + + SwDocShell* pDocSh = rView.GetDocShell(); + SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(pDocSh); + + while (pTmpFrm) // Alle Views Invalidieren + { + SwView *pVw = PTR_CAST(SwView, pTmpFrm->GetViewShell()); + if (pVw) + pVw->GetEditWin().Invalidate(); + pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, pDocSh); + } + +#ifdef REPLACE_OFADBMGR +#else + CloseAll(); +#endif + return bRet; +} + +/*-------------------------------------------------------------------- + Beschreibung: Serienbrief als Mail versenden + --------------------------------------------------------------------*/ + + +BOOL SwNewDBMgr::MergeMailing(SwWrtShell* pSh) +{ + //check if the doc is synchronized and contains at least one linked section + BOOL bSynchronizedDoc = pSh->IsLabelDoc() && pSh->GetSectionFmtCount() > 1; +#ifdef REPLACE_OFADBMGR +#else + + OfaDBParam& rParam = GetDBData(FALSE); + + // 1. Satz positionieren, Evaluierung ueber die Felder + for (USHORT i = 0; i < aDBDataArr.Count(); i++) + { + OfaDBParam* pParam = aDBDataArr[i]; + + // Alle Im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren + if (OpenDB(FALSE, pParam->GetDBName())) + { + if (pParam->GetCursor()) + Flush(FALSE); // Cursor initialisieren + ToFirstSelectedRecord(FALSE); + } + } + + OpenDB(FALSE, rParam.GetDBName()); + if (!ToFirstSelectedRecord(FALSE)) + return(FALSE); + + ODbRowRef xRow = GetCurSelectedRecord(FALSE); +#endif + BOOL bLoop = TRUE; + +#ifdef REPLACE_OFADBMGR +#else + // keine Arme keine Kekse + if(!xRow.is()) + return FALSE; + SbaDBDataDefRef aDBDef = OpenColumnNames(FALSE); + if (aDBDef.Is()) +#endif + { +#ifdef REPLACE_OFADBMGR + Reference< XColumnsSupplier > xColsSupp( pMergeData->xResultSet, UNO_QUERY ); + Reference <XNameAccess> xCols = xColsSupp->getColumns(); + if(!xCols->hasByName(sEMailAddrFld)) + return FALSE; + Any aCol = xCols->getByName(sEMailAddrFld); + Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();; +#else + const SbaColumnList& rCols = aDBDef->GetOriginalColumns(); + USHORT nColPos = 0; + for (nColPos = 0; nColPos < rCols.Count(); nColPos++) + { + const SbaNameItem* pNameItem = (const SbaNameItem*)&rCols.GetObject(nColPos)->Get(SBA_DEF_FLTNAME); + if (pNameItem->GetValue() == sEMailAddrFld) + break; + } + + if (nColPos >= rCols.Count()) + return FALSE; + nColPos++; +#endif + + bInMerge = TRUE; + SfxDispatcher* pSfxDispatcher = pSh->GetView().GetViewFrame()->GetDispatcher(); + if (!sSubject.Len()) // Kein leeres Subject wegen Automail (PB) + sSubject = ' '; + SfxStringItem aSubject(SID_MAIL_SUBJECT, sSubject); + SfxStringItem aText(SID_MAIL_TEXT, ' '); // Leerer Text ist nicht moeglich + SfxStringItem aAttached(SID_MAIL_ATTACH_FILE, sAttached); + SfxBoolItem aAttach(SID_MAIL_ATTACH, TRUE); + + SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig(); + BYTE nMailFmts = pModOpt->GetMailingFormats() | TXTFORMAT_ASCII; // Immer Ascii + SfxByteItem aTextFormats(SID_MAIL_TXTFORMAT, nMailFmts); +#ifdef REPLACE_OFADBMGR +#else + Flush(FALSE); // Cursor initialisieren +#endif + + pSfxDispatcher->Execute( SID_SAVEDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD); + if( !pSh->IsModified() ) + { + // Beim Speichern wurde kein Abbruch gedrueckt + // neue DocShell erzeugen, alle gelinkten Bereiche embedden + // und unter temporaerem Namen wieder speichern. + BOOL bDelTempFile = TRUE; + String sTmpName; + const SfxFilter* pSfxFlt; + + { + SfxMedium* pOrig = pSh->GetView().GetDocShell()->GetMedium(); + + pSfxFlt = SwIoSystem::GetFileFilter( pOrig->GetPhysicalName(), ::aEmptyStr ); + + String sFileName = ::GetTmpFileName(); + String sTmpName = URIHelper::SmartRelToAbs(sFileName); + + BOOL bCopyCompleted = TRUE; + try + { + String sMain(sTmpName); + sal_Unicode cSlash = '/'; + xub_StrLen nSlashPos = sMain.SearchBackward(cSlash); + sMain.Erase(nSlashPos); + ::ucb::Content aNewContent( sMain, Reference< XCommandEnvironment > ()); + Any aAny; + TransferInfo aInfo; + aInfo.NameClash = NameClash::OVERWRITE; + aInfo.NewTitle = INetURLObject(sTmpName).GetName(); + aInfo.SourceURL = pOrig->GetPhysicalName(); + aInfo.MoveData = FALSE; + aAny <<= aInfo; + aNewContent.executeCommand( C2U( "transfer" ), aAny); + } + catch( ... ) + { + bCopyCompleted = FALSE; + } + + if( !bCopyCompleted ) + { + // Neues Dokument erzeugen. + SfxObjectShellRef xDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL )); + SfxMedium* pMed = new SfxMedium( sTmpName, STREAM_READ, TRUE ); + pMed->SetFilter( pSfxFlt ); + + // alle gelinkten Bereiche/Grafiken aufs lokale FileSystem + // einbetten + if( xDocSh->DoLoad( pOrig ) && + ((SwDocShell*)(&xDocSh))->EmbedAllLinks() ) + { + xDocSh->DoSaveAs(*pMed); + xDocSh->DoSaveCompleted(pMed); + } + else + bDelTempFile = FALSE; + + xDocSh->DoClose(); + } + else + bDelTempFile = FALSE; + + if( !bDelTempFile ) + sTmpName = pOrig->GetPhysicalName(); + } + + + String sAddress; + ULONG nDocNo = 1; + bCancel = FALSE; + + PrintMonitor aPrtMonDlg(&pSh->GetView().GetEditWin(), TRUE); + aPrtMonDlg.aDocName.SetText(pSh->GetView().GetDocShell()->GetTitle(22)); + aPrtMonDlg.aCancel.SetClickHdl(LINK(this, SwNewDBMgr, PrtCancelHdl)); + aPrtMonDlg.Show(); + + OfficeApplication* pOffApp = OFF_APP(); + SfxRequest aReq( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, pOffApp->GetPool() ); + aReq.AppendItem( SfxStringItem( SID_FILE_NAME, sTmpName )); + aReq.AppendItem( SfxStringItem( SID_FILTER_NAME, pSfxFlt->GetName() )); + aReq.AppendItem( SfxBoolItem( SID_HIDDEN, TRUE ) ); + aReq.AppendItem( SfxStringItem( SID_REFERER, String::CreateFromAscii(URL_PREFIX_PRIV_SOFFICE ))); + + pOffApp->ExecuteSlot( aReq, pOffApp->SfxApplication::GetInterface()); + if( aReq.IsDone() ) + { + // DocShell besorgen + SfxViewFrameItem* pVItem = (SfxViewFrameItem*)aReq.GetReturnValue(); + SwView* pView = (SwView*) pVItem->GetFrame()->GetViewShell(); + SwWrtShell& rSh = pView->GetWrtShell(); + pView->AttrChangedNotify( &rSh );//Damit SelectShell gerufen wird. + + SwDoc* pDoc = rSh.GetDoc(); + SwNewDBMgr* pOldDBMgr = pDoc->GetNewDBMgr(); + pDoc->SetNewDBMgr( this ); + pDoc->EmbedAllLinks(); + String sTempStat(SW_RES(STR_DB_EMAIL)); + + do + { +#ifdef REPLACE_OFADBMGR +#else + // Naechste Selektion holen + xRow = GetCurSelectedRecord(FALSE); + ULONG nOldRec = GetCurRecordId(FALSE); // Alte Position merken + if( xRow.is() && xRow->size() > 0) +#endif + { + + if(UIUNDO_DELETE_INVISIBLECNTNT == rSh.GetUndoIds()) + rSh.Undo(); + rSh.ViewShell::UpdateFlds(); + + // alle versteckten Felder/Bereiche entfernen + rSh.RemoveInvisibleContent(); + + SfxFrameItem aFrame( SID_DOCFRAME, pVItem->GetFrame() ); +#ifdef REPLACE_OFADBMGR + SwDBFormatData aDBFormat; + sAddress = GetDBField( xColumnProp, aDBFormat); +#else + sAddress = ImportDBField(nColPos, &aDBDef, xRow); +#endif + if (!sAddress.Len()) + sAddress = '_'; + + String sStat(sTempStat); + sStat += ' '; + sStat += String::CreateFromInt32( nDocNo++ ); + aPrtMonDlg.aPrintInfo.SetText(sStat); + aPrtMonDlg.aPrinter.SetText( sAddress ); + + // Rechenzeit fuer EMail-Monitor: + for (USHORT i = 0; i < 25; i++) + Application::Reschedule(); + + sAddress.Insert(String::CreateFromAscii("mailto:"), 0); + SfxStringItem aRecipient( SID_MAIL_RECIPIENT, sAddress ); + + const SfxPoolItem* pRet = pSfxDispatcher->Execute( + SID_MAIL_SENDDOC, + SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD, + &aRecipient, &aSubject, &aAttach, &aAttached, + &aText, &aTextFormats, &aFrame, + 0L ); + //this must be done here because pRet may be destroyed in Reschedule (DeleteOnIdle) + BOOL bBreak = pRet && !( (SfxBoolItem*)pRet )->GetValue(); + + // Rechenzeit fuer EMail-Monitor: + for (i = 0; i < 25; i++) + Application::Reschedule(); + + if ( bBreak ) + break; // das Verschicken wurde unterbrochen + + } +#ifdef REPLACE_OFADBMGR + } while( !bCancel && bSynchronizedDoc ? ExistsNextRecord() : ToNextMergeRecord()); +#else + // Kontext fuer ToNextSelectedRecord auf richtige Datenbank stellen: + GetDBData(FALSE, &rParam.GetDBName()); + + // Endlosschleifen durch "Erster Datensatz" verhindern: + if (GetCurRecordId(FALSE) < nOldRec) + ToSelectedRecord(FALSE, nOldRec); // Alte Position restaurieren + } while(!bCancel && xRow.is() && GotoNextSelectedRecord( bSynchronizedDoc)); +#endif + pDoc->SetNewDBMgr( pOldDBMgr ); + pView->GetDocShell()->OwnerLock( FALSE ); + + } + // jetzt noch die temp Datei entfernen + if( bDelTempFile ) + { + try + { + ::ucb::Content aTempContent( + sTmpName, + Reference< XCommandEnvironment > ()); + aTempContent.executeCommand( C2U( "delete" ), + makeAny( sal_Bool( sal_True ) ) ); + } + catch( ... ) + { + DBG_ERRORFILE( "Exception" ); + } + + } + SW_MOD()->SetView(&pSh->GetView()); + } + + bInMerge = FALSE; + nMergeType = DBMGR_INSERT; + } + +#ifdef REPLACE_OFADBMGR +#else + CloseAll(); +#endif + return bLoop; +} + +/* -----------------------------17.04.00 11:18-------------------------------- + + ---------------------------------------------------------------------------*/ +#ifdef REPLACE_OFADBMGR +#else +BOOL SwNewDBMgr::GotoNextSelectedRecord( BOOL bSyncronized ) +{ + BOOL bRet = FALSE; + if(!bSyncronized) + bRet = ToNextSelectedRecord( FALSE ); + else + { + OfaDBParam& rParam = GetDBData(FALSE); + if (rParam.GetCursor()) + { + if (rParam.pSelectionList.Is() && rParam.pSelectionList->Count()) + { + bRet = (rParam.CurrentSelPos() < rParam.pSelectionList->Count()); + } + else + { + bRet = !rParam.GetCursor()->IsOffRange(); + } + } + } + return(bRet); +} +#endif +/*-------------------------------------------------------------------- + Beschreibung: Serienbriefe als einzelne Dokumente speichern + --------------------------------------------------------------------*/ + +BOOL SwNewDBMgr::MergeMailFiles(SwWrtShell* pSh) +{ + //check if the doc is synchronized and contains at least one linked section + BOOL bSynchronizedDoc = pSh->IsLabelDoc() && pSh->GetSectionFmtCount() > 1; +#ifdef REPLACE_OFADBMGR +#else + OfaDBParam& rParam = GetDBData(FALSE); + + // 1. Satz positionieren, Evaluierung ueber die Felder + for (USHORT i = 0; i < aDBDataArr.Count(); i++) + { + OfaDBParam* pParam = aDBDataArr[i]; + + // Alle im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren + if (OpenDB(FALSE, pParam->GetDBName())) + { + if (pParam->GetCursor()) + Flush(FALSE); // Cursor initialisieren + ToFirstSelectedRecord(FALSE); + } + } + + OpenDB(FALSE, rParam.GetDBName()); + if (!ToFirstSelectedRecord(FALSE)) + return(FALSE); + + ODbRowRef xRow = GetCurSelectedRecord(FALSE); + + // keine Arme keine Kekse + if(!xRow.is()) + return FALSE; +#endif + BOOL bLoop = TRUE; + +#ifdef REPLACE_OFADBMGR + Reference< XPropertySet > xColumnProp; +#else + SbaDBDataDefRef aDBDef = OpenColumnNames(FALSE); + if (aDBDef.Is()) +#endif + { + USHORT nColPos = 0; + BOOL bColumnName = sEMailAddrFld.Len() > 0; + + if (bColumnName) + { +#ifdef REPLACE_OFADBMGR + Reference< XColumnsSupplier > xColsSupp( pMergeData->xResultSet, UNO_QUERY ); + Reference <XNameAccess> xCols = xColsSupp->getColumns(); + if(!xCols->hasByName(sEMailAddrFld)) + return FALSE; + Any aCol = xCols->getByName(sEMailAddrFld); + xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();; +#else + const SbaColumnList& rCols = aDBDef->GetOriginalColumns(); + + for (nColPos = 0; nColPos < rCols.Count(); nColPos++) + { + const SbaNameItem* pNameItem = (const SbaNameItem*)&rCols.GetObject(nColPos)->Get(SBA_DEF_FLTNAME); + if (pNameItem->GetValue() == sEMailAddrFld) + break; + } + + if (nColPos >= rCols.Count()) + return FALSE; + + nColPos++; +#endif + } + + bInMerge = TRUE; + SfxDispatcher* pSfxDispatcher = pSh->GetView().GetViewFrame()->GetDispatcher(); + +#ifdef REPLACE_OFADBMGR +#else + Flush(FALSE); // Cursor initialisieren +#endif + + pSfxDispatcher->Execute( SID_SAVEDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD); + if( !pSh->IsModified() ) + { + // Beim Speichern wurde kein Abbruch gedrueckt + SfxMedium* pOrig = pSh->GetView().GetDocShell()->GetMedium(); + String sOldName(pOrig->GetPhysicalName()); + const SfxFilter* pSfxFlt = SwIoSystem::GetFileFilter( + sOldName, ::aEmptyStr ); + String sAddress; + bCancel = FALSE; + + PrintMonitor aPrtMonDlg(&pSh->GetView().GetEditWin()); + aPrtMonDlg.aDocName.SetText(pSh->GetView().GetDocShell()->GetTitle(22)); + + aPrtMonDlg.aCancel.SetClickHdl(LINK(this, SwNewDBMgr, PrtCancelHdl)); + aPrtMonDlg.Show(); + + SwDocShell *pDocSh = pSh->GetView().GetDocShell(); + // Progress, um KeyInputs zu unterbinden + SfxProgress aProgress(pDocSh, ::aEmptyStr, 1); + + // Alle Dispatcher sperren + SfxViewFrame* pViewFrm = SfxViewFrame::GetFirst(pDocSh); + while (pViewFrm) + { + pViewFrm->GetDispatcher()->Lock(TRUE); + pViewFrm = SfxViewFrame::GetNext(*pViewFrm, pDocSh); + } + ULONG nDocNo = 1; + ULONG nCounter = 0; + String sExt( INetURLObject( sOldName ).GetExtension() ); + + do { +#ifdef REPLACE_OFADBMGR +#else + // Naechste Selektion holen + xRow = GetCurSelectedRecord(FALSE); + ULONG nOldRec = GetCurRecordId(FALSE); // Alte Position merken + + if( xRow.is() && xRow->size() > 0 ) +#endif + { + String sPath(sSubject); + + if( bColumnName ) + { +#ifdef REPLACE_OFADBMGR + SwDBFormatData aDBFormat; + sAddress = GetDBField( xColumnProp, aDBFormat); +#else + + sAddress = ImportDBField(nColPos, &aDBDef, xRow); +#endif + if (!sAddress.Len()) + sAddress = '_'; + sPath += sAddress; + nCounter = 0; + } + + INetURLObject aEntry(sPath); + String sLeading(aEntry.GetBase()); + aEntry.removeSegment(); + sPath = aEntry.GetMainURL(); + TempFile aTemp(sLeading,&sExt,&sPath ); + + if( !aTemp.IsValid() ) + { + ErrorHandler::HandleError( ERRCODE_IO_NOTSUPPORTED ); + bLoop = FALSE; + bCancel = TRUE; + } + else + { + INetURLObject aTempFile(aTemp.GetName()); + aPrtMonDlg.aPrinter.SetText( aTempFile.GetBase() ); + String sStat(SW_RES(STR_STATSTR_LETTER)); // Brief + sStat += ' '; + sStat += String::CreateFromInt32( nDocNo++ ); + aPrtMonDlg.aPrintInfo.SetText(sStat); + + // Rechenzeit fuer Save-Monitor: + for (USHORT i = 0; i < 10; i++) + Application::Reschedule(); + + // Neues Dokument erzeugen und speichern + SfxObjectShellRef xDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL )); + SfxMedium* pMed = new SfxMedium( sOldName, STREAM_STD_READ, TRUE ); + pMed->SetFilter( pSfxFlt ); + + if (xDocSh->DoLoad(pMed)) + { + SwDoc* pDoc = ((SwDocShell*)(&xDocSh))->GetDoc(); + SwNewDBMgr* pOldDBMgr = pDoc->GetNewDBMgr(); + pDoc->SetNewDBMgr( this ); + pDoc->UpdateFlds(0); + + // alle versteckten Felder/Bereiche entfernen + pDoc->RemoveInvisibleContent(); + + SfxMedium* pDstMed = new SfxMedium( aTempFile.GetFull(), STREAM_STD_READWRITE, TRUE ); + pDstMed->SetFilter( pSfxFlt ); + + xDocSh->DoSaveAs(*pDstMed); + xDocSh->DoSaveCompleted(pDstMed); + if( xDocSh->GetError() ) + { + // error message ?? + ErrorHandler::HandleError( xDocSh->GetError() ); + bCancel = TRUE; + bLoop = FALSE; + } + pDoc->SetNewDBMgr( pOldDBMgr ); + } + xDocSh->DoClose(); + } + } +#ifdef REPLACE_OFADBMGR + } while( !bCancel && bSynchronizedDoc ? ExistsNextRecord() : ToNextMergeRecord()); +#else + // Kontext fuer ToNextSelectedRecord auf + // richtige Datenbank stellen: + GetDBData(FALSE, &rParam.GetDBName()); + + // Endlosschleifen durch "Erster Datensatz" verhindern: + if( !bCancel && GetCurRecordId(FALSE) < nOldRec ) + ToSelectedRecord(FALSE, nOldRec); // Alte Position restaurieren + } while( !bCancel && xRow.is() && + GotoNextSelectedRecord( bSynchronizedDoc) ); +#endif + // Alle Dispatcher freigeben + pViewFrm = SfxViewFrame::GetFirst(pDocSh); + while (pViewFrm) + { + pViewFrm->GetDispatcher()->Lock(FALSE); + pViewFrm = SfxViewFrame::GetNext(*pViewFrm, pDocSh); + } + + SW_MOD()->SetView(&pSh->GetView()); + } + + bInMerge = FALSE; + nMergeType = DBMGR_INSERT; + } + +#ifdef REPLACE_OFADBMGR +#else + CloseAll(); +#endif + return bLoop; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +IMPL_LINK_INLINE_START( SwNewDBMgr, PrtCancelHdl, Button *, pButton ) +{ + pButton->GetParent()->Hide(); + bCancel = TRUE; + return 0; +} +IMPL_LINK_INLINE_END( SwNewDBMgr, PrtCancelHdl, Button *, pButton ) + + +/*-------------------------------------------------------------------- + Beschreibung: Numberformat der Spalte ermitteln und ggfs. in + den uebergebenen Formatter uebertragen + --------------------------------------------------------------------*/ + +#ifdef REPLACE_OFADBMGR +ULONG SwNewDBMgr::GetColumnFmt( const String& rDBName, + const String& rTableName, + const String& rColNm, + SvNumberFormatter* pNFmtr, + long nLanguage ) +#else +ULONG SwNewDBMgr::GetColumnFmt( const String& rDBName, const String& rColNm, + SvNumberFormatter* pNFmtr ) +#endif +{ + //JP 12.01.99: ggfs. das NumberFormat im Doc setzen + ULONG nRet = 0; +#ifdef REPLACE_OFADBMGR + if(pNFmtr) + { + SvNumberFormatsSupplierObj* pNumFmt = new SvNumberFormatsSupplierObj( pNFmtr ); + Reference< util::XNumberFormatsSupplier > xDocNumFmtsSupplier = pNumFmt; + Reference< XNumberFormats > xDocNumberFormats = xDocNumFmtsSupplier->getNumberFormats(); + Reference< XNumberFormatTypes > xDocNumberFormatTypes(xDocNumberFormats, UNO_QUERY); + + String sLanguage, sCountry; + ::ConvertLanguageToIsoNames( nLanguage, sLanguage, sCountry ); + Locale aLocale; + aLocale.Language = sLanguage; + aLocale.Country = sCountry; + + Reference< XDataSource> xSource; + Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource); + + //get the number formatter of the data source + Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY); + Reference< XNumberFormats > xNumberFormats; + if(xSourceProps.is()) + { + Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier")); + if(aFormats.hasValue()) + { + Reference<XNumberFormatsSupplier> xSuppl = *(Reference<util::XNumberFormatsSupplier>*) aFormats.getValue(); + if(xSuppl.is()) + { + xNumberFormats = xSuppl->getNumberFormats(); + } + } + } + Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName); + if(xColsSupp.is()) + { + Reference <XNameAccess> xCols = xColsSupp->getColumns(); + if(!xCols->hasByName(rColNm)) + return nRet; + Any aCol = xCols->getByName(rColNm); + Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();; + + Any aFormat = xColumnProp->getPropertyValue(C2U("FormatKey")); + if(aFormat.hasValue()) + { + sal_Int32 nFmt; + aFormat >>= nFmt; + if(xNumberFormats.is()) + { + try + { + Reference<XPropertySet> xNumProps = xNumberFormats->getByKey( nFmt ); + Any aFormat = xNumProps->getPropertyValue(C2U("FormatString")); + Any aLocale = xNumProps->getPropertyValue(C2U("Locale")); + OUString sFormat; + aFormat >>= sFormat; + com::sun::star::lang::Locale aLoc; + aLocale >>= aLoc; + nFmt = xDocNumberFormats->addNew( sFormat, aLoc ); + nRet = nFmt; + } + catch(...) + { + DBG_ERROR("illegal number format key") + } + } + } + else + nRet = utl::getDefaultNumberFormat(xColumnProp, xDocNumberFormatTypes, aLocale); + } + else + nRet = pNFmtr->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM ); + } +#else + if( pNFmtr ) + { + int nCol; + if( OpenDB( DBMGR_STD, rDBName, FALSE ) && + 0 != ( nCol = GetColumnPos( DBMGR_STD, rColNm ))) + nRet = GetRealColumnFmt( rColNm, GetColumnFormat( DBMGR_STD, nCol ), + *pNFmtr ); + else + nRet = pNFmtr->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM ); + } +#endif + return nRet; +} +/* -----------------------------17.07.00 09:47-------------------------------- + + ---------------------------------------------------------------------------*/ +#ifdef REPLACE_OFADBMGR +sal_Int32 SwNewDBMgr::GetColumnType( const String& rDBName, + const String& rTableName, + const String& rColNm ) +{ + sal_Int32 nRet = DataType::SQLNULL; + Reference< XDataSource> xSource; + Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource); + Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName); + if(xColsSupp.is()) + { + Reference <XNameAccess> xCols = xColsSupp->getColumns(); + if(xCols->hasByName(rColNm)) + { + Any aCol = xCols->getByName(rColNm); + Reference <XPropertySet> xCol = *(Reference <XPropertySet>*)aCol.getValue(); + Any aType = xCol->getPropertyValue(C2S("Type")); + aType >>= nRet; + } + } + return nRet; +} +#else +#endif + +#ifdef REPLACE_OFADBMGR +#else +ULONG SwNewDBMgr::GetRealColumnFmt( const String& rColNm, ULONG nFmt, + SvNumberFormatter& rNFmtr ) +{ + SvNumberFormatter* pDBNumFmtr; + const SvNumberformat* pNFmt; + SbaDBDataDefRef aDBDef = OpenColumnNames( DBMGR_STD ); + if( aDBDef.Is() && 0 != ( pDBNumFmtr = aDBDef->GetFormatter() ) && + 0 != (pNFmt = pDBNumFmtr->GetEntry( nFmt ) ) ) + { + nFmt = rNFmtr.GetEntryKey( pNFmt->GetFormatstring(), pNFmt->GetLanguage() ); + if( NUMBERFORMAT_ENTRY_NOT_FOUND == nFmt ) + { + xub_StrLen nCheckPos; + short nType; + XubString aTmp( pNFmt->GetFormatstring() ); + rNFmtr.PutEntry( aTmp, nCheckPos, nType, nFmt, pNFmt->GetLanguage() ); + } + } + else + nFmt = rNFmtr.GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM ); + + return nFmt; +} +BOOL SwNewDBMgr::IsDBCaseSensitive( const String& rName ) const +{ + BOOL bRet = FALSE; + String sDBName = OFF_APP()->LocalizeDBName( NATIONAL2INI, rName ); + if( sDBName.Len() ) + { + SbaDatabaseRef xConnection = pSbaObject->GetDatabase(sDBName, TRUE); + if( xConnection.Is() ) + // JP 18.11.99: looked from + // \offmgr\source\sba\core\db\dbtabobj.cxx + bRet = SDB_IC_OBJECT == xConnection->GetIdentifierCase(); + } + return bRet; +} +#endif + +#ifdef REPLACE_OFADBMGR +/* -----------------------------03.07.00 17:12-------------------------------- + + ---------------------------------------------------------------------------*/ +Reference< sdbc::XConnection> SwNewDBMgr::GetConnection(const String& rDataSource, + Reference<XDataSource>& rxSource) +{ + Reference< sdbc::XConnection> xConnection; + Reference<XNameAccess> xDBContext; + Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() ); + if( xMgr.is() ) + { + Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" )); + xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ; + } + DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available") + if(xDBContext.is()) + { + try + { + if(xDBContext->hasByName(rDataSource)) + { + Any aDBSource = xDBContext->getByName(rDataSource); + Reference<XDataSource>* pxSource = (Reference<XDataSource>*)aDBSource.getValue(); + OUString sDummy; + xConnection = (*pxSource)->getConnection(sDummy, sDummy); + rxSource = (*pxSource); + } + } + catch(...) {} + } + return xConnection; +} +/* -----------------------------03.07.00 17:12-------------------------------- + + ---------------------------------------------------------------------------*/ +Reference< sdbcx::XColumnsSupplier> SwNewDBMgr::GetColumnSupplier(Reference<sdbc::XConnection> xConnection, + const String& rTableOrQuery, + BYTE eTableOrQuery) +{ + Reference< sdbcx::XColumnsSupplier> xRet; + if(SW_DB_SELECT_QUERY != eTableOrQuery) + { + Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY); + if(xTSupplier.is()) + { + Reference<XNameAccess> xTbls = xTSupplier->getTables(); + if(xTbls->hasByName(rTableOrQuery)) + try + { + Any aTable = xTbls->getByName(rTableOrQuery); + Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aTable.getValue(); + xRet = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY); + } + catch(...){} + } + } + if(!xRet.is() && SW_DB_SELECT_QUERY != SW_DB_SELECT_TABLE) + { + Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY); + if(xQSupplier.is()) + { + Reference<XNameAccess> xQueries = xQSupplier->getQueries(); + if(xQueries->hasByName(rTableOrQuery)) + try + { + Any aQuery = xQueries->getByName(rTableOrQuery); + Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aQuery.getValue(); + xRet = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY); + } + catch(...){} + } + } + return xRet; +} +/* -----------------------------05.07.00 13:44-------------------------------- + + ---------------------------------------------------------------------------*/ +String SwNewDBMgr::GetDBField(Reference<XPropertySet> xColumnProps, + const SwDBFormatData& rDBFormatData, + double* pNumber) +{ + Reference< XColumn > xColumn(xColumnProps, UNO_QUERY); + String sRet; + DBG_ASSERT(xColumn.is(), "SwNewDBMgr::::ImportDBField: illegal arguments") + if(!xColumn.is()) + return sRet; + + Any aType = xColumnProps->getPropertyValue(C2U("Type")); + sal_Int32 eDataType; + aType >>= eDataType; + switch(eDataType) + { + case DataType::CHAR: + case DataType::VARCHAR: + case DataType::LONGVARCHAR: + sRet = xColumn->getString(); + break; + case DataType::BIT: + case DataType::TINYINT: + case DataType::SMALLINT: + case DataType::INTEGER: + case DataType::BIGINT: + case DataType::FLOAT: + case DataType::REAL: + case DataType::DOUBLE: + case DataType::NUMERIC: + case DataType::DECIMAL: + case DataType::DATE: + case DataType::TIME: + case DataType::TIMESTAMP: + { + ::Date aTempDate(rDBFormatData.aNullDate.Day, + rDBFormatData.aNullDate.Month, rDBFormatData.aNullDate.Year); + + try + { + sRet = utl::DBTypeConversion::getValue( + xColumnProps, + rDBFormatData.xFormatter, + rDBFormatData.aLocale, + aTempDate); + double fVal = xColumn->getDouble(); + if (pNumber) + *pNumber = fVal; + } + catch(Exception aExcept) + { + DBG_ERROR("exception caught") + } + + } + break; + +// case DataType::BINARY: +// case DataType::VARBINARY: +// case DataType::LONGVARBINARY: +// case DataType::SQLNULL: +// case DataType::OTHER: +// case DataType::OBJECT: +// case DataType::DISTINCT: +// case DataType::STRUCT: +// case DataType::ARRAY: +// case DataType::BLOB: +// case DataType::CLOB: +// case DataType::REF: +// default: + } +// if (pFormat) +// { +// SFX_ITEMSET_GET(*pCol, pFormatItem, SfxUInt32Item, SBA_DEF_FMTVALUE, sal_True); +// *pFormat = pFormatItem->GetValue(); +// } + + return sRet; +} +/* -----------------------------06.07.00 14:26-------------------------------- + opens a data source table or query and keeps the reference + until EndMerge() is called + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::OpenMergeSource(const String& rDataSource, + const String& rDataTableOrQuery, + const String& rStatement, + const SbaSelectionListRef xSelectionList) +{ + DBG_ASSERT(!bInMerge && !pMergeData, "merge already activated!") + bInMerge = TRUE; + pMergeData = new SwDSParam(rDataSource, rDataTableOrQuery, SW_DB_SELECT_UNKNOWN, rStatement); + //remove corresponding data from aDataSourceParams and insert the merge data + String sDBName(rDataSource); + sDBName += DB_DELIM; + sDBName += rDataTableOrQuery; + SwDSParam* pTemp = FindDSData(sDBName, FALSE); + if(pTemp) + pTemp = pMergeData; + else + aDataSourceParams.Insert(pMergeData, aDataSourceParams.Count()); + + Reference<XDataSource> xSource; + pMergeData->xConnection = SwNewDBMgr::GetConnection(rDataSource, xSource); + pMergeData->xSelectionList = xSelectionList; + if( xSelectionList.Is() && xSelectionList->Count() && (long)xSelectionList->GetObject(0) != -1L ) + { + pMergeData->bSelectionList = TRUE; + } + + if(pMergeData->xConnection.is()) + { + try + { + pMergeData->bScrollable = pMergeData->xConnection->getMetaData() + ->supportsResultSetType((sal_Int32)ResultSetType::SCROLL_INSENSITIVE); + pMergeData->xStatement = pMergeData->xConnection->createStatement(); + pMergeData->xResultSet = pMergeData->xStatement->executeQuery( rStatement ); + //after executeQuery the cursor must be positioned + if(pMergeData->bSelectionList) + { + if(pMergeData->bScrollable) + { + pMergeData->bEndOfDB = !pMergeData->xResultSet->absolute( + (ULONG)pMergeData->xSelectionList->GetObject( 0 ) ); + } + else + { + ULONG nPos = (ULONG)pMergeData->xSelectionList->GetObject( 0 ); + while(nPos > 0 && !pMergeData->bEndOfDB) + { + pMergeData->bEndOfDB |= !pMergeData->xResultSet->next(); + nPos--; + } + } + if(1 == pMergeData->xSelectionList->Count()) + pMergeData->bEndOfDB = TRUE; + } + else + { + pMergeData->bEndOfDB = !pMergeData->xResultSet->next(); + ++pMergeData->nSelectionIndex; + } + Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() ); + if( xMgr.is() ) + { + Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.util.NumberFormatter" )); + pMergeData->xFormatter = Reference<util::XNumberFormatter>(xInstance, UNO_QUERY) ; + } + + Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY); + if(xSourceProps.is()) + { + Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier")); + if(aFormats.hasValue()) + { + Reference<XNumberFormatsSupplier> xSuppl = *(Reference<util::XNumberFormatsSupplier>*) aFormats.getValue(); + if(xSuppl.is()) + { + Reference< XPropertySet > xSettings = xSuppl->getNumberFormatSettings(); + Any aNull = xSettings->getPropertyValue(C2U("NullDate")); + if(aNull.hasValue()) + pMergeData->aNullDate = *(util::Date*)aNull.getValue(); + } + } + } + } + catch(Exception aExcept) + { + DBG_ERROR("exception caught") + } + } + BOOL bRet = pMergeData && pMergeData->xResultSet.is(); + if(!bRet) + pMergeData = 0; + return bRet; +} +/* -----------------------------06.07.00 14:28-------------------------------- + releases the merge data source table or query after merge is completed + ---------------------------------------------------------------------------*/ +void SwNewDBMgr::EndMerge() +{ + DBG_ASSERT(bInMerge, "merge is not active") + bInMerge = FALSE; + pMergeData = 0; +} +/* -----------------------------06.07.00 14:28-------------------------------- + checks if a desired data source table or query is open + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::IsDataSourceOpen(const String& rDataSource, const String& rTableOrQuery) const +{ + if(pMergeData) + { + return rDataSource == pMergeData->sDataSource && + rTableOrQuery == pMergeData->sTableOrQuery && + pMergeData->xResultSet.is(); + } + else + return FALSE; +} +/* -----------------------------17.07.00 16:44-------------------------------- + read column data a a specified position + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::GetColumnCnt(const String& rSourceName, const String& rTableName, + const String& rColumnName, sal_uInt32 nAbsRecordId, + long nLanguage, + String& rResult, double* pNumber) +{ + BOOL bRet = FALSE; + //check if it's the merge data source + if(pMergeData && + rSourceName == pMergeData->sDataSource && + rTableName == pMergeData->sTableOrQuery) + { + if(!pMergeData->xResultSet.is()) + return FALSE; + //keep the old index + sal_Int32 nOldRow = pMergeData->xResultSet->getRow(); + //position to the desired index + BOOL bMove; + if(nOldRow != nAbsRecordId) + bMove = lcl_MoveAbsolute(pMergeData, nAbsRecordId); + if(bMove) + { + bRet = lcl_GetColumnCnt(pMergeData, rColumnName, nLanguage, rResult, pNumber); + } + if(nOldRow != nAbsRecordId) + bMove = lcl_MoveAbsolute(pMergeData, nOldRow); + } + // + return bRet; +} +/* -----------------------------06.07.00 16:47-------------------------------- + reads the column data at the current position + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::GetMergeColumnCnt(const String& rColumnName, USHORT nLanguage, + String &rResult, double *pNumber, sal_uInt32 *pFormat) +{ + if(!pMergeData || !pMergeData->xResultSet.is()) + return FALSE; + + BOOL bRet = lcl_GetColumnCnt(pMergeData, rColumnName, nLanguage, rResult, pNumber); + return bRet; +} +/* -----------------------------07.07.00 14:28-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::ToNextMergeRecord() +{ + DBG_ASSERT(pMergeData && pMergeData->xResultSet.is(), "no data source in merge") + if(!pMergeData || !pMergeData->xResultSet.is() || pMergeData->bEndOfDB) + return FALSE; + try + { + if(pMergeData->bSelectionList) + { + if(pMergeData->bScrollable) + { + pMergeData->bEndOfDB = !pMergeData->xResultSet->absolute( + (ULONG)pMergeData->xSelectionList->GetObject( ++pMergeData->nSelectionIndex ) ); + } + else + { + ULONG nOldPos = pMergeData->nSelectionIndex ? + (ULONG)pMergeData->xSelectionList->GetObject(pMergeData->nSelectionIndex): 0; + ULONG nPos = (ULONG)pMergeData->xSelectionList->GetObject( ++pMergeData->nSelectionIndex ); + DBG_ASSERT(nPos >=0, "selection invalid!") + long nDiff = nPos - nOldPos; + //if a backward move is necessary then the result set must be created again + if(nDiff < 0) + { + try + { + pMergeData->xResultSet = pMergeData->xStatement->executeQuery( pMergeData->sStatement ); + } + catch(...) + { + pMergeData->bEndOfDB = TRUE; + } + nDiff = nPos; + } + while(nDiff > 0 && !pMergeData->bEndOfDB) + { + pMergeData->bEndOfDB |= !pMergeData->xResultSet->next(); + nDiff--; + } + } + if(pMergeData->nSelectionIndex >= pMergeData->xSelectionList->Count()) + pMergeData->bEndOfDB = TRUE; + } + else + { + pMergeData->bEndOfDB = !pMergeData->xResultSet->next(); + ++pMergeData->nSelectionIndex; + } + } + catch(Exception aExcept) + { + DBG_ERROR("exception caught") + } + return TRUE; +} +/* -----------------------------13.07.00 17:23-------------------------------- + synchronized labels contain a next record field at their end + to assure that the next page can be created in mail merge + the cursor position must be validated + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::ExistsNextRecord() const +{ + return pMergeData && !pMergeData->bEndOfDB; +} +/* -----------------------------13.07.00 10:41-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_uInt32 SwNewDBMgr::GetSelectedRecordId() +{ + sal_uInt32 nRet = 0; + DBG_ASSERT(pMergeData && pMergeData->xResultSet.is(), "no data source in merge") + if(!pMergeData || !pMergeData->xResultSet.is()) + return FALSE; + try + { + nRet = pMergeData->xResultSet->getRow(); + } + catch(Exception aExcept) + { + DBG_ERROR("exception caught") + } + return nRet; +} +/* -----------------------------13.07.00 10:58-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Bool SwNewDBMgr::ToRecordId(sal_Int32 nSet) +{ + DBG_ASSERT(pMergeData && pMergeData->xResultSet.is(), "no data source in merge") + if(!pMergeData || !pMergeData->xResultSet.is()|| nSet < 0) + return FALSE; + sal_Bool bRet = FALSE; + sal_Int32 nAbsPos = -1; + if(pMergeData->bSelectionList) + { + if(pMergeData->xSelectionList->Count() > nSet) + { + nAbsPos = (sal_Int32)pMergeData->xSelectionList->GetObject(nSet); + } + } + else + nAbsPos = nSet; + + if(nAbsPos >= 0) + { + bRet = lcl_MoveAbsolute(pMergeData, nAbsPos); + pMergeData->bEndOfDB = !bRet; + } + return bRet; +} +/* -----------------------------17.07.00 11:14-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::ShowInBeamer(const String& rDBName, const String& rTableName, + BYTE nType, const String& rStatement) +{ + DBG_ERROR("no beamer interface available!") + return FALSE; +} +/* -----------------------------17.07.00 14:50-------------------------------- + + ---------------------------------------------------------------------------*/ +void lcl_ExtractMembers(const String& rDBName, String& sSource, String& sTable, String& sStatement) +{ + sSource = rDBName.GetToken(0, DB_DELIM); + sTable = rDBName.GetToken(0).GetToken(1, DB_DELIM); + sal_uInt16 nPos; + if ((nPos = rDBName.Search(';')) != STRING_NOTFOUND) + sStatement = rDBName.Copy(nPos + 1); +} +/* -----------------------------17.07.00 14:17-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwNewDBMgr::OpenDataSource(const String& rDataSource, const String& rTableOrQuery) +{ + String sDBName = rDataSource; + sDBName += DB_DELIM; + sDBName += rTableOrQuery; + SwDSParam* pFound = FindDSData(sDBName, TRUE); + pFound->bSelectionList = pFound->xSelectionList.Is() && pFound->xSelectionList->Count(); + Reference< XDataSource> xSource; + if(pFound->xResultSet.is()) + return TRUE; + pFound->xConnection = SwNewDBMgr::GetConnection(rDataSource, xSource ); + if(pFound->xConnection.is()) + { + try + { + pFound->bScrollable = pFound->xConnection->getMetaData() + ->supportsResultSetType((sal_Int32)ResultSetType::SCROLL_INSENSITIVE); + pFound->xStatement = pFound->xConnection->createStatement(); + pFound->xResultSet = pFound->xStatement->executeQuery( pFound->sStatement ); + + //after executeQuery the cursor must be positioned + if(pFound->bSelectionList) + { + if(pFound->bScrollable) + { + pFound->bEndOfDB = !pMergeData->xResultSet->absolute( + (ULONG)pFound->xSelectionList->GetObject( 0 ) ); + } + else + { + ULONG nPos = (ULONG)pFound->xSelectionList->GetObject( 0 ); + while(nPos > 0 && !pFound->bEndOfDB) + { + pFound->bEndOfDB |= !pFound->xResultSet->next(); + nPos--; + } + } + if(1 == pFound->xSelectionList->Count()) + pFound->bEndOfDB = TRUE; + } + else + { + pFound->bEndOfDB = !pMergeData->xResultSet->next(); + ++pMergeData->nSelectionIndex; + } + } + catch(...) + { + pFound->xResultSet = 0; + pFound->xStatement = 0; + pFound->xConnection = 0; + } + } + return pFound->xResultSet.is(); +} +/* -----------------------------17.07.00 15:55-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_uInt32 SwNewDBMgr::GetSelectedRecordId(const String& rDataSource, const String& rTableOrQuery) +{ + sal_uInt32 nRet = -1; + //check for merge data source first + if(pMergeData && rDataSource == pMergeData->sDataSource && + rTableOrQuery == pMergeData->sTableOrQuery && + pMergeData->xResultSet.is()) + nRet = GetSelectedRecordId(); + else + { + String sDBName(rDataSource); + sDBName += DB_DELIM; + sDBName += rTableOrQuery; + SwDSParam* pFound = SwNewDBMgr::FindDSData(sDBName, FALSE); + if(pFound && pFound->xResultSet.is()) + { + try + { + nRet = pFound->xResultSet->getRow(); + } + catch(...){} + } + } + return nRet; +} + +/* -----------------------------17.07.00 14:18-------------------------------- + close all data sources - after fields were updated + ---------------------------------------------------------------------------*/ +void SwNewDBMgr::CloseAll(BOOL bIncludingMerge) +{ + for(USHORT nPos = 0; nPos < aDataSourceParams.Count(); nPos++) + { + SwDSParam* pParam = aDataSourceParams[nPos]; + if(bIncludingMerge || pParam != pMergeData) + { + pParam->xResultSet = 0; + pParam->xStatement = 0; + pParam->xConnection = 0; + } + } +} +/* -----------------------------17.07.00 14:54-------------------------------- + + ---------------------------------------------------------------------------*/ +SwDSParam* SwNewDBMgr::FindDSData(const String& rDBName, BOOL bCreate) +{ + String sSource; + String sTable; + String sStatement; + lcl_ExtractMembers(rDBName, sSource, sTable, sStatement); + SwDSParam* pFound = 0; + + for(USHORT nPos = 0; nPos < aDataSourceParams.Count(); nPos++) + { + SwDSParam* pParam = aDataSourceParams[nPos]; + if(sSource == pParam->sDataSource && + sTable == pParam->sTableOrQuery) + { + pFound = pParam; + break; + } + } + if(bCreate) + { + if(!pFound) + { + pFound = new SwDSParam(sSource, sTable, SW_DB_SELECT_UNKNOWN, sStatement); + aDataSourceParams.Insert(pFound, aDataSourceParams.Count()); + } + else + pFound->sStatement = sStatement; + } + return pFound; +} +/* -----------------------------17.07.00 14:31-------------------------------- + rDBName: <Source> + DB_DELIM + <Table>; + <Statement> + ---------------------------------------------------------------------------*/ +void SwNewDBMgr::AddDSData(const String& rDBName, long nSelStart, long nSelEnd) +{ + SwDSParam* pFound = FindDSData(rDBName, TRUE); + if(pFound->xSelectionList.Is()) + pFound->xSelectionList->Clear(); + else + pFound->xSelectionList = new SbaSelectionList; + if (nSelStart > 0) + { + if (nSelEnd < nSelStart) + { + sal_uInt32 nZw = nSelEnd; + nSelEnd = nSelStart; + nSelStart = nZw; + } + + for (long i = nSelStart; i <= nSelEnd; i++) + pFound->xSelectionList->Insert((void*)i , LIST_APPEND); + } +} +/* -----------------------------17.07.00 14:31-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwNewDBMgr::GetDSSelection(const String& rDBDesc, long& rSelStart, long& rSelEnd) +{ + SwDSParam* pFound = FindDSData(rDBDesc, FALSE); + if(!pFound || !pFound->xSelectionList.Is() || !pFound->xSelectionList->Count()) + rSelStart = -1L; + else + { + if(pFound->xSelectionList->Count()) + { + rSelStart = (sal_uInt32)pFound->xSelectionList->GetObject(0); + for (sal_uInt32 i = 1; i < pFound->xSelectionList->Count(); i++) + { + long nPrev = (sal_uInt32)pFound->xSelectionList->GetObject(i - 1); + long nNow = (sal_uInt32)pFound->xSelectionList->GetObject(i); + + if (nNow - nPrev > 1) + { + rSelEnd = nPrev; + return; + } + } + rSelEnd = (sal_uInt32)pFound->xSelectionList->GetObject(i - 1); + } + } +} +/* -----------------------------17.07.00 14:34-------------------------------- + + ---------------------------------------------------------------------------*/ +const String& SwNewDBMgr::GetAddressDBName() +{ + DBG_ERROR("no address data base selection available") + return aEmptyStr; +} +/* -----------------------------18.07.00 13:13-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence<OUString> SwNewDBMgr::GetExistingDatabaseNames() +{ + Reference<XNameAccess> xDBContext; + Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() ); + if( xMgr.is() ) + { + Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" )); + xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ; + } + if(xDBContext.is()) + { + return xDBContext->getElementNames(); + } + return Sequence<OUString>(); +} +#endif //REPLACE_OFADBMGR + +/*------------------------------------------------------------------------ + $Log: not supported by cvs2svn $ + Revision 1.372 2000/09/18 16:05:18 willem.vandorp + OpenOffice header added. + + Revision 1.371 2000/08/08 10:10:39 os + ucb transfer command used + + Revision 1.370 2000/07/18 12:50:07 os + replace ofadbmgr + + Revision 1.369 2000/07/07 15:25:43 os + replace ofadbmgr + + Revision 1.368 2000/07/06 07:59:10 os + replace ofadbmgr + + Revision 1.367 2000/07/05 08:23:06 os + Replace ofadbmgr + + Revision 1.366 2000/06/26 13:18:45 os + INetURLObject::SmartRelToAbs removed + + Revision 1.365 2000/06/13 09:57:36 os + using UCB + + Revision 1.364 2000/06/08 09:46:48 os + ContentBroker not in SwModule + + Revision 1.363 2000/06/07 13:26:07 os + using UCB + + Revision 1.362 2000/05/23 18:11:05 jp + Bugfixes for Unicode + + Revision 1.361 2000/04/17 10:01:56 os + #74698# detect synchronized documents with an additional DBNextSet - field + + Revision 1.360 2000/04/11 08:03:52 os + UNICODE + + Revision 1.359 2000/02/11 14:44:23 hr + #70473# changes for unicode ( patched by automated patchtool ) + + Revision 1.358 2000/01/06 18:20:27 jp + Bug #71413#: MergeMailFiles: HandleErrors, created filenames starts with 1 + + Revision 1.357 2000/01/06 07:31:29 os + #71436# mail merge dialog: execute via status method disposed + + Revision 1.356 1999/12/22 15:57:02 jp + Bug #71238#: MergePrint - behind the first call erase the JobName + + Revision 1.355 1999/12/14 14:35:04 jp + Bug #69595#: print can create single Jobs + + Revision 1.354 1999/11/23 11:20:55 os + comment + + Revision 1.353 1999/11/18 21:02:54 jp + for Bug #68744#: new: IsCaseSensitive + + + +------------------------------------------------------------------------*/ + |