1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_dbaccess.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "AppController.hxx" 32*cdf0e10cSrcweir #include "AppDetailView.hxx" 33*cdf0e10cSrcweir #include "AppView.hxx" 34*cdf0e10cSrcweir #include "dbaccess_slotid.hrc" 35*cdf0e10cSrcweir #include "dbu_app.hrc" 36*cdf0e10cSrcweir #include "dbustrings.hrc" 37*cdf0e10cSrcweir #include "defaultobjectnamecheck.hxx" 38*cdf0e10cSrcweir #include "dlgsave.hxx" 39*cdf0e10cSrcweir #include "UITools.hxx" 40*cdf0e10cSrcweir #include "subcomponentmanager.hxx" 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir /** === begin UNO includes === **/ 43*cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/container/XContainer.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/container/XHierarchicalNameContainer.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp> 48*cdf0e10cSrcweir #include <com/sun/star/lang/XEventListener.hpp> 49*cdf0e10cSrcweir #include <com/sun/star/sdb/CommandType.hpp> 50*cdf0e10cSrcweir #include <com/sun/star/sdb/SQLContext.hpp> 51*cdf0e10cSrcweir #include <com/sun/star/sdb/XQueriesSupplier.hpp> 52*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XRename.hpp> 53*cdf0e10cSrcweir #include <com/sun/star/sdb/ErrorCondition.hpp> 54*cdf0e10cSrcweir #include <com/sun/star/sdb/application/DatabaseObject.hpp> 55*cdf0e10cSrcweir #include <com/sun/star/sdb/SQLContext.hpp> 56*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XTablesSupplier.hpp> 57*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XViewsSupplier.hpp> 58*cdf0e10cSrcweir #include <com/sun/star/ucb/Command.hpp> 59*cdf0e10cSrcweir #include <com/sun/star/ucb/XCommandEnvironment.hpp> 60*cdf0e10cSrcweir #include <com/sun/star/ucb/XCommandProcessor.hpp> 61*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 62*cdf0e10cSrcweir #include <com/sun/star/uno/XNamingService.hpp> 63*cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp> 64*cdf0e10cSrcweir #include <com/sun/star/util/XRefreshable.hpp> 65*cdf0e10cSrcweir #include <com/sun/star/lang/XEventListener.hpp> 66*cdf0e10cSrcweir /** === end UNO includes === **/ 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir #include <cppuhelper/exc_hlp.hxx> 69*cdf0e10cSrcweir #include <connectivity/dbexception.hxx> 70*cdf0e10cSrcweir #include <connectivity/dbtools.hxx> 71*cdf0e10cSrcweir #include <connectivity/sqlerror.hxx> 72*cdf0e10cSrcweir #include <connectivity/dbexception.hxx> 73*cdf0e10cSrcweir #include <sfx2/mailmodelapi.hxx> 74*cdf0e10cSrcweir #include <svx/dbaexchange.hxx> 75*cdf0e10cSrcweir #include <toolkit/unohlp.hxx> 76*cdf0e10cSrcweir #include <tools/diagnose_ex.h> 77*cdf0e10cSrcweir #include <tools/urlobj.hxx> 78*cdf0e10cSrcweir #include <unotools/bootstrap.hxx> 79*cdf0e10cSrcweir #include <vcl/mnemonic.hxx> 80*cdf0e10cSrcweir #include <vcl/svapp.hxx> 81*cdf0e10cSrcweir #include <vcl/waitobj.hxx> 82*cdf0e10cSrcweir #include <vos/mutex.hxx> 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir //........................................................................ 85*cdf0e10cSrcweir namespace dbaui 86*cdf0e10cSrcweir { 87*cdf0e10cSrcweir using namespace ::dbtools; 88*cdf0e10cSrcweir using namespace ::connectivity; 89*cdf0e10cSrcweir using namespace ::svx; 90*cdf0e10cSrcweir using namespace ::com::sun::star; 91*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 92*cdf0e10cSrcweir using namespace ::com::sun::star::awt; 93*cdf0e10cSrcweir using namespace ::com::sun::star::util; 94*cdf0e10cSrcweir using namespace ::com::sun::star::frame; 95*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 96*cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs; 97*cdf0e10cSrcweir using namespace ::com::sun::star::sdb; 98*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 99*cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx; 100*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 101*cdf0e10cSrcweir using namespace ::com::sun::star::container; 102*cdf0e10cSrcweir using namespace ::com::sun::star::ucb; 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir /** === begin UNO using === **/ 105*cdf0e10cSrcweir using ::com::sun::star::util::XCloseable; 106*cdf0e10cSrcweir using ::com::sun::star::ui::XContextMenuInterceptor; 107*cdf0e10cSrcweir /** === end UNO using === **/ 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir namespace DatabaseObject = ::com::sun::star::sdb::application::DatabaseObject; 110*cdf0e10cSrcweir namespace ErrorCondition = ::com::sun::star::sdb::ErrorCondition; 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir //........................................................................ 113*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir class CloseChecker : public ::cppu::WeakImplHelper1< com::sun::star::lang::XEventListener > 116*cdf0e10cSrcweir { 117*cdf0e10cSrcweir bool m_bClosed; 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir public: 120*cdf0e10cSrcweir CloseChecker() 121*cdf0e10cSrcweir :m_bClosed( false ) 122*cdf0e10cSrcweir { 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir virtual ~CloseChecker() 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir } 128*cdf0e10cSrcweir 129*cdf0e10cSrcweir bool isClosed() 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir return true; 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir // interface XEventListener 135*cdf0e10cSrcweir virtual void SAL_CALL disposing( const EventObject& /*Source*/ ) throw( RuntimeException ) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir m_bClosed = true; 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir }; 141*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 142*cdf0e10cSrcweir void OApplicationController::convertToView(const ::rtl::OUString& _sName) 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir try 145*cdf0e10cSrcweir { 146*cdf0e10cSrcweir SharedConnection xConnection( getConnection() ); 147*cdf0e10cSrcweir Reference< XQueriesSupplier > xSup( xConnection, UNO_QUERY_THROW ); 148*cdf0e10cSrcweir Reference< XNameAccess > xQueries( xSup->getQueries(), UNO_QUERY_THROW ); 149*cdf0e10cSrcweir Reference< XPropertySet > xSourceObject( xQueries->getByName( _sName ), UNO_QUERY_THROW ); 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir Reference< XTablesSupplier > xTablesSup( xConnection, UNO_QUERY_THROW ); 152*cdf0e10cSrcweir Reference< XNameAccess > xTables( xTablesSup->getTables(), UNO_QUERY_THROW ); 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir Reference< XDatabaseMetaData > xMeta = xConnection->getMetaData(); 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir String aName = String(ModuleRes(STR_TBL_TITLE)); 157*cdf0e10cSrcweir aName = aName.GetToken(0,' '); 158*cdf0e10cSrcweir String aDefaultName = ::dbaui::createDefaultName(xMeta,xTables,aName); 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir DynamicTableOrQueryNameCheck aNameChecker( xConnection, CommandType::TABLE ); 161*cdf0e10cSrcweir OSaveAsDlg aDlg( getView(), CommandType::TABLE, getORB(), xConnection, aDefaultName, aNameChecker ); 162*cdf0e10cSrcweir if ( aDlg.Execute() == RET_OK ) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir ::rtl::OUString sName = aDlg.getName(); 165*cdf0e10cSrcweir ::rtl::OUString sCatalog = aDlg.getCatalog(); 166*cdf0e10cSrcweir ::rtl::OUString sSchema = aDlg.getSchema(); 167*cdf0e10cSrcweir ::rtl::OUString sNewName( 168*cdf0e10cSrcweir ::dbtools::composeTableName( xMeta, sCatalog, sSchema, sName, sal_False, ::dbtools::eInTableDefinitions ) ); 169*cdf0e10cSrcweir Reference<XPropertySet> xView = ::dbaui::createView(sNewName,xConnection,xSourceObject); 170*cdf0e10cSrcweir if ( !xView.is() ) 171*cdf0e10cSrcweir throw SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")) ,0,Any()); 172*cdf0e10cSrcweir getContainer()->elementAdded(E_TABLE,sNewName,makeAny(xView)); 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir catch(const SQLException& ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir showError( SQLExceptionInfo( ::cppu::getCaughtException() ) ); 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir catch( const Exception& ) 180*cdf0e10cSrcweir { 181*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 182*cdf0e10cSrcweir } 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 185*cdf0e10cSrcweir void OApplicationController::pasteFormat(sal_uInt32 _nFormatId) 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir if ( _nFormatId ) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir try 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir const TransferableDataHelper& rClipboard = getViewClipboard(); 192*cdf0e10cSrcweir ElementType eType = getContainer()->getElementType(); 193*cdf0e10cSrcweir if ( eType == E_TABLE ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir m_aTableCopyHelper.pasteTable( _nFormatId, rClipboard, getDatabaseName(), ensureConnection() ); 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir else 198*cdf0e10cSrcweir paste( eType, ODataAccessObjectTransferable::extractObjectDescriptor( rClipboard ) ); 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir catch( const Exception& ) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 208*cdf0e10cSrcweir void OApplicationController::openDataSourceAdminDialog() 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir openDialog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.DatasourceAdministrationDialog" ) ) ); 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 214*cdf0e10cSrcweir void OApplicationController::openDialog( const ::rtl::OUString& _sServiceName ) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir try 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 219*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 220*cdf0e10cSrcweir WaitObject aWO(getView()); 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir Sequence< Any > aArgs(3); 223*cdf0e10cSrcweir sal_Int32 nArgPos = 0; 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir Reference< ::com::sun::star::awt::XWindow> xWindow = getTopMostContainerWindow(); 226*cdf0e10cSrcweir if ( !xWindow.is() ) 227*cdf0e10cSrcweir { 228*cdf0e10cSrcweir DBG_ASSERT( getContainer(), "OApplicationController::Construct: have no view!" ); 229*cdf0e10cSrcweir if ( getContainer() ) 230*cdf0e10cSrcweir xWindow = VCLUnoHelper::GetInterface(getView()->Window::GetParent()); 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir // the parent window 233*cdf0e10cSrcweir aArgs[nArgPos++] <<= PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParentWindow")), 234*cdf0e10cSrcweir 0, 235*cdf0e10cSrcweir makeAny(xWindow), 236*cdf0e10cSrcweir PropertyState_DIRECT_VALUE); 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir // the initial selection 239*cdf0e10cSrcweir ::rtl::OUString sInitialSelection; 240*cdf0e10cSrcweir if ( getContainer() ) 241*cdf0e10cSrcweir sInitialSelection = getDatabaseName(); 242*cdf0e10cSrcweir if ( sInitialSelection.getLength() ) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir aArgs[ nArgPos++ ] <<= PropertyValue( 245*cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InitialSelection" ) ), 0, 246*cdf0e10cSrcweir makeAny( sInitialSelection ), PropertyState_DIRECT_VALUE ); 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir SharedConnection xConnection( getConnection() ); 250*cdf0e10cSrcweir if ( xConnection.is() ) 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir aArgs[ nArgPos++ ] <<= PropertyValue( 253*cdf0e10cSrcweir PROPERTY_ACTIVE_CONNECTION, 0, 254*cdf0e10cSrcweir makeAny( xConnection ), PropertyState_DIRECT_VALUE ); 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir aArgs.realloc( nArgPos ); 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir // create the dialog 259*cdf0e10cSrcweir Reference< XExecutableDialog > xAdminDialog; 260*cdf0e10cSrcweir xAdminDialog = Reference< XExecutableDialog >( 261*cdf0e10cSrcweir getORB()->createInstanceWithArguments(_sServiceName,aArgs), UNO_QUERY); 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir // execute it 264*cdf0e10cSrcweir if (xAdminDialog.is()) 265*cdf0e10cSrcweir xAdminDialog->execute(); 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir catch( const Exception& ) 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir } 272*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 273*cdf0e10cSrcweir void OApplicationController::openTableFilterDialog() 274*cdf0e10cSrcweir { 275*cdf0e10cSrcweir openDialog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.TableFilterDialog" ) ) ); 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 279*cdf0e10cSrcweir void OApplicationController::refreshTables() 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir if ( getContainer() && getContainer()->getDetailView() ) 282*cdf0e10cSrcweir { 283*cdf0e10cSrcweir WaitObject aWO(getView()); 284*cdf0e10cSrcweir OSL_ENSURE(getContainer()->getElementType() == E_TABLE,"Only allowed when the tables container is selected!"); 285*cdf0e10cSrcweir try 286*cdf0e10cSrcweir { 287*cdf0e10cSrcweir Reference<XRefreshable> xRefresh(getElements(E_TABLE),UNO_QUERY); 288*cdf0e10cSrcweir if ( xRefresh.is() ) 289*cdf0e10cSrcweir xRefresh->refresh(); 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir catch(const Exception&) 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir OSL_ENSURE(0,"Could not refresh tables!"); 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir getContainer()->getDetailView()->clearPages(sal_False); 297*cdf0e10cSrcweir getContainer()->getDetailView()->createTablesPage( ensureConnection() ); 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir } 300*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 301*cdf0e10cSrcweir void OApplicationController::openDirectSQLDialog() 302*cdf0e10cSrcweir { 303*cdf0e10cSrcweir openDialog( SERVICE_SDB_DIRECTSQLDIALOG ); 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 306*cdf0e10cSrcweir void SAL_CALL OApplicationController::propertyChange( const PropertyChangeEvent& evt ) throw (RuntimeException) 307*cdf0e10cSrcweir { 308*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 309*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 310*cdf0e10cSrcweir if ( evt.PropertyName == PROPERTY_USER ) 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir m_bNeedToReconnect = sal_True; 313*cdf0e10cSrcweir InvalidateFeature(SID_DB_APP_STATUS_USERNAME); 314*cdf0e10cSrcweir } 315*cdf0e10cSrcweir else if ( evt.PropertyName == PROPERTY_URL ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir m_bNeedToReconnect = sal_True; 318*cdf0e10cSrcweir InvalidateFeature(SID_DB_APP_STATUS_DBNAME); 319*cdf0e10cSrcweir InvalidateFeature(SID_DB_APP_STATUS_TYPE); 320*cdf0e10cSrcweir InvalidateFeature(SID_DB_APP_STATUS_HOSTNAME); 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir else if ( PROPERTY_NAME == evt.PropertyName ) 323*cdf0e10cSrcweir { 324*cdf0e10cSrcweir const ElementType eType = getContainer()->getElementType(); 325*cdf0e10cSrcweir if ( eType == E_FORM || eType == E_REPORT ) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir ::rtl::OUString sOldName,sNewName; 328*cdf0e10cSrcweir evt.OldValue >>= sOldName; 329*cdf0e10cSrcweir evt.NewValue >>= sNewName; 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir // if the old name is empty, then this is a newly inserted content. We're notified of it via the 332*cdf0e10cSrcweir // elementInserted method, so there's no need to handle it here. 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir if ( sOldName.getLength() ) 335*cdf0e10cSrcweir { 336*cdf0e10cSrcweir Reference<XChild> xChild(evt.Source,UNO_QUERY); 337*cdf0e10cSrcweir if ( xChild.is() ) 338*cdf0e10cSrcweir { 339*cdf0e10cSrcweir Reference<XContent> xContent(xChild->getParent(),UNO_QUERY); 340*cdf0e10cSrcweir if ( xContent.is() ) 341*cdf0e10cSrcweir sOldName = xContent->getIdentifier()->getContentIdentifier() + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")) + sOldName; 342*cdf0e10cSrcweir } 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir getContainer()->elementReplaced( eType , sOldName, sNewName ); 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir } 347*cdf0e10cSrcweir } 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir EventObject aEvt; 350*cdf0e10cSrcweir aEvt.Source = m_xModel; 351*cdf0e10cSrcweir modified(aEvt); 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 355*cdf0e10cSrcweir Reference< XDataSource > SAL_CALL OApplicationController::getDataSource() throw (RuntimeException) 356*cdf0e10cSrcweir { 357*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 358*cdf0e10cSrcweir Reference< XDataSource > xDataSource( m_xDataSource, UNO_QUERY ); 359*cdf0e10cSrcweir return xDataSource; 360*cdf0e10cSrcweir } 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 363*cdf0e10cSrcweir Reference< XWindow > SAL_CALL OApplicationController::getApplicationMainWindow() throw (RuntimeException) 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 366*cdf0e10cSrcweir Reference< XFrame > xFrame( getFrame(), UNO_QUERY_THROW ); 367*cdf0e10cSrcweir Reference< XWindow > xWindow( xFrame->getContainerWindow(), UNO_QUERY_THROW ); 368*cdf0e10cSrcweir return xWindow; 369*cdf0e10cSrcweir } 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 372*cdf0e10cSrcweir Sequence< Reference< XComponent > > SAL_CALL OApplicationController::getSubComponents() throw (RuntimeException) 373*cdf0e10cSrcweir { 374*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 375*cdf0e10cSrcweir return m_pSubComponentManager->getSubComponents(); 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 379*cdf0e10cSrcweir Reference< XConnection > SAL_CALL OApplicationController::getActiveConnection() throw (RuntimeException) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 382*cdf0e10cSrcweir return m_xDataSourceConnection.getTyped(); 383*cdf0e10cSrcweir } 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 386*cdf0e10cSrcweir ::sal_Bool SAL_CALL OApplicationController::isConnected( ) throw (RuntimeException) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 389*cdf0e10cSrcweir return m_xDataSourceConnection.is(); 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 393*cdf0e10cSrcweir void SAL_CALL OApplicationController::connect( ) throw (SQLException, RuntimeException) 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir ::vos::OGuard aSolarGuard(Application::GetSolarMutex()); 396*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir SQLExceptionInfo aError; 399*cdf0e10cSrcweir SharedConnection xConnection = ensureConnection( &aError ); 400*cdf0e10cSrcweir if ( !xConnection.is() ) 401*cdf0e10cSrcweir { 402*cdf0e10cSrcweir if ( aError.isValid() ) 403*cdf0e10cSrcweir aError.doThrow(); 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir // no particular error, but nonetheless could not connect -> throw a generic exception 406*cdf0e10cSrcweir String sConnectingContext( ModuleRes( STR_COULDNOTCONNECT_DATASOURCE ) ); 407*cdf0e10cSrcweir sConnectingContext.SearchAndReplaceAscii( "$name$", getStrippedDatabaseName() ); 408*cdf0e10cSrcweir ::dbtools::throwGenericSQLException( sConnectingContext, *this ); 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir 412*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 413*cdf0e10cSrcweir beans::Pair< ::sal_Int32, ::rtl::OUString > SAL_CALL OApplicationController::identifySubComponent( const Reference< XComponent >& i_rSubComponent ) throw (IllegalArgumentException, RuntimeException) 414*cdf0e10cSrcweir { 415*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir sal_Int32 nType = -1; 418*cdf0e10cSrcweir ::rtl::OUString sName; 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir if ( !m_pSubComponentManager->lookupSubComponent( i_rSubComponent, sName, nType ) ) 421*cdf0e10cSrcweir throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir if ( nType == SID_DB_APP_DSRELDESIGN ) 424*cdf0e10cSrcweir // this is somewhat hacky ... we're expected to return a DatabaseObject value. However, there is no such 425*cdf0e10cSrcweir // value for the relation design. /me thinks we should change the API definition here ... 426*cdf0e10cSrcweir nType = -1; 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir return beans::Pair< ::sal_Int32, ::rtl::OUString >( nType, sName ); 429*cdf0e10cSrcweir } 430*cdf0e10cSrcweir 431*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 432*cdf0e10cSrcweir ::sal_Bool SAL_CALL OApplicationController::closeSubComponents( ) throw (RuntimeException) 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir ::vos::OGuard aSolarGuard(Application::GetSolarMutex()); 435*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 436*cdf0e10cSrcweir return m_pSubComponentManager->closeSubComponents(); 437*cdf0e10cSrcweir } 438*cdf0e10cSrcweir 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 441*cdf0e10cSrcweir namespace 442*cdf0e10cSrcweir { 443*cdf0e10cSrcweir ElementType lcl_objectType2ElementType( const sal_Int32 _nObjectType ) 444*cdf0e10cSrcweir { 445*cdf0e10cSrcweir ElementType eType( E_NONE ); 446*cdf0e10cSrcweir switch ( _nObjectType ) 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir case DatabaseObject::TABLE: eType = E_TABLE; break; 449*cdf0e10cSrcweir case DatabaseObject::QUERY: eType = E_QUERY; break; 450*cdf0e10cSrcweir case DatabaseObject::FORM: eType = E_FORM; break; 451*cdf0e10cSrcweir case DatabaseObject::REPORT: eType = E_REPORT; break; 452*cdf0e10cSrcweir default: 453*cdf0e10cSrcweir OSL_ENSURE( false, "lcl_objectType2ElementType: unsupported object type!" ); 454*cdf0e10cSrcweir // this should have been caught earlier 455*cdf0e10cSrcweir } 456*cdf0e10cSrcweir return eType; 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir } 459*cdf0e10cSrcweir 460*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 461*cdf0e10cSrcweir void OApplicationController::impl_validateObjectTypeAndName_throw( const sal_Int32 _nObjectType, const ::boost::optional< ::rtl::OUString >& i_rObjectName ) 462*cdf0e10cSrcweir { 463*cdf0e10cSrcweir // ensure we're connected 464*cdf0e10cSrcweir if ( !isConnected() ) 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir SQLError aError( getORB() ); 467*cdf0e10cSrcweir aError.raiseException( ErrorCondition::DB_NOT_CONNECTED, *this ); 468*cdf0e10cSrcweir } 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir // ensure a proper object type 471*cdf0e10cSrcweir if ( ( _nObjectType != DatabaseObject::TABLE ) 472*cdf0e10cSrcweir && ( _nObjectType != DatabaseObject::QUERY ) 473*cdf0e10cSrcweir && ( _nObjectType != DatabaseObject::FORM ) 474*cdf0e10cSrcweir && ( _nObjectType != DatabaseObject::REPORT ) 475*cdf0e10cSrcweir ) 476*cdf0e10cSrcweir throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); 477*cdf0e10cSrcweir 478*cdf0e10cSrcweir if ( !i_rObjectName ) 479*cdf0e10cSrcweir return; 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir // ensure an existing object 482*cdf0e10cSrcweir Reference< XNameAccess > xContainer( getElements( lcl_objectType2ElementType( _nObjectType ) ) ); 483*cdf0e10cSrcweir if ( !xContainer.is() ) 484*cdf0e10cSrcweir // all possible reasons for this (e.g. not being connected currently) should 485*cdf0e10cSrcweir // have been handled before 486*cdf0e10cSrcweir throw RuntimeException( ::rtl::OUString(), *this ); 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir bool bExistentObject = false; 489*cdf0e10cSrcweir switch ( _nObjectType ) 490*cdf0e10cSrcweir { 491*cdf0e10cSrcweir case DatabaseObject::TABLE: 492*cdf0e10cSrcweir case DatabaseObject::QUERY: 493*cdf0e10cSrcweir bExistentObject = xContainer->hasByName( *i_rObjectName ); 494*cdf0e10cSrcweir break; 495*cdf0e10cSrcweir case DatabaseObject::FORM: 496*cdf0e10cSrcweir case DatabaseObject::REPORT: 497*cdf0e10cSrcweir { 498*cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xHierarchy( xContainer, UNO_QUERY_THROW ); 499*cdf0e10cSrcweir bExistentObject = xHierarchy->hasByHierarchicalName( *i_rObjectName ); 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir break; 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir if ( !bExistentObject ) 505*cdf0e10cSrcweir throw NoSuchElementException( *i_rObjectName, *this ); 506*cdf0e10cSrcweir } 507*cdf0e10cSrcweir 508*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 509*cdf0e10cSrcweir Reference< XComponent > SAL_CALL OApplicationController::loadComponent( ::sal_Int32 _ObjectType, 510*cdf0e10cSrcweir const ::rtl::OUString& _ObjectName, ::sal_Bool _ForEditing ) throw (IllegalArgumentException, NoSuchElementException, SQLException, RuntimeException) 511*cdf0e10cSrcweir { 512*cdf0e10cSrcweir return loadComponentWithArguments( _ObjectType, _ObjectName, _ForEditing, Sequence< PropertyValue >() ); 513*cdf0e10cSrcweir } 514*cdf0e10cSrcweir 515*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 516*cdf0e10cSrcweir Reference< XComponent > SAL_CALL OApplicationController::loadComponentWithArguments( ::sal_Int32 _ObjectType, 517*cdf0e10cSrcweir const ::rtl::OUString& _ObjectName, ::sal_Bool _ForEditing, const Sequence< PropertyValue >& _Arguments ) throw (IllegalArgumentException, NoSuchElementException, SQLException, RuntimeException) 518*cdf0e10cSrcweir { 519*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 520*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 521*cdf0e10cSrcweir 522*cdf0e10cSrcweir impl_validateObjectTypeAndName_throw( _ObjectType, _ObjectName ); 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir Reference< XComponent > xComponent( openElementWithArguments( 525*cdf0e10cSrcweir _ObjectName, 526*cdf0e10cSrcweir lcl_objectType2ElementType( _ObjectType ), 527*cdf0e10cSrcweir _ForEditing ? E_OPEN_DESIGN : E_OPEN_NORMAL, 528*cdf0e10cSrcweir _ForEditing ? SID_DB_APP_EDIT : SID_DB_APP_OPEN, 529*cdf0e10cSrcweir ::comphelper::NamedValueCollection( _Arguments ) 530*cdf0e10cSrcweir ) ); 531*cdf0e10cSrcweir 532*cdf0e10cSrcweir return xComponent; 533*cdf0e10cSrcweir } 534*cdf0e10cSrcweir 535*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 536*cdf0e10cSrcweir Reference< XComponent > SAL_CALL OApplicationController::createComponent( ::sal_Int32 i_nObjectType, Reference< XComponent >& o_DocumentDefinition ) throw (IllegalArgumentException, SQLException, RuntimeException) 537*cdf0e10cSrcweir { 538*cdf0e10cSrcweir return createComponentWithArguments( i_nObjectType, Sequence< PropertyValue >(), o_DocumentDefinition ); 539*cdf0e10cSrcweir } 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 542*cdf0e10cSrcweir Reference< XComponent > SAL_CALL OApplicationController::createComponentWithArguments( ::sal_Int32 i_nObjectType, const Sequence< PropertyValue >& i_rArguments, Reference< XComponent >& o_DocumentDefinition ) throw (IllegalArgumentException, SQLException, RuntimeException) 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 545*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir impl_validateObjectTypeAndName_throw( i_nObjectType, ::boost::optional< ::rtl::OUString >() ); 548*cdf0e10cSrcweir 549*cdf0e10cSrcweir Reference< XComponent > xComponent( newElement( 550*cdf0e10cSrcweir lcl_objectType2ElementType( i_nObjectType ), 551*cdf0e10cSrcweir ::comphelper::NamedValueCollection( i_rArguments ), 552*cdf0e10cSrcweir o_DocumentDefinition 553*cdf0e10cSrcweir ) ); 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir return xComponent; 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 559*cdf0e10cSrcweir void SAL_CALL OApplicationController::registerContextMenuInterceptor( const Reference< XContextMenuInterceptor >& _Interceptor ) throw (RuntimeException) 560*cdf0e10cSrcweir { 561*cdf0e10cSrcweir if ( _Interceptor.is() ) 562*cdf0e10cSrcweir m_aContextMenuInterceptors.addInterface( _Interceptor ); 563*cdf0e10cSrcweir } 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 566*cdf0e10cSrcweir void SAL_CALL OApplicationController::releaseContextMenuInterceptor( const Reference< XContextMenuInterceptor >& _Interceptor ) throw (RuntimeException) 567*cdf0e10cSrcweir { 568*cdf0e10cSrcweir m_aContextMenuInterceptors.removeInterface( _Interceptor ); 569*cdf0e10cSrcweir } 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 572*cdf0e10cSrcweir void OApplicationController::previewChanged( sal_Int32 _nMode ) 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 575*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir if ( m_xDataSource.is() && !isDataSourceReadOnly() ) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir try 580*cdf0e10cSrcweir { 581*cdf0e10cSrcweir ::comphelper::NamedValueCollection aLayoutInfo( m_xDataSource->getPropertyValue( PROPERTY_LAYOUTINFORMATION ) ); 582*cdf0e10cSrcweir sal_Int32 nOldMode = aLayoutInfo.getOrDefault( "Preview", _nMode ); 583*cdf0e10cSrcweir if ( nOldMode != _nMode ) 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir aLayoutInfo.put( "Preview", _nMode ); 586*cdf0e10cSrcweir m_xDataSource->setPropertyValue( PROPERTY_LAYOUTINFORMATION, makeAny( aLayoutInfo.getPropertyValues() ) ); 587*cdf0e10cSrcweir } 588*cdf0e10cSrcweir } 589*cdf0e10cSrcweir catch ( const Exception& ) 590*cdf0e10cSrcweir { 591*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 592*cdf0e10cSrcweir } 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir InvalidateFeature(SID_DB_APP_DISABLE_PREVIEW); 595*cdf0e10cSrcweir InvalidateFeature(SID_DB_APP_VIEW_DOCINFO_PREVIEW); 596*cdf0e10cSrcweir InvalidateFeature(SID_DB_APP_VIEW_DOC_PREVIEW); 597*cdf0e10cSrcweir } 598*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 599*cdf0e10cSrcweir //void OApplicationController::updateTitle() 600*cdf0e10cSrcweir //{ 601*cdf0e10cSrcweir // ::rtl::OUString sName = getStrippedDatabaseName(); 602*cdf0e10cSrcweir // 603*cdf0e10cSrcweir // String sTitle = String(ModuleRes(STR_APP_TITLE)); 604*cdf0e10cSrcweir // sName = sName + sTitle; 605*cdf0e10cSrcweir //#ifdef DBG_UTIL 606*cdf0e10cSrcweir // ::rtl::OUString aDefault; 607*cdf0e10cSrcweir // sName += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" [")); 608*cdf0e10cSrcweir // sName += utl::Bootstrap::getBuildIdData( aDefault ); 609*cdf0e10cSrcweir // sName += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("]")); 610*cdf0e10cSrcweir //#endif 611*cdf0e10cSrcweir //} 612*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 613*cdf0e10cSrcweir void OApplicationController::askToReconnect() 614*cdf0e10cSrcweir { 615*cdf0e10cSrcweir if ( m_bNeedToReconnect ) 616*cdf0e10cSrcweir { 617*cdf0e10cSrcweir m_bNeedToReconnect = sal_False; 618*cdf0e10cSrcweir sal_Bool bClear = sal_True; 619*cdf0e10cSrcweir if ( !m_pSubComponentManager->empty() ) 620*cdf0e10cSrcweir { 621*cdf0e10cSrcweir QueryBox aQry(getView(), ModuleRes(APP_CLOSEDOCUMENTS)); 622*cdf0e10cSrcweir switch (aQry.Execute()) 623*cdf0e10cSrcweir { 624*cdf0e10cSrcweir case RET_YES: 625*cdf0e10cSrcweir closeSubComponents(); 626*cdf0e10cSrcweir break; 627*cdf0e10cSrcweir default: 628*cdf0e10cSrcweir bClear = sal_False; 629*cdf0e10cSrcweir break; 630*cdf0e10cSrcweir } 631*cdf0e10cSrcweir } 632*cdf0e10cSrcweir if ( bClear ) 633*cdf0e10cSrcweir { 634*cdf0e10cSrcweir ElementType eType = getContainer()->getElementType(); 635*cdf0e10cSrcweir disconnect(); 636*cdf0e10cSrcweir getContainer()->getDetailView()->clearPages(sal_False); 637*cdf0e10cSrcweir getContainer()->selectContainer(E_NONE); // invalidate the old selection 638*cdf0e10cSrcweir m_eCurrentType = E_NONE; 639*cdf0e10cSrcweir getContainer()->selectContainer(eType); // reselect the current one again 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir } 642*cdf0e10cSrcweir } 643*cdf0e10cSrcweir 644*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 645*cdf0e10cSrcweir ::rtl::OUString OApplicationController::getDatabaseName() const 646*cdf0e10cSrcweir { 647*cdf0e10cSrcweir ::rtl::OUString sDatabaseName; 648*cdf0e10cSrcweir try 649*cdf0e10cSrcweir { 650*cdf0e10cSrcweir if ( m_xDataSource.is() ) 651*cdf0e10cSrcweir { 652*cdf0e10cSrcweir OSL_VERIFY( m_xDataSource->getPropertyValue( PROPERTY_NAME ) >>= sDatabaseName ); 653*cdf0e10cSrcweir } 654*cdf0e10cSrcweir } 655*cdf0e10cSrcweir catch ( const Exception& ) 656*cdf0e10cSrcweir { 657*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 658*cdf0e10cSrcweir } 659*cdf0e10cSrcweir return sDatabaseName; 660*cdf0e10cSrcweir } 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 663*cdf0e10cSrcweir ::rtl::OUString OApplicationController::getStrippedDatabaseName() const 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir ::rtl::OUString sDatabaseName; 666*cdf0e10cSrcweir return ::dbaui::getStrippedDatabaseName( m_xDataSource, sDatabaseName ); 667*cdf0e10cSrcweir } 668*cdf0e10cSrcweir 669*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 670*cdf0e10cSrcweir void OApplicationController::onDocumentOpened( const ::rtl::OUString& _rName, const sal_Int32 _nType, 671*cdf0e10cSrcweir const ElementOpenMode _eMode, const Reference< XComponent >& _xDocument, const Reference< XComponent >& _rxDefinition ) 672*cdf0e10cSrcweir { 673*cdf0e10cSrcweir if ( !_xDocument.is() ) 674*cdf0e10cSrcweir return; 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir try 677*cdf0e10cSrcweir { 678*cdf0e10cSrcweir OSL_ENSURE( _xDocument.is(), "OApplicationController::onDocumentOpened: is there any *valid* scenario where this fails?" ); 679*cdf0e10cSrcweir m_pSubComponentManager->onSubComponentOpened( _rName, _nType, _eMode, _xDocument.is() ? _xDocument : _rxDefinition ); 680*cdf0e10cSrcweir 681*cdf0e10cSrcweir if ( _rxDefinition.is() ) 682*cdf0e10cSrcweir { 683*cdf0e10cSrcweir Reference< XPropertySet > xProp( _rxDefinition, UNO_QUERY_THROW ); 684*cdf0e10cSrcweir Reference< XPropertySetInfo > xPSI( xProp->getPropertySetInfo(), UNO_SET_THROW ); 685*cdf0e10cSrcweir xProp->addPropertyChangeListener( PROPERTY_NAME, static_cast< XPropertyChangeListener* >( this ) ); 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir } 688*cdf0e10cSrcweir catch( const Exception& ) 689*cdf0e10cSrcweir { 690*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 691*cdf0e10cSrcweir } 692*cdf0e10cSrcweir } 693*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 694*cdf0e10cSrcweir sal_Bool OApplicationController::insertHierachyElement(ElementType _eType,const String& _sParentFolder,sal_Bool _bCollection,const Reference<XContent>& _xContent,sal_Bool _bMove) 695*cdf0e10cSrcweir { 696*cdf0e10cSrcweir Reference<XHierarchicalNameContainer> xNames(getElements(_eType), UNO_QUERY); 697*cdf0e10cSrcweir return dbaui::insertHierachyElement(getView() 698*cdf0e10cSrcweir ,getORB() 699*cdf0e10cSrcweir ,xNames 700*cdf0e10cSrcweir ,_sParentFolder 701*cdf0e10cSrcweir ,_eType == E_FORM 702*cdf0e10cSrcweir ,_bCollection 703*cdf0e10cSrcweir ,_xContent 704*cdf0e10cSrcweir ,_bMove); 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 707*cdf0e10cSrcweir sal_Bool OApplicationController::isRenameDeleteAllowed(ElementType _eType,sal_Bool _bDelete) const 708*cdf0e10cSrcweir { 709*cdf0e10cSrcweir ElementType eType = getContainer()->getElementType(); 710*cdf0e10cSrcweir sal_Bool bEnabled = !isDataSourceReadOnly() && eType == _eType; 711*cdf0e10cSrcweir if ( bEnabled ) 712*cdf0e10cSrcweir { 713*cdf0e10cSrcweir 714*cdf0e10cSrcweir if ( E_TABLE == eType ) 715*cdf0e10cSrcweir bEnabled = !isConnectionReadOnly() && getContainer()->isALeafSelected(); 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir sal_Bool bCompareRes = sal_False; 718*cdf0e10cSrcweir if ( _bDelete ) 719*cdf0e10cSrcweir bCompareRes = getContainer()->getSelectionCount() > 0; 720*cdf0e10cSrcweir else 721*cdf0e10cSrcweir { 722*cdf0e10cSrcweir bCompareRes = getContainer()->getSelectionCount() == 1; 723*cdf0e10cSrcweir if ( bEnabled && bCompareRes && E_TABLE == eType ) 724*cdf0e10cSrcweir { 725*cdf0e10cSrcweir ::std::vector< ::rtl::OUString> aList; 726*cdf0e10cSrcweir getSelectionElementNames(aList); 727*cdf0e10cSrcweir 728*cdf0e10cSrcweir try 729*cdf0e10cSrcweir { 730*cdf0e10cSrcweir Reference< XNameAccess > xContainer = const_cast<OApplicationController*>(this)->getElements(eType); 731*cdf0e10cSrcweir bEnabled = (xContainer.is() && xContainer->hasByName(*aList.begin())); 732*cdf0e10cSrcweir if ( bEnabled ) 733*cdf0e10cSrcweir bEnabled = Reference<XRename>(xContainer->getByName(*aList.begin()),UNO_QUERY).is(); 734*cdf0e10cSrcweir } 735*cdf0e10cSrcweir catch(Exception&) 736*cdf0e10cSrcweir { 737*cdf0e10cSrcweir bEnabled = sal_False; 738*cdf0e10cSrcweir } 739*cdf0e10cSrcweir } 740*cdf0e10cSrcweir } 741*cdf0e10cSrcweir 742*cdf0e10cSrcweir bEnabled = bEnabled && bCompareRes; 743*cdf0e10cSrcweir } 744*cdf0e10cSrcweir return bEnabled; 745*cdf0e10cSrcweir } 746*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 747*cdf0e10cSrcweir void OApplicationController::onLoadedMenu(const Reference< ::com::sun::star::frame::XLayoutManager >& _xLayoutManager) 748*cdf0e10cSrcweir { 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir if ( _xLayoutManager.is() ) 751*cdf0e10cSrcweir { 752*cdf0e10cSrcweir static ::rtl::OUString s_sStatusbar(RTL_CONSTASCII_USTRINGPARAM("private:resource/statusbar/statusbar")); 753*cdf0e10cSrcweir _xLayoutManager->createElement( s_sStatusbar ); 754*cdf0e10cSrcweir _xLayoutManager->requestElement( s_sStatusbar ); 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir if ( getContainer() ) 757*cdf0e10cSrcweir { 758*cdf0e10cSrcweir // we need to share the "mnemonic space": 759*cdf0e10cSrcweir MnemonicGenerator aMnemonicGenerator; 760*cdf0e10cSrcweir // - the menu already has mnemonics 761*cdf0e10cSrcweir SystemWindow* pSystemWindow = getContainer()->GetSystemWindow(); 762*cdf0e10cSrcweir MenuBar* pMenu = pSystemWindow ? pSystemWindow->GetMenuBar() : NULL; 763*cdf0e10cSrcweir if ( pMenu ) 764*cdf0e10cSrcweir { 765*cdf0e10cSrcweir sal_uInt16 nMenuItems = pMenu->GetItemCount(); 766*cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < nMenuItems; ++i ) 767*cdf0e10cSrcweir aMnemonicGenerator.RegisterMnemonic( pMenu->GetItemText( pMenu->GetItemId( i ) ) ); 768*cdf0e10cSrcweir } 769*cdf0e10cSrcweir // - the icons should use automatic ones 770*cdf0e10cSrcweir getContainer()->createIconAutoMnemonics( aMnemonicGenerator ); 771*cdf0e10cSrcweir // - as well as the entries in the task pane 772*cdf0e10cSrcweir getContainer()->setTaskExternalMnemonics( aMnemonicGenerator ); 773*cdf0e10cSrcweir } 774*cdf0e10cSrcweir 775*cdf0e10cSrcweir Execute( SID_DB_APP_VIEW_FORMS, Sequence< PropertyValue >() ); 776*cdf0e10cSrcweir InvalidateAll(); 777*cdf0e10cSrcweir } 778*cdf0e10cSrcweir } 779*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 780*cdf0e10cSrcweir void OApplicationController::doAction(sal_uInt16 _nId ,ElementOpenMode _eOpenMode) 781*cdf0e10cSrcweir { 782*cdf0e10cSrcweir ::std::vector< ::rtl::OUString> aList; 783*cdf0e10cSrcweir getSelectionElementNames(aList); 784*cdf0e10cSrcweir ElementType eType = getContainer()->getElementType(); 785*cdf0e10cSrcweir ::comphelper::NamedValueCollection aArguments; 786*cdf0e10cSrcweir ElementOpenMode eOpenMode = _eOpenMode; 787*cdf0e10cSrcweir if ( eType == E_REPORT && E_OPEN_FOR_MAIL == _eOpenMode ) 788*cdf0e10cSrcweir { 789*cdf0e10cSrcweir aArguments.put("Hidden",true); 790*cdf0e10cSrcweir eOpenMode = E_OPEN_NORMAL; 791*cdf0e10cSrcweir } 792*cdf0e10cSrcweir 793*cdf0e10cSrcweir ::std::vector< ::std::pair< ::rtl::OUString ,Reference< XModel > > > aCompoments; 794*cdf0e10cSrcweir ::std::vector< ::rtl::OUString>::iterator aEnd = aList.end(); 795*cdf0e10cSrcweir for (::std::vector< ::rtl::OUString>::iterator aIter = aList.begin(); aIter != aEnd; ++aIter) 796*cdf0e10cSrcweir { 797*cdf0e10cSrcweir if ( SID_DB_APP_CONVERTTOVIEW == _nId ) 798*cdf0e10cSrcweir convertToView(*aIter); 799*cdf0e10cSrcweir else 800*cdf0e10cSrcweir { 801*cdf0e10cSrcweir Reference< XModel > xModel( openElementWithArguments( *aIter, eType, eOpenMode, _nId,aArguments ), UNO_QUERY ); 802*cdf0e10cSrcweir aCompoments.push_back( ::std::pair< ::rtl::OUString, Reference< XModel > >( *aIter, xModel ) ); 803*cdf0e10cSrcweir } 804*cdf0e10cSrcweir } 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir // special handling for mail, if more than one document is selected attach them all 807*cdf0e10cSrcweir if ( _eOpenMode == E_OPEN_FOR_MAIL ) 808*cdf0e10cSrcweir { 809*cdf0e10cSrcweir 810*cdf0e10cSrcweir ::std::vector< ::std::pair< ::rtl::OUString ,Reference< XModel > > >::iterator componentIter = aCompoments.begin(); 811*cdf0e10cSrcweir ::std::vector< ::std::pair< ::rtl::OUString ,Reference< XModel > > >::iterator componentEnd = aCompoments.end(); 812*cdf0e10cSrcweir ::rtl::OUString aDocTypeString; 813*cdf0e10cSrcweir SfxMailModel aSendMail; 814*cdf0e10cSrcweir SfxMailModel::SendMailResult eResult = SfxMailModel::SEND_MAIL_OK; 815*cdf0e10cSrcweir for (; componentIter != componentEnd && SfxMailModel::SEND_MAIL_OK == eResult; ++componentIter) 816*cdf0e10cSrcweir { 817*cdf0e10cSrcweir try 818*cdf0e10cSrcweir { 819*cdf0e10cSrcweir Reference< XModel > xModel(componentIter->second,UNO_QUERY); 820*cdf0e10cSrcweir 821*cdf0e10cSrcweir // Send document as e-Mail using stored/default type 822*cdf0e10cSrcweir eResult = aSendMail.AttachDocument(aDocTypeString,xModel,componentIter->first); 823*cdf0e10cSrcweir ::comphelper::disposeComponent(xModel); 824*cdf0e10cSrcweir } 825*cdf0e10cSrcweir catch(const Exception&) 826*cdf0e10cSrcweir { 827*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 828*cdf0e10cSrcweir } 829*cdf0e10cSrcweir } 830*cdf0e10cSrcweir if ( !aSendMail.IsEmpty() ) 831*cdf0e10cSrcweir aSendMail.Send( getFrame() ); 832*cdf0e10cSrcweir } 833*cdf0e10cSrcweir } 834*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 835*cdf0e10cSrcweir ElementType OApplicationController::getElementType(const Reference< XContainer >& _xContainer) const 836*cdf0e10cSrcweir { 837*cdf0e10cSrcweir ElementType eRet = E_NONE; 838*cdf0e10cSrcweir Reference<XServiceInfo> xServiceInfo(_xContainer,UNO_QUERY); 839*cdf0e10cSrcweir if ( xServiceInfo.is() ) 840*cdf0e10cSrcweir { 841*cdf0e10cSrcweir if ( xServiceInfo->supportsService(SERVICE_SDBCX_TABLES) ) 842*cdf0e10cSrcweir eRet = E_TABLE; 843*cdf0e10cSrcweir else if ( xServiceInfo->supportsService(SERVICE_NAME_FORM_COLLECTION) ) 844*cdf0e10cSrcweir eRet = E_FORM; 845*cdf0e10cSrcweir else if ( xServiceInfo->supportsService(SERVICE_NAME_REPORT_COLLECTION) ) 846*cdf0e10cSrcweir eRet = E_REPORT; 847*cdf0e10cSrcweir else 848*cdf0e10cSrcweir eRet = E_QUERY; 849*cdf0e10cSrcweir } 850*cdf0e10cSrcweir return eRet; 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir 853*cdf0e10cSrcweir //........................................................................ 854*cdf0e10cSrcweir } // namespace dbaui 855*cdf0e10cSrcweir //........................................................................ 856