1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_dbaccess.hxx" 30 31 32 33 #include "browserids.hxx" 34 #include "brwctrlr.hxx" 35 #include "brwview.hxx" 36 #include "dbu_brw.hrc" 37 #include "dbustrings.hrc" 38 #include "queryfilter.hxx" 39 #include "queryorder.hxx" 40 #include "sqlmessage.hxx" 41 42 /** === begin UNO includes === **/ 43 #include <com/sun/star/beans/PropertyAttribute.hpp> 44 #include <com/sun/star/container/XNameContainer.hpp> 45 #include <com/sun/star/container/XNamed.hpp> 46 #include <com/sun/star/form/FormButtonType.hpp> 47 #include <com/sun/star/form/FormSubmitEncoding.hpp> 48 #include <com/sun/star/form/FormSubmitMethod.hpp> 49 #include <com/sun/star/form/XApproveActionBroadcaster.hpp> 50 #include <com/sun/star/form/XBoundControl.hpp> 51 #include <com/sun/star/form/XChangeBroadcaster.hpp> 52 #include <com/sun/star/form/XChangeListener.hpp> 53 #include <com/sun/star/form/XDatabaseParameterBroadcaster.hpp> 54 #include <com/sun/star/form/XLoadable.hpp> 55 #include <com/sun/star/form/XReset.hpp> 56 #include <com/sun/star/form/XResetListener.hpp> 57 #include <com/sun/star/form/XSubmit.hpp> 58 #include <com/sun/star/form/XSubmitListener.hpp> 59 #include <com/sun/star/form/runtime/XFormController.hpp> 60 #include <com/sun/star/sdb/CommandType.hpp> 61 #include <com/sun/star/sdb/ErrorCondition.hpp> 62 #include <com/sun/star/sdb/ParametersRequest.hpp> 63 #include <com/sun/star/sdb/SQLContext.hpp> 64 #include <com/sun/star/sdb/XInteractionSupplyParameters.hpp> 65 #include <com/sun/star/sdb/XSQLErrorBroadcaster.hpp> 66 #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> 67 #include <com/sun/star/sdb/SQLFilterOperator.hpp> 68 #include <com/sun/star/sdbc/XConnection.hpp> 69 #include <com/sun/star/sdbc/XResultSetUpdate.hpp> 70 #include <com/sun/star/sdbc/XRowSetListener.hpp> 71 #include <com/sun/star/sdbc/XWarningsSupplier.hpp> 72 #include <com/sun/star/sdbcx/Privilege.hpp> 73 #include <com/sun/star/sdbcx/XRowLocate.hpp> 74 #include <com/sun/star/task/XInteractionHandler.hpp> 75 #include <com/sun/star/uno/TypeClass.hpp> 76 #include <com/sun/star/util/XCancellable.hpp> 77 /** === end UNO includes === **/ 78 79 #include <comphelper/enumhelper.hxx> 80 #include <comphelper/extract.hxx> 81 #include <comphelper/interaction.hxx> 82 #include <comphelper/sequence.hxx> 83 #include <connectivity/dbexception.hxx> 84 #include <connectivity/dbtools.hxx> 85 #include <connectivity/sqlerror.hxx> 86 #include <cppuhelper/exc_hlp.hxx> 87 #include <cppuhelper/implbase2.hxx> 88 #include <cppuhelper/typeprovider.hxx> 89 #include <osl/mutex.hxx> 90 #include <rtl/logfile.hxx> 91 #include <sfx2/app.hxx> 92 #include <sfx2/sfx.hrc> 93 #include <svx/fmsearch.hxx> 94 #include <svx/svxdlg.hxx> 95 #include <tools/color.hxx> 96 #include <tools/diagnose_ex.h> 97 #include <vcl/msgbox.hxx> 98 #include <vcl/waitobj.hxx> 99 100 using namespace ::com::sun::star::uno; 101 using namespace ::com::sun::star::awt; 102 using namespace ::com::sun::star::sdb; 103 using namespace ::com::sun::star::sdbc; 104 using namespace ::com::sun::star::sdbcx; 105 using namespace ::com::sun::star::task; 106 using namespace ::com::sun::star::beans; 107 using namespace ::com::sun::star::frame; 108 using namespace ::com::sun::star::form; 109 using namespace ::com::sun::star::util; 110 using namespace ::com::sun::star::lang; 111 using namespace ::com::sun::star::container; 112 using namespace ::dbtools; 113 using namespace ::comphelper; 114 using namespace ::svt; 115 116 #define HANDLE_SQL_ERRORS( action, successflag, context, message ) \ 117 try \ 118 { \ 119 successflag = sal_False; \ 120 action; \ 121 successflag = sal_True; \ 122 } \ 123 catch(SQLException& e) \ 124 { \ 125 SQLException aError = ::dbtools::prependErrorInfo(e, *this, context); \ 126 ::com::sun::star::sdb::SQLErrorEvent aEvent; \ 127 aEvent.Reason <<= aError; \ 128 errorOccured(aEvent); \ 129 } \ 130 catch(Exception&) \ 131 { \ 132 DBG_UNHANDLED_EXCEPTION(); \ 133 } \ 134 135 #define DO_SAFE( action, message ) try { action; } catch(Exception&) { DBG_ERROR(message); } ; 136 137 //.................................................................. 138 namespace dbaui 139 { 140 //.................................................................. 141 142 //================================================================== 143 // OParameterContinuation 144 //================================================================== 145 class OParameterContinuation : public OInteraction< XInteractionSupplyParameters > 146 { 147 Sequence< PropertyValue > m_aValues; 148 149 public: 150 OParameterContinuation() { } 151 152 Sequence< PropertyValue > getValues() const { return m_aValues; } 153 154 // XInteractionSupplyParameters 155 virtual void SAL_CALL setParameters( const Sequence< PropertyValue >& _rValues ) throw(RuntimeException); 156 }; 157 158 //------------------------------------------------------------------ 159 void SAL_CALL OParameterContinuation::setParameters( const Sequence< PropertyValue >& _rValues ) throw(RuntimeException) 160 { 161 m_aValues = _rValues; 162 } 163 164 165 //============================================================================== 166 // a helper class implementing a runtime::XFormController, will be aggregated by SbaXDataBrowserController 167 // (we can't derive from XFormController as it's base class is XTabController and the XTabController::getModel collides 168 // with the XController::getModel implemented in our base class SbaXDataBrowserController) 169 class SbaXDataBrowserController::FormControllerImpl 170 : public ::cppu::WeakAggImplHelper2< ::com::sun::star::form::runtime::XFormController, 171 ::com::sun::star::frame::XFrameActionListener > 172 { 173 friend class SbaXDataBrowserController; 174 ::cppu::OInterfaceContainerHelper m_aActivateListeners; 175 SbaXDataBrowserController* m_pOwner; 176 177 public: 178 FormControllerImpl(SbaXDataBrowserController* pOwner); 179 180 // XFormController 181 virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > SAL_CALL getFormOperations() throw (::com::sun::star::uno::RuntimeException); 182 virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > SAL_CALL getCurrentControl(void) throw( ::com::sun::star::uno::RuntimeException ); 183 virtual void SAL_CALL addActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( ::com::sun::star::uno::RuntimeException ); 184 virtual void SAL_CALL removeActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( ::com::sun::star::uno::RuntimeException ); 185 virtual void SAL_CALL addChildController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _ChildController ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 186 virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext > SAL_CALL getContext() throw (::com::sun::star::uno::RuntimeException); 187 virtual void SAL_CALL setContext( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext >& _context ) throw (::com::sun::star::uno::RuntimeException); 188 virtual ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > SAL_CALL getInteractionHandler() throw (::com::sun::star::uno::RuntimeException); 189 virtual void SAL_CALL setInteractionHandler( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _interactionHandler ) throw (::com::sun::star::uno::RuntimeException); 190 191 // XChild, base of XFormController 192 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent( ) throw (::com::sun::star::uno::RuntimeException); 193 virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Parent ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); 194 195 // XComponent, base of XFormController 196 virtual void SAL_CALL dispose( ) throw (::com::sun::star::uno::RuntimeException); 197 virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); 198 virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 199 200 // XIndexAccess, base of XFormController 201 virtual ::sal_Int32 SAL_CALL getCount( ) throw (::com::sun::star::uno::RuntimeException); 202 virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 203 204 // XElementAccess, base of XIndexAccess 205 virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException); 206 virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException); 207 208 // XEnumerationAccess, base of XElementAccess 209 virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration( ) throw (::com::sun::star::uno::RuntimeException); 210 211 // XModifyBroadcaster, base of XFormController 212 virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 213 virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 214 215 // XConfirmDeleteBroadcaster, base of XFormController 216 virtual void SAL_CALL addConfirmDeleteListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 217 virtual void SAL_CALL removeConfirmDeleteListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 218 219 // XSQLErrorBroadcaster, base of XFormController 220 virtual void SAL_CALL addSQLErrorListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener >& Listener ) throw (::com::sun::star::uno::RuntimeException); 221 virtual void SAL_CALL removeSQLErrorListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener >& Listener ) throw (::com::sun::star::uno::RuntimeException); 222 223 // XRowSetApproveBroadcaster, base of XFormController 224 virtual void SAL_CALL addRowSetApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener >& listener ) throw (::com::sun::star::uno::RuntimeException); 225 virtual void SAL_CALL removeRowSetApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener >& listener ) throw (::com::sun::star::uno::RuntimeException); 226 227 // XDatabaseParameterBroadcaster2, base of XFormController 228 virtual void SAL_CALL addDatabaseParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 229 virtual void SAL_CALL removeDatabaseParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 230 231 // XDatabaseParameterBroadcaster, base of XDatabaseParameterBroadcaster2 232 virtual void SAL_CALL addParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 233 virtual void SAL_CALL removeParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 234 235 // XModeSelector, base of XFormController 236 virtual void SAL_CALL setMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); 237 virtual ::rtl::OUString SAL_CALL getMode( ) throw (::com::sun::star::uno::RuntimeException); 238 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedModes( ) throw (::com::sun::star::uno::RuntimeException); 239 virtual ::sal_Bool SAL_CALL supportsMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::uno::RuntimeException); 240 241 // XTabController, base of XFormController 242 virtual void SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel > & Model) throw( ::com::sun::star::uno::RuntimeException ); 243 virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel > SAL_CALL getModel(void) throw( ::com::sun::star::uno::RuntimeException ); 244 virtual void SAL_CALL setContainer(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > & _Container) throw( ::com::sun::star::uno::RuntimeException ); 245 virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > SAL_CALL getContainer(void) throw( ::com::sun::star::uno::RuntimeException ); 246 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > > SAL_CALL getControls(void) throw( ::com::sun::star::uno::RuntimeException ); 247 virtual void SAL_CALL autoTabOrder(void) throw( ::com::sun::star::uno::RuntimeException ); 248 virtual void SAL_CALL activateTabOrder(void) throw( ::com::sun::star::uno::RuntimeException ); 249 virtual void SAL_CALL activateFirst(void) throw( ::com::sun::star::uno::RuntimeException ); 250 virtual void SAL_CALL activateLast(void) throw( ::com::sun::star::uno::RuntimeException ); 251 252 // XFrameActionListener 253 virtual void SAL_CALL frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); 254 255 // XEventListener 256 virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException ); 257 258 protected: 259 ~FormControllerImpl(); 260 }; 261 262 263 DBG_NAME(FormControllerImpl) 264 //------------------------------------------------------------------ 265 SbaXDataBrowserController::FormControllerImpl::FormControllerImpl(SbaXDataBrowserController* _pOwner) 266 :m_aActivateListeners(_pOwner->getMutex()) 267 ,m_pOwner(_pOwner) 268 { 269 DBG_CTOR(FormControllerImpl,NULL); 270 271 OSL_ENSURE(m_pOwner, "SbaXDataBrowserController::FormControllerImpl::FormControllerImpl : invalid Owner !"); 272 } 273 274 //------------------------------------------------------------------ 275 SbaXDataBrowserController::FormControllerImpl::~FormControllerImpl() 276 { 277 278 DBG_DTOR(FormControllerImpl,NULL); 279 } 280 281 //------------------------------------------------------------------ 282 Reference< runtime::XFormOperations > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getFormOperations() throw (RuntimeException) 283 { 284 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getFormOperations: not supported!" ); 285 return NULL; 286 } 287 288 //------------------------------------------------------------------ 289 Reference< ::com::sun::star::awt::XControl > SbaXDataBrowserController::FormControllerImpl::getCurrentControl(void) throw( RuntimeException ) 290 { 291 return m_pOwner->getBrowserView() ? m_pOwner->getBrowserView()->getGridControl() : Reference< ::com::sun::star::awt::XControl > (); 292 } 293 294 //------------------------------------------------------------------ 295 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addActivateListener(const Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( RuntimeException ) 296 { 297 m_aActivateListeners.addInterface(l); 298 } 299 300 //------------------------------------------------------------------ 301 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeActivateListener(const Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( RuntimeException ) 302 { 303 m_aActivateListeners.removeInterface(l); 304 } 305 306 //------------------------------------------------------------------ 307 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addChildController( const Reference< runtime::XFormController >& /*_ChildController*/ ) throw( RuntimeException, IllegalArgumentException ) 308 { 309 // not supported 310 throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); 311 } 312 313 //------------------------------------------------------------------ 314 Reference< runtime::XFormControllerContext > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getContext() throw (RuntimeException) 315 { 316 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getContext: no support!!" ); 317 return NULL; 318 } 319 320 //------------------------------------------------------------------ 321 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setContext( const Reference< runtime::XFormControllerContext >& /*_context*/ ) throw (RuntimeException) 322 { 323 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::setContext: no support!!" ); 324 } 325 326 //------------------------------------------------------------------ 327 Reference< XInteractionHandler > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getInteractionHandler() throw (RuntimeException) 328 { 329 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getInteractionHandler: no support!!" ); 330 return NULL; 331 } 332 333 //------------------------------------------------------------------ 334 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setInteractionHandler( const Reference< XInteractionHandler >& /*_interactionHandler*/ ) throw (RuntimeException) 335 { 336 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::setInteractionHandler: no support!!" ); 337 } 338 339 //------------------------------------------------------------------ 340 Reference< XInterface > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getParent( ) throw (RuntimeException) 341 { 342 // don't have any parent form controllers 343 return NULL; 344 } 345 346 //------------------------------------------------------------------ 347 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setParent( const Reference< XInterface >& /*Parent*/ ) throw (NoSupportException, RuntimeException) 348 { 349 throw NoSupportException( ::rtl::OUString(), *this ); 350 } 351 352 //------------------------------------------------------------------ 353 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::dispose( ) throw (RuntimeException) 354 { 355 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::dispose: no, you do *not* want to do this!" ); 356 } 357 358 //------------------------------------------------------------------ 359 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addEventListener( const Reference< XEventListener >& /*xListener*/ ) throw (RuntimeException) 360 { 361 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addEventListener: no support!!" ); 362 } 363 364 //------------------------------------------------------------------ 365 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeEventListener( const Reference< XEventListener >& /*aListener*/ ) throw (RuntimeException) 366 { 367 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeEventListener: no support!!" ); 368 } 369 370 //------------------------------------------------------------------ 371 ::sal_Int32 SAL_CALL SbaXDataBrowserController::FormControllerImpl::getCount( ) throw (RuntimeException) 372 { 373 // no sub controllers, never 374 return 0; 375 } 376 377 //------------------------------------------------------------------ 378 Any SAL_CALL SbaXDataBrowserController::FormControllerImpl::getByIndex( ::sal_Int32 /*Index*/ ) throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException) 379 { 380 // no sub controllers, never 381 throw IndexOutOfBoundsException( ::rtl::OUString(), *this ); 382 } 383 384 //------------------------------------------------------------------ 385 Type SAL_CALL SbaXDataBrowserController::FormControllerImpl::getElementType( ) throw (RuntimeException) 386 { 387 return ::cppu::UnoType< runtime::XFormController >::get(); 388 } 389 390 //------------------------------------------------------------------ 391 ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::hasElements( ) throw (RuntimeException) 392 { 393 // no sub controllers, never 394 return false; 395 } 396 397 //------------------------------------------------------------------ 398 Reference< XEnumeration > SAL_CALL SbaXDataBrowserController::FormControllerImpl::createEnumeration( ) throw (RuntimeException) 399 { 400 return new ::comphelper::OEnumerationByIndex( this ); 401 } 402 403 //------------------------------------------------------------------ 404 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addModifyListener( const Reference< XModifyListener >& /*_Listener*/ ) throw (RuntimeException) 405 { 406 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addModifyListener: no support!" ); 407 } 408 409 //------------------------------------------------------------------ 410 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeModifyListener( const Reference< XModifyListener >& /*_Listener*/ ) throw (RuntimeException) 411 { 412 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeModifyListener: no support!" ); 413 } 414 415 //------------------------------------------------------------------ 416 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addConfirmDeleteListener( const Reference< XConfirmDeleteListener >& /*_Listener*/ ) throw (RuntimeException) 417 { 418 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addConfirmDeleteListener: no support!" ); 419 } 420 421 //------------------------------------------------------------------ 422 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeConfirmDeleteListener( const Reference< XConfirmDeleteListener >& /*_Listener*/ ) throw (RuntimeException) 423 { 424 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeConfirmDeleteListener: no support!" ); 425 } 426 427 //------------------------------------------------------------------ 428 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addSQLErrorListener( const Reference< XSQLErrorListener >& /*_Listener*/ ) throw (RuntimeException) 429 { 430 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addSQLErrorListener: no support!" ); 431 } 432 433 //------------------------------------------------------------------ 434 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeSQLErrorListener( const Reference< XSQLErrorListener >& /*_Listener*/ ) throw (RuntimeException) 435 { 436 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeSQLErrorListener: no support!" ); 437 } 438 439 //------------------------------------------------------------------ 440 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addRowSetApproveListener( const Reference< XRowSetApproveListener >& /*_Listener*/ ) throw (RuntimeException) 441 { 442 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addRowSetApproveListener: no support!" ); 443 } 444 445 //------------------------------------------------------------------ 446 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeRowSetApproveListener( const Reference< XRowSetApproveListener >& /*_Listener*/ ) throw (RuntimeException) 447 { 448 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeRowSetApproveListener: no support!" ); 449 } 450 451 //------------------------------------------------------------------ 452 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addDatabaseParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) 453 { 454 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addDatabaseParameterListener: no support!" ); 455 } 456 457 //------------------------------------------------------------------ 458 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeDatabaseParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) 459 { 460 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeDatabaseParameterListener: no support!" ); 461 } 462 463 //------------------------------------------------------------------ 464 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) 465 { 466 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addParameterListener: no support!" ); 467 } 468 469 //------------------------------------------------------------------ 470 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) 471 { 472 OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeParameterListener: no support!" ); 473 } 474 475 //------------------------------------------------------------------ 476 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setMode( const ::rtl::OUString& _rMode ) throw (NoSupportException, RuntimeException) 477 { 478 if ( !supportsMode( _rMode ) ) 479 throw NoSupportException(); 480 } 481 482 //------------------------------------------------------------------ 483 ::rtl::OUString SAL_CALL SbaXDataBrowserController::FormControllerImpl::getMode( ) throw (RuntimeException) 484 { 485 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); 486 } 487 488 //------------------------------------------------------------------ 489 Sequence< ::rtl::OUString > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getSupportedModes( ) throw (RuntimeException) 490 { 491 Sequence< ::rtl::OUString > aModes(1); 492 aModes[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); 493 return aModes; 494 } 495 496 //------------------------------------------------------------------ 497 ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::supportsMode( const ::rtl::OUString& aMode ) throw (RuntimeException) 498 { 499 return aMode.compareToAscii( "DataMode" ) == 0; 500 } 501 502 //------------------------------------------------------------------ 503 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setModel(const Reference< ::com::sun::star::awt::XTabControllerModel > & /*Model*/) throw( RuntimeException ) 504 { 505 OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::setModel : invalid call, can't change my model !"); 506 } 507 508 //------------------------------------------------------------------ 509 Reference< ::com::sun::star::awt::XTabControllerModel > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getModel(void) throw( RuntimeException ) 510 { 511 return Reference< XTabControllerModel >(m_pOwner->getRowSet(), UNO_QUERY); 512 } 513 514 //------------------------------------------------------------------ 515 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setContainer(const Reference< ::com::sun::star::awt::XControlContainer > & /*_Container*/) throw( RuntimeException ) 516 { 517 OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::setContainer : invalid call, can't change my container !"); 518 } 519 520 //------------------------------------------------------------------ 521 Reference< ::com::sun::star::awt::XControlContainer > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getContainer(void) throw( RuntimeException ) 522 { 523 if (m_pOwner->getBrowserView()) 524 return m_pOwner->getBrowserView()->getContainer(); 525 return Reference< ::com::sun::star::awt::XControlContainer > (); 526 } 527 528 //------------------------------------------------------------------ 529 Sequence< Reference< ::com::sun::star::awt::XControl > > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getControls(void) throw( RuntimeException ) 530 { 531 if (m_pOwner->getBrowserView()) 532 { 533 Reference< ::com::sun::star::awt::XControl > xGrid = m_pOwner->getBrowserView()->getGridControl(); 534 return Sequence< Reference< ::com::sun::star::awt::XControl > >(&xGrid, 1); 535 } 536 return Sequence< Reference< ::com::sun::star::awt::XControl > >(); 537 } 538 539 //------------------------------------------------------------------ 540 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::autoTabOrder(void) throw( RuntimeException ) 541 { 542 OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::autoTabOrder : nothing to do (always have only one control) !"); 543 } 544 545 //------------------------------------------------------------------ 546 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateTabOrder(void) throw( RuntimeException ) 547 { 548 OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::activateTabOrder : nothing to do (always have only one control) !"); 549 } 550 551 //------------------------------------------------------------------ 552 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateFirst(void) throw( RuntimeException ) 553 { 554 if (m_pOwner->getBrowserView()) 555 m_pOwner->getBrowserView()->getVclControl()->ActivateCell(); 556 } 557 558 //------------------------------------------------------------------ 559 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateLast(void) throw( RuntimeException ) 560 { 561 if (m_pOwner->getBrowserView()) 562 m_pOwner->getBrowserView()->getVclControl()->ActivateCell(); 563 } 564 565 //------------------------------------------------------------------ 566 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::frameAction(const ::com::sun::star::frame::FrameActionEvent& /*aEvent*/) throw( RuntimeException ) 567 { 568 } 569 570 //------------------------------------------------------------------ 571 void SAL_CALL SbaXDataBrowserController::FormControllerImpl::disposing(const ::com::sun::star::lang::EventObject& /*Source*/) throw( RuntimeException ) 572 { 573 // nothing to do 574 // we don't add ourself as listener to any broadcasters, so we are not resposible for removing us 575 } 576 577 //================================================================== 578 //= SbaXDataBrowserController 579 //================================================================== 580 //------------------------------------------------------------------ 581 Sequence< Type > SAL_CALL SbaXDataBrowserController::getTypes( ) throw (RuntimeException) 582 { 583 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getTypes" ); 584 return ::comphelper::concatSequences( 585 SbaXDataBrowserController_Base::getTypes(), 586 m_pFormControllerImpl->getTypes() 587 ); 588 } 589 590 //------------------------------------------------------------------ 591 Sequence< sal_Int8 > SAL_CALL SbaXDataBrowserController::getImplementationId( ) throw (RuntimeException) 592 { 593 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getImplementationId" ); 594 static ::cppu::OImplementationId * pId = 0; 595 if (! pId) 596 { 597 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 598 if (! pId) 599 { 600 static ::cppu::OImplementationId aId; 601 pId = &aId; 602 } 603 } 604 return pId->getImplementationId(); 605 } 606 607 //------------------------------------------------------------------ 608 Any SAL_CALL SbaXDataBrowserController::queryInterface(const Type& _rType) throw (RuntimeException) 609 { 610 // check for our additional interfaces 611 Any aRet = SbaXDataBrowserController_Base::queryInterface(_rType); 612 613 // check for our aggregate (implementing the XFormController) 614 if (!aRet.hasValue()) 615 aRet = m_xFormControllerImpl->queryAggregation(_rType); 616 617 // no more to offer 618 return aRet; 619 } 620 621 DBG_NAME(SbaXDataBrowserController) 622 //------------------------------------------------------------------------------ 623 SbaXDataBrowserController::SbaXDataBrowserController(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM) 624 :SbaXDataBrowserController_Base(_rM) 625 ,m_nRowSetPrivileges(0) 626 ,m_pClipbordNotifier( NULL ) 627 ,m_aAsyncGetCellFocus(LINK(this, SbaXDataBrowserController, OnAsyncGetCellFocus)) 628 ,m_aAsyncDisplayError( LINK( this, SbaXDataBrowserController, OnAsyncDisplayError ) ) 629 ,m_sStateSaveRecord(ModuleRes(RID_STR_SAVE_CURRENT_RECORD)) 630 ,m_sStateUndoRecord(ModuleRes(RID_STR_UNDO_MODIFY_RECORD)) 631 ,m_sModuleIdentifier( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.DataSourceBrowser" ) ) ) 632 ,m_pFormControllerImpl(NULL) 633 ,m_nPendingLoadFinished(0) 634 ,m_nFormActionNestingLevel(0) 635 ,m_bLoadCanceled( sal_False ) 636 ,m_bClosingKillOpen( sal_False ) 637 ,m_bCannotSelectUnfiltered( true ) 638 { 639 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SbaXDataBrowserController" ); 640 DBG_CTOR(SbaXDataBrowserController,NULL); 641 642 // create the form controller aggregate 643 ::comphelper::increment(m_refCount); 644 { 645 m_pFormControllerImpl = new FormControllerImpl(this); 646 m_xFormControllerImpl = m_pFormControllerImpl; 647 m_xFormControllerImpl->setDelegator(*this); 648 } 649 ::comphelper::decrement(m_refCount); 650 651 m_aInvalidateClipboard.SetTimeoutHdl(LINK(this, SbaXDataBrowserController, OnInvalidateClipboard)); 652 m_aInvalidateClipboard.SetTimeout(300); 653 } 654 655 //------------------------------------------------------------------------------ 656 SbaXDataBrowserController::~SbaXDataBrowserController() 657 { 658 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::~SbaXDataBrowserController" ); 659 // deleteView(); 660 // release the aggregated form controller 661 if (m_xFormControllerImpl.is()) 662 { 663 Reference< XInterface > xEmpty; 664 m_xFormControllerImpl->setDelegator(xEmpty); 665 } 666 667 DBG_DTOR(SbaXDataBrowserController,NULL); 668 } 669 670 // ----------------------------------------------------------------------- 671 void SbaXDataBrowserController::startFrameListening( const Reference< XFrame >& _rxFrame ) 672 { 673 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::startFrameListening" ); 674 SbaXDataBrowserController_Base::startFrameListening( _rxFrame ); 675 676 Reference< XFrameActionListener > xAggListener; 677 if ( m_xFormControllerImpl.is() ) 678 m_xFormControllerImpl->queryAggregation( XFrameActionListener::static_type() ) >>= xAggListener; 679 680 if ( _rxFrame.is() && xAggListener.is() ) 681 _rxFrame->addFrameActionListener( xAggListener ); 682 } 683 684 // ----------------------------------------------------------------------- 685 void SbaXDataBrowserController::stopFrameListening( const Reference< XFrame >& _rxFrame ) 686 { 687 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::stopFrameListening" ); 688 SbaXDataBrowserController_Base::stopFrameListening( _rxFrame ); 689 690 Reference< XFrameActionListener > xAggListener; 691 if ( m_xFormControllerImpl.is() ) 692 m_xFormControllerImpl->queryAggregation( XFrameActionListener::static_type() ) >>= xAggListener; 693 694 if ( _rxFrame.is() && xAggListener.is() ) 695 _rxFrame->removeFrameActionListener( xAggListener ); 696 } 697 698 // ----------------------------------------------------------------------------- 699 void SbaXDataBrowserController::onStartLoading( const Reference< XLoadable >& _rxLoadable ) 700 { 701 m_bLoadCanceled = sal_False; 702 m_bCannotSelectUnfiltered = false; 703 704 Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY ); 705 if ( xWarnings.is() ) 706 xWarnings->clearWarnings(); 707 } 708 709 // ----------------------------------------------------------------------------- 710 void SbaXDataBrowserController::impl_checkForCannotSelectUnfiltered( const SQLExceptionInfo& _rError ) 711 { 712 ::connectivity::SQLError aError( getORB() ); 713 ::connectivity::ErrorCode nErrorCode( aError.getErrorCode( ErrorCondition::DATA_CANNOT_SELECT_UNFILTERED ) ); 714 if ( ((const SQLException*)_rError)->ErrorCode == nErrorCode ) 715 { 716 m_bCannotSelectUnfiltered = true; 717 InvalidateFeature( ID_BROWSER_FILTERCRIT ); 718 } 719 } 720 721 // ----------------------------------------------------------------------------- 722 sal_Bool SbaXDataBrowserController::reloadForm( const Reference< XLoadable >& _rxLoadable ) 723 { 724 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloadForm" ); 725 WaitObject aWO(getBrowserView()); 726 727 onStartLoading( _rxLoadable ); 728 729 FormErrorHelper aReportError(this); 730 if (_rxLoadable->isLoaded()) 731 _rxLoadable->reload(); 732 else 733 _rxLoadable->load(); 734 735 m_xParser.clear(); 736 const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 737 if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING))) 738 xFormSet->getPropertyValue(PROPERTY_SINGLESELECTQUERYCOMPOSER) >>= m_xParser; 739 #if 0 740 { 741 const Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY ); 742 const Reference< XSingleSelectQueryAnalyzer > xAnalyzer( xRowSetProps->getPropertyValue( PROPERTY_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY ); 743 if ( xAnalyzer.is() ) 744 { 745 const Reference< XIndexAccess > xOrderColumns( xAnalyzer->getOrderColumns(), UNO_SET_THROW ); 746 const sal_Int32 nOrderColumns( xOrderColumns->getCount() ); 747 for ( sal_Int32 c=0; c<nOrderColumns; ++c ) 748 { 749 const Reference< XPropertySet > xOrderColumn( xOrderColumns->getByIndex(c), UNO_QUERY_THROW ); 750 ::rtl::OUString sColumnName; 751 OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_NAME ) >>= sColumnName); 752 ::rtl::OUString sTableName; 753 OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_TABLENAME ) >>= sTableName); 754 (void)sColumnName; 755 (void)sTableName; 756 } 757 } 758 } 759 #endif 760 761 Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY ); 762 if ( xWarnings.is() ) 763 { 764 try 765 { 766 SQLExceptionInfo aInfo( xWarnings->getWarnings() ); 767 if ( aInfo.isValid() ) 768 { 769 showError( aInfo ); 770 impl_checkForCannotSelectUnfiltered( aInfo ); 771 } 772 } 773 catch(const SQLException& e) 774 { 775 (void)e; 776 } 777 } 778 779 return _rxLoadable->isLoaded(); 780 } 781 782 // ----------------------------------------------------------------------------- 783 void SbaXDataBrowserController::initFormatter() 784 { 785 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::initFormatter" ); 786 // --------------------------------------------------------------- 787 // create a formatter working with the connections format supplier 788 Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier(::dbtools::getNumberFormats(::dbtools::getConnection(m_xRowSet), sal_True,getORB())); 789 790 if(xSupplier.is()) 791 { 792 // create a new formatter 793 m_xFormatter = Reference< ::com::sun::star::util::XNumberFormatter > ( 794 getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")), UNO_QUERY); 795 if (m_xFormatter.is()) 796 m_xFormatter->attachNumberFormatsSupplier(xSupplier); 797 } 798 else // clear the formatter 799 m_xFormatter = NULL; 800 } 801 // ----------------------------------------------------------------------------- 802 void SbaXDataBrowserController::describeSupportedFeatures() 803 { 804 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::describeSupportedFeatures" ); 805 SbaXDataBrowserController_Base::describeSupportedFeatures(); 806 implDescribeSupportedFeature( ".uno:FormSlots/undoRecord", ID_BROWSER_UNDORECORD, CommandGroup::CONTROLS ); 807 implDescribeSupportedFeature( ".uno:FormController/undoRecord", ID_BROWSER_UNDORECORD, CommandGroup::CONTROLS ); 808 implDescribeSupportedFeature( ".uno:RecUndo", ID_BROWSER_UNDORECORD, CommandGroup::CONTROLS ); 809 implDescribeSupportedFeature( ".uno:FormSlots/saveRecord", ID_BROWSER_SAVERECORD, CommandGroup::CONTROLS ); 810 implDescribeSupportedFeature( ".uno:FormController/saveRecord", ID_BROWSER_SAVERECORD, CommandGroup::CONTROLS ); 811 implDescribeSupportedFeature( ".uno:RecSave", ID_BROWSER_SAVERECORD, CommandGroup::CONTROLS ); 812 implDescribeSupportedFeature( ".uno:Save", ID_BROWSER_SAVERECORD, CommandGroup::DOCUMENT ); 813 implDescribeSupportedFeature( ".uno:RecSearch", SID_FM_SEARCH, CommandGroup::CONTROLS ); 814 implDescribeSupportedFeature( ".uno:AutoFilter", SID_FM_AUTOFILTER, CommandGroup::CONTROLS ); 815 implDescribeSupportedFeature( ".uno:Refresh", SID_FM_REFRESH, CommandGroup::CONTROLS ); 816 implDescribeSupportedFeature( ".uno:OrderCrit", SID_FM_ORDERCRIT, CommandGroup::CONTROLS ); 817 implDescribeSupportedFeature( ".uno:RemoveFilterSort", SID_FM_REMOVE_FILTER_SORT,CommandGroup::CONTROLS ); 818 implDescribeSupportedFeature( ".uno:FormFiltered", SID_FM_FORM_FILTERED, CommandGroup::CONTROLS ); 819 implDescribeSupportedFeature( ".uno:FilterCrit", SID_FM_FILTERCRIT, CommandGroup::CONTROLS ); 820 implDescribeSupportedFeature( ".uno:Sortup", ID_BROWSER_SORTUP, CommandGroup::CONTROLS ); 821 implDescribeSupportedFeature( ".uno:SortDown", ID_BROWSER_SORTDOWN, CommandGroup::CONTROLS ); 822 implDescribeSupportedFeature( ".uno:FormSlots/deleteRecord", SID_FM_DELETEROWS, CommandGroup::EDIT ); 823 implDescribeSupportedFeature( ".uno:FormSlots/insertRecord", ID_BROWSER_INSERT_ROW, CommandGroup::INSERT ); 824 } 825 //------------------------------------------------------------------------------ 826 sal_Bool SbaXDataBrowserController::Construct(Window* pParent) 827 { 828 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::Construct" ); 829 // --------------------------------------------- 830 // create/initialize the form and the grid model 831 m_xRowSet = CreateForm(); 832 if (!m_xRowSet.is()) 833 return sal_False; 834 835 m_xColumnsSupplier.set(m_xRowSet,UNO_QUERY); 836 m_xLoadable.set(m_xRowSet,UNO_QUERY); 837 838 Reference< XPropertySet > xFormProperties( m_xRowSet, UNO_QUERY ); 839 if ( !InitializeForm( xFormProperties ) ) 840 return sal_False; 841 842 m_xGridModel = CreateGridModel(); 843 if (!m_xGridModel.is()) 844 return sal_False; 845 846 // set the formatter if available 847 initFormatter(); 848 // --------------------------------------------------------------- 849 850 // we want to have a grid with a "flat" border 851 Reference< XPropertySet > xGridSet(m_xGridModel, UNO_QUERY); 852 if ( xGridSet.is() ) 853 xGridSet->setPropertyValue(PROPERTY_BORDER, makeAny((sal_Int16)2)); 854 855 // ---------- 856 // marry them 857 Reference< ::com::sun::star::container::XNameContainer > xNameCont(m_xRowSet, UNO_QUERY); 858 { 859 String sText(ModuleRes(STR_DATASOURCE_GRIDCONTROL_NAME)); 860 xNameCont->insertByName(::rtl::OUString(sText), makeAny(m_xGridModel)); 861 } 862 863 // --------------- 864 // create the view 865 setView( * new UnoDataBrowserView( pParent, *this, getORB() ) ); 866 if (!getBrowserView()) 867 return sal_False; 868 869 // late construction 870 sal_Bool bSuccess = sal_False; 871 try 872 { 873 getBrowserView()->Construct(getControlModel()); 874 bSuccess = sal_True; 875 } 876 catch(SQLException&) 877 { 878 } 879 catch(Exception&) 880 { 881 DBG_ERROR("SbaXDataBrowserController::Construct : the construction of UnoDataBrowserView failed !"); 882 } 883 884 if (!bSuccess) 885 { 886 // deleteView(); 887 return sal_False; 888 } 889 890 // now that we have a view we can create the clipboard listener 891 m_aSystemClipboard = TransferableDataHelper::CreateFromSystemClipboard( getView() ); 892 m_aSystemClipboard.StartClipboardListening( ); 893 894 m_pClipbordNotifier = new TransferableClipboardListener( LINK( this, SbaXDataBrowserController, OnClipboardChanged ) ); 895 m_pClipbordNotifier->acquire(); 896 m_pClipbordNotifier->AddRemoveListener( getView(), sal_True ); 897 898 // this call create the toolbox 899 SbaXDataBrowserController_Base::Construct(pParent); 900 901 getBrowserView()->Show(); 902 903 // set the callbacks for the grid control 904 SbaGridControl* pVclGrid = getBrowserView()->getVclControl(); 905 DBG_ASSERT(pVclGrid, "SbaXDataBrowserController::Construct : have no VCL control !"); 906 pVclGrid->SetMasterListener(this); 907 908 // -------------------------- 909 // add listeners ... 910 911 // ... to the form model 912 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 913 if (xFormSet.is()) 914 { 915 xFormSet->addPropertyChangeListener(PROPERTY_ISNEW, static_cast<XPropertyChangeListener*>(this)); 916 xFormSet->addPropertyChangeListener(PROPERTY_ISMODIFIED, static_cast<XPropertyChangeListener*>(this)); 917 xFormSet->addPropertyChangeListener(PROPERTY_ROWCOUNT, static_cast<XPropertyChangeListener*>(this)); 918 xFormSet->addPropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast<XPropertyChangeListener*>(this)); 919 xFormSet->addPropertyChangeListener(PROPERTY_ORDER, static_cast<XPropertyChangeListener*>(this)); 920 xFormSet->addPropertyChangeListener(PROPERTY_FILTER, static_cast<XPropertyChangeListener*>(this)); 921 xFormSet->addPropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast<XPropertyChangeListener*>(this)); 922 xFormSet->addPropertyChangeListener(PROPERTY_APPLYFILTER, static_cast<XPropertyChangeListener*>(this)); 923 } 924 Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); 925 if (xFormError.is()) 926 xFormError->addSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); 927 928 if (m_xLoadable.is()) 929 m_xLoadable->addLoadListener(this); 930 931 Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster > xFormParameter(getRowSet(), UNO_QUERY); 932 if (xFormParameter.is()) 933 xFormParameter->addParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this); 934 935 addModelListeners(getControlModel()); 936 addControlListeners(getBrowserView()->getGridControl()); 937 938 // ------------- 939 // load the form 940 return LoadForm(); 941 } 942 943 //------------------------------------------------------------------------------ 944 sal_Bool SbaXDataBrowserController::LoadForm() 945 { 946 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::LoadForm" ); 947 reloadForm( m_xLoadable ); 948 return sal_True; 949 } 950 //------------------------------------------------------------------------------ 951 void SbaXDataBrowserController::AddColumnListener(const Reference< XPropertySet > & /*xCol*/) 952 { 953 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::AddColumnListener" ); 954 // we're not interested in any column properties ... 955 } 956 957 //------------------------------------------------------------------------------ 958 void SbaXDataBrowserController::RemoveColumnListener(const Reference< XPropertySet > & /*xCol*/) 959 { 960 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::RemoveColumnListener" ); 961 } 962 //------------------------------------------------------------------------------ 963 Reference< XRowSet > SbaXDataBrowserController::CreateForm() 964 { 965 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CreateForm" ); 966 return Reference< XRowSet > (getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.form.component.Form")), UNO_QUERY); 967 } 968 969 //------------------------------------------------------------------------------ 970 Reference< ::com::sun::star::form::XFormComponent > SbaXDataBrowserController::CreateGridModel() 971 { 972 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CreateGridModel" ); 973 return Reference< ::com::sun::star::form::XFormComponent > (getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.form.component.GridControl")), UNO_QUERY); 974 } 975 976 // ------------------------------------------------------------------------- 977 void SbaXDataBrowserController::addModelListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel) 978 { 979 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addModelListeners" ); 980 // ... all the grid columns 981 addColumnListeners(_xGridControlModel); 982 983 // (we are interested in all columns the grid has (and only in these) so we have to listen to the container, too) 984 Reference< ::com::sun::star::container::XContainer > xColContainer(_xGridControlModel, UNO_QUERY); 985 if (xColContainer.is()) 986 xColContainer->addContainerListener((::com::sun::star::container::XContainerListener*)this); 987 988 Reference< ::com::sun::star::form::XReset > xReset(_xGridControlModel, UNO_QUERY); 989 if (xReset.is()) 990 xReset->addResetListener((::com::sun::star::form::XResetListener*)this); 991 } 992 993 // ------------------------------------------------------------------------- 994 void SbaXDataBrowserController::removeModelListeners(const Reference< XControlModel > & _xGridControlModel) 995 { 996 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::removeModelListeners" ); 997 // every single column model 998 Reference< XIndexContainer > xColumns(_xGridControlModel, UNO_QUERY); 999 if (xColumns.is()) 1000 { 1001 sal_Int32 nCount = xColumns->getCount(); 1002 for (sal_uInt16 i=0; i < nCount; ++i) 1003 { 1004 Reference< XPropertySet > xCol(xColumns->getByIndex(i),UNO_QUERY); 1005 RemoveColumnListener(xCol); 1006 } 1007 } 1008 1009 Reference< XContainer > xColContainer(_xGridControlModel, UNO_QUERY); 1010 if (xColContainer.is()) 1011 xColContainer->removeContainerListener( this ); 1012 1013 Reference< XReset > xReset(_xGridControlModel, UNO_QUERY); 1014 if (xReset.is()) 1015 xReset->removeResetListener( this ); 1016 } 1017 1018 // ------------------------------------------------------------------------- 1019 void SbaXDataBrowserController::addControlListeners(const Reference< ::com::sun::star::awt::XControl > & _xGridControl) 1020 { 1021 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addControlListeners" ); 1022 // to ge the 'modified' for the current cell 1023 Reference< XModifyBroadcaster > xBroadcaster(getBrowserView()->getGridControl(), UNO_QUERY); 1024 if (xBroadcaster.is()) 1025 xBroadcaster->addModifyListener(static_cast<XModifyListener*>(this)); 1026 1027 // introduce ourself as dispatch provider for the grid 1028 Reference< XDispatchProviderInterception > xInterception(getBrowserView()->getGridControl(), UNO_QUERY); 1029 if (xInterception.is()) 1030 xInterception->registerDispatchProviderInterceptor(static_cast<XDispatchProviderInterceptor*>(this)); 1031 1032 // add as focus listener to the control (needed for the form controller functionality) 1033 Reference< XWindow > xWindow(_xGridControl, UNO_QUERY); 1034 if (xWindow.is()) 1035 xWindow->addFocusListener(this); 1036 } 1037 1038 // ------------------------------------------------------------------------- 1039 void SbaXDataBrowserController::removeControlListeners(const Reference< ::com::sun::star::awt::XControl > & _xGridControl) 1040 { 1041 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::removeControlListeners" ); 1042 Reference< XModifyBroadcaster > xBroadcaster(_xGridControl, UNO_QUERY); 1043 if (xBroadcaster.is()) 1044 xBroadcaster->removeModifyListener(static_cast<XModifyListener*>(this)); 1045 1046 Reference< XDispatchProviderInterception > xInterception(_xGridControl, UNO_QUERY); 1047 if (xInterception.is()) 1048 xInterception->releaseDispatchProviderInterceptor(static_cast<XDispatchProviderInterceptor*>(this)); 1049 1050 Reference< XWindow > xWindow(_xGridControl, UNO_QUERY); 1051 if (xWindow.is()) 1052 xWindow->removeFocusListener(this); 1053 } 1054 1055 //------------------------------------------------------------------ 1056 void SAL_CALL SbaXDataBrowserController::focusGained(const FocusEvent& /*e*/) throw( RuntimeException ) 1057 { 1058 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::focusGained" ); 1059 // notify our activate listeners (registered on the form controller aggregate) 1060 EventObject aEvt(*this); 1061 ::cppu::OInterfaceIteratorHelper aIter(m_pFormControllerImpl->m_aActivateListeners); 1062 while (aIter.hasMoreElements()) 1063 static_cast<XFormControllerListener*>(aIter.next())->formActivated(aEvt); 1064 } 1065 1066 //------------------------------------------------------------------ 1067 void SAL_CALL SbaXDataBrowserController::focusLost(const FocusEvent& e) throw( RuntimeException ) 1068 { 1069 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::focusLost" ); 1070 // some general checks 1071 if (!getBrowserView() || !getBrowserView()->getGridControl().is()) 1072 return; 1073 Reference< XVclWindowPeer > xMyGridPeer(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY); 1074 if (!xMyGridPeer.is()) 1075 return; 1076 Reference< XWindowPeer > xNextControlPeer(e.NextFocus, UNO_QUERY); 1077 if (!xNextControlPeer.is()) 1078 return; 1079 1080 // don't do a notification if it remains in the family (i.e. a child of the grid control gets the focus) 1081 if (xMyGridPeer->isChild(xNextControlPeer)) 1082 return; 1083 1084 if (xMyGridPeer == xNextControlPeer) 1085 return; 1086 1087 // notify the listeners that the "form" we represent has been deactivated 1088 EventObject aEvt(*this); 1089 ::cppu::OInterfaceIteratorHelper aIter(m_pFormControllerImpl->m_aActivateListeners); 1090 while (aIter.hasMoreElements()) 1091 static_cast<XFormControllerListener*>(aIter.next())->formDeactivated(aEvt); 1092 1093 // commit the changes of the grid control (as we're deactivated) 1094 Reference< XBoundComponent > xCommitable(getBrowserView()->getGridControl(), UNO_QUERY); 1095 if (xCommitable.is()) 1096 xCommitable->commit(); 1097 else 1098 OSL_ENSURE(sal_False, "SbaXDataBrowserController::focusLost : why is my control not commitable ?"); 1099 } 1100 1101 // ------------------------------------------------------------------------- 1102 void SbaXDataBrowserController::disposingGridControl(const ::com::sun::star::lang::EventObject& /*Source*/) 1103 { 1104 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingGridControl" ); 1105 removeControlListeners(getBrowserView()->getGridControl()); 1106 } 1107 1108 // ------------------------------------------------------------------------- 1109 void SbaXDataBrowserController::disposingGridModel(const ::com::sun::star::lang::EventObject& /*Source*/) 1110 { 1111 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingGridModel" ); 1112 removeModelListeners(getControlModel()); 1113 } 1114 1115 // ------------------------------------------------------------------------- 1116 void SbaXDataBrowserController::disposingFormModel(const ::com::sun::star::lang::EventObject& Source) 1117 { 1118 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingFormModel" ); 1119 Reference< XPropertySet > xSourceSet(Source.Source, UNO_QUERY); 1120 if (xSourceSet.is()) 1121 { 1122 xSourceSet->removePropertyChangeListener(PROPERTY_ISNEW, static_cast<XPropertyChangeListener*>(this)); 1123 xSourceSet->removePropertyChangeListener(PROPERTY_ISMODIFIED, static_cast<XPropertyChangeListener*>(this)); 1124 xSourceSet->removePropertyChangeListener(PROPERTY_ROWCOUNT, static_cast<XPropertyChangeListener*>(this)); 1125 xSourceSet->removePropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast<XPropertyChangeListener*>(this)); 1126 xSourceSet->removePropertyChangeListener(PROPERTY_ORDER, static_cast<XPropertyChangeListener*>(this)); 1127 xSourceSet->removePropertyChangeListener(PROPERTY_FILTER, static_cast<XPropertyChangeListener*>(this)); 1128 xSourceSet->removePropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast<XPropertyChangeListener*>(this)); 1129 xSourceSet->removePropertyChangeListener(PROPERTY_APPLYFILTER, static_cast<XPropertyChangeListener*>(this)); 1130 } 1131 1132 Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(Source.Source, UNO_QUERY); 1133 if (xFormError.is()) 1134 xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); 1135 1136 if (m_xLoadable.is()) 1137 m_xLoadable->removeLoadListener(this); 1138 1139 Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster > xFormParameter(Source.Source, UNO_QUERY); 1140 if (xFormParameter.is()) 1141 xFormParameter->removeParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this); 1142 } 1143 1144 // ------------------------------------------------------------------------- 1145 void SbaXDataBrowserController::disposingColumnModel(const ::com::sun::star::lang::EventObject& Source) 1146 { 1147 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingColumnModel" ); 1148 RemoveColumnListener(Reference< XPropertySet > (Source.Source, UNO_QUERY)); 1149 } 1150 1151 // ------------------------------------------------------------------------- 1152 void SbaXDataBrowserController::disposing(const EventObject& Source) throw( RuntimeException ) 1153 { 1154 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposing" ); 1155 // if it's a component other than our aggregate, forward it to the aggregate 1156 if ( m_xFormControllerImpl != Source.Source ) 1157 { 1158 Reference< XEventListener > xAggListener; 1159 m_xFormControllerImpl->queryAggregation( ::getCppuType( &xAggListener ) ) >>= xAggListener; 1160 if ( xAggListener.is( )) 1161 xAggListener->disposing( Source ); 1162 } 1163 1164 // is it the grid control ? 1165 if (getBrowserView()) 1166 { 1167 Reference< ::com::sun::star::awt::XControl > xSourceControl(Source.Source, UNO_QUERY); 1168 if (xSourceControl == getBrowserView()->getGridControl()) 1169 disposingGridControl(Source); 1170 } 1171 1172 // it's model (the container of the columns) ? 1173 if (getControlModel() == Source.Source) 1174 disposingGridModel(Source); 1175 1176 // the form's model ? 1177 if ((getRowSet() == Source.Source)) 1178 disposingFormModel(Source); 1179 1180 // from a single column model ? 1181 Reference< XPropertySet > xSourceSet(Source.Source, UNO_QUERY); 1182 if (xSourceSet.is()) 1183 { 1184 Reference< XPropertySetInfo > xInfo = xSourceSet->getPropertySetInfo(); 1185 // we assume that columns have a Width property and all other sets we are listening to don't have 1186 if (xInfo->hasPropertyByName(PROPERTY_WIDTH)) 1187 disposingColumnModel(Source); 1188 } 1189 SbaXDataBrowserController_Base::OGenericUnoController::disposing( Source ); 1190 } 1191 1192 // ----------------------------------------------------------------------- 1193 void SAL_CALL SbaXDataBrowserController::setIdentifier( const ::rtl::OUString& _Identifier ) throw (RuntimeException) 1194 { 1195 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setIdentifier" ); 1196 ::osl::MutexGuard aGuard( getMutex() ); 1197 m_sModuleIdentifier = _Identifier; 1198 } 1199 1200 // ----------------------------------------------------------------------- 1201 ::rtl::OUString SAL_CALL SbaXDataBrowserController::getIdentifier( ) throw (RuntimeException) 1202 { 1203 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getIdentifier" ); 1204 ::osl::MutexGuard aGuard( getMutex() ); 1205 return m_sModuleIdentifier; 1206 } 1207 1208 // ----------------------------------------------------------------------- 1209 void SbaXDataBrowserController::propertyChange(const PropertyChangeEvent& evt) throw ( RuntimeException ) 1210 { 1211 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::propertyChange" ); 1212 Reference< XPropertySet > xSource(evt.Source, UNO_QUERY); 1213 if (!xSource.is()) 1214 return; 1215 1216 ::vos::OGuard aGuard(Application::GetSolarMutex()); 1217 // the IsModified changed to sal_False ? 1218 if ( (evt.PropertyName.equals(PROPERTY_ISMODIFIED)) 1219 && (::comphelper::getBOOL(evt.NewValue) == sal_False) 1220 ) 1221 { // -> the current field isn't modified anymore, too 1222 setCurrentModified( sal_False ); 1223 } 1224 1225 // switching to a new record ? 1226 if ( (evt.PropertyName.equals(PROPERTY_ISNEW)) 1227 && (::comphelper::getBOOL(evt.NewValue) == sal_True) 1228 ) 1229 { 1230 if (::comphelper::getINT32(xSource->getPropertyValue(PROPERTY_ROWCOUNT)) == 0) 1231 // if we're switching to a new record and didn't have any records before we need to invalidate 1232 // all slots (as the cursor was invalid before the mode change and so the slots were disabled) 1233 InvalidateAll(); 1234 } 1235 1236 1237 if (evt.PropertyName.equals(PROPERTY_FILTER)) 1238 { 1239 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 1240 } 1241 else if (evt.PropertyName.equals(PROPERTY_HAVING_CLAUSE)) 1242 { 1243 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 1244 } 1245 else if (evt.PropertyName.equals(PROPERTY_ORDER)) 1246 { 1247 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 1248 } 1249 1250 // a new record count ? -> may be our search availability has changed 1251 if (evt.PropertyName.equals(PROPERTY_ROWCOUNT)) 1252 { 1253 sal_Int32 nNewValue = 0, nOldValue = 0; 1254 evt.NewValue >>= nNewValue; 1255 evt.OldValue >>= nOldValue; 1256 if((nOldValue == 0 && nNewValue != 0) || (nOldValue != 0 && nNewValue == 0)) 1257 InvalidateAll(); 1258 } 1259 } 1260 1261 //------------------------------------------------------------------------ 1262 void SbaXDataBrowserController::modified(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 1263 { 1264 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::modified" ); 1265 setCurrentModified( sal_True ); 1266 } 1267 1268 // ----------------------------------------------------------------------- 1269 void SbaXDataBrowserController::elementInserted(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException ) 1270 { 1271 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementInserted" ); 1272 DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(), 1273 "SbaXDataBrowserController::elementInserted: where did this come from (not from the grid model)?!"); 1274 Reference< XPropertySet > xNewColumn(evt.Element,UNO_QUERY); 1275 if ( xNewColumn.is() ) 1276 AddColumnListener(xNewColumn); 1277 } 1278 1279 // ----------------------------------------------------------------------- 1280 void SbaXDataBrowserController::elementRemoved(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException ) 1281 { 1282 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementRemoved" ); 1283 DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(), 1284 "SbaXDataBrowserController::elementRemoved: where did this come from (not from the grid model)?!"); 1285 Reference< XPropertySet > xOldColumn(evt.Element,UNO_QUERY); 1286 if ( xOldColumn.is() ) 1287 RemoveColumnListener(xOldColumn); 1288 } 1289 1290 // ----------------------------------------------------------------------- 1291 void SbaXDataBrowserController::elementReplaced(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException ) 1292 { 1293 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementReplaced" ); 1294 DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(), 1295 "SbaXDataBrowserController::elementReplaced: where did this come from (not from the grid model)?!"); 1296 Reference< XPropertySet > xOldColumn(evt.ReplacedElement,UNO_QUERY); 1297 if ( xOldColumn.is() ) 1298 RemoveColumnListener(xOldColumn); 1299 1300 Reference< XPropertySet > xNewColumn(evt.Element,UNO_QUERY); 1301 if ( xNewColumn.is() ) 1302 AddColumnListener(xNewColumn); 1303 } 1304 1305 // ----------------------------------------------------------------------- 1306 sal_Bool SbaXDataBrowserController::suspend(sal_Bool /*bSuspend*/) throw( RuntimeException ) 1307 { 1308 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::suspend" ); 1309 DBG_ASSERT(m_nPendingLoadFinished == 0, "SbaXDataBrowserController::suspend : there shouldn't be a pending load !"); 1310 1311 m_aAsyncGetCellFocus.CancelCall(); 1312 m_aAsyncDisplayError.CancelCall(); 1313 m_aAsyncInvalidateAll.CancelCall(); 1314 1315 sal_Bool bSuccess = SaveModified(); 1316 return bSuccess; 1317 } 1318 // ----------------------------------------------------------------------- 1319 void SbaXDataBrowserController::disposing() 1320 { 1321 // the base class 1322 SbaXDataBrowserController_Base::OGenericUnoController::disposing(); 1323 1324 // the data source 1325 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1326 if (xFormSet.is()) 1327 { 1328 xFormSet->removePropertyChangeListener(PROPERTY_ISNEW, static_cast<XPropertyChangeListener*>(this)); 1329 xFormSet->removePropertyChangeListener(PROPERTY_ISMODIFIED, static_cast<XPropertyChangeListener*>(this)); 1330 xFormSet->removePropertyChangeListener(PROPERTY_ROWCOUNT, static_cast<XPropertyChangeListener*>(this)); 1331 xFormSet->removePropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast<XPropertyChangeListener*>(this)); 1332 xFormSet->removePropertyChangeListener(PROPERTY_ORDER, static_cast<XPropertyChangeListener*>(this)); 1333 xFormSet->removePropertyChangeListener(PROPERTY_FILTER, static_cast<XPropertyChangeListener*>(this)); 1334 xFormSet->removePropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast<XPropertyChangeListener*>(this)); 1335 xFormSet->removePropertyChangeListener(PROPERTY_APPLYFILTER, static_cast<XPropertyChangeListener*>(this)); 1336 } 1337 1338 Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); 1339 if (xFormError.is()) 1340 xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); 1341 1342 if (m_xLoadable.is()) 1343 m_xLoadable->removeLoadListener(this); 1344 1345 Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster > xFormParameter(getRowSet(), UNO_QUERY); 1346 if (xFormParameter.is()) 1347 xFormParameter->removeParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this); 1348 1349 removeModelListeners(getControlModel()); 1350 1351 if ( getView() && m_pClipbordNotifier ) 1352 { 1353 m_pClipbordNotifier->ClearCallbackLink(); 1354 m_pClipbordNotifier->AddRemoveListener( getView(), sal_False ); 1355 m_pClipbordNotifier->release(); 1356 m_pClipbordNotifier = NULL; 1357 } 1358 1359 if (getBrowserView()) 1360 { 1361 removeControlListeners(getBrowserView()->getGridControl()); 1362 // don't delete explicitly, this is done by the owner (and user) of this controller (me hopes ...) 1363 clearView(); 1364 } 1365 1366 if(m_aInvalidateClipboard.IsActive()) 1367 m_aInvalidateClipboard.Stop(); 1368 1369 // dispose the row set 1370 try 1371 { 1372 ::comphelper::disposeComponent(m_xRowSet); 1373 1374 m_xRowSet = NULL; 1375 m_xColumnsSupplier = NULL; 1376 m_xLoadable = NULL; 1377 } 1378 catch(Exception&) 1379 { 1380 DBG_UNHANDLED_EXCEPTION(); 1381 } 1382 m_xParser.clear(); 1383 // don't dispose, just reset - it's owned by the RowSet 1384 } 1385 //------------------------------------------------------------------------------ 1386 void SbaXDataBrowserController::frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( RuntimeException ) 1387 { 1388 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::frameAction" ); 1389 ::osl::MutexGuard aGuard( getMutex() ); 1390 1391 SbaXDataBrowserController_Base::frameAction( aEvent ); 1392 1393 if ( aEvent.Source == getFrame() ) 1394 switch ( aEvent.Action ) 1395 { 1396 case FrameAction_FRAME_ACTIVATED: 1397 case FrameAction_FRAME_UI_ACTIVATED: 1398 // ensure that the active cell (if any) has the focus 1399 m_aAsyncGetCellFocus.Call(); 1400 // start the clipboard timer 1401 if (getBrowserView() && getBrowserView()->getVclControl() && !m_aInvalidateClipboard.IsActive()) 1402 { 1403 m_aInvalidateClipboard.Start(); 1404 OnInvalidateClipboard( NULL ); 1405 } 1406 break; 1407 case FrameAction_FRAME_DEACTIVATING: 1408 case FrameAction_FRAME_UI_DEACTIVATING: 1409 // stop the clipboard invalidator 1410 if (getBrowserView() && getBrowserView()->getVclControl() && m_aInvalidateClipboard.IsActive()) 1411 { 1412 m_aInvalidateClipboard.Stop(); 1413 OnInvalidateClipboard( NULL ); 1414 } 1415 // remove the "get cell focus"-event 1416 m_aAsyncGetCellFocus.CancelCall(); 1417 break; 1418 default: 1419 break; 1420 } 1421 } 1422 1423 //------------------------------------------------------------------------------ 1424 IMPL_LINK( SbaXDataBrowserController, OnAsyncDisplayError, void*, /* _pNotInterestedIn */ ) 1425 { 1426 if ( m_aCurrentError.isValid() ) 1427 { 1428 OSQLMessageBox aDlg( getBrowserView(), m_aCurrentError ); 1429 aDlg.Execute(); 1430 } 1431 return 0L; 1432 } 1433 1434 //------------------------------------------------------------------------------ 1435 void SbaXDataBrowserController::errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( RuntimeException ) 1436 { 1437 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::errorOccured" ); 1438 ::osl::MutexGuard aGuard( getMutex() ); 1439 1440 SQLExceptionInfo aInfo( aEvent.Reason ); 1441 if ( !aInfo.isValid() ) 1442 return; 1443 1444 if ( m_nFormActionNestingLevel ) 1445 { 1446 OSL_ENSURE( !m_aCurrentError.isValid(), "SbaXDataBrowserController::errorOccured: can handle one error per transaction only!" ); 1447 m_aCurrentError = aInfo; 1448 } 1449 else 1450 { 1451 m_aCurrentError = aInfo; 1452 m_aAsyncDisplayError.Call(); 1453 } 1454 } 1455 1456 //------------------------------------------------------------------------------ 1457 sal_Bool SbaXDataBrowserController::approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( RuntimeException ) 1458 { 1459 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::approveParameter" ); 1460 if (aEvent.Source != getRowSet()) 1461 { 1462 // not my data source -> allow anything 1463 DBG_ERROR("SbaXDataBrowserController::approveParameter : invalid event source !"); 1464 return sal_True; 1465 } 1466 1467 Reference< ::com::sun::star::container::XIndexAccess > xParameters = aEvent.Parameters; 1468 ::vos::OGuard aSolarGuard(Application::GetSolarMutex()); 1469 // this may be executed in a non-main thread and we want to use vcl ... 1470 Window* pParent = Application::GetDefDialogParent(); 1471 // don't use the content as parent if it isn't visible 1472 // (and don't use NULL as parent : this may be displayed in the beamer and really shouldn't be task-local) 1473 // 69297 - FS - 25.10.99 1474 if (getBrowserView() && getBrowserView()->IsVisible()) 1475 pParent = getBrowserView(); 1476 1477 // default handling: instantiate an interaction handler and let it handle the parameter request 1478 try 1479 { 1480 // two continuations allowed: OK and Cancel 1481 OParameterContinuation* pParamValues = new OParameterContinuation; 1482 OInteractionAbort* pAbort = new OInteractionAbort; 1483 // the request 1484 ParametersRequest aRequest; 1485 aRequest.Parameters = xParameters; 1486 aRequest.Connection = getConnection(Reference< XRowSet >(aEvent.Source, UNO_QUERY)); 1487 OInteractionRequest* pParamRequest = new OInteractionRequest(makeAny(aRequest)); 1488 Reference< XInteractionRequest > xParamRequest(pParamRequest); 1489 // some knittings 1490 pParamRequest->addContinuation(pParamValues); 1491 pParamRequest->addContinuation(pAbort); 1492 1493 // create the handler, let it handle the request 1494 Reference< XInteractionHandler > xHandler(getORB()->createInstance(SERVICE_TASK_INTERACTION_HANDLER), UNO_QUERY); 1495 if (xHandler.is()) 1496 xHandler->handle(xParamRequest); 1497 1498 if (!pParamValues->wasSelected()) 1499 { // canceled 1500 setLoadingCancelled(); 1501 return sal_False; 1502 } 1503 1504 // transfer the values into the parameter supplier 1505 Sequence< PropertyValue > aFinalValues = pParamValues->getValues(); 1506 if (aFinalValues.getLength() != aRequest.Parameters->getCount()) 1507 { 1508 DBG_ERROR("SbaXDataBrowserController::approveParameter: the InteractionHandler returned nonsense!"); 1509 setLoadingCancelled(); 1510 return sal_False; 1511 } 1512 const PropertyValue* pFinalValues = aFinalValues.getConstArray(); 1513 for (sal_Int32 i=0; i<aFinalValues.getLength(); ++i, ++pFinalValues) 1514 { 1515 Reference< XPropertySet > xParam; 1516 ::cppu::extractInterface(xParam, aRequest.Parameters->getByIndex(i)); 1517 DBG_ASSERT(xParam.is(), "SbaXDataBrowserController::approveParameter: one of the parameters is no property set!"); 1518 if (xParam.is()) 1519 { 1520 #ifdef DBG_UTIL 1521 ::rtl::OUString sName; 1522 xParam->getPropertyValue(PROPERTY_NAME) >>= sName; 1523 DBG_ASSERT(sName.equals(pFinalValues->Name), "SbaXDataBrowserController::approveParameter: suspicious value names!"); 1524 #endif 1525 try { xParam->setPropertyValue(PROPERTY_VALUE, pFinalValues->Value); } 1526 catch(Exception&) 1527 { 1528 DBG_ERROR("SbaXDataBrowserController::approveParameter: setting one of the properties failed!"); 1529 } 1530 } 1531 } 1532 } 1533 catch( const Exception& ) 1534 { 1535 DBG_UNHANDLED_EXCEPTION(); 1536 } 1537 1538 return sal_True; 1539 } 1540 1541 1542 //------------------------------------------------------------------------------ 1543 sal_Bool SbaXDataBrowserController::approveReset(const ::com::sun::star::lang::EventObject& /*rEvent*/) throw( RuntimeException ) 1544 { 1545 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::approveReset" ); 1546 return sal_True; 1547 } 1548 1549 //------------------------------------------------------------------------------ 1550 void SbaXDataBrowserController::resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( RuntimeException ) 1551 { 1552 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::resetted" ); 1553 DBG_ASSERT(rEvent.Source == getControlModel(), "SbaXDataBrowserController::resetted : where did this come from ?"); 1554 (void)rEvent; 1555 setCurrentModified( sal_False ); 1556 } 1557 1558 //------------------------------------------------------------------------------ 1559 sal_Bool SbaXDataBrowserController::confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& /*aEvent*/) throw( RuntimeException ) 1560 { 1561 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::confirmDelete" ); 1562 if (QueryBox(getBrowserView(), ModuleRes(QUERY_BRW_DELETE_ROWS)).Execute() != RET_YES) 1563 return sal_False; 1564 1565 return sal_True; 1566 } 1567 //------------------------------------------------------------------------------ 1568 FeatureState SbaXDataBrowserController::GetState(sal_uInt16 nId) const 1569 { 1570 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::GetState" ); 1571 FeatureState aReturn; 1572 // (disabled automatically) 1573 1574 try 1575 { 1576 // no chance without a view 1577 if (!getBrowserView() || !getBrowserView()->getVclControl()) 1578 return aReturn; 1579 1580 switch (nId) 1581 { 1582 case ID_BROWSER_REMOVEFILTER: 1583 if (!m_xParser.is()) 1584 { 1585 aReturn.bEnabled = false; 1586 return aReturn; 1587 } 1588 // any filter or sort order set ? 1589 aReturn.bEnabled = m_xParser->getFilter().getLength() || m_xParser->getHavingClause().getLength() || m_xParser->getOrder().getLength(); 1590 return aReturn; 1591 } 1592 // no chance without valid models 1593 if (isValid() && !isValidCursor()) 1594 return aReturn; 1595 1596 switch (nId) 1597 { 1598 case ID_BROWSER_SEARCH: 1599 { 1600 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1601 sal_Int32 nCount = ::comphelper::getINT32(xFormSet->getPropertyValue(PROPERTY_ROWCOUNT)); 1602 aReturn.bEnabled = nCount != 0; 1603 } 1604 break; 1605 case ID_BROWSER_INSERT_ROW: 1606 { 1607 // check if it is available 1608 sal_Bool bInsertPrivilege = ( m_nRowSetPrivileges & Privilege::INSERT) != 0; 1609 sal_Bool bAllowInsertions = sal_True; 1610 try 1611 { 1612 Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW ); 1613 OSL_VERIFY( xRowSetProps->getPropertyValue( ::rtl::OUString::createFromAscii( "AllowInserts" ) ) >>= bAllowInsertions ); 1614 } 1615 catch( const Exception& ) 1616 { 1617 DBG_UNHANDLED_EXCEPTION(); 1618 } 1619 aReturn.bEnabled = bInsertPrivilege && bAllowInsertions; 1620 } 1621 break; 1622 case SID_FM_DELETEROWS: 1623 { 1624 // check if it is available 1625 sal_Bool bDeletePrivilege = ( m_nRowSetPrivileges & Privilege::INSERT) != 0; 1626 sal_Bool bAllowDeletions = sal_True; 1627 sal_Int32 nRowCount = 0; 1628 sal_Bool bInsertionRow = sal_False; 1629 try 1630 { 1631 Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW ); 1632 OSL_VERIFY( xRowSetProps->getPropertyValue( ::rtl::OUString::createFromAscii( "AllowDeletes" ) ) >>= bAllowDeletions ); 1633 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ROWCOUNT ) >>= nRowCount ); 1634 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ISNEW ) >>= bInsertionRow ); 1635 } 1636 catch( const Exception& ) 1637 { 1638 DBG_UNHANDLED_EXCEPTION(); 1639 } 1640 aReturn.bEnabled = bDeletePrivilege && bAllowDeletions && ( nRowCount != 0 ) && !bInsertionRow; 1641 } 1642 break; 1643 1644 case ID_BROWSER_COPY: 1645 if ( getBrowserView()->getVclControl()->GetSelectRowCount() ) 1646 { 1647 aReturn.bEnabled = m_aCurrentFrame.isActive(); 1648 break; 1649 } 1650 // run through 1651 case ID_BROWSER_PASTE: 1652 case ID_BROWSER_CUT: 1653 { 1654 CellControllerRef xCurrentController = getBrowserView()->getVclControl()->Controller(); 1655 if (xCurrentController.Is() && xCurrentController->ISA(EditCellController)) 1656 { 1657 Edit& rEdit = (Edit&)xCurrentController->GetWindow(); 1658 sal_Bool bHasLen = (rEdit.GetSelection().Len() != 0); 1659 sal_Bool bIsReadOnly = rEdit.IsReadOnly(); 1660 switch (nId) 1661 { 1662 case ID_BROWSER_CUT: aReturn.bEnabled = m_aCurrentFrame.isActive() && bHasLen && !bIsReadOnly; break; 1663 case SID_COPY : aReturn.bEnabled = m_aCurrentFrame.isActive() && bHasLen; break; 1664 case ID_BROWSER_PASTE: 1665 aReturn.bEnabled = m_aCurrentFrame.isActive() && !bIsReadOnly; 1666 if(aReturn.bEnabled) 1667 { 1668 aReturn.bEnabled = aReturn.bEnabled && IsFormatSupported( m_aSystemClipboard.GetDataFlavorExVector(), FORMAT_STRING ); 1669 } 1670 break; 1671 } 1672 } 1673 } 1674 break; 1675 1676 case ID_BROWSER_SORTUP: 1677 case ID_BROWSER_SORTDOWN: 1678 case ID_BROWSER_AUTOFILTER: 1679 { 1680 // a native statement can't be filtered or sorted 1681 const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1682 if ( !::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) || !m_xParser.is() ) 1683 break; 1684 1685 Reference< XPropertySet > xCurrentField = getBoundField(); 1686 if (!xCurrentField.is()) 1687 break; 1688 1689 aReturn.bEnabled = ::comphelper::getBOOL(xCurrentField->getPropertyValue(PROPERTY_ISSEARCHABLE)); 1690 const Reference< XRowSet > xRow = getRowSet(); 1691 aReturn.bEnabled = aReturn.bEnabled 1692 && xRow.is() 1693 && !xRow->isBeforeFirst() 1694 && !xRow->isAfterLast() 1695 && !xRow->rowDeleted() 1696 && ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 ); 1697 } 1698 break; 1699 1700 case ID_BROWSER_FILTERCRIT: 1701 if ( m_bCannotSelectUnfiltered && m_xParser.is() ) 1702 { 1703 aReturn.bEnabled = sal_True; 1704 break; 1705 } 1706 // no break 1707 case ID_BROWSER_ORDERCRIT: 1708 { 1709 const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1710 if ( !::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) || !m_xParser.is() ) 1711 break; 1712 1713 aReturn.bEnabled = getRowSet().is() 1714 && ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 ); 1715 } 1716 break; 1717 1718 case ID_BROWSER_REFRESH: 1719 aReturn.bEnabled = sal_True; 1720 break; 1721 1722 case ID_BROWSER_REDO: 1723 aReturn.bEnabled = sal_False; // simply forget it ;). no redo possible. 1724 break; 1725 1726 case ID_BROWSER_UNDORECORD: 1727 case ID_BROWSER_SAVERECORD: 1728 { 1729 if (!m_bCurrentlyModified) 1730 { 1731 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1732 if (xFormSet.is()) 1733 aReturn.bEnabled = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISMODIFIED)); 1734 } 1735 else 1736 aReturn.bEnabled = sal_True; 1737 1738 aReturn.sTitle = (ID_BROWSER_UNDORECORD == nId) ? m_sStateUndoRecord : m_sStateSaveRecord; 1739 } 1740 break; 1741 case ID_BROWSER_EDITDOC: 1742 { 1743 // check if it is available 1744 Reference< XPropertySet > xDataSourceSet(getRowSet(), UNO_QUERY); 1745 if (!xDataSourceSet.is()) 1746 break; // no datasource -> no edit mode 1747 1748 sal_Int32 nDataSourcePrivileges = ::comphelper::getINT32(xDataSourceSet->getPropertyValue(PROPERTY_PRIVILEGES)); 1749 sal_Bool bInsertAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::INSERT) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowInserts"))); 1750 sal_Bool bUpdateAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::UPDATE) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowUpdates"))); 1751 sal_Bool bDeleteAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::DELETE) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowDeletes"))); 1752 if (!bInsertAllowedAndPossible && !bUpdateAllowedAndPossible && !bDeleteAllowedAndPossible) 1753 break; // no insert/update/delete -> no edit mode 1754 1755 if (!isValidCursor() || !isLoaded()) 1756 break; // no cursor -> no edit mode 1757 1758 aReturn.bEnabled = sal_True; 1759 1760 sal_Int16 nGridMode = getBrowserView()->getVclControl()->GetOptions(); 1761 aReturn.bChecked = nGridMode > DbGridControl::OPT_READONLY; 1762 } 1763 break; 1764 case ID_BROWSER_FILTERED: 1765 { 1766 aReturn.bEnabled = sal_False; 1767 Reference< XPropertySet > xActiveSet(getRowSet(), UNO_QUERY); 1768 ::rtl::OUString aFilter = ::comphelper::getString(xActiveSet->getPropertyValue(PROPERTY_FILTER)); 1769 ::rtl::OUString aHaving = ::comphelper::getString(xActiveSet->getPropertyValue(PROPERTY_HAVING_CLAUSE)); 1770 if ( aFilter.getLength() || aHaving.getLength() ) 1771 { 1772 xActiveSet->getPropertyValue( PROPERTY_APPLYFILTER ) >>= aReturn.bChecked; 1773 aReturn.bEnabled = sal_True; 1774 } 1775 else 1776 { 1777 aReturn.bChecked = sal_False; 1778 aReturn.bEnabled = sal_False; 1779 } 1780 } 1781 break; 1782 default: 1783 return SbaXDataBrowserController_Base::GetState(nId); 1784 } 1785 } 1786 catch(const Exception& ) 1787 { 1788 DBG_UNHANDLED_EXCEPTION(); 1789 } 1790 1791 return aReturn; 1792 } 1793 1794 //------------------------------------------------------------------------------ 1795 void SbaXDataBrowserController::applyParserOrder(const ::rtl::OUString& _rOldOrder,const Reference< XSingleSelectQueryComposer >& _xParser) 1796 { 1797 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::applyParserOrder" ); 1798 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1799 if (!m_xLoadable.is()) 1800 { 1801 OSL_ENSURE(sal_False, "SbaXDataBrowserController::applyParserOrder: invalid row set!"); 1802 return; 1803 } 1804 1805 sal_uInt16 nPos = getCurrentColumnPosition(); 1806 sal_Bool bSuccess = sal_False; 1807 try 1808 { 1809 xFormSet->setPropertyValue(PROPERTY_ORDER, makeAny(_xParser->getOrder())); 1810 bSuccess = reloadForm(m_xLoadable); 1811 } 1812 catch(Exception&) 1813 { 1814 } 1815 1816 if (!bSuccess) 1817 { 1818 xFormSet->setPropertyValue(PROPERTY_ORDER, makeAny(_rOldOrder)); 1819 //DO_SAFE( _xParser->setOrder(_rOldOrder), "SbaXDataBrowserController::applyParserOrder: could not restore the old order of my parser !" ); 1820 1821 try 1822 { 1823 if (loadingCancelled() || !reloadForm(m_xLoadable)) 1824 criticalFail(); 1825 } 1826 catch(Exception&) 1827 { 1828 criticalFail(); 1829 } 1830 InvalidateAll(); 1831 } 1832 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 1833 1834 setCurrentColumnPosition(nPos); 1835 } 1836 1837 //------------------------------------------------------------------------------ 1838 void SbaXDataBrowserController::applyParserFilter(const ::rtl::OUString& _rOldFilter, sal_Bool _bOldFilterApplied,const ::rtl::OUString& _sOldHaving,const Reference< XSingleSelectQueryComposer >& _xParser) 1839 { 1840 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::applyParserFilter" ); 1841 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1842 if (!m_xLoadable.is()) 1843 { 1844 OSL_ENSURE(sal_False, "SbaXDataBrowserController::applyParserFilter: invalid row set!"); 1845 return; 1846 } 1847 1848 sal_uInt16 nPos = getCurrentColumnPosition(); 1849 1850 sal_Bool bSuccess = sal_False; 1851 try 1852 { 1853 FormErrorHelper aError(this); 1854 xFormSet->setPropertyValue(PROPERTY_FILTER, makeAny(_xParser->getFilter())); 1855 xFormSet->setPropertyValue(PROPERTY_HAVING_CLAUSE, makeAny(_xParser->getHavingClause())); 1856 xFormSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(sal_Bool(sal_True))); 1857 1858 bSuccess = reloadForm(m_xLoadable); 1859 } 1860 catch(Exception&) 1861 { 1862 } 1863 1864 if (!bSuccess) 1865 { 1866 xFormSet->setPropertyValue(PROPERTY_FILTER, makeAny(_rOldFilter)); 1867 xFormSet->setPropertyValue(PROPERTY_HAVING_CLAUSE, makeAny(_sOldHaving)); 1868 xFormSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(_bOldFilterApplied)); 1869 1870 try 1871 { 1872 if (loadingCancelled() || !reloadForm(m_xLoadable)) 1873 criticalFail(); 1874 } 1875 catch(Exception&) 1876 { 1877 criticalFail(); 1878 } 1879 InvalidateAll(); 1880 } 1881 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 1882 1883 setCurrentColumnPosition(nPos); 1884 } 1885 1886 //------------------------------------------------------------------------------ 1887 Reference< XSingleSelectQueryComposer > SbaXDataBrowserController::createParser_nothrow() 1888 { 1889 Reference< XSingleSelectQueryComposer > xComposer; 1890 try 1891 { 1892 const Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW ); 1893 const Reference< XMultiServiceFactory > xFactory( 1894 xRowSetProps->getPropertyValue( PROPERTY_ACTIVE_CONNECTION ), UNO_QUERY_THROW ); 1895 xComposer.set( xFactory->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY_THROW ); 1896 1897 ::rtl::OUString sActiveCommand; 1898 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ACTIVECOMMAND ) >>= sActiveCommand ); 1899 if ( sActiveCommand.getLength() > 0 ) 1900 { 1901 xComposer->setElementaryQuery( sActiveCommand ); 1902 } 1903 else 1904 { 1905 ::rtl::OUString sCommand; 1906 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMAND ) >>= sCommand ); 1907 sal_Int32 nCommandType = CommandType::COMMAND; 1908 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMAND_TYPE ) >>= nCommandType ); 1909 xComposer->setCommand( sCommand, nCommandType ); 1910 } 1911 1912 ::rtl::OUString sFilter; 1913 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_FILTER ) >>= sFilter ); 1914 xComposer->setFilter( sFilter ); 1915 1916 ::rtl::OUString sHavingClause; 1917 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_HAVING_CLAUSE ) >>= sHavingClause ); 1918 xComposer->setHavingClause( sHavingClause ); 1919 1920 ::rtl::OUString sOrder; 1921 OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ORDER ) >>= sOrder ); 1922 xComposer->setOrder( sOrder ); 1923 } 1924 catch ( const Exception& ) 1925 { 1926 DBG_UNHANDLED_EXCEPTION(); 1927 } 1928 return xComposer; 1929 } 1930 //------------------------------------------------------------------------------ 1931 void SbaXDataBrowserController::ExecuteFilterSortCrit(sal_Bool bFilter) 1932 { 1933 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ExecuteFilterSortCrit" ); 1934 if (!SaveModified()) 1935 return; 1936 1937 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 1938 1939 const ::rtl::OUString sOldVal = bFilter ? m_xParser->getFilter() : m_xParser->getOrder(); 1940 const ::rtl::OUString sOldHaving = m_xParser->getHavingClause(); 1941 Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow(); 1942 try 1943 { 1944 Reference< ::com::sun::star::sdbcx::XColumnsSupplier> xSup = getColumnsSupplier(); 1945 Reference< XConnection> xCon(xFormSet->getPropertyValue(PROPERTY_ACTIVE_CONNECTION),UNO_QUERY); 1946 if(bFilter) 1947 { 1948 DlgFilterCrit aDlg( getBrowserView(), getORB(), xCon, xParser, xSup->getColumns() ); 1949 String aFilter; 1950 if ( !aDlg.Execute() ) 1951 return; // if so we don't need to update the grid 1952 aDlg.BuildWherePart(); 1953 } 1954 else 1955 { 1956 DlgOrderCrit aDlg( getBrowserView(),xCon,xParser,xSup->getColumns() ); 1957 String aOrder; 1958 if(!aDlg.Execute()) 1959 { 1960 return; // if so we don't need to actualize the grid 1961 } 1962 aDlg.BuildOrderPart(); 1963 } 1964 } 1965 catch(const SQLException& ) 1966 { 1967 SQLExceptionInfo aError( ::cppu::getCaughtException() ); 1968 showError( aError ); 1969 return; 1970 } 1971 catch(Exception&) 1972 { 1973 return; 1974 } 1975 1976 ::rtl::OUString sNewVal = bFilter ? xParser->getFilter() : xParser->getOrder(); 1977 sal_Bool bOldFilterApplied(sal_False); 1978 if (bFilter) 1979 { 1980 try { bOldFilterApplied = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_APPLYFILTER)); } catch(Exception&) { } ; 1981 } 1982 1983 ::rtl::OUString sNewHaving = xParser->getHavingClause(); 1984 if ( sOldVal.equals(sNewVal) && (!bFilter || sOldHaving.equals(sNewHaving)) ) 1985 // nothing to be done 1986 return; 1987 1988 if (bFilter) 1989 applyParserFilter(sOldVal, bOldFilterApplied,sOldHaving,xParser); 1990 else 1991 applyParserOrder(sOldVal,xParser); 1992 1993 ::comphelper::disposeComponent(xParser); 1994 } 1995 1996 //------------------------------------------------------------------------------ 1997 void SbaXDataBrowserController::ExecuteSearch() 1998 { 1999 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ExecuteSearch" ); 2000 // calculate the control source of the active field 2001 Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); 2002 DBG_ASSERT(xGrid.is(), "SbaXDataBrowserController::ExecuteSearch : the control should have an ::com::sun::star::form::XGrid interface !"); 2003 2004 Reference< ::com::sun::star::form::XGridPeer > xGridPeer(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY); 2005 Reference< ::com::sun::star::container::XIndexContainer > xColumns = xGridPeer->getColumns(); 2006 DBG_ASSERT(xGridPeer.is() && xColumns.is(), "SbaXDataBrowserController::ExecuteSearch : invalid peer !"); 2007 2008 sal_Int16 nViewCol = xGrid->getCurrentColumnPosition(); 2009 sal_Int16 nModelCol = getBrowserView()->View2ModelPos(nViewCol); 2010 2011 Reference< XPropertySet > xCurrentCol(xColumns->getByIndex(nModelCol),UNO_QUERY); 2012 String sActiveField = ::comphelper::getString(xCurrentCol->getPropertyValue(PROPERTY_CONTROLSOURCE)); 2013 2014 // the text within the current cell 2015 String sInitialText; 2016 Reference< ::com::sun::star::container::XIndexAccess > xColControls(xGridPeer, UNO_QUERY); 2017 Reference< XInterface > xCurControl(xColControls->getByIndex(nViewCol),UNO_QUERY); 2018 ::rtl::OUString aInitialText; 2019 if (IsSearchableControl(xCurControl, &aInitialText)) 2020 sInitialText = (const sal_Unicode*)aInitialText; 2021 2022 // prohibit the synchronization of the grid's display with the cursor's position 2023 Reference< XPropertySet > xModelSet(getControlModel(), UNO_QUERY); 2024 DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::ExecuteSearch : no model set ?!"); 2025 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_False))); 2026 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("AlwaysShowCursor"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); 2027 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("CursorColor"), makeAny(sal_Int32(COL_LIGHTRED))); 2028 2029 Reference< ::com::sun::star::util::XNumberFormatsSupplier > xNFS(::dbtools::getNumberFormats(::dbtools::getConnection(m_xRowSet), sal_True,getORB())); 2030 2031 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 2032 AbstractFmSearchDialog* pDialog = NULL; 2033 if ( pFact ) 2034 { 2035 ::std::vector< String > aContextNames; 2036 aContextNames.push_back( String::CreateFromAscii("Standard") ); 2037 pDialog = pFact->CreateFmSearchDialog(getBrowserView(), sInitialText, aContextNames, 0, LINK(this, SbaXDataBrowserController, OnSearchContextRequest)); 2038 } 2039 DBG_ASSERT( pDialog, "SbaXDataBrowserController::ExecuteSearch: could not get the search dialog!" ); 2040 if ( pDialog ) 2041 { 2042 pDialog->SetActiveField( sActiveField ); 2043 pDialog->SetFoundHandler( LINK( this, SbaXDataBrowserController, OnFoundData ) ); 2044 pDialog->SetCanceledNotFoundHdl( LINK( this, SbaXDataBrowserController, OnCanceledNotFound ) ); 2045 pDialog->Execute(); 2046 delete pDialog; 2047 } 2048 2049 // restore the grid's normal operating state 2050 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); 2051 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("AlwaysShowCursor"), ::comphelper::makeBoolAny(sal_Bool(sal_False))); 2052 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("CursorColor"), Any()); 2053 } 2054 2055 //------------------------------------------------------------------------------ 2056 void SbaXDataBrowserController::Execute(sal_uInt16 nId, const Sequence< PropertyValue >& _rArgs) 2057 { 2058 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::Execute" ); 2059 sal_Bool bSortUp = sal_True; 2060 2061 switch (nId) 2062 { 2063 default: 2064 SbaXDataBrowserController_Base::Execute( nId, _rArgs ); 2065 return; 2066 2067 case ID_BROWSER_INSERT_ROW: 2068 try 2069 { 2070 if (SaveModified()) 2071 { 2072 getRowSet()->afterLast(); 2073 // check if it is available 2074 Reference< XResultSetUpdate > xUpdateCursor(getRowSet(), UNO_QUERY_THROW); 2075 xUpdateCursor->moveToInsertRow(); 2076 } 2077 } 2078 catch(Exception&) 2079 { 2080 OSL_ENSURE(0,"Exception caught!"); 2081 } 2082 break; 2083 case SID_FM_DELETEROWS: 2084 2085 if (SaveModified()) 2086 { 2087 SbaGridControl* pVclGrid = getBrowserView()->getVclControl(); 2088 if ( pVclGrid ) 2089 { 2090 if( !pVclGrid->GetSelectRowCount() ) 2091 { 2092 pVclGrid->DeactivateCell(); 2093 pVclGrid->SelectRow(pVclGrid->GetCurRow()); 2094 } 2095 pVclGrid->DeleteSelectedRows(); 2096 } 2097 } 2098 break; 2099 2100 case ID_BROWSER_FILTERED: 2101 if (SaveModified()) 2102 { 2103 Reference< XPropertySet > xActiveSet(getRowSet(), UNO_QUERY); 2104 sal_Bool bApplied = ::comphelper::getBOOL(xActiveSet->getPropertyValue(PROPERTY_APPLYFILTER)); 2105 xActiveSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(sal_Bool(!bApplied))); 2106 reloadForm(m_xLoadable); 2107 } 2108 InvalidateFeature(ID_BROWSER_FILTERED); 2109 break; 2110 case ID_BROWSER_EDITDOC: 2111 { 2112 sal_Int16 nGridMode = getBrowserView()->getVclControl()->GetOptions(); 2113 if (nGridMode == DbGridControl::OPT_READONLY) 2114 getBrowserView()->getVclControl()->SetOptions(DbGridControl::OPT_UPDATE | DbGridControl::OPT_INSERT | DbGridControl::OPT_DELETE); 2115 // the options not supported by the data source will be removed automatically 2116 else 2117 { 2118 if ( !SaveModified( ) ) 2119 // give the user a chance to save the current record (if neccessary) 2120 break; 2121 2122 // maybe the user wanted to reject the modified record ? 2123 if (GetState(ID_BROWSER_UNDORECORD).bEnabled) 2124 Execute(ID_BROWSER_UNDORECORD,Sequence<PropertyValue>()); 2125 2126 getBrowserView()->getVclControl()->SetOptions(DbGridControl::OPT_READONLY); 2127 } 2128 InvalidateFeature(ID_BROWSER_EDITDOC); 2129 } 2130 break; 2131 2132 case ID_BROWSER_SEARCH: 2133 if ( SaveModified( ) ) 2134 ExecuteSearch(); 2135 break; 2136 2137 case ID_BROWSER_COPY: 2138 if ( getBrowserView()->getVclControl()->GetSelectRowCount() > 0 ) 2139 { 2140 getBrowserView()->getVclControl()->CopySelectedRowsToClipboard(); 2141 break; 2142 } 2143 // run through 2144 case ID_BROWSER_CUT: 2145 case ID_BROWSER_PASTE: 2146 { 2147 CellControllerRef xCurrentController = getBrowserView()->getVclControl()->Controller(); 2148 if (!xCurrentController.Is()) 2149 // should be intercepted by GetState. Normally. 2150 // Unfortunately ID_BROWSER_PASTE is a 'fast call' slot, which means it may be executed without checking if it is 2151 // enabled. This would be really deadly herein if the current cell has no controller ... 2152 // (FS - 13.04.99 - #64694#) 2153 return; 2154 2155 Edit& rEdit = (Edit&)xCurrentController->GetWindow(); 2156 switch (nId) 2157 { 2158 case ID_BROWSER_CUT : rEdit.Cut(); break; 2159 case SID_COPY : rEdit.Copy(); break; 2160 case ID_BROWSER_PASTE : rEdit.Paste(); break; 2161 } 2162 if (ID_BROWSER_CUT == nId || ID_BROWSER_PASTE == nId) 2163 { 2164 xCurrentController->SetModified(); 2165 rEdit.Modify(); 2166 } 2167 } 2168 break; 2169 2170 case ID_BROWSER_SORTDOWN: 2171 bSortUp = sal_False; 2172 // DON'T break 2173 case ID_BROWSER_SORTUP: 2174 { 2175 if (!SaveModified()) 2176 break; 2177 2178 if (!isValidCursor()) 2179 break; 2180 2181 // only one sort order 2182 Reference< XPropertySet > xField(getBoundField(), UNO_QUERY); 2183 if (!xField.is()) 2184 break; 2185 2186 Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow(); 2187 const ::rtl::OUString sOldSort = xParser->getOrder(); 2188 sal_Bool bParserSuccess = sal_False; 2189 HANDLE_SQL_ERRORS( 2190 xParser->setOrder(::rtl::OUString()); xParser->appendOrderByColumn(xField, bSortUp), 2191 bParserSuccess, 2192 UniString(ModuleRes(SBA_BROWSER_SETTING_ORDER)), 2193 "SbaXDataBrowserController::Execute : caught an exception while composing the new filter !" 2194 ) 2195 2196 if (bParserSuccess) 2197 applyParserOrder(sOldSort,xParser); 2198 } 2199 break; 2200 2201 case ID_BROWSER_AUTOFILTER: 2202 { 2203 if (!SaveModified()) 2204 break; 2205 2206 if (!isValidCursor()) 2207 break; 2208 2209 Reference< XPropertySet > xField(getBoundField(), UNO_QUERY); 2210 if (!xField.is()) 2211 break; 2212 2213 // check if the column is a aggregate function 2214 sal_Bool bHaving = sal_False; 2215 ::rtl::OUString sName; 2216 xField->getPropertyValue(PROPERTY_NAME) >>= sName; 2217 Reference< XColumnsSupplier > xColumnsSupplier(m_xParser, UNO_QUERY); 2218 Reference< ::com::sun::star::container::XNameAccess > xCols = xColumnsSupplier.is() ? xColumnsSupplier->getColumns() : Reference< ::com::sun::star::container::XNameAccess > (); 2219 if ( xCols.is() && xCols->hasByName(sName) ) 2220 { 2221 Reference<XPropertySet> xProp(xCols->getByName(sName),UNO_QUERY); 2222 static ::rtl::OUString sAgg(RTL_CONSTASCII_USTRINGPARAM("AggregateFunction")); 2223 if ( xProp->getPropertySetInfo()->hasPropertyByName(sAgg) ) 2224 xProp->getPropertyValue(sAgg) >>= bHaving; 2225 } 2226 2227 Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow(); 2228 const ::rtl::OUString sOldFilter = xParser->getFilter(); 2229 const ::rtl::OUString sOldHaving = xParser->getHavingClause(); 2230 2231 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 2232 sal_Bool bApplied = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_APPLYFILTER)); 2233 // do we have a filter but it's not applied ? 2234 // -> completely overwrite it, else append one 2235 if (!bApplied) 2236 { 2237 DO_SAFE( (bHaving ? xParser->setHavingClause(::rtl::OUString()) : xParser->setFilter(::rtl::OUString())), "SbaXDataBrowserController::Execute : caught an exception while resetting the new filter !" ); 2238 } 2239 2240 sal_Bool bParserSuccess = sal_False; 2241 2242 sal_Int32 nOp = SQLFilterOperator::EQUAL; 2243 if ( xField.is() ) 2244 { 2245 sal_Int32 nType = 0; 2246 xField->getPropertyValue(PROPERTY_TYPE) >>= nType; 2247 switch(nType) 2248 { 2249 case DataType::VARCHAR: 2250 case DataType::CHAR: 2251 case DataType::LONGVARCHAR: 2252 nOp = SQLFilterOperator::LIKE; 2253 break; 2254 default: 2255 nOp = SQLFilterOperator::EQUAL; 2256 } 2257 } 2258 2259 if ( bHaving ) 2260 { 2261 HANDLE_SQL_ERRORS( 2262 xParser->appendHavingClauseByColumn(xField,sal_True,nOp), 2263 bParserSuccess, 2264 UniString(ModuleRes(SBA_BROWSER_SETTING_FILTER)), 2265 "SbaXDataBrowserController::Execute : caught an exception while composing the new filter !" 2266 ) 2267 } 2268 else 2269 { 2270 HANDLE_SQL_ERRORS( 2271 xParser->appendFilterByColumn(xField,sal_True,nOp), 2272 bParserSuccess, 2273 UniString(ModuleRes(SBA_BROWSER_SETTING_FILTER)), 2274 "SbaXDataBrowserController::Execute : caught an exception while composing the new filter !" 2275 ) 2276 } 2277 2278 if (bParserSuccess) 2279 applyParserFilter(sOldFilter, bApplied,sOldHaving,xParser); 2280 2281 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 2282 InvalidateFeature(ID_BROWSER_FILTERED); 2283 } 2284 break; 2285 2286 case ID_BROWSER_ORDERCRIT: 2287 ExecuteFilterSortCrit(sal_False); 2288 break; 2289 2290 case ID_BROWSER_FILTERCRIT: 2291 ExecuteFilterSortCrit(sal_True); 2292 InvalidateFeature(ID_BROWSER_FILTERED); 2293 break; 2294 2295 case ID_BROWSER_REMOVEFILTER: 2296 { 2297 if (!SaveModified()) 2298 break; 2299 2300 sal_Bool bNeedPostReload = preReloadForm(); 2301 // reset the filter and the sort property simutaneously so only _one_ new statement has to be 2302 // sent 2303 Reference< XPropertySet > xSet(getRowSet(), UNO_QUERY); 2304 if ( xSet.is() ) 2305 { 2306 xSet->setPropertyValue(PROPERTY_FILTER,makeAny(::rtl::OUString())); 2307 xSet->setPropertyValue(PROPERTY_HAVING_CLAUSE,makeAny(::rtl::OUString())); 2308 xSet->setPropertyValue(PROPERTY_ORDER,makeAny(::rtl::OUString())); 2309 } 2310 try 2311 { 2312 reloadForm(m_xLoadable); 2313 if ( bNeedPostReload ) 2314 postReloadForm(); 2315 } 2316 catch(Exception&) 2317 { 2318 } 2319 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 2320 InvalidateFeature(ID_BROWSER_FILTERED); 2321 } 2322 break; 2323 2324 case ID_BROWSER_REFRESH: 2325 if ( SaveModified( ) ) 2326 { 2327 if (!reloadForm(m_xLoadable)) 2328 criticalFail(); 2329 } 2330 break; 2331 2332 case ID_BROWSER_SAVERECORD: 2333 if ( SaveModified( sal_False ) ) 2334 setCurrentModified( sal_False ); 2335 break; 2336 2337 case ID_BROWSER_UNDORECORD: 2338 { 2339 try 2340 { 2341 // restore the cursor state 2342 Reference< XResultSetUpdate > xCursor(getRowSet(), UNO_QUERY); 2343 Reference< XPropertySet > xSet(xCursor, UNO_QUERY); 2344 Any aVal = xSet->getPropertyValue(PROPERTY_ISNEW); 2345 if (aVal.hasValue() && ::comphelper::getBOOL(aVal)) 2346 { 2347 xCursor->moveToInsertRow(); 2348 // no need to reset the grid model after we moved to the insert row, this is done implicitly by the 2349 // form 2350 // (and in some cases it may be deadly to do the reset explicitly after the form did it implicitly, 2351 // cause the form's reset may be async, and this leads to some nice deadlock scenarios ....) 2352 } 2353 else 2354 { 2355 xCursor->cancelRowUpdates(); 2356 2357 // restore the grids state 2358 Reference< ::com::sun::star::form::XReset > xReset(getControlModel(), UNO_QUERY); 2359 if (xReset.is()) 2360 xReset->reset(); 2361 } 2362 } 2363 catch(SQLException&) 2364 { 2365 } 2366 2367 setCurrentModified( sal_False ); 2368 } 2369 } 2370 } 2371 2372 //------------------------------------------------------------------------------ 2373 sal_Bool SbaXDataBrowserController::SaveModified(sal_Bool bAskFor) 2374 { 2375 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SaveModified" ); 2376 if ( bAskFor && GetState(ID_BROWSER_SAVERECORD).bEnabled ) 2377 { 2378 getBrowserView()->getVclControl()->GrabFocus(); 2379 2380 QueryBox aQry(getBrowserView()->getVclControl(), ModuleRes(QUERY_BRW_SAVEMODIFIED)); 2381 2382 switch (aQry.Execute()) 2383 { 2384 case RET_NO: 2385 Execute(ID_BROWSER_UNDORECORD,Sequence<PropertyValue>()); 2386 return sal_True; 2387 case RET_CANCEL: 2388 return sal_False; 2389 } 2390 } 2391 2392 if ( !CommitCurrent() ) // das aktuelle Control committen lassen 2393 return sal_False; 2394 2395 Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 2396 sal_Bool bResult = sal_False; 2397 try 2398 { 2399 if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISMODIFIED))) 2400 { 2401 Reference< XResultSetUpdate > xCursor(getRowSet(), UNO_QUERY); 2402 if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISNEW))) 2403 xCursor->insertRow(); 2404 else 2405 xCursor->updateRow(); 2406 } 2407 bResult = sal_True; 2408 } 2409 catch(SQLException&) 2410 { 2411 } 2412 catch(Exception&) 2413 { 2414 DBG_ERROR("SbaXDataBrowserController::SaveModified : could not save the current record !"); 2415 bResult = sal_False; 2416 } 2417 2418 InvalidateFeature(ID_BROWSER_SAVERECORD); 2419 InvalidateFeature(ID_BROWSER_UNDORECORD); 2420 return bResult; 2421 } 2422 2423 //------------------------------------------------------------------------------ 2424 sal_Bool SbaXDataBrowserController::CommitCurrent() 2425 { 2426 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CommitCurrent" ); 2427 if (!getBrowserView()) 2428 return sal_True; 2429 2430 Reference< ::com::sun::star::awt::XControl > xActiveControl(getBrowserView()->getGridControl()); 2431 Reference< ::com::sun::star::form::XBoundControl > xLockingTest(xActiveControl, UNO_QUERY); 2432 sal_Bool bControlIsLocked = xLockingTest.is() && xLockingTest->getLock(); 2433 if (xActiveControl.is() && !bControlIsLocked) 2434 { 2435 // zunaechst das Control fragen ob es das IFace unterstuetzt 2436 Reference< ::com::sun::star::form::XBoundComponent > xBoundControl(xActiveControl, UNO_QUERY); 2437 if (!xBoundControl.is()) 2438 xBoundControl = Reference< ::com::sun::star::form::XBoundComponent > (xActiveControl->getModel(), UNO_QUERY); 2439 if (xBoundControl.is() && !xBoundControl->commit()) 2440 return sal_False; 2441 } 2442 return sal_True; 2443 } 2444 2445 //------------------------------------------------------------------------------ 2446 void SbaXDataBrowserController::setCurrentModified( sal_Bool _bSet ) 2447 { 2448 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setCurrentModified" ); 2449 m_bCurrentlyModified = _bSet; 2450 InvalidateFeature( ID_BROWSER_SAVERECORD ); 2451 InvalidateFeature( ID_BROWSER_UNDORECORD ); 2452 } 2453 2454 //------------------------------------------------------------------------------ 2455 void SbaXDataBrowserController::RowChanged() 2456 { 2457 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::RowChanged" ); 2458 setCurrentModified( sal_False ); 2459 } 2460 2461 //------------------------------------------------------------------------------ 2462 void SbaXDataBrowserController::ColumnChanged() 2463 { 2464 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ColumnChanged" ); 2465 InvalidateFeature(ID_BROWSER_SORTUP); 2466 InvalidateFeature(ID_BROWSER_SORTDOWN); 2467 InvalidateFeature(ID_BROWSER_ORDERCRIT); 2468 InvalidateFeature(ID_BROWSER_FILTERCRIT); 2469 InvalidateFeature(ID_BROWSER_AUTOFILTER); 2470 InvalidateFeature(ID_BROWSER_REMOVEFILTER); 2471 2472 setCurrentModified( sal_False ); 2473 } 2474 2475 //------------------------------------------------------------------------------ 2476 void SbaXDataBrowserController::SelectionChanged() 2477 { 2478 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SelectionChanged" ); 2479 // not interested in 2480 } 2481 2482 //------------------------------------------------------------------------------ 2483 void SbaXDataBrowserController::CellActivated() 2484 { 2485 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CellActivated" ); 2486 m_aInvalidateClipboard.Start(); 2487 OnInvalidateClipboard( NULL ); 2488 } 2489 2490 //------------------------------------------------------------------------------ 2491 void SbaXDataBrowserController::CellDeactivated() 2492 { 2493 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CellDeactivated" ); 2494 m_aInvalidateClipboard.Stop(); 2495 OnInvalidateClipboard( NULL ); 2496 } 2497 2498 //------------------------------------------------------------------------------ 2499 IMPL_LINK( SbaXDataBrowserController, OnClipboardChanged, void*, EMPTYARG ) 2500 { 2501 ::vos::OGuard aGuard(Application::GetSolarMutex()); 2502 return OnInvalidateClipboard( NULL ); 2503 } 2504 2505 //------------------------------------------------------------------------------ 2506 IMPL_LINK(SbaXDataBrowserController, OnInvalidateClipboard, AutoTimer*, _pTimer) 2507 { 2508 InvalidateFeature(ID_BROWSER_CUT); 2509 InvalidateFeature(ID_BROWSER_COPY); 2510 2511 // if the invalidation was triggered by the timer, we do not need to invalidate PASTE. 2512 // The timer is only for checking the CUT/COPY slots regulariry, which depend on the 2513 // selection state of the active cell 2514 // TODO: get a callback at the Edit which allows to be notified when the selection 2515 // changes. This would be much better than this cycle-eating polling mechanism here .... 2516 if ( _pTimer != &m_aInvalidateClipboard ) 2517 InvalidateFeature(ID_BROWSER_PASTE); 2518 2519 return 0L; 2520 } 2521 2522 // ------------------------------------------------------------------------- 2523 Reference< XPropertySet > SbaXDataBrowserController::getBoundField(sal_uInt16 nViewPos) const 2524 { 2525 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SaveData" ); 2526 Reference< XPropertySet > xEmptyReturn; 2527 2528 // get the current column from the grid 2529 if (nViewPos == (sal_uInt16)-1) 2530 { 2531 Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); 2532 if (!xGrid.is()) 2533 return xEmptyReturn; 2534 nViewPos = xGrid->getCurrentColumnPosition(); 2535 } 2536 sal_uInt16 nCurrentCol = getBrowserView()->View2ModelPos(nViewPos); 2537 if (nCurrentCol == (sal_uInt16)-1) 2538 return xEmptyReturn; 2539 2540 // get the according column from the model 2541 Reference< ::com::sun::star::container::XIndexContainer > xCols(getControlModel(), UNO_QUERY); 2542 Reference< XPropertySet > xCurrentCol(xCols->getByIndex(nCurrentCol),UNO_QUERY); 2543 if (!xCurrentCol.is()) 2544 return xEmptyReturn; 2545 2546 xEmptyReturn.set(xCurrentCol->getPropertyValue(PROPERTY_BOUNDFIELD) ,UNO_QUERY); 2547 return xEmptyReturn; 2548 } 2549 2550 //------------------------------------------------------------------------------ 2551 IMPL_LINK(SbaXDataBrowserController, OnSearchContextRequest, FmSearchContext*, pContext) 2552 { 2553 Reference< ::com::sun::star::container::XIndexAccess > xPeerContainer(getBrowserView()->getGridControl(), UNO_QUERY); 2554 2555 // check all grid columns for their control source 2556 Reference< ::com::sun::star::container::XIndexAccess > xModelColumns(getFormComponent(), UNO_QUERY); 2557 DBG_ASSERT(xModelColumns.is(), "SbaXDataBrowserController::OnSearchContextRequest : there is a grid control without columns !"); 2558 // the case 'no columns' should be indicated with an empty container, I think ... 2559 DBG_ASSERT(xModelColumns->getCount() >= xPeerContainer->getCount(), "SbaXDataBrowserController::OnSearchContextRequest : impossible : have more view than model columns !"); 2560 2561 String sFieldList; 2562 for (sal_Int32 nViewPos=0; nViewPos<xPeerContainer->getCount(); ++nViewPos) 2563 { 2564 Reference< XInterface > xCurrentColumn(xPeerContainer->getByIndex(nViewPos),UNO_QUERY); 2565 if (!xCurrentColumn.is()) 2566 continue; 2567 2568 // can we use this column control fo searching ? 2569 if (!IsSearchableControl(xCurrentColumn)) 2570 continue; 2571 2572 sal_uInt16 nModelPos = getBrowserView()->View2ModelPos((sal_uInt16)nViewPos); 2573 Reference< XPropertySet > xCurrentColModel(xModelColumns->getByIndex(nModelPos),UNO_QUERY); 2574 ::rtl::OUString aName = ::comphelper::getString(xCurrentColModel->getPropertyValue(PROPERTY_CONTROLSOURCE)); 2575 2576 sFieldList += (const sal_Unicode*)aName; 2577 sFieldList += ';'; 2578 2579 pContext->arrFields.push_back(xCurrentColumn); 2580 } 2581 sFieldList.EraseTrailingChars(';'); 2582 2583 pContext->xCursor.set(getRowSet(),UNO_QUERY); 2584 pContext->strUsedFields = sFieldList; 2585 2586 // if the cursor is in a mode other than STANDARD -> reset 2587 Reference< XPropertySet > xCursorSet(pContext->xCursor, UNO_QUERY); 2588 DBG_ASSERT(xCursorSet.is() && !::comphelper::getBOOL(xCursorSet->getPropertyValue(PROPERTY_ISMODIFIED)), 2589 "SbaXDataBrowserController::OnSearchContextRequest : please do not call for cursors with modified rows !"); 2590 if (xCursorSet.is() && ::comphelper::getBOOL(xCursorSet->getPropertyValue(PROPERTY_ISNEW))) 2591 { 2592 Reference< XResultSetUpdate > xUpdateCursor(pContext->xCursor, UNO_QUERY); 2593 xUpdateCursor->moveToCurrentRow(); 2594 } 2595 return pContext->arrFields.size(); 2596 } 2597 2598 //------------------------------------------------------------------------------ 2599 IMPL_LINK(SbaXDataBrowserController, OnFoundData, FmFoundRecordInformation*, pInfo) 2600 { 2601 Reference< ::com::sun::star::sdbcx::XRowLocate > xCursor(getRowSet(), UNO_QUERY); 2602 DBG_ASSERT(xCursor.is(), "SbaXDataBrowserController::OnFoundData : shit happens. sometimes. but this is simply impossible !"); 2603 2604 // move the cursor 2605 xCursor->moveToBookmark(pInfo->aPosition); 2606 2607 // let the grid snyc it's display with the cursor 2608 Reference< XPropertySet > xModelSet(getControlModel(), UNO_QUERY); 2609 DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::OnFoundData : no model set ?!"); 2610 Any aOld = xModelSet->getPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron")); 2611 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); 2612 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), aOld); 2613 2614 // and move to the field 2615 Reference< ::com::sun::star::container::XIndexAccess > aColumnControls(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY); 2616 sal_uInt16 nViewPos; 2617 2618 for ( nViewPos = 0; nViewPos < aColumnControls->getCount(); ++nViewPos ) 2619 { 2620 Reference< XInterface > xCurrent(aColumnControls->getByIndex(nViewPos),UNO_QUERY); 2621 if (IsSearchableControl(xCurrent)) 2622 { 2623 if (pInfo->nFieldPos) 2624 --pInfo->nFieldPos; 2625 else 2626 break; 2627 } 2628 } 2629 2630 Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); 2631 xGrid->setCurrentColumnPosition(nViewPos); 2632 2633 return 0; 2634 } 2635 2636 //------------------------------------------------------------------------------ 2637 IMPL_LINK(SbaXDataBrowserController, OnCanceledNotFound, FmFoundRecordInformation*, pInfo) 2638 { 2639 Reference< ::com::sun::star::sdbcx::XRowLocate > xCursor(getRowSet(), UNO_QUERY); 2640 2641 try 2642 { 2643 DBG_ASSERT(xCursor.is(), "SbaXDataBrowserController::OnCanceledNotFound : shit happens. sometimes. but this is simply impossible !"); 2644 // move the cursor 2645 xCursor->moveToBookmark(pInfo->aPosition); 2646 } 2647 catch( const Exception& ) 2648 { 2649 DBG_UNHANDLED_EXCEPTION(); 2650 } 2651 2652 try 2653 { 2654 // let the grid snyc it's display with the cursor 2655 Reference< XPropertySet > xModelSet(getControlModel(), UNO_QUERY); 2656 DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::OnCanceledNotFound : no model set ?!"); 2657 Any aOld = xModelSet->getPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron")); 2658 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); 2659 xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), aOld); 2660 } 2661 catch( const Exception& ) 2662 { 2663 DBG_UNHANDLED_EXCEPTION(); 2664 } 2665 2666 return 0L; 2667 } 2668 2669 //------------------------------------------------------------------------------ 2670 IMPL_LINK(SbaXDataBrowserController, OnAsyncGetCellFocus, void*, EMPTYARG) 2671 { 2672 SbaGridControl* pVclGrid = getBrowserView() ? getBrowserView()->getVclControl() : NULL; 2673 // if we have a controller, but the window for the controller doesn't have the focus, we correct this 2674 if(pVclGrid) 2675 { 2676 if (!pVclGrid->IsEditing()) 2677 return 0L; 2678 2679 if (pVclGrid->HasChildPathFocus()) 2680 pVclGrid->Controller()->GetWindow().GrabFocus(); 2681 } 2682 2683 return 0L; 2684 } 2685 2686 //------------------------------------------------------------------------------ 2687 void SbaXDataBrowserController::criticalFail() 2688 { 2689 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::criticalFail" ); 2690 InvalidateAll(); 2691 m_nRowSetPrivileges = 0; 2692 } 2693 2694 //------------------------------------------------------------------------------ 2695 void SbaXDataBrowserController::LoadFinished(sal_Bool /*bWasSynch*/) 2696 { 2697 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::LoadFinished" ); 2698 m_nRowSetPrivileges = 0; 2699 2700 if (isValid() && !loadingCancelled()) 2701 { 2702 // obtain cached values 2703 try 2704 { 2705 Reference< XPropertySet > xFormProps( m_xLoadable, UNO_QUERY_THROW ); 2706 OSL_VERIFY( xFormProps->getPropertyValue( PROPERTY_PRIVILEGES ) >>= m_nRowSetPrivileges ); 2707 } 2708 catch( const Exception& ) 2709 { 2710 DBG_UNHANDLED_EXCEPTION(); 2711 } 2712 2713 // -------------------------------- 2714 // switch the control to alive mode 2715 getBrowserView()->getGridControl()->setDesignMode(sal_False); 2716 2717 // ------------------------------- 2718 initializeParser(); 2719 2720 // ------------------------------- 2721 InvalidateAll(); 2722 2723 m_aAsyncGetCellFocus.Call(); 2724 } 2725 } 2726 // ----------------------------------------------------------------------------- 2727 void SbaXDataBrowserController::initializeParser() const 2728 { 2729 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::initializeParser" ); 2730 if ( !m_xParser.is() ) 2731 { 2732 // ---------------------------------------------- 2733 // create a parser (needed for filtering/sorting) 2734 try 2735 { 2736 const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); 2737 if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING))) 2738 { // (only if the statement isn't native) 2739 // (it is allowed to use the PROPERTY_ISPASSTHROUGH : _after_ loading a form it is valid) 2740 xFormSet->getPropertyValue(PROPERTY_SINGLESELECTQUERYCOMPOSER) >>= m_xParser; 2741 } 2742 } 2743 catch(Exception&) 2744 { 2745 DBG_UNHANDLED_EXCEPTION(); 2746 m_xParser = NULL; 2747 // no further handling, we ignore the error 2748 } 2749 } 2750 } 2751 //------------------------------------------------------------------------------ 2752 void SbaXDataBrowserController::loaded(const EventObject& /*aEvent*/) throw( RuntimeException ) 2753 { 2754 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::loaded" ); 2755 // not interested in 2756 // we're loading within an separate thread and have a handling for it's "finished event" 2757 } 2758 2759 //------------------------------------------------------------------------------ 2760 void SbaXDataBrowserController::unloading(const EventObject& /*aEvent*/) throw( RuntimeException ) 2761 { 2762 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::unloading" ); 2763 // not interested in 2764 } 2765 2766 //------------------------------------------------------------------------------ 2767 void SbaXDataBrowserController::unloaded(const EventObject& /*aEvent*/) throw( RuntimeException ) 2768 { 2769 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::unloaded" ); 2770 m_xParser.clear(); 2771 InvalidateAll(); 2772 // do this asynchron, there are other listeners reacting on this message ... 2773 // (it's a little hack : the grid columns are listening to this event, too, and their bound field may 2774 // change as a reaction on that event. as we have no chance to be notified of this change (which is 2775 // the one we're interested in) we give them time to do what they want to before invalidating our 2776 // bound-field-dependent slots .... 2777 } 2778 2779 //------------------------------------------------------------------------------ 2780 void SbaXDataBrowserController::reloading(const EventObject& /*aEvent*/) throw( RuntimeException ) 2781 { 2782 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloading" ); 2783 // not interested in 2784 } 2785 2786 //------------------------------------------------------------------------------ 2787 void SbaXDataBrowserController::reloaded(const EventObject& /*aEvent*/) throw( RuntimeException ) 2788 { 2789 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloaded" ); 2790 InvalidateAll(); 2791 // do this asynchronously, there are other listeners reacting on this message ... 2792 // (it's a little hack : the grid columns are listening to this event, too, and their bound field may 2793 // change as a reaction on that event. as we have no chance to be notified of this change (which is 2794 // the one we're interested in) we give them time to do what they want to before invalidating our 2795 // bound-field-dependent slots .... 2796 } 2797 //------------------------------------------------------------------------------ 2798 void SbaXDataBrowserController::enterFormAction() 2799 { 2800 if ( !m_nFormActionNestingLevel ) 2801 // first action -> reset 2802 m_aCurrentError.clear(); 2803 2804 ++m_nFormActionNestingLevel; 2805 } 2806 2807 //------------------------------------------------------------------------------ 2808 void SbaXDataBrowserController::leaveFormAction() 2809 { 2810 DBG_ASSERT( m_nFormActionNestingLevel > 0, "SbaXDataBrowserController::leaveFormAction : invalid call !" ); 2811 if ( --m_nFormActionNestingLevel > 0 ) 2812 return; 2813 2814 if ( !m_aCurrentError.isValid() ) 2815 return; 2816 2817 m_aAsyncDisplayError.Call(); 2818 } 2819 2820 // ------------------------------------------------------------------------- 2821 sal_Bool SbaXDataBrowserController::isLoaded() const 2822 { 2823 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::isLoaded" ); 2824 return m_xLoadable.is() && m_xLoadable->isLoaded(); 2825 } 2826 2827 // ------------------------------------------------------------------------- 2828 sal_Bool SbaXDataBrowserController::isValidCursor() const 2829 { 2830 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::isValidCursor" ); 2831 if (!m_xColumnsSupplier.is()) 2832 return sal_False; 2833 Reference< ::com::sun::star::container::XNameAccess > xCols = m_xColumnsSupplier->getColumns(); 2834 if (!xCols.is() || !xCols->hasElements()) 2835 return sal_False; 2836 2837 sal_Bool bIsValid = !(m_xRowSet->isBeforeFirst() || m_xRowSet->isAfterLast()); 2838 if ( !bIsValid ) 2839 { 2840 Reference<XPropertySet> xProp(m_xRowSet,UNO_QUERY); 2841 bIsValid = ::cppu::any2bool(xProp->getPropertyValue(PROPERTY_ISNEW)); 2842 if ( !bIsValid ) 2843 { 2844 bIsValid = m_xParser.is(); 2845 } 2846 } // if ( !bIsValid ) 2847 return bIsValid; 2848 } 2849 2850 //================================================================== 2851 // LoadFormHelper 2852 //================================================================== 2853 2854 class LoadFormHelper :public ::cppu::WeakImplHelper2< ::com::sun::star::form::XLoadListener, 2855 XRowSetListener> 2856 { 2857 enum STATE { STARTED, LOADED, POSITIONED, DISPOSED }; 2858 STATE m_eState; 2859 2860 Reference< XRowSet > m_xForm; 2861 2862 ::osl::Mutex m_aAccessSafety; 2863 2864 public: 2865 LoadFormHelper(const Reference< XRowSet > & _rxForm); 2866 2867 // ::com::sun::star::form::XLoadListener 2868 virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); 2869 virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); 2870 virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); 2871 virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); 2872 virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); 2873 2874 // XRowSetListener 2875 virtual void SAL_CALL cursorMoved(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException ); 2876 virtual void SAL_CALL rowChanged(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException ); 2877 virtual void SAL_CALL rowSetChanged(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException ); 2878 2879 // ::com::sun::star::lang::XEventListener 2880 virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( RuntimeException ); 2881 2882 2883 bool WaitUntilReallyLoaded(bool _bOnlyIfLoaded); 2884 // waits 'til the first positioned event after the loaded event. returns true if successfull, 2885 // false if the form was disposed or unloaded before or while waiting 2886 // if _bOnlyIfLoaded is false and the form isn't loaded already loaded, false will be returned 2887 // (without any wating) 2888 2889 void cancel(); 2890 2891 protected: 2892 ~LoadFormHelper(); 2893 2894 void implDispose(); 2895 }; 2896 2897 DBG_NAME(LoadFormHelper) 2898 //------------------------------------------------------------------------------ 2899 LoadFormHelper::LoadFormHelper(const Reference< XRowSet > & _rxForm) 2900 :m_eState(STARTED) 2901 ,m_xForm(_rxForm) 2902 { 2903 DBG_CTOR(LoadFormHelper,NULL); 2904 2905 Reference< ::com::sun::star::form::XLoadable > (m_xForm, UNO_QUERY)->addLoadListener(this); 2906 m_xForm->addRowSetListener(this); 2907 } 2908 2909 //------------------------------------------------------------------------------ 2910 LoadFormHelper::~LoadFormHelper() 2911 { 2912 ::osl::MutexGuard aGuard(m_aAccessSafety); 2913 implDispose(); 2914 2915 DBG_DTOR(LoadFormHelper,NULL); 2916 } 2917 2918 //------------------------------------------------------------------------------ 2919 void LoadFormHelper::implDispose() 2920 { 2921 if (DISPOSED != m_eState) 2922 { 2923 2924 Reference< ::com::sun::star::form::XLoadable > (m_xForm, UNO_QUERY)->removeLoadListener(this); 2925 m_xForm->removeRowSetListener(this); 2926 m_xForm = NULL; 2927 m_eState = DISPOSED; 2928 } 2929 } 2930 2931 //------------------------------------------------------------------------------ 2932 void SAL_CALL LoadFormHelper::loaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2933 { 2934 ::osl::MutexGuard aGuard(m_aAccessSafety); 2935 DBG_ASSERT(m_eState == STARTED || m_eState == DISPOSED, "LoadFormHelper::loaded : wrong call !"); 2936 if (m_eState == STARTED) 2937 m_eState = LOADED; 2938 } 2939 2940 //------------------------------------------------------------------------------ 2941 void SAL_CALL LoadFormHelper::unloaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2942 { 2943 ::osl::MutexGuard aGuard(m_aAccessSafety); 2944 DBG_ERROR("LoadFormHelper::unloaded : shouldn't be called !"); 2945 implDispose(); 2946 } 2947 2948 //------------------------------------------------------------------------------ 2949 void SAL_CALL LoadFormHelper::unloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2950 { 2951 } 2952 2953 //------------------------------------------------------------------------------ 2954 void SAL_CALL LoadFormHelper::reloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2955 { 2956 } 2957 2958 //------------------------------------------------------------------------------ 2959 void SAL_CALL LoadFormHelper::reloaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2960 { 2961 } 2962 2963 //------------------------------------------------------------------------------ 2964 void SAL_CALL LoadFormHelper::cursorMoved(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) 2965 { 2966 ::osl::MutexGuard aGuard(m_aAccessSafety); 2967 if (m_eState == LOADED) 2968 m_eState = POSITIONED; 2969 } 2970 2971 //------------------------------------------------------------------------------ 2972 void SAL_CALL LoadFormHelper::rowChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) 2973 { 2974 } 2975 2976 //------------------------------------------------------------------------------ 2977 void SAL_CALL LoadFormHelper::rowSetChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) 2978 { 2979 } 2980 2981 //------------------------------------------------------------------------------ 2982 void SAL_CALL LoadFormHelper::disposing(const ::com::sun::star::lang::EventObject& /*Source*/) throw( RuntimeException ) 2983 { 2984 ::osl::MutexGuard aGuard(m_aAccessSafety); 2985 implDispose(); 2986 } 2987 2988 //------------------------------------------------------------------------------ 2989 void LoadFormHelper::cancel() 2990 { 2991 implDispose(); 2992 } 2993 2994 //------------------------------------------------------------------------------ 2995 bool LoadFormHelper::WaitUntilReallyLoaded(bool _bOnlyIfLoaded) 2996 { 2997 ::osl::ResettableMutexGuard aGuard( m_aAccessSafety ); 2998 if (DISPOSED == m_eState) 2999 return false; 3000 3001 if (_bOnlyIfLoaded && (STARTED == m_eState)) 3002 // we did't get a "loaded" event .... 3003 return false; 3004 3005 sal_Bool bDone = (POSITIONED == m_eState); 3006 aGuard.clear(); 3007 3008 while (!bDone) 3009 { 3010 aGuard.reset(); 3011 bDone = (POSITIONED == m_eState); 3012 aGuard.clear(); 3013 } 3014 3015 aGuard.reset(); 3016 implDispose(); 3017 3018 return true; 3019 } 3020 3021 // ----------------------------------------------------------------------------- 3022 sal_Int16 SbaXDataBrowserController::getCurrentColumnPosition() 3023 { 3024 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getCurrentColumnPosition" ); 3025 Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); 3026 sal_Int16 nViewPos = -1; 3027 try 3028 { 3029 if ( xGrid.is() ) 3030 nViewPos = xGrid->getCurrentColumnPosition(); 3031 } 3032 catch(Exception&) {} 3033 return nViewPos; 3034 } 3035 // ----------------------------------------------------------------------------- 3036 void SbaXDataBrowserController::setCurrentColumnPosition( sal_Int16 _nPos ) 3037 { 3038 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setCurrentColumnPosition" ); 3039 Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); 3040 try 3041 { 3042 if ( -1 != _nPos ) 3043 xGrid->setCurrentColumnPosition(_nPos); 3044 } 3045 catch(Exception&) {} 3046 } 3047 // ----------------------------------------------------------------------------- 3048 void SbaXDataBrowserController::BeforeDrop() 3049 { 3050 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::BeforeDrop" ); 3051 Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); 3052 if (xFormError.is()) 3053 xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); 3054 } 3055 // ----------------------------------------------------------------------------- 3056 void SbaXDataBrowserController::AfterDrop() 3057 { 3058 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::AfterDrop" ); 3059 Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); 3060 if (xFormError.is()) 3061 xFormError->addSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); 3062 } 3063 // ----------------------------------------------------------------------------- 3064 void SbaXDataBrowserController::addColumnListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel) 3065 { 3066 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addColumnListeners" ); 3067 // ... all the grid columns 3068 Reference< ::com::sun::star::container::XIndexContainer > xColumns(_xGridControlModel, UNO_QUERY); 3069 if (xColumns.is()) 3070 { 3071 sal_Int32 nCount = xColumns->getCount(); 3072 for (sal_uInt16 i=0; i < nCount; ++i) 3073 { 3074 Reference< XPropertySet > xCol(xColumns->getByIndex(i),UNO_QUERY); 3075 AddColumnListener(xCol); 3076 } 3077 } 3078 } 3079 // ----------------------------------------------------------------------------- 3080 sal_Bool SbaXDataBrowserController::InitializeGridModel(const Reference< ::com::sun::star::form::XFormComponent > & /*xGrid*/) 3081 { 3082 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::InitializeGridModel" ); 3083 return sal_True; 3084 } 3085 //.................................................................. 3086 } // namespace dbaui 3087 //.................................................................. 3088