/************************************************************************* * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: textsh2.cxx,v $ * * $Revision: 1.22 $ * * last change: $Author: rt $ $Date: 2005-09-09 10:54:53 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. * * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2005 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 * ************************************************************************/ #pragma hdrstop #if STLPORT_VERSION>=321 #include #endif #include #ifndef _SFXENUMITEM_HXX //autogen #include #endif #ifndef _SFX_WHITER_HXX //autogen #include #endif #ifndef _SFXEVENT_HXX //autogen #include #endif #ifndef _SFXDISPATCH_HXX //autogen #include #endif #ifndef _SFXVIEWFRM_HXX //autogen #include #endif #ifndef _MSGBOX_HXX //autogen #include #endif #ifndef _SFXSTRITEM_HXX //autogen #include #endif #ifndef _SFXITEMSET_HXX #include #endif #ifndef _SFXREQUEST_HXX #include #endif #ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_ #include #endif #ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ #include #endif #ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_ #include #endif #ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_ #include #endif #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ #include #endif #ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_ #include #endif #ifndef _COMPHELPER_PROCESSFACTORY_HXX_ #include #endif #ifndef _COM_SUN_STAR_SDBC_XROWSET_HPP_ #include #endif #ifndef _SFXFRAME_HXX #include #endif #ifndef _FLDMGR_HXX #include #endif #ifndef _FLDBAS_HXX #include #endif #include "dbmgr.hxx" #ifndef _COMPHELPER_UNO3_HXX_ #include #endif #ifndef _SVX_DATACCESSDESCRIPTOR_HXX_ #include #endif #include #include "view.hxx" #include "wrtsh.hxx" #include "swtypes.hxx" #include "cmdid.h" #include "swevent.hxx" #include "shells.hrc" #include "textsh.hxx" //CHINA001 #include "dbinsdlg.hxx" #include "swabstdlg.hxx" //CHINA001 #include "dbui.hrc" //CHINA001 using namespace rtl; using namespace svx; using namespace com::sun::star; using namespace com::sun::star::uno; 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; #define C2U(cChar) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(cChar)) #define C2S(cChar) UniString::CreateFromAscii(cChar) #define DB_DD_DELIM 0x0b struct DBTextStruct_Impl { SwDBData aDBData; Sequence aSelection; Reference xCursor; Reference xConnection; }; inline void AddSelList( List& rLst, long nRow ) { rLst.Insert( (void*)nRow , LIST_APPEND ); } void SwTextShell::ExecDB(SfxRequest &rReq) { const SfxItemSet *pArgs = rReq.GetArgs(); SwNewDBMgr* pNewDBMgr = GetShell().GetNewDBMgr(); USHORT nSlot = rReq.GetSlot(); OUString sSourceArg, sCommandArg; sal_Int32 nCommandTypeArg = 0; const SfxPoolItem* pSourceItem = 0; const SfxPoolItem* pCursorItem = 0; const SfxPoolItem* pConnectionItem = 0; const SfxPoolItem* pCommandItem = 0; const SfxPoolItem* pCommandTypeItem = 0; const SfxPoolItem* pSelectionItem = 0; // first get the selection of rows to be inserted pArgs->GetItemState(FN_DB_DATA_SELECTION_ANY, FALSE, &pSelectionItem); Sequence aSelection; if(pSelectionItem) ((SfxUsrAnyItem*)pSelectionItem)->GetValue() >>= aSelection; // get the data source name pArgs->GetItemState(FN_DB_DATA_SOURCE_ANY, FALSE, &pSourceItem); if(pSourceItem) ((const SfxUsrAnyItem*)pSourceItem)->GetValue() >>= sSourceArg; // get the command pArgs->GetItemState(FN_DB_DATA_COMMAND_ANY, FALSE, &pCommandItem); if(pCommandItem) ((const SfxUsrAnyItem*)pCommandItem)->GetValue() >>= sCommandArg; // get the command type pArgs->GetItemState(FN_DB_DATA_COMMAND_TYPE_ANY, FALSE, &pCommandTypeItem); if(pCommandTypeItem) ((const SfxUsrAnyItem*)pCommandTypeItem)->GetValue() >>= nCommandTypeArg; Reference xConnection; pArgs->GetItemState(FN_DB_CONNECTION_ANY, FALSE, &pConnectionItem); if ( pConnectionItem ) ((const SfxUsrAnyItem*)pConnectionItem)->GetValue() >>= xConnection; // may be we even get no connection if ( !xConnection.is() ) { Reference xSource; xConnection = pNewDBMgr->GetConnection(sSourceArg, xSource); } if(!xConnection.is()) return ; // get the cursor, we use to travel, may be NULL Reference xCursor; pArgs->GetItemState(FN_DB_DATA_CURSOR_ANY, FALSE, &pCursorItem); if ( pCursorItem ) ((const SfxUsrAnyItem*)pCursorItem)->GetValue() >>= xCursor; switch (nSlot) { case FN_QRY_INSERT: { if(pSourceItem && pCommandItem && pCommandTypeItem) { DBTextStruct_Impl* pNew = new DBTextStruct_Impl; pNew->aDBData.sDataSource = sSourceArg; pNew->aDBData.sCommand = sCommandArg; pNew->aDBData.nCommandType = nCommandTypeArg; pNew->aSelection = aSelection; //if the cursor is NULL, it must be created inside InsertDBTextHdl // because it called via a PostUserEvent pNew->xCursor = xCursor; pNew->xConnection = xConnection; Application::PostUserEvent( STATIC_LINK( this, SwBaseShell, InsertDBTextHdl ), pNew ); // the pNew will be removed in InsertDBTextHdl !! } } break; case FN_QRY_MERGE_FIELD: { // we don't get any cursor, so we must create our own BOOL bDisposeResultSet = FALSE; if ( !xCursor.is() ) { xCursor = SwNewDBMgr::createCursor(sSourceArg,sCommandArg,nCommandTypeArg,xConnection); bDisposeResultSet = xCursor.is(); } ODataAccessDescriptor aDescriptor; aDescriptor.setDataSource(sSourceArg); aDescriptor[daCommand] <<= sCommandArg; aDescriptor[daCursor] <<= xCursor; aDescriptor[daSelection] <<= aSelection; aDescriptor[daCommandType] <<= nCommandTypeArg; SwMergeDescriptor aMergeDesc( DBMGR_MERGE, *GetShellPtr(), aDescriptor ); pNewDBMgr->MergeNew(aMergeDesc); if ( bDisposeResultSet ) ::comphelper::disposeComponent(xCursor); } break; case FN_QRY_INSERT_FIELD: { const SfxPoolItem* pColumnItem = 0; const SfxPoolItem* pColumnNameItem = 0; pArgs->GetItemState(FN_DB_COLUMN_ANY, FALSE, &pColumnItem); pArgs->GetItemState(FN_DB_DATA_COLUMN_NAME_ANY, FALSE, &pColumnNameItem); OUString sColumnName; if(pColumnNameItem) ((SfxUsrAnyItem*)pColumnNameItem)->GetValue() >>= sColumnName; String sDBName = sSourceArg; sDBName += DB_DELIM; sDBName += (String)sCommandArg; sDBName += DB_DELIM; sDBName += String::CreateFromInt32(nCommandTypeArg); sDBName += DB_DELIM; sDBName += (String)sColumnName; SwFldMgr aFldMgr(GetShellPtr()); SwInsertFld_Data aData(TYP_DBFLD, 0, sDBName, aEmptyStr, 0, FALSE, TRUE); if(pConnectionItem) aData.aDBConnection = ((SfxUsrAnyItem*)pConnectionItem)->GetValue(); if(pColumnItem) aData.aDBColumn = ((SfxUsrAnyItem*)pColumnItem)->GetValue(); aFldMgr.InsertFld(aData); SfxViewFrame* pViewFrame = GetView().GetViewFrame(); com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder = pViewFrame->GetBindings().GetRecorder(); if ( xRecorder.is() ) { SfxRequest aReq( pViewFrame, FN_INSERT_DBFIELD ); aReq.AppendItem( SfxUInt16Item(FN_PARAM_FIELD_TYPE, TYP_DBFLD)); aReq.AppendItem( SfxStringItem( FN_INSERT_DBFIELD, sDBName )); aReq.AppendItem( SfxStringItem( FN_PARAM_1, sCommandArg )); aReq.AppendItem( SfxStringItem( FN_PARAM_2, sColumnName )); aReq.AppendItem( SfxInt32Item( FN_PARAM_3, nCommandTypeArg)); aReq.Done(); } } break; default: ASSERT(!this, falscher Dispatcher); return; } } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ IMPL_STATIC_LINK( SwBaseShell, InsertDBTextHdl, DBTextStruct_Impl*, pDBStruct ) { if( pDBStruct ) { sal_Bool bDispose = sal_False; Reference< sdbc::XConnection> xConnection = pDBStruct->xConnection; Reference xSource = SwNewDBMgr::getDataSourceAsParent(xConnection,pDBStruct->aDBData.sDataSource); // #111987# the connection is disposed an so no parent has been found if(xConnection.is() && !xSource.is()) return 0; if ( !xConnection.is() ) { xConnection = SwNewDBMgr::GetConnection(pDBStruct->aDBData.sDataSource, xSource); bDispose = sal_True; } Reference< XColumnsSupplier> xColSupp; if(xConnection.is()) xColSupp = SwNewDBMgr::GetColumnSupplier(xConnection, pDBStruct->aDBData.sCommand, pDBStruct->aDBData.nCommandType == CommandType::QUERY ? SW_DB_SELECT_QUERY : SW_DB_SELECT_TABLE); if( xColSupp.is() ) { SwDBData aDBData = pDBStruct->aDBData; //CHINA001 ::std::auto_ptr pDlg( new SwInsertDBColAutoPilot( //CHINA001 pThis->GetView(), //CHINA001 xSource, //CHINA001 xColSupp, //CHINA001 aDBData ) ); SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();//CHINA001 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");//CHINA001 ::std::auto_ptrpDlg (pFact->CreateSwInsertDBColAutoPilot( pThis->GetView(), xSource, xColSupp, aDBData, ResId( DLG_AP_INSERT_DB_SEL ))); //CHINA001 if( RET_OK == pDlg->Execute() ) { Reference xResSet = pDBStruct->xCursor; pDlg->DataToDoc( pDBStruct->aSelection, xSource, xConnection, xResSet); } } if ( bDispose ) ::comphelper::disposeComponent(xConnection); } delete pDBStruct; return 0; }