diff options
Diffstat (limited to 'sc/source/ui/dbgui/dapidata.cxx')
-rw-r--r-- | sc/source/ui/dbgui/dapidata.cxx | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/sc/source/ui/dbgui/dapidata.cxx b/sc/source/ui/dbgui/dapidata.cxx new file mode 100644 index 000000000000..976e0ae23039 --- /dev/null +++ b/sc/source/ui/dbgui/dapidata.cxx @@ -0,0 +1,229 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +#undef SC_DLLIMPLEMENTATION + + + +//------------------------------------------------------------------ + +#include <tools/debug.hxx> +#include <vcl/waitobj.hxx> +#include <comphelper/processfactory.hxx> + +#include <com/sun/star/sheet/DataImportMode.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#include <com/sun/star/sdb/XQueriesSupplier.hpp> +#include <com/sun/star/sdb/XCompletedConnection.hpp> + +using namespace com::sun::star; + +#include "dapidata.hxx" +#include "scresid.hxx" +#include "sc.hrc" +#include "dapitype.hrc" +#include "miscuno.hxx" +#include "dpsdbtab.hxx" // ScImportSourceDesc + +//------------------------------------------------------------------------- + +#define DP_SERVICE_DBCONTEXT "com.sun.star.sdb.DatabaseContext" +#define SC_SERVICE_INTHANDLER "com.sun.star.task.InteractionHandler" + +// entries in the "type" ListBox +#define DP_TYPELIST_TABLE 0 +#define DP_TYPELIST_QUERY 1 +#define DP_TYPELIST_SQL 2 +#define DP_TYPELIST_SQLNAT 3 + +//------------------------------------------------------------------------- + +ScDataPilotDatabaseDlg::ScDataPilotDatabaseDlg( Window* pParent ) : + ModalDialog ( pParent, ScResId( RID_SCDLG_DAPIDATA ) ), + // + aFlFrame ( this, ScResId( FL_FRAME ) ), + aFtDatabase ( this, ScResId( FT_DATABASE ) ), + aLbDatabase ( this, ScResId( LB_DATABASE ) ), + aFtObject ( this, ScResId( FT_OBJECT ) ), + aCbObject ( this, ScResId( CB_OBJECT ) ), + aFtType ( this, ScResId( FT_OBJTYPE ) ), + aLbType ( this, ScResId( LB_OBJTYPE ) ), + aBtnOk ( this, ScResId( BTN_OK ) ), + aBtnCancel ( this, ScResId( BTN_CANCEL ) ), + aBtnHelp ( this, ScResId( BTN_HELP ) ) +{ + FreeResource(); + + WaitObject aWait( this ); // initializing the database service the first time takes a while + + try + { + // get database names + + uno::Reference<container::XNameAccess> xContext( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString::createFromAscii( DP_SERVICE_DBCONTEXT ) ), + uno::UNO_QUERY); + if (xContext.is()) + { + uno::Sequence<rtl::OUString> aNames = xContext->getElementNames(); + long nCount = aNames.getLength(); + const rtl::OUString* pArray = aNames.getConstArray(); + for (long nPos = 0; nPos < nCount; nPos++) + { + String aName = pArray[nPos]; + aLbDatabase.InsertEntry( aName ); + } + } + } + catch(uno::Exception&) + { + DBG_ERROR("exception in database"); + } + + aLbDatabase.SelectEntryPos( 0 ); + aLbType.SelectEntryPos( 0 ); + + FillObjects(); + + aLbDatabase.SetSelectHdl( LINK( this, ScDataPilotDatabaseDlg, SelectHdl ) ); + aLbType.SetSelectHdl( LINK( this, ScDataPilotDatabaseDlg, SelectHdl ) ); +} + +ScDataPilotDatabaseDlg::~ScDataPilotDatabaseDlg() +{ +} + +void ScDataPilotDatabaseDlg::GetValues( ScImportSourceDesc& rDesc ) +{ + USHORT nSelect = aLbType.GetSelectEntryPos(); + + rDesc.aDBName = aLbDatabase.GetSelectEntry(); + rDesc.aObject = aCbObject.GetText(); + + if ( !rDesc.aDBName.Len() || !rDesc.aObject.Len() ) + rDesc.nType = sheet::DataImportMode_NONE; + else if ( nSelect == DP_TYPELIST_TABLE ) + rDesc.nType = sheet::DataImportMode_TABLE; + else if ( nSelect == DP_TYPELIST_QUERY ) + rDesc.nType = sheet::DataImportMode_QUERY; + else + rDesc.nType = sheet::DataImportMode_SQL; + + rDesc.bNative = ( nSelect == DP_TYPELIST_SQLNAT ); +} + +IMPL_LINK( ScDataPilotDatabaseDlg, SelectHdl, ListBox*, EMPTYARG ) +{ + FillObjects(); + return 0; +} + +void ScDataPilotDatabaseDlg::FillObjects() +{ + aCbObject.Clear(); + + String aDatabaseName = aLbDatabase.GetSelectEntry(); + if (!aDatabaseName.Len()) + return; + + USHORT nSelect = aLbType.GetSelectEntryPos(); + if ( nSelect > DP_TYPELIST_QUERY ) + return; // only tables and queries + + try + { + // open connection (for tables or queries) + + uno::Reference<container::XNameAccess> xContext( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString::createFromAscii( DP_SERVICE_DBCONTEXT ) ), + uno::UNO_QUERY); + if ( !xContext.is() ) return; + + uno::Any aSourceAny = xContext->getByName( aDatabaseName ); + uno::Reference<sdb::XCompletedConnection> xSource( + ScUnoHelpFunctions::AnyToInterface( aSourceAny ), uno::UNO_QUERY ); + if ( !xSource.is() ) return; + + uno::Reference<task::XInteractionHandler> xHandler( + comphelper::getProcessServiceFactory()->createInstance( + rtl::OUString::createFromAscii( SC_SERVICE_INTHANDLER ) ), + uno::UNO_QUERY); + + uno::Reference<sdbc::XConnection> xConnection = xSource->connectWithCompletion( xHandler ); + + uno::Sequence<rtl::OUString> aNames; + if ( nSelect == DP_TYPELIST_TABLE ) + { + // get all tables + + uno::Reference<sdbcx::XTablesSupplier> xTablesSupp( xConnection, uno::UNO_QUERY ); + if ( !xTablesSupp.is() ) return; + + uno::Reference<container::XNameAccess> xTables = xTablesSupp->getTables(); + if ( !xTables.is() ) return; + + aNames = xTables->getElementNames(); + } + else + { + // get all queries + + uno::Reference<sdb::XQueriesSupplier> xQueriesSupp( xConnection, uno::UNO_QUERY ); + if ( !xQueriesSupp.is() ) return; + + uno::Reference<container::XNameAccess> xQueries = xQueriesSupp->getQueries(); + if ( !xQueries.is() ) return; + + aNames = xQueries->getElementNames(); + } + + // fill list + + long nCount = aNames.getLength(); + const rtl::OUString* pArray = aNames.getConstArray(); + for( long nPos=0; nPos<nCount; nPos++ ) + { + String aName = pArray[nPos]; + aCbObject.InsertEntry( aName ); + } + } + catch(uno::Exception&) + { + // #71604# this may happen if an invalid database is selected -> no DBG_ERROR + DBG_WARNING("exception in database"); + } +} + + + + |