summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dbaccess/source/ui/app/AppControllerDnD.cxx709
1 files changed, 22 insertions, 687 deletions
diff --git a/dbaccess/source/ui/app/AppControllerDnD.cxx b/dbaccess/source/ui/app/AppControllerDnD.cxx
index cdbe9add35d3..d04cfae5427e 100644
--- a/dbaccess/source/ui/app/AppControllerDnD.cxx
+++ b/dbaccess/source/ui/app/AppControllerDnD.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: AppControllerDnD.cxx,v $
*
- * $Revision: 1.7 $
+ * $Revision: 1.8 $
*
- * last change: $Author: obo $ $Date: 2005-01-05 12:32:32 $
+ * last change: $Author: kz $ $Date: 2005-01-21 17:05:46 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -83,42 +83,27 @@
#ifndef _COM_SUN_STAR_FRAME_XSTORABLE_HPP_
#include <com/sun/star/frame/XStorable.hpp>
#endif
-#ifndef _COM_SUN_STAR_SDBC_XPARAMETERS_HPP_
-#include <com/sun/star/sdbc/XParameters.hpp>
-#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_
#include <com/sun/star/container/XChild.hpp>
#endif
+#ifndef _COM_SUN_STAR_UTIL_XMODIFIABLE_HPP_
+#include <com/sun/star/util/XModifiable.hpp>
+#endif
#ifndef _COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMECONTAINER_HPP_
#include <com/sun/star/container/XHierarchicalNameContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
#include <com/sun/star/sdbc/DataType.hpp>
#endif
+#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
+#include <com/sun/star/sdb/CommandType.hpp>
+#endif
#ifndef _COM_SUN_STAR_SDB_XBOOKMARKSSUPPLIER_HPP_
#include <com/sun/star/sdb/XBookmarksSupplier.hpp>
#endif
-#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
-#include <com/sun/star/sdb/XQueriesSupplier.hpp>
-#endif
-#ifndef _COM_SUN_STAR_SDBC_XRESULTSETMETADATASUPPLIER_HPP_
-#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
-#endif
-#ifndef _COM_SUN_STAR_SDB_XSQLQUERYCOMPOSERFACTORY_HPP_
-#include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp>
-#endif
#ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
#include <com/sun/star/sdb/SQLContext.hpp>
#endif
-#ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_
-#include <com/sun/star/task/XInteractionHandler.hpp>
-#endif
-#ifndef _COM_SUN_STAR_SDBC_XCOLUMNLOCATE_HPP_
-#include <com/sun/star/sdbc/XColumnLocate.hpp>
-#endif
-#ifndef _COM_SUN_STAR_SDBCX_XROWLOCATE_HPP_
-#include <com/sun/star/sdbcx/XRowLocate.hpp>
-#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
@@ -218,33 +203,9 @@
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif
-#ifndef DBAUI_TOKENWRITER_HXX
-#include "TokenWriter.hxx"
-#endif
#ifndef DBAUI_DBEXCHANGE_HXX
#include "dbexchange.hxx"
#endif
-#ifndef DBAUI_WIZ_COPYTABLEDIALOG_HXX
-#include "WCopyTable.hxx"
-#endif
-#ifndef DBAUI_WIZARD_CPAGE_HXX
-#include "WCPage.hxx"
-#endif
-#ifndef DBAUI_WIZ_EXTENDPAGES_HXX
-#include "WExtendPages.hxx"
-#endif
-#ifndef DBAUI_WIZ_NAMEMATCHING_HXX
-#include "WNameMatch.hxx"
-#endif
-#ifndef DBAUI_WIZ_COLUMNSELECT_HXX
-#include "WColumnSelect.hxx"
-#endif
-#ifndef DBAUI_RTFREADER_HXX
-#include "RtfReader.hxx"
-#endif
-#ifndef DBAUI_HTMLREADER_HXX
-#include "HtmlReader.hxx"
-#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
@@ -288,329 +249,8 @@ using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::ucb;
+using namespace ::com::sun::star::util;
- // -----------------------------------------------------------------------------
-#define FILL_PARAM(type,method) \
-{ \
- type nValue = xRow->g##method(i); \
- if ( !xRow->wasNull() ) \
- xParameter->s##method(nPos,nValue); \
- else \
- xParameter->setNull(nPos,aColumnTypes[i]); \
-}
-// -----------------------------------------------------------------------------
-namespace
-{
-void insertRows(const Reference<XResultSet>& xSrcRs,
- const ODatabaseExport::TPositions& _rvColumns,
- const Reference<XPropertySet>& _xDestTable,
- const Reference<XDatabaseMetaData>& _xMetaData,
- sal_Bool bIsAutoIncrement,
- const Sequence<Any>& _aSelection,
- sal_Bool _bBookmarkSelection,
- Window* _pParent
- ) throw(SQLException, RuntimeException)
-{
- Reference< XResultSetMetaDataSupplier> xSrcMetaSup(xSrcRs,UNO_QUERY);
- Reference<XRow> xRow(xSrcRs,UNO_QUERY);
- Reference< XRowLocate > xRowLocate( xSrcRs, UNO_QUERY );
- sal_Bool bUseSelection = _aSelection.getLength() > 0;
-
- if ( !xRow.is() || ( bUseSelection && _bBookmarkSelection && !xRowLocate.is() ) )
- {
- DBG_ERROR( "insertRows: bad arguments!" );
- return;
- }
-
- ::rtl::OUString aSql(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INSERT INTO ")));
- ::rtl::OUString sComposedTableName = ::dbtools::composeTableName(_xMetaData,_xDestTable,sal_True,::dbtools::eInDataManipulation);
-
- aSql += sComposedTableName;
- aSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ( "));
- // set values and column names
- ::rtl::OUString aValues(RTL_CONSTASCII_USTRINGPARAM(" VALUES ( "));
- static ::rtl::OUString aPara(RTL_CONSTASCII_USTRINGPARAM("?,"));
- static ::rtl::OUString aComma(RTL_CONSTASCII_USTRINGPARAM(","));
-
- ::rtl::OUString aQuote;
- if ( _xMetaData.is() )
- aQuote = _xMetaData->getIdentifierQuoteString();
-
- Reference<XColumnsSupplier> xColsSup(_xDestTable,UNO_QUERY);
- OSL_ENSURE(xColsSup.is(),"OApplicationController::insertRows: No columnsSupplier!");
- if(!xColsSup.is())
- return;
-
- // we a vector which all types
- Reference< XResultSetMetaData> xMeta = xSrcMetaSup->getMetaData();
- sal_Int32 nCount = xMeta->getColumnCount();
- ::std::vector<sal_Int32> aColumnTypes;
- aColumnTypes.reserve(nCount+1);
- aColumnTypes.push_back(-1); // just to avoid a everytime i-1 call
-
- for(sal_Int32 k=1;k <= nCount;++k)
- aColumnTypes.push_back(xMeta->getColumnType(k));
-
- // create sql string and set column types
- Reference<XNameAccess> xNameAccess = xColsSup->getColumns();
- Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
- const ::rtl::OUString* pBegin = aSeq.getConstArray();
- const ::rtl::OUString* pEnd = pBegin + aSeq.getLength();
- ::std::vector< ::rtl::OUString> aInsertList;
- aInsertList.resize(aSeq.getLength()+1);
- sal_Int32 i = 0;
- for(sal_uInt32 j=0; j < aInsertList.size() ;++i,++j)
- {
- ODatabaseExport::TPositions::const_iterator aFind = ::std::find_if(_rvColumns.begin(),_rvColumns.end(),
- ::std::compose1(::std::bind2nd(::std::equal_to<sal_Int32>(),i+1),::std::select2nd<ODatabaseExport::TPositions::value_type>()));
- if ( _rvColumns.end() != aFind && aFind->second != CONTAINER_ENTRY_NOTFOUND && aFind->first != CONTAINER_ENTRY_NOTFOUND )
- {
- aInsertList[aFind->first] = ::dbtools::quoteName( aQuote,*(pBegin+i));
- }
- }
-
- i = 1;
- // create the sql string
- for (::std::vector< ::rtl::OUString>::iterator aInsertIter = aInsertList.begin(); aInsertIter != aInsertList.end(); ++aInsertIter)
- {
- if ( aInsertIter->getLength() )
- {
- aSql += *aInsertIter;
- aSql += aComma;
- aValues += aPara;
- }
- }
-
- aSql = aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")));
- aValues = aValues.replaceAt(aValues.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")));
-
- aSql += aValues;
- // now create,fill and execute the prepared statement
- Reference< XPreparedStatement > xPrep(_xMetaData->getConnection()->prepareStatement(aSql));
- Reference< XParameters > xParameter(xPrep,UNO_QUERY);
-
-
- sal_Int32 nRowCount = 0;
- const Any* pSelBegin = _aSelection.getConstArray();
- const Any* pSelEnd = pSelBegin + _aSelection.getLength();
- sal_Bool bNext = sal_True;
- sal_Bool bAlreadyAsked = sal_False;
- do // loop as long as there are more rows or the selection ends
- {
- if ( bUseSelection )
- {
- if ( pSelBegin != pSelEnd )
- {
- if ( _bBookmarkSelection )
- {
- xRowLocate->moveToBookmark( *pSelBegin );
- }
- else
- {
- sal_Int32 nPos = 0;
- *pSelBegin >>= nPos;
- bNext = xSrcRs->absolute( nPos );
- }
- ++pSelBegin;
- }
- else
- bNext = sal_False;
- }
- else
- bNext = xSrcRs->next();
- if ( bNext )
- {
- ++nRowCount;
- sal_Bool bInsertAutoIncrement = sal_True;
- ODatabaseExport::TPositions::const_iterator aPosIter = _rvColumns.begin();
- SQLExceptionInfo aInfo;
- try
- {
- for(sal_Int32 i = 1;aPosIter != _rvColumns.end();++aPosIter)
- {
- sal_Int32 nPos = aPosIter->first;
- if ( nPos == CONTAINER_ENTRY_NOTFOUND )
- {
- ++i; // otherwise we don't get the correct value when only the 2nd source column was selected
- continue;
- }
- if ( bIsAutoIncrement && bInsertAutoIncrement )
- {
- xParameter->setInt(1,nRowCount);
- bInsertAutoIncrement = sal_False;
- continue;
- }
- // we have to check here against 1 because the parameters are 1 based
- OSL_ENSURE( i >= 1 && i < (sal_Int32)aColumnTypes.size(),"Index out of range for column types!");
- switch(aColumnTypes[i])
- {
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- FILL_PARAM( ::rtl::OUString, etString)
- break;
- case DataType::DECIMAL:
- case DataType::NUMERIC:
- case DataType::DOUBLE:
- case DataType::REAL:
- FILL_PARAM( double, etDouble)
- break;
- case DataType::BIGINT:
- FILL_PARAM( sal_Int64, etLong)
- break;
- case DataType::FLOAT:
- FILL_PARAM( float, etFloat)
- break;
- case DataType::LONGVARBINARY:
- case DataType::BINARY:
- case DataType::VARBINARY:
- FILL_PARAM( Sequence< sal_Int8 >, etBytes)
- break;
- case DataType::DATE:
- FILL_PARAM( ::com::sun::star::util::Date, etDate)
- break;
- case DataType::TIME:
- FILL_PARAM( ::com::sun::star::util::Time, etTime)
- break;
- case DataType::TIMESTAMP:
- FILL_PARAM( ::com::sun::star::util::DateTime, etTimestamp)
- break;
- case DataType::BIT:
- FILL_PARAM( sal_Bool, etBoolean)
- break;
- case DataType::TINYINT:
- FILL_PARAM( sal_Int8, etByte)
- break;
- case DataType::SMALLINT:
- FILL_PARAM( sal_Int16, etShort)
- break;
- case DataType::INTEGER:
- FILL_PARAM( sal_Int32, etInt)
- break;
- default:
- OSL_ENSURE(0,"Unknown type");
- }
- ++i;
- }
- xPrep->executeUpdate();
- }
- catch(SQLContext& e) { aInfo = e; }
- catch(SQLWarning& e) { aInfo = e; }
- catch(SQLException& e) { aInfo = e; }
-
- if ( aInfo.isValid() && !bAlreadyAsked )
- {
- String sAskIfContinue = String(ModuleRes(STR_ERROR_OCCURED_WHILE_COPYING));
- String sTitle = String(ModuleRes(STR_STAT_WARNING));
- OSQLMessageBox aDlg(_pParent,sTitle,sAskIfContinue,WB_YES_NO|WB_DEF_YES,OSQLMessageBox::Warning);
- if ( aDlg.Execute() == RET_YES )
- bAlreadyAsked = sal_True;
- else
- {
- SQLException e;
- switch( aInfo.getType() )
- {
- case SQLExceptionInfo::SQL_EXCEPTION:
- throw *(const SQLException*)aInfo;
- break;
- case SQLExceptionInfo::SQL_WARNING:
- throw *(const SQLWarning*)aInfo;
- break;
- case SQLExceptionInfo::SQL_CONTEXT:
- throw *(const SQLContext*)aInfo;
- break;
- }
- }
- }
- }
- }
- while( bNext );
-}
-// -----------------------------------------------------------------------------
-Reference<XResultSet> createResultSet( OApplicationController* _pBrowser,sal_Bool bDispose,
- sal_Int32 _nCommandType,Reference<XConnection>& _xSrcConnection,
- const Reference<XPropertySet>& xSourceObject,
- Reference<XStatement> &xStmt,Reference<XPreparedStatement> &xPrepStmt)
-{
- Reference<XResultSet> xSrcRs;
- ::rtl::OUString sSql;
- if(_nCommandType == CommandType::TABLE)
- {
- sSql = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT "));
- // we need to create the sql stmt with column names
- // otherwise it is possible that names don't match
- ::rtl::OUString sQuote = _xSrcConnection->getMetaData()->getIdentifierQuoteString();
- static ::rtl::OUString sComma = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(","));
-
- Reference<XColumnsSupplier> xSrcColsSup(xSourceObject,UNO_QUERY);
- OSL_ENSURE(xSrcColsSup.is(),"No source columns!");
- Reference<XNameAccess> xNameAccess = xSrcColsSup->getColumns();
- Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
- const ::rtl::OUString* pBegin = aSeq.getConstArray();
- const ::rtl::OUString* pEnd = pBegin + aSeq.getLength();
- for(;pBegin != pEnd;++pBegin)
- {
- sSql += ::dbtools::quoteName( sQuote,*pBegin);
- sSql += sComma;
- }
- sSql = sSql.replaceAt(sSql.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ")));
- sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FROM "));
- sal_Bool bUseCatalogInSelect = ::dbtools::isDataSourcePropertyEnabled(_xSrcConnection,PROPERTY_USECATALOGINSELECT,sal_True);
- sal_Bool bUseSchemaInSelect = ::dbtools::isDataSourcePropertyEnabled(_xSrcConnection,PROPERTY_USESCHEMAINSELECT,sal_True);
- ::rtl::OUString sComposedName = ::dbtools::composeTableName(_xSrcConnection->getMetaData(),xSourceObject,sal_True,::dbtools::eInDataManipulation,bUseCatalogInSelect,bUseSchemaInSelect);
- sSql += sComposedName;
- xStmt = _xSrcConnection->createStatement();
- if( xStmt.is() )
- xSrcRs = xStmt->executeQuery(sSql);
- }
- else
- {
- xSourceObject->getPropertyValue(PROPERTY_COMMAND) >>= sSql;
- xPrepStmt = _xSrcConnection->prepareStatement(sSql);
- if( xPrepStmt.is() )
- {
- // look if we have to fill in some parameters
- // create and fill a composer
- Reference< XMultiServiceFactory > xFactory( _xSrcConnection, UNO_QUERY );
- Reference< XSingleSelectQueryComposer > xComposer;
- if ( xFactory.is() )
- xComposer.set( xFactory->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY );
- if ( xComposer.is() )
- {
- try
- {
- xComposer->setQuery(sSql);
- Reference< XInteractionHandler > xHandler(_pBrowser->getORB()->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.InteractionHandler"))), UNO_QUERY);
- ::dbtools::askForParameters(xComposer,Reference<XParameters>(xPrepStmt,UNO_QUERY),_xSrcConnection,xHandler);
- xSrcRs = xPrepStmt->executeQuery();
- }
- catch(SQLContext&)
- {
- if(bDispose)
- ::comphelper::disposeComponent(_xSrcConnection);
- throw;
- }
- catch(SQLWarning&)
- {
- if(bDispose)
- ::comphelper::disposeComponent(_xSrcConnection);
- throw;
- }
- catch(SQLException&)
- {
- if(bDispose)
- ::comphelper::disposeComponent(_xSrcConnection);
- throw;
- }
- catch (Exception&)
- {
- }
- }
- }
- }
- return xSrcRs;
-}
-}
// -----------------------------------------------------------------------------
void OApplicationController::deleteTables(const ::std::vector< ::rtl::OUString>& _rList)
{
@@ -851,7 +491,7 @@ Reference<XConnection> OApplicationController::getActiveConnection() const
return xConnection;
}
// -----------------------------------------------------------------------------
-void OApplicationController::ensureConnection(Reference<XConnection>& _xConnection,sal_Bool _bCreate)
+bool OApplicationController::ensureConnection(Reference<XConnection>& _xConnection,sal_Bool _bCreate)
{
::vos::OGuard aSolarGuard(Application::GetSolarMutex());
::osl::MutexGuard aGuard(m_aMutex);
@@ -873,6 +513,7 @@ void OApplicationController::ensureConnection(Reference<XConnection>& _xConnecti
// getContainer()->clearSelection();
}
_xConnection = aFind->second;
+ return _xConnection.is();
}
// -----------------------------------------------------------------------------
sal_Bool OApplicationController::isDataSourceReadOnly() const
@@ -990,6 +631,8 @@ void OApplicationController::impl_initialize( const Sequence< Any >& aArguments
}
}
+ Reference<XModifiable> xModi(m_xDataSource,UNO_QUERY);
+ m_bCurrentlyModified = (xModi.is() && xModi->isModified());
sal_Bool bNew = sal_False;
Reference<XModel> xModel(m_xDataSource,UNO_QUERY);
if ( bInteractive && xModel.is() && !xModel->getURL().getLength() && getView() )
@@ -1129,11 +772,11 @@ TransferableHelper* OApplicationController::copyObject()
if ( eType == E_TABLE )
{
- pData = new ODataClipboard(sDataSource, CommandType::TABLE, sName, xConnection, getNumberFormatter(xConnection), getORB());
+ pData = new ODataClipboard(sDataSource, CommandType::TABLE, sName, xConnection, getNumberFormatter(xConnection,getORB()), getORB());
}
else
{
- pData = new ODataClipboard(sDataSource, CommandType::QUERY, sName, getNumberFormatter(xConnection), getORB());
+ pData = new ODataClipboard(sDataSource, CommandType::QUERY, sName, getNumberFormatter(xConnection,getORB()), getORB());
}
}
@@ -1318,286 +961,6 @@ sal_Bool OApplicationController::paste( ElementType _eType,const ::svx::ODataAcc
return sal_False;
}
// -----------------------------------------------------------------------------
-void OApplicationController::pasteTable( SotFormatStringId _nFormatId,const TransferableDataHelper& _rTransData )
-{
- if ( _nFormatId == SOT_FORMATSTR_ID_DBACCESS_TABLE || _nFormatId == SOT_FORMATSTR_ID_DBACCESS_QUERY )
- {
- if ( ODataAccessObjectTransferable::canExtractObjectDescriptor(_rTransData.GetDataFlavorExVector()) )
- pasteTable( ODataAccessObjectTransferable::extractObjectDescriptor(_rTransData) );
- }
- else if ( _rTransData.HasFormat(_nFormatId) )
- {
- try
- {
-
- DropDescriptor aTrans;
- if ( _nFormatId != SOT_FORMAT_RTF )
- const_cast<TransferableDataHelper&>(_rTransData).GetSotStorageStream(_rTransData.HasFormat(SOT_FORMATSTR_ID_HTML) ? SOT_FORMATSTR_ID_HTML : SOT_FORMATSTR_ID_HTML_SIMPLE,aTrans.aHtmlRtfStorage);
- else
- const_cast<TransferableDataHelper&>(_rTransData).GetSotStorageStream(SOT_FORMAT_RTF,aTrans.aHtmlRtfStorage);
-
- aTrans.nType = E_TABLE;
- aTrans.bHtml = SOT_FORMATSTR_ID_HTML == _nFormatId || SOT_FORMATSTR_ID_HTML_SIMPLE == _nFormatId;
- if ( !copyTagTable(aTrans,sal_False) )
- showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*this,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
- }
- catch(SQLContext& e) { showError(SQLExceptionInfo(e)); }
- catch(SQLWarning& e) { showError(SQLExceptionInfo(e)); }
- catch(SQLException& e) { showError(SQLExceptionInfo(e)); }
- catch(Exception& )
- {
- OSL_ENSURE(sal_False, "OApplicationController::pasteTable: caught a generic exception!");
- }
- }
- else
- showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*this,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
-}
-// -----------------------------------------------------------------------------
-void OApplicationController::pasteTable( const TransferableDataHelper& _rTransData )
-{
- if ( _rTransData.HasFormat(SOT_FORMATSTR_ID_DBACCESS_TABLE) || _rTransData.HasFormat(SOT_FORMATSTR_ID_DBACCESS_QUERY) )
- pasteTable( SOT_FORMATSTR_ID_DBACCESS_TABLE,_rTransData);
- else if ( _rTransData.HasFormat(SOT_FORMATSTR_ID_HTML) )
- pasteTable( SOT_FORMATSTR_ID_HTML,_rTransData);
- else if ( _rTransData.HasFormat(SOT_FORMATSTR_ID_HTML_SIMPLE) )
- pasteTable( SOT_FORMATSTR_ID_HTML_SIMPLE,_rTransData);
- else if ( _rTransData.HasFormat(SOT_FORMAT_RTF) )
- pasteTable( SOT_FORMAT_RTF,_rTransData);
-}
-// -----------------------------------------------------------------------------
-void OApplicationController::pasteTable( const ::svx::ODataAccessDescriptor& _rPasteData )
-{
- Reference<XConnection> xSrcConnection;
- Reference<XResultSet> xSrcRs; // the source resultset may be empty
- Sequence< Any > aSelection;
- sal_Bool bBookmarkSelection;
- ::rtl::OUString sCommand,
- sSrcDataSourceName = _rPasteData.getDataSource();
-
- _rPasteData[daCommand] >>= sCommand;
- if ( _rPasteData.has(daConnection) )
- _rPasteData[daConnection] >>= xSrcConnection;
- if ( _rPasteData.has(daSelection) )
- _rPasteData[daSelection] >>= aSelection;
- if ( _rPasteData.has(daBookmarkSelection) )
- _rPasteData[daBookmarkSelection] >>= bBookmarkSelection;
- if ( _rPasteData.has(daCursor) )
- _rPasteData[daCursor] >>= xSrcRs;
-
- // paste into the tables
- sal_Int32 nCommandType = CommandType::COMMAND;
- if ( _rPasteData.has(daCommandType) )
- _rPasteData[daCommandType] >>= nCommandType;
-
- insertTable( nCommandType
- ,xSrcConnection
- ,xSrcRs
- ,aSelection
- ,bBookmarkSelection
- ,sCommand
- ,sSrcDataSourceName);
-}
-// -----------------------------------------------------------------------------
-void OApplicationController::insertTable(sal_Int32 _nCommandType
- ,const Reference<XConnection>& _xSrcConnection
- ,const Reference<XResultSet>& _xSrcRs // the source resultset may be empty
- ,const Sequence< Any >& _aSelection
- ,sal_Bool _bBookmarkSelection
- ,const ::rtl::OUString& _sCommand
- ,const ::rtl::OUString& _sSrcDataSourceName)
-{
- try
- {
- if ( CommandType::QUERY == _nCommandType || CommandType::TABLE == _nCommandType )
- {
- ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
- ::osl::MutexGuard aGuard(m_aMutex);
-
- ::rtl::OUString sDataSourceName = getDatabaseName();
-
- // first get the dest connection
- Reference<XConnection> xDestConnection,xSrcConnection; // supports the service sdb::connection
- ensureConnection(xDestConnection);
- if ( !xDestConnection.is() )
- return;
-
- xSrcConnection = _xSrcConnection;
- Reference<XResultSet> xSrcRs = _xSrcRs;
-
-
- // get the source connection
- sal_Bool bDispose = sal_False;
- if ( _sSrcDataSourceName == sDataSourceName )
- xSrcConnection = xDestConnection;
- else if ( !xSrcConnection.is() )
- {
- Reference< XEventListener> xEvt(static_cast< ::cppu::OWeakObject*>(this), UNO_QUERY);
- showError(::dbaui::createConnection(m_xDataSource,getORB(),xEvt,xSrcConnection));
- bDispose = sal_True;
- }
- Reference<XNameAccess> xNameAccess;
- sal_Bool bTable = sal_True;
- switch(_nCommandType)
- {
- case CommandType::TABLE:
- {
- // only for tables
- Reference<XTablesSupplier> xSup(xSrcConnection,UNO_QUERY);
- if(xSup.is())
- xNameAccess = xSup->getTables();
- }
- break;
- case CommandType::QUERY:
- {
- Reference<XQueriesSupplier> xSup(xSrcConnection,UNO_QUERY);
- if ( xSup.is() )
- xNameAccess = xSup->getQueries();
- bTable = sal_False;
- }
- break;
- }
-
- // check if this name really exists in the name access
- if ( xNameAccess.is() && xNameAccess->hasByName( _sCommand ) )
- {
- Reference<XPropertySet> xSourceObject(xNameAccess->getByName( _sCommand ),UNO_QUERY);
-
- sal_Bool bIsView = sal_False;
- if ( bTable ) // we only have to check if this table has as type VIEW
- {
- static ::rtl::OUString sVIEW = ::rtl::OUString::createFromAscii("VIEW");
- bIsView = ::comphelper::getString(xSourceObject->getPropertyValue(PROPERTY_TYPE)) == sVIEW;
- }
-
- OCopyTableWizard aWizard(getView(),
- xSourceObject,
- xSrcConnection,
- xDestConnection,
- getNumberFormatter(xDestConnection),
- getORB());
- aWizard.fillTypeInfo();
- aWizard.loadData();
- OCopyTable* pPage1 = new OCopyTable(&aWizard,COPY, bIsView,OCopyTableWizard::WIZARD_DEF_DATA);
- OWizNameMatching* pPage2 = new OWizNameMatching(&aWizard);
- OWizColumnSelect* pPage3 = new OWizColumnSelect(&aWizard);
- OWizNormalExtend* pPage4 = new OWizNormalExtend(&aWizard);
-
- aWizard.AddWizardPage(pPage1);
- aWizard.AddWizardPage(pPage2);
- aWizard.AddWizardPage(pPage3);
- aWizard.AddWizardPage(pPage4);
- aWizard.ActivatePage();
-
- if (aWizard.Execute() == RET_OK)
- {
- WaitObject aWO(getView());
- Reference<XPropertySet> xTable;
- switch(aWizard.getCreateStyle())
- {
- case OCopyTableWizard::WIZARD_DEF:
- case OCopyTableWizard::WIZARD_DEF_DATA:
- {
- xTable = aWizard.createTable();
- if(!xTable.is())
- break;
- if(OCopyTableWizard::WIZARD_DEF == aWizard.getCreateStyle())
- break;
- } // run through
- case OCopyTableWizard::WIZARD_APPEND_DATA:
- {
-
- if(!xTable.is())
- xTable = aWizard.createTable();
- if(!xTable.is())
- break;
-
- Reference<XStatement> xStmt; // needed to hold a reference to the statement
- Reference<XPreparedStatement> xPrepStmt;// needed to hold a reference to the statement
-
- ODatabaseExport::TPositions aColumnMapping = aWizard.GetColumnPositions();
- // create the sql stmt
- if ( !xSrcRs.is() ) // if not already exists
- xSrcRs = createResultSet(this,
- bDispose,
- _nCommandType,
- xSrcConnection,
- xSourceObject,
- xStmt,
- xPrepStmt);
- else
- {
- // here I use the ResultSet directly so I have to adjust
- // the column mapping given by the wizard, because the resultset could use
- // another order of the columns
- Reference< XColumnLocate> xLocate(xSrcRs,UNO_QUERY);
- Reference<XColumnsSupplier> xSrcColsSup(xSourceObject,UNO_QUERY);
- OSL_ENSURE(xSrcColsSup.is(),"No source columns!");
- Reference<XNameAccess> xNameAccess = xSrcColsSup->getColumns();
- Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
- const ::rtl::OUString* pBegin = aSeq.getConstArray();
- const ::rtl::OUString* pEnd = pBegin + aSeq.getLength();
-
- ODatabaseExport::TPositions aNewColMapping;
- aNewColMapping.resize( aColumnMapping.size() ,ODatabaseExport::TPositions::value_type(CONTAINER_ENTRY_NOTFOUND,CONTAINER_ENTRY_NOTFOUND) );
-
- for(sal_Int32 k = 0;pBegin != pEnd;++pBegin,++k)
- {
- sal_Int32 nColPos = xLocate->findColumn(*pBegin) -1;
- if ( nColPos >= 0 )
- // aNewColMapping[k] = aColumnMapping[nColPos];
- aNewColMapping[nColPos] = aColumnMapping[k];
- }
- aColumnMapping = aNewColMapping;
- // position the resultset before the first row
- if ( !xSrcRs->isBeforeFirst() )
- xSrcRs->beforeFirst();
- }
- // now insert the rows into the new table
- // we couldn't use the rowset here because it could happen that we haven't a primary key
- insertRows( xSrcRs,
- aColumnMapping,
- xTable,
- xDestConnection->getMetaData(),
- aWizard.isAutoincrementEnabled(),
- _aSelection,
- _bBookmarkSelection,
- getView());
- }
- break;
- case OCopyTableWizard::WIZARD_DEF_VIEW:
- xTable = aWizard.createView();
- break;
- default:
- break;
- }
- }
- }
- else
- {
- switch(_nCommandType)
- {
- case CommandType::TABLE:
- break;
- case CommandType::QUERY:
- break;
- }
- showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*this,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
- }
- if ( bDispose )
- ::comphelper::disposeComponent(xSrcConnection);
- }
- else
- DBG_ERROR("OApplicationController::pasteTable: invalid call (no supported format found)!");
- }
- catch(SQLContext& e) { showError(SQLExceptionInfo(e)); }
- catch(SQLWarning& e) { showError(SQLExceptionInfo(e)); }
- catch(SQLException& e) { showError(SQLExceptionInfo(e)); }
- catch(Exception& )
- {
- OSL_ENSURE(sal_False, "OApplicationController::pasteTable: caught a generic exception!");
- }
-}
-// -----------------------------------------------------------------------------
Reference<XNameContainer> OApplicationController::getQueryDefintions() const
{
Reference<XQueryDefinitionsSupplier> xSet(m_xDataSource,UNO_QUERY);
@@ -1627,16 +990,10 @@ void OApplicationController::getSupportedFormats(ElementType _eType,::std::vecto
// -----------------------------------------------------------------------------
sal_Bool OApplicationController::isTableFormat() const
{
- sal_Bool bTableFormat = getViewClipboard().HasFormat(SOT_FORMATSTR_ID_DBACCESS_TABLE)
- || getViewClipboard().HasFormat(SOT_FORMATSTR_ID_DBACCESS_QUERY)
- || getViewClipboard().HasFormat(SOT_FORMAT_RTF)
- || getViewClipboard().HasFormat(SOT_FORMATSTR_ID_HTML)
- || getViewClipboard().HasFormat(SOT_FORMATSTR_ID_HTML_SIMPLE);
-
- return bTableFormat;
+ return m_aTableCopyHelper.isTableFormat(getViewClipboard());
}
// -----------------------------------------------------------------------------
-sal_Bool OApplicationController::copyTagTable(DropDescriptor& _rDesc, sal_Bool _bCheck)
+sal_Bool OApplicationController::copyTagTable(OTableCopyHelper::DropDescriptor& _rDesc, sal_Bool _bCheck)
{
// first get the dest connection
::osl::MutexGuard aGuard(m_aMutex);
@@ -1646,20 +1003,7 @@ sal_Bool OApplicationController::copyTagTable(DropDescriptor& _rDesc, sal_Bool _
if ( !xDestConnection.is() )
return sal_False;
- Reference<XEventListener> xEvt;
- ODatabaseImportExport* pImport = NULL;
- if ( _rDesc.bHtml )
- pImport = new OHTMLImportExport(xDestConnection,getNumberFormatter(xDestConnection),getORB());
- else
- pImport = new ORTFImportExport(xDestConnection,getNumberFormatter(xDestConnection),getORB());
-
- xEvt = pImport;
- SvStream* pStream = (SvStream*)(SotStorageStream*)_rDesc.aHtmlRtfStorage;
- if ( _bCheck )
- pImport->enableCheckOnly();
-
- pImport->setStream(pStream);
- return pImport->Read();
+ return m_aTableCopyHelper.copyTagTable(_rDesc, _bCheck,xDestConnection);
}
// -----------------------------------------------------------------------------
IMPL_LINK( OApplicationController, OnAsyncDrop, void*, NOTINTERESTEDIN )
@@ -1671,19 +1015,10 @@ IMPL_LINK( OApplicationController, OnAsyncDrop, void*, NOTINTERESTEDIN )
if ( m_aAsyncDrop.nType == E_TABLE )
{
- if ( m_aAsyncDrop.aHtmlRtfStorage.Is() )
- {
- copyTagTable(m_aAsyncDrop,sal_False);
- m_aAsyncDrop.aHtmlRtfStorage = NULL;
- // we now have to delete the temp file created in executeDrop
- INetURLObject aURL;
- aURL.SetURL(m_aAsyncDrop.aUrl);
- ::utl::UCBContentHelper::Kill(aURL.GetMainURL(INetURLObject::NO_DECODE));
- }
- else if ( !m_aAsyncDrop.bError )
- pasteTable(m_aAsyncDrop.aDroppedData);
- else
- showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*this,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
+ Reference<XConnection> xDestConnection; // supports the service sdb::connection
+ ensureConnection( xDestConnection);
+ if ( xDestConnection.is() )
+ m_aTableCopyHelper.asyncCopyTagTable(m_aAsyncDrop,getDatabaseName(),xDestConnection);
}
else
{