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