/************************************************************************* * * $RCSfile: textsh2.cxx,v $ * * $Revision: 1.6 $ * * last change: $Author: os $ $Date: 2001-02-21 12:27:37 $ * * 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 #endif #include #ifndef _SBASLTID_HRC //autogen #include #endif #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 _OFF_APP_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 _COMPHELPER_PROCESSFACTORY_HXX_ #include #endif #include "dbmgr.hxx" #include "view.hxx" #include "wrtsh.hxx" #include "swtypes.hxx" #include "cmdid.h" #include "swevent.hxx" #include "shells.hrc" #include "textsh.hxx" #include "dbinsdlg.hxx" using namespace rtl; 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::createFromAscii(cChar) #define C2S(cChar) UniString::CreateFromAscii(cChar) #define DB_DD_DELIM 0x0b inline void AddSelList( List& rLst, long nRow ) { rLst.Insert( (void*)nRow , LIST_APPEND ); } void lcl_QRY_UPDATE( const SfxItemSet *pArgs, SwNewDBMgr *pNewDBMgr, SwWrtShell &rSh, USHORT nSlot ) { DBG_ASSERT( pArgs, "arguments expected" ); if (pArgs) { SbaSelectionListRef pSelectionList; const SfxStringItem &rDBNameItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_DATABASE); const SfxStringItem &rTableNameItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_DBOBJ_NAME); const SfxStringItem &rStatementItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_STATEMENT); DBG_ASSERT( rStatementItem.ISA(SfxStringItem), "invalid argument type" ); const SbaSelectionItem &rSelectionItem = (const SbaSelectionItem&) pArgs->Get(SID_ATTR_SBA_SELECTION); pSelectionList = rSelectionItem.GetSelectionList(); String sDBName(rDBNameItem.GetValue()); String sTableName(rTableNameItem.GetValue()); String sStatement(rStatementItem.GetValue()); pNewDBMgr->SetMergeType( DBMGR_MERGE ); pNewDBMgr->Merge(DBMGR_MERGE, &rSh, sStatement, pSelectionList, sDBName, sTableName); } } /* --------------------------------------------------------------------------- ---------------------------------------------------------------------------*/ void SwBaseShell::ExecDB(SfxRequest &rReq) { const SfxItemSet *pArgs = rReq.GetArgs(); SwNewDBMgr* pNewDBMgr = GetShell().GetNewDBMgr(); USHORT nSlot = rReq.GetSlot(); switch (nSlot) { case SID_SBA_BRW_UPDATE: lcl_QRY_UPDATE( pArgs, pNewDBMgr, GetShell(), nSlot ); break; case SID_SBA_BRW_INSERT: DBG_ASSERT( pArgs, "arguments expected" ); if( pArgs ) { String sDBName = ((SfxStringItem&)pArgs->Get( SID_ATTR_SBA_DATABASE)).GetValue(); String sTblName = ((SfxStringItem&)pArgs->Get( SID_ATTR_SBA_DBOBJ_NAME)).GetValue(); String sStatmnt = ((SfxStringItem&)pArgs->Get( SID_ATTR_SBA_STATEMENT)).GetValue(); SbaSelectionListRef xSelectionList( ((SbaSelectionItem&) pArgs->Get(SID_ATTR_SBA_SELECTION)).GetSelectionList()); String* pDataStr = new String( sDBName ); ((((((*pDataStr) += char(DB_DD_DELIM) ) += sTblName ) += char(DB_DD_DELIM) ) += '0' ) += char(DB_DD_DELIM) ) // Flag fuer Tabelle oder Query - unused! += sStatmnt; if( xSelectionList.Is() ) for( ULONG n = 0, nEnd = xSelectionList->Count(); n < nEnd; ++n ) ((*pDataStr) += char(DB_DD_DELIM) ) += String::CreateFromInt32( (long)xSelectionList->GetObject( n )); SwBaseShell::InsertDBTextHdl( this, pDataStr ); // der String wird im InsertDBTextHdl geloescht !! } break; default: ASSERT(!this, falscher Dispatcher); return; } } void SwTextShell::ExecDB(SfxRequest &rReq) { const SfxItemSet *pArgs = rReq.GetArgs(); SwNewDBMgr* pNewDBMgr = GetShell().GetNewDBMgr(); USHORT nSlot = rReq.GetSlot(); switch (nSlot) { case FN_QRY_INSERT: { String* pNew = new String( ((const SfxStringItem&)pArgs-> Get(nSlot)).GetValue() ); Application::PostUserEvent( STATIC_LINK( this, SwBaseShell, InsertDBTextHdl ), pNew ); // der String wird im InsertDBTextHdl geloescht !! } break; case FN_QRY_MERGE_FIELD: { String sSbaData = ((const SfxStringItem&)pArgs->Get(nSlot)).GetValue(); String sDBName = sSbaData.GetToken(0, DB_DD_DELIM); String sTableName(sSbaData.GetToken(1, DB_DD_DELIM)); BOOL bTable = sSbaData.GetToken(2, DB_DD_DELIM) == C2S("1"); String sStatement = sSbaData.GetToken(3, DB_DD_DELIM); SbaSelectionListRef pSelectionList; pSelectionList.Clear(); pSelectionList = new SbaSelectionList; USHORT nCount = sSbaData.GetTokenCount(DB_DD_DELIM); for( USHORT i = 4; i < nCount; i++ ) AddSelList( *pSelectionList, sSbaData.GetToken( i, DB_DD_DELIM).ToInt32() ); pNewDBMgr->SetMergeType( DBMGR_MERGE ); pNewDBMgr->Merge(DBMGR_MERGE, GetShellPtr(), sStatement, pSelectionList, sDBName, sTableName); } break; case FN_QRY_INSERT_FIELD: { String sSbaData = ((const SfxStringItem&)pArgs->Get(FN_QRY_INSERT_FIELD)).GetValue(); String sDBName = sSbaData.GetToken(0, DB_DD_DELIM); sDBName += DB_DELIM; sDBName += sSbaData.GetToken(1, DB_DD_DELIM); sDBName += DB_DELIM; BOOL bTable = sSbaData.GetToken(2, DB_DD_DELIM) == C2S("1"); sDBName += sSbaData.GetToken(3, DB_DD_DELIM); // Column name InsertDBFld(sDBName); } break; default: ASSERT(!this, falscher Dispatcher); return; } } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ IMPL_STATIC_LINK( SwBaseShell, InsertDBTextHdl, String*, pString ) { if( pString ) { USHORT nTokenPos = 0; String sSourceName( pString->GetToken( 0, DB_DD_DELIM, nTokenPos )); String sTblQryName( pString->GetToken( 0, DB_DD_DELIM, nTokenPos )); String sStatmnt( pString->GetToken( 1, DB_DD_DELIM, nTokenPos )); Reference xSource; Reference< sdbc::XConnection> xConnection = SwNewDBMgr::GetConnection(sSourceName, xSource); Reference< XColumnsSupplier> xColSupp; if(xConnection.is()) xColSupp = SwNewDBMgr::GetColumnSupplier(xConnection, sTblQryName, SW_DB_SELECT_UNKNOWN); if( xColSupp.is() ) { SwDBData aDBData; aDBData.sDataSource = sSourceName; aDBData.sCommand = sStatmnt.Len() ? sStatmnt : sTblQryName; aDBData.nCommandType = sStatmnt.Len() ? sdb::CommandType::COMMAND : sdb::CommandType::TABLE; SwInsertDBColAutoPilot *pDlg = new SwInsertDBColAutoPilot( pThis->GetView(), xSource, xColSupp, aDBData ); if( RET_OK == pDlg->Execute() ) { Sequence aSelection(pString->GetTokenCount(DB_DD_DELIM) - 4 ); sal_Int32* pSelection = aSelection.getArray(); SbaSelectionList aSelectionList; for(sal_Int32 nPos = 0; nPos < aSelection.getLength(); nPos++) { pSelection[nPos] = pString->GetToken( 0, DB_DD_DELIM, nTokenPos ).ToInt32(); } Reference xResSet; pDlg->DataToDoc( aSelection, xSource, xConnection, xResSet); } delete pDlg; } Reference xComp(xConnection, UNO_QUERY); if(xComp.is()) xComp->dispose(); } delete pString; return 0; }