diff options
Diffstat (limited to 'forms/source/runtime/formoperations.cxx')
-rw-r--r-- | forms/source/runtime/formoperations.cxx | 1742 |
1 files changed, 0 insertions, 1742 deletions
diff --git a/forms/source/runtime/formoperations.cxx b/forms/source/runtime/formoperations.cxx deleted file mode 100644 index eb0f83902..000000000 --- a/forms/source/runtime/formoperations.cxx +++ /dev/null @@ -1,1742 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_forms.hxx" - -#include "formoperations.hxx" -#include "frm_strings.hxx" -#include "frm_resource.hxx" -#include "frm_resource.hrc" -#include "frm_module.hxx" - -/** === begin UNO includes === **/ -#include <com/sun/star/ucb/AlreadyInitializedException.hpp> -#include <com/sun/star/util/XModifyBroadcaster.hpp> -#include <com/sun/star/form/runtime/FormFeature.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/lang/DisposedException.hpp> -#include <com/sun/star/awt/XControl.hpp> -#include <com/sun/star/form/XGrid.hpp> -#include <com/sun/star/form/XBoundControl.hpp> -#include <com/sun/star/form/XBoundComponent.hpp> -#include <com/sun/star/sdbcx/XRowLocate.hpp> -#include <com/sun/star/form/XConfirmDeleteListener.hpp> -#include <com/sun/star/sdb/RowChangeEvent.hpp> -#include <com/sun/star/sdb/RowChangeAction.hpp> -#include <com/sun/star/sdb/SQLFilterOperator.hpp> -#include <com/sun/star/sdbc/DataType.hpp> -#include <com/sun/star/form/XReset.hpp> -#include <com/sun/star/beans/XMultiPropertySet.hpp> -#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> -#include <com/sun/star/util/XRefreshable.hpp> -/** === end UNO includes === **/ - -#include <connectivity/dbtools.hxx> -#include <connectivity/dbexception.hxx> -#include <vcl/svapp.hxx> -#include <vcl/stdtext.hxx> -#include <vcl/msgbox.hxx> -#include <vcl/waitobj.hxx> -#include <tools/diagnose_ex.h> -#include <comphelper/container.hxx> -#include <comphelper/property.hxx> -#include <comphelper/namedvaluecollection.hxx> -#include <cppuhelper/exc_hlp.hxx> -#include <osl/mutex.hxx> -#include <sal/macros.h> - -//-------------------------------------------------------------------------- -extern "C" void SAL_CALL createRegistryInfo_FormOperations() -{ - static ::frm::OMultiInstanceAutoRegistration< ::frm::FormOperations > aAutoRegistration; -} - -//........................................................................ -namespace frm -{ -//........................................................................ - - using ::dbtools::SQLExceptionInfo; - /** === begin UNO using === **/ - using ::com::sun::star::uno::Reference; - using ::com::sun::star::uno::XComponentContext; - using ::com::sun::star::uno::RuntimeException; - using ::com::sun::star::uno::Sequence; - using ::com::sun::star::uno::Exception; - using ::com::sun::star::uno::Any; - using ::com::sun::star::uno::XInterface; - using ::com::sun::star::sdbc::XRowSet; - using ::com::sun::star::sdbc::XResultSetUpdate; - using ::com::sun::star::form::runtime::XFormController; - using ::com::sun::star::form::runtime::XFeatureInvalidation; - using ::com::sun::star::form::runtime::FeatureState; - using ::com::sun::star::lang::IllegalArgumentException; - using ::com::sun::star::sdbc::SQLException; - using namespace ::com::sun::star::sdbc; - using ::com::sun::star::form::XForm; - using ::com::sun::star::ucb::AlreadyInitializedException; - using ::com::sun::star::util::XModifyBroadcaster; - using ::com::sun::star::uno::UNO_QUERY; - using ::com::sun::star::lang::EventObject; - using ::com::sun::star::beans::PropertyChangeEvent; - using ::com::sun::star::lang::XMultiServiceFactory; - using ::com::sun::star::lang::DisposedException; - using ::com::sun::star::beans::XPropertySet; - using ::com::sun::star::awt::XControl; - using ::com::sun::star::form::XGrid; - using ::com::sun::star::container::XIndexAccess; - using ::com::sun::star::uno::UNO_QUERY_THROW; - using ::com::sun::star::form::XBoundControl; - using ::com::sun::star::form::XBoundComponent; - using ::com::sun::star::sdbcx::XRowLocate; - using ::com::sun::star::form::XConfirmDeleteListener; - using ::com::sun::star::sdb::RowChangeEvent; - using namespace ::com::sun::star::sdb; - using ::com::sun::star::form::XReset; - using ::com::sun::star::beans::XMultiPropertySet; - using ::com::sun::star::uno::makeAny; - using ::com::sun::star::lang::WrappedTargetException; - using ::com::sun::star::beans::PropertyValue; - using ::com::sun::star::ui::dialogs::XExecutableDialog; - using ::com::sun::star::beans::NamedValue; - - using ::com::sun::star::util::XRefreshable; - using ::com::sun::star::awt::XControlModel; - /** === end UNO using === **/ - namespace FormFeature = ::com::sun::star::form::runtime::FormFeature; - namespace RowChangeAction = ::com::sun::star::sdb::RowChangeAction; - - //==================================================================== - //= FormOperations - //==================================================================== - //-------------------------------------------------------------------- - FormOperations::FormOperations( const Reference< XMultiServiceFactory >& _rxContext ) - :FormOperations_Base( m_aMutex ) - ,m_aContext( _rxContext ) - ,m_bInitializedParser( false ) - ,m_bActiveControlModified( false ) - ,m_bConstructed( false ) - #ifdef DBG_UTIL - ,m_nMethodNestingLevel( false ) - #endif - { - } - - //-------------------------------------------------------------------- - FormOperations::~FormOperations() - { - } - - //-------------------------------------------------------------------- - ::rtl::OUString FormOperations::getImplementationName_Static( ) throw(RuntimeException) - { - return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.forms.FormOperations" ) ); - } - - //-------------------------------------------------------------------- - Sequence< ::rtl::OUString > FormOperations::getSupportedServiceNames_Static( ) throw(RuntimeException) - { - Sequence< ::rtl::OUString > aNames(1); - aNames[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.runtime.FormOperations" ) ); - return aNames; - } - - //-------------------------------------------------------------------- - Reference< XInterface > SAL_CALL FormOperations::Create(const Reference< XMultiServiceFactory >& _rxFactory ) - { - return *new FormOperations( _rxFactory ); - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::initialize( const Sequence< Any >& _arguments ) throw (Exception, RuntimeException) - { - if ( m_bConstructed ) - throw AlreadyInitializedException(); - - if ( _arguments.getLength() == 1 ) - { - Reference< XFormController > xController; - Reference< XForm > xForm; - if ( _arguments[0] >>= xController ) - createWithFormController( xController ); - else if ( _arguments[0] >>= xForm ) - createWithForm( xForm ); - else - throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); - return; - } - - throw IllegalArgumentException( ::rtl::OUString(), *this, 0 ); - } - - //-------------------------------------------------------------------- - ::rtl::OUString SAL_CALL FormOperations::getImplementationName( ) throw (RuntimeException) - { - return getImplementationName_Static(); - } - - //-------------------------------------------------------------------- - ::sal_Bool SAL_CALL FormOperations::supportsService( const ::rtl::OUString& _ServiceName ) throw (RuntimeException) - { - Sequence< ::rtl::OUString > aSupportedServiceNames( getSupportedServiceNames() ); - const ::rtl::OUString* pBegin = aSupportedServiceNames.getConstArray(); - const ::rtl::OUString* pEnd = aSupportedServiceNames.getConstArray() + aSupportedServiceNames.getLength(); - return ::std::find( pBegin, pEnd, _ServiceName ) != pEnd; - } - - //-------------------------------------------------------------------- - Sequence< ::rtl::OUString > SAL_CALL FormOperations::getSupportedServiceNames( ) throw (RuntimeException) - { - return getSupportedServiceNames_Static(); - } - - //-------------------------------------------------------------------- - Reference< XRowSet > SAL_CALL FormOperations::getCursor() throw (RuntimeException) - { - MethodGuard aGuard( *this ); - return m_xCursor; - } - - //-------------------------------------------------------------------- - Reference< XResultSetUpdate > SAL_CALL FormOperations::getUpdateCursor() throw (RuntimeException) - { - MethodGuard aGuard( *this ); - return m_xUpdateCursor; - } - - //-------------------------------------------------------------------- - Reference< XFormController > SAL_CALL FormOperations::getController() throw (RuntimeException) - { - MethodGuard aGuard( *this ); - return m_xController; - } - - //-------------------------------------------------------------------- - Reference< XFeatureInvalidation > SAL_CALL FormOperations::getFeatureInvalidation() throw (RuntimeException) - { - MethodGuard aGuard( *this ); - return m_xFeatureInvalidation; - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::setFeatureInvalidation( const Reference< XFeatureInvalidation > & _rxFeatureInvalidation ) throw (RuntimeException) - { - MethodGuard aGuard( *this ); - m_xFeatureInvalidation = _rxFeatureInvalidation; - } - - //-------------------------------------------------------------------- - FeatureState SAL_CALL FormOperations::getState( ::sal_Int16 _nFeature ) throw (RuntimeException) - { - MethodGuard aGuard( *this ); - - FeatureState aState; - aState.Enabled = sal_False; - - try - { - // some checks for basic pre-requisites - if ( !m_xLoadableForm.is() - || !m_xLoadableForm->isLoaded() - || !m_xCursorProperties.is() - ) - { - return aState; - } - - switch ( _nFeature ) - { - case FormFeature::MoveToFirst: - case FormFeature::MoveToPrevious: - aState.Enabled = impl_canMoveLeft_throw( ); - break; - - case FormFeature::MoveToNext: - aState.Enabled = impl_canMoveRight_throw(); - break; - - case FormFeature::MoveToLast: - aState.Enabled = impl_getRowCount_throw() && ( !m_xCursor->isLast() || impl_isInsertionRow_throw() ); - break; - - case FormFeature::DeleteRecord: - // already deleted ? - if ( m_xCursor->rowDeleted() ) - aState.Enabled = sal_False; - else - { - // allowed to delete the row ? - aState.Enabled = !impl_isInsertionRow_throw() && ::dbtools::canDelete( m_xCursorProperties ); - } - break; - - case FormFeature::MoveToInsertRow: - // if we are inserting we can move to the next row if the current record or control is modified - aState.Enabled = impl_isInsertionRow_throw() - ? impl_isModifiedRow_throw() || m_bActiveControlModified - : ::dbtools::canInsert( m_xCursorProperties ); - break; - - case FormFeature::ReloadForm: - { - // there must be an active connection - Reference< XRowSet > xCursorRowSet( m_xCursor, UNO_QUERY ); - aState.Enabled = ::dbtools::getConnection( xCursorRowSet ).is(); - - // and an active command - ::rtl::OUString sActiveCommand; - m_xCursorProperties->getPropertyValue( PROPERTY_ACTIVECOMMAND ) >>= sActiveCommand; - aState.Enabled &= sActiveCommand.getLength() > 0; - } - break; - - case FormFeature::RefreshCurrentControl: - { - Reference< XRefreshable > xControlModelRefresh( impl_getCurrentControlModel_throw(), UNO_QUERY ); - aState.Enabled = xControlModelRefresh.is(); - } - break; - - case FormFeature::SaveRecordChanges: - case FormFeature::UndoRecordChanges: - aState.Enabled = impl_isModifiedRow_throw() || m_bActiveControlModified; - break; - - case FormFeature::RemoveFilterAndSort: - if ( impl_isParseable_throw() && impl_hasFilterOrOrder_throw() ) - aState.Enabled = !impl_isInsertOnlyForm_throw(); - break; - - case FormFeature::SortAscending: - case FormFeature::SortDescending: - case FormFeature::AutoFilter: - if ( m_xController.is() && impl_isParseable_throw() ) - { - sal_Bool bIsDeleted = m_xCursor->rowDeleted(); - - if ( !bIsDeleted && !impl_isInsertOnlyForm_throw() ) - { - Reference< XPropertySet > xBoundField = impl_getCurrentBoundField_nothrow( ); - if ( xBoundField.is() ) - xBoundField->getPropertyValue( PROPERTY_SEARCHABLE ) >>= aState.Enabled; - } - } - break; - - case FormFeature::InteractiveSort: - case FormFeature::InteractiveFilter: - if ( impl_isParseable_throw() ) - aState.Enabled = !impl_isInsertOnlyForm_throw(); - break; - - case FormFeature::ToggleApplyFilter: - { - ::rtl::OUString sFilter; - m_xCursorProperties->getPropertyValue( PROPERTY_FILTER ) >>= sFilter; - if ( sFilter.getLength() ) - { - aState.State = m_xCursorProperties->getPropertyValue( PROPERTY_APPLYFILTER ); - aState.Enabled = !impl_isInsertOnlyForm_throw(); - } - else - aState.State <<= (sal_Bool)sal_False; - } - break; - - case FormFeature::MoveAbsolute: - { - sal_Int32 nPosition = m_xCursor->getRow(); - sal_Bool bIsNew = impl_isInsertionRow_throw(); - sal_Int32 nCount = impl_getRowCount_throw(); - sal_Bool bFinalCount = impl_isRowCountFinal_throw(); - - if ( ( nPosition >= 0 ) || bIsNew ) - { - if ( bFinalCount ) - { - // special case: there are no records at all, and we - // can't insert records -> disabled - if ( !nCount && !::dbtools::canInsert( m_xCursorProperties ) ) - { - aState.Enabled = sal_False; - } - else - { - if ( bIsNew ) - nPosition = ++nCount; - aState.State <<= (sal_Int32)nPosition; - aState.Enabled = sal_True; - } - } - else - { - aState.State <<= (sal_Int32)nPosition; - aState.Enabled = sal_True; - } - } - } - break; - - case FormFeature::TotalRecords: - { - sal_Bool bIsNew = impl_isInsertionRow_throw(); - sal_Int32 nCount = impl_getRowCount_throw(); - sal_Bool bFinalCount = impl_isRowCountFinal_throw(); - - if ( bIsNew ) - ++nCount; - - ::rtl::OUString sValue = ::rtl::OUString::valueOf( sal_Int32( nCount ) ); - if ( !bFinalCount ) - sValue += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" *") ); - - aState.State <<= sValue; - aState.Enabled = sal_True; - } - break; - - default: - OSL_FAIL( "FormOperations::getState: unknown feature id!" ); - break; - } - } - catch( const Exception& ) - { - OSL_FAIL( "FormOperations::getState: caught an exception!" ); - } - - return aState; - } - - //-------------------------------------------------------------------- - ::sal_Bool SAL_CALL FormOperations::isEnabled( ::sal_Int16 _nFeature ) throw (RuntimeException) - { - MethodGuard aGuard( *this ); - - FeatureState aState( getState( _nFeature ) ); - return aState.Enabled; - } - - //-------------------------------------------------------------------- - namespace - { - static bool lcl_needConfirmCommit( sal_Int32 _nFeature ) - { - return ( ( _nFeature == FormFeature::ReloadForm ) - || ( _nFeature == FormFeature::RemoveFilterAndSort ) - || ( _nFeature == FormFeature::ToggleApplyFilter ) - || ( _nFeature == FormFeature::SortAscending ) - || ( _nFeature == FormFeature::SortDescending ) - || ( _nFeature == FormFeature::AutoFilter ) - || ( _nFeature == FormFeature::InteractiveSort ) - || ( _nFeature == FormFeature::InteractiveFilter ) - ); - } - static bool lcl_requiresArguments( sal_Int32 _nFeature ) - { - return ( _nFeature == FormFeature::MoveAbsolute ); - } - static bool lcl_isExecutableFeature( sal_Int32 _nFeature ) - { - return ( _nFeature != FormFeature::TotalRecords ); - } - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::execute( ::sal_Int16 _nFeature ) throw (RuntimeException, IllegalArgumentException, SQLException, WrappedTargetException) - { - SolarMutexGuard aSolarGuard; - MethodGuard aGuard( *this ); - - if ( ( _nFeature != FormFeature::DeleteRecord ) && ( _nFeature != FormFeature::UndoRecordChanges ) ) - { - // if we have a controller, commit the current control - if ( m_xController.is() ) - if ( !impl_commitCurrentControl_throw() ) - return; - - // commit the current record - bool bCommitCurrentRecord = true; - // (but before, let the user confirm if necessary) - if ( impl_isModifiedRow_throw() ) - { - if ( lcl_needConfirmCommit( _nFeature ) ) - { - // TODO: shouldn't this be done with an interaction handler? - QueryBox aQuery( NULL, WB_YES_NO_CANCEL | WB_DEF_YES, FRM_RES_STRING( RID_STR_QUERY_SAVE_MODIFIED_ROW ) ); - switch ( aQuery.Execute() ) - { - case RET_NO: bCommitCurrentRecord = false; break; - case RET_CANCEL: return; - } - } - } - - if ( bCommitCurrentRecord && !impl_commitCurrentRecord_throw() ) - return; - } - - try - { - switch ( _nFeature ) - { - case FormFeature::MoveToFirst: - m_xCursor->first(); - break; - - case FormFeature::MoveToNext: - impl_moveRight_throw( ); - break; - - case FormFeature::MoveToPrevious: - impl_moveLeft_throw( ); - break; - - case FormFeature::MoveToLast: - { -/* - // TODO: re-implement this ..... - // run in an own thread if ... - // ... the data source is thread safe ... - sal_Bool bAllowOwnThread = sal_False; - if ( ::comphelper::hasProperty( PROPERTY_THREADSAFE, m_xCursorProperties ) ) - m_xCursorProperties->getPropertyValue( PROPERTY_THREADSAFE ) >>= bAllowOwnThread; - - // ... the record count is unknown - sal_Bool bNeedOwnThread sal_False; - if ( ::comphelper::hasProperty( PROPERTY_ROWCOUNTFINAL, m_xCursorProperties ) ) - m_xCursorProperties->getPropertyValue( PROPERTY_ROWCOUNTFINAL ) >>= bNeedOwnThread; - - if ( bNeedOwnThread && bAllowOwnThread ) - ; - else -*/ - m_xCursor->last(); - } - break; - - case FormFeature::ReloadForm: - if ( m_xLoadableForm.is() ) - { - WaitObject aWO( NULL ); - m_xLoadableForm->reload(); - - // refresh all controls in the form (and sub forms) which can be refreshed - // #i90914# - ::comphelper::IndexAccessIterator aIter( m_xLoadableForm ); - Reference< XInterface > xElement( aIter.Next() ); - while ( xElement.is() ) - { - Reference< XRefreshable > xRefresh( xElement, UNO_QUERY ); - if ( xRefresh.is() ) - xRefresh->refresh(); - xElement = aIter.Next(); - } - } - break; - - case FormFeature::RefreshCurrentControl: - { - Reference< XRefreshable > xControlModelRefresh( impl_getCurrentControlModel_throw(), UNO_QUERY ); - OSL_ENSURE( xControlModelRefresh.is(), "FormOperations::execute: how did you reach this?" ); - if ( xControlModelRefresh.is() ) - xControlModelRefresh->refresh(); - } - break; - - case FormFeature::DeleteRecord: - { - sal_uInt32 nCount = impl_getRowCount_throw(); - - // next position - sal_Bool bLeft = m_xCursor->isLast() && ( nCount > 1 ); - sal_Bool bRight= !m_xCursor->isLast(); - sal_Bool bSuccess = sal_False; - try - { - // ask for confirmation - Reference< XConfirmDeleteListener > xConfirmDelete( m_xController, UNO_QUERY ); - - if ( xConfirmDelete.is() ) - { - RowChangeEvent aEvent; - aEvent.Source = Reference< XInterface >( m_xCursor, UNO_QUERY ); - aEvent.Action = RowChangeAction::DELETE; - aEvent.Rows = 1; - bSuccess = xConfirmDelete->confirmDelete( aEvent ); - } - - // delete it - if ( bSuccess ) - m_xUpdateCursor->deleteRow(); - } - catch( const Exception& ) - { - bSuccess = sal_False; - } - - if ( bSuccess ) - { - if ( bLeft || bRight ) - m_xCursor->relative( bRight ? 1 : -1 ); - else - { - sal_Bool bCanInsert = ::dbtools::canInsert( m_xCursorProperties ); - // is it possible to insert another record? - if ( bCanInsert ) - m_xUpdateCursor->moveToInsertRow(); - else - // move record to update stati - m_xCursor->first(); - } - } - } - break; - - case FormFeature::SaveRecordChanges: - case FormFeature::UndoRecordChanges: - { - sal_Bool bInserting = impl_isInsertionRow_throw(); - - if ( FormFeature::UndoRecordChanges == _nFeature ) - { - if ( !bInserting ) - m_xUpdateCursor->cancelRowUpdates(); - - // reset all controls for this form - impl_resetAllControls_nothrow( ); - - if ( bInserting ) // back to insertion mode for this form - m_xUpdateCursor->moveToInsertRow(); - } - else - { - if ( bInserting ) - { - m_xUpdateCursor->insertRow(); - m_xCursor->last(); - } - else - m_xUpdateCursor->updateRow(); - } - } - break; - - case FormFeature::MoveToInsertRow: - // move to the last row before moving to the insert row - m_xCursor->last(); - m_xUpdateCursor->moveToInsertRow(); - break; - - case FormFeature::RemoveFilterAndSort: - { - // simultaneously reset Filter and Order property - Reference< XMultiPropertySet > xProperties( m_xCursorProperties, UNO_QUERY ); - OSL_ENSURE( xProperties.is(), "FormOperations::execute: no multi property access!" ); - if ( xProperties.is() ) - { - Sequence< ::rtl::OUString > aNames( 2 ); - aNames[0] = PROPERTY_FILTER; - aNames[1] = PROPERTY_SORT; - - Sequence< Any> aValues( 2 ); - aValues[0] <<= ::rtl::OUString(); - aValues[1] <<= ::rtl::OUString(); - - WaitObject aWO( NULL ); - xProperties->setPropertyValues( aNames, aValues ); - - if ( m_xLoadableForm.is() ) - m_xLoadableForm->reload(); - } - } - break; - - case FormFeature::ToggleApplyFilter: - if ( impl_commitCurrentControl_throw() && impl_commitCurrentRecord_throw() ) - { - // simply toggle the value - sal_Bool bApplied = sal_False; - m_xCursorProperties->getPropertyValue( PROPERTY_APPLYFILTER ) >>= bApplied; - m_xCursorProperties->setPropertyValue( PROPERTY_APPLYFILTER, makeAny( (sal_Bool)!bApplied ) ); - - // and reload - WaitObject aWO( NULL ); - m_xLoadableForm->reload(); - } - break; - - case FormFeature::SortAscending: - impl_executeAutoSort_throw( true ); - break; - - case FormFeature::SortDescending: - impl_executeAutoSort_throw( false ); - break; - - case FormFeature::AutoFilter: - impl_executeAutoFilter_throw(); - break; - - case FormFeature::InteractiveSort: - impl_executeFilterOrSort_throw( false ); - break; - - case FormFeature::InteractiveFilter: - impl_executeFilterOrSort_throw( true ); - break; - - default: - { - sal_uInt16 nErrorResourceId = RID_STR_FEATURE_UNKNOWN; - if ( lcl_requiresArguments( _nFeature ) ) - nErrorResourceId = RID_STR_FEATURE_REQUIRES_PARAMETERS; - else if ( !lcl_isExecutableFeature( _nFeature ) ) - nErrorResourceId = RID_STR_FEATURE_NOT_EXECUTABLE; - throw IllegalArgumentException( FRM_RES_STRING( nErrorResourceId ), *this, 1 ); - } - } // switch - } - catch( const RuntimeException& ) { throw; } - catch( const SQLException& ) { throw; } - catch( const IllegalArgumentException& ) { throw; } - catch( const Exception& ) - { - throw WrappedTargetException( ::rtl::OUString(), *const_cast< FormOperations* >( this ), ::cppu::getCaughtException() ); - } - - impl_invalidateAllSupportedFeatures_nothrow( aGuard ); - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::executeWithArguments( ::sal_Int16 _nFeature, const Sequence< NamedValue >& _rArguments ) throw (RuntimeException, IllegalArgumentException, SQLException, WrappedTargetException) - { - if ( !lcl_requiresArguments( _nFeature ) ) - { - execute( _nFeature ); - return; - } - - SolarMutexGuard aSolarGuard; - MethodGuard aGuard( *this ); - - // at the moment we have only one feature which supports execution parameters - if ( !lcl_isExecutableFeature( _nFeature ) ) - throw IllegalArgumentException( FRM_RES_STRING( RID_STR_FEATURE_NOT_EXECUTABLE ), *this, 1 ); - - switch ( _nFeature ) - { - case FormFeature::MoveAbsolute: - { - sal_Int32 nPosition = -1; - - ::comphelper::NamedValueCollection aArguments( _rArguments ); - aArguments.get_ensureType( "Position", nPosition ); - - if ( nPosition < 1 ) - nPosition = 1; - - try - { - // commit before doing anything else - if ( m_xController.is() && !impl_commitCurrentControl_throw() ) - return; - if ( !impl_commitCurrentRecord_throw() ) - return; - - sal_Int32 nCount = impl_getRowCount_throw(); - sal_Bool bFinalCount = impl_isRowCountFinal_throw(); - - if ( bFinalCount && ( (sal_Int32)nPosition > nCount ) ) - nPosition = nCount; - - m_xCursor->absolute( nPosition ); - } - catch( const RuntimeException& ) { throw; } - catch( const SQLException& ) { throw; } - catch( const Exception& ) - { - throw WrappedTargetException( ::rtl::OUString(), *this, ::cppu::getCaughtException() ); - } - } - break; - default: - throw IllegalArgumentException( FRM_RES_STRING( RID_STR_FEATURE_UNKNOWN ), *this, 1 ); - } // switch - } - - //-------------------------------------------------------------------- - ::sal_Bool SAL_CALL FormOperations::commitCurrentRecord( ::sal_Bool& _out_rRecordInserted ) throw (RuntimeException, SQLException) - { - MethodGuard aGuard( *this ); - _out_rRecordInserted = sal_False; - - return impl_commitCurrentRecord_throw( &_out_rRecordInserted ); - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_commitCurrentRecord_throw( ::sal_Bool* _pRecordInserted ) const - { - DBG_ASSERT( m_nMethodNestingLevel, "FormOperations::impl_commitCurrentRecord_throw: to be called within a MethodGuard'ed section only!" ); - - if ( !impl_hasCursor_nothrow() ) - return false; - - // nothing to do if the record is not modified - sal_Bool bResult = !impl_isModifiedRow_throw(); - if ( !bResult ) - { - // insert respectively update the row - if ( impl_isInsertionRow_throw() ) - { - m_xUpdateCursor->insertRow(); - if ( _pRecordInserted ) - *_pRecordInserted = sal_True; - } - else - m_xUpdateCursor->updateRow(); - bResult = true; - } - return bResult; - } - - //-------------------------------------------------------------------- - ::sal_Bool SAL_CALL FormOperations::commitCurrentControl() throw (RuntimeException, SQLException) - { - MethodGuard aGuard( *this ); - return impl_commitCurrentControl_throw(); - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_commitCurrentControl_throw() const - { - DBG_ASSERT( m_nMethodNestingLevel, "FormOperations::impl_commitCurrentRecord_throw: to be called within a MethodGuard'ed section only!" ); - OSL_PRECOND( m_xController.is(), "FormOperations::commitCurrentControl: no controller!" ); - if ( !m_xController.is() ) - return false; - - bool bSuccess = false; - try - { - Reference< XControl > xCurrentControl( m_xController->getCurrentControl() ); - - // check whether the control is locked - Reference< XBoundControl > xCheckLock( xCurrentControl, UNO_QUERY ); - sal_Bool bControlIsLocked = xCheckLock.is() && xCheckLock->getLock(); - - // commit if necessary - bSuccess = true; - if ( xCurrentControl.is() && !bControlIsLocked ) - { - // both the control and it's model can be committable, so try both - Reference< XBoundComponent > xBound( xCurrentControl, UNO_QUERY ); - if ( !xBound.is() ) - xBound = xBound.query( xCurrentControl->getModel() ); - // and now really commit - if ( xBound.is() ) - bSuccess = xBound->commit(); - } - - } - catch( const RuntimeException& ) { throw; } - catch( const SQLException& ) { throw; } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - bSuccess = false; - } - - return bSuccess; - } - - //-------------------------------------------------------------------- - ::sal_Bool SAL_CALL FormOperations::isInsertionRow() throw (RuntimeException, WrappedTargetException) - { - sal_Bool bIs = sal_False; - try - { - bIs = impl_isInsertionRow_throw(); - } - catch( const RuntimeException& ) { throw; } - catch( const Exception& ) - { - throw WrappedTargetException( ::rtl::OUString(), *this, ::cppu::getCaughtException() ); - } - return bIs; - } - - //-------------------------------------------------------------------- - ::sal_Bool SAL_CALL FormOperations::isModifiedRow() throw (RuntimeException, WrappedTargetException) - { - sal_Bool bIs = sal_False; - try - { - bIs = impl_isModifiedRow_throw(); - } - catch( const RuntimeException& ) { throw; } - catch( const Exception& ) - { - throw WrappedTargetException( ::rtl::OUString(), *this, ::cppu::getCaughtException() ); - } - return bIs; - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::cursorMoved( const EventObject& /*_Event*/ ) throw (RuntimeException) - { - MethodGuard aGuard( *this ); - m_bActiveControlModified = sal_False; - - impl_invalidateAllSupportedFeatures_nothrow( aGuard ); - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::rowChanged( const EventObject& /*_Event*/ ) throw (RuntimeException) - { - // not interested in - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::rowSetChanged( const EventObject& /*_Event*/ ) throw (RuntimeException) - { - // not interested in - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::modified( const EventObject& /*_Source*/ ) throw( RuntimeException ) - { - MethodGuard aGuard( *this ); - - OSL_ENSURE( m_xCursor.is(), "FormOperations::modified: already disposed!" ); - if ( !m_bActiveControlModified ) - { - m_bActiveControlModified = sal_True; - impl_invalidateModifyDependentFeatures_nothrow( aGuard ); - } - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::propertyChange( const PropertyChangeEvent& _rEvent ) throw (RuntimeException) - { - MethodGuard aGuard( *this ); - - if ( m_xCursor.is() && ( m_xCursor == _rEvent.Source ) ) - { - sal_Bool bIs = sal_False; - if ( ( _rEvent.PropertyName == PROPERTY_ISMODIFIED ) - || ( _rEvent.PropertyName == PROPERTY_ISNEW ) - ) - { - if ( ( _rEvent.NewValue >>= bIs ) && !bIs ) - m_bActiveControlModified = sal_False; - } - impl_invalidateAllSupportedFeatures_nothrow( aGuard ); - } - - if ( m_xParser.is() && ( m_xCursor == _rEvent.Source ) ) - { - try - { - ::rtl::OUString sNewValue; - _rEvent.NewValue >>= sNewValue; - if ( _rEvent.PropertyName == PROPERTY_ACTIVECOMMAND ) - { - m_xParser->setElementaryQuery( sNewValue ); - } - else if ( _rEvent.PropertyName == PROPERTY_FILTER ) - { - if ( m_xParser->getFilter() != sNewValue ) - m_xParser->setFilter( sNewValue ); - } - else if ( _rEvent.PropertyName == PROPERTY_SORT ) - { - _rEvent.NewValue >>= sNewValue; - if ( m_xParser->getOrder() != sNewValue ) - m_xParser->setOrder( sNewValue ); - } - } - catch( Exception& ) - { - OSL_FAIL( "FormOperations::propertyChange: caught an exception while updating the parser!" ); - } - impl_invalidateAllSupportedFeatures_nothrow( aGuard ); - } - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::disposing( const EventObject& /*_Source*/ ) throw (RuntimeException) - { - // TODO: should we react on this? Or is this the responsibility of our owner to dispose us? - } - - //-------------------------------------------------------------------- - void SAL_CALL FormOperations::disposing() - { - ::osl::MutexGuard aGuard( m_aMutex ); - - impl_disposeParser_nothrow(); - - try - { - // revoke various listeners - if ( m_xCursor.is() ) - m_xCursor->removeRowSetListener( this ); - - if ( m_xCursorProperties.is() ) - { - m_xCursorProperties->removePropertyChangeListener( PROPERTY_ISMODIFIED,this ); - m_xCursorProperties->removePropertyChangeListener( PROPERTY_ISNEW, this ); - } - - Reference< XModifyBroadcaster > xBroadcaster( m_xController, UNO_QUERY ); - if ( xBroadcaster.is() ) - xBroadcaster->removeModifyListener( this ); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - m_xController.clear(); - m_xCursor.clear(); - m_xUpdateCursor.clear(); - m_xCursorProperties.clear(); - m_xLoadableForm.clear(); - m_xFeatureInvalidation.clear(); - - m_bActiveControlModified = true; - } - - //-------------------------------------------------------------------- - void FormOperations::impl_checkDisposed_throw() const - { - if ( impl_isDisposed_nothrow() ) - throw DisposedException( ::rtl::OUString(), *const_cast< FormOperations* >( this ) ); - } - - //-------------------------------------------------------------------- - void FormOperations::impl_initFromController_throw() - { - OSL_PRECOND( m_xController.is(), "FormOperations::impl_initFromController_throw: invalid controller!" ); - m_xCursor = m_xCursor.query( m_xController->getModel() ); - if ( !m_xCursor.is() ) - throw IllegalArgumentException( ::rtl::OUString(), *this, 0 ); - - impl_initFromForm_throw(); - - Reference< XModifyBroadcaster > xBroadcaster( m_xController, UNO_QUERY ); - if ( xBroadcaster.is() ) - xBroadcaster->addModifyListener( this ); - } - - //-------------------------------------------------------------------- - void FormOperations::impl_initFromForm_throw() - { - OSL_PRECOND( m_xCursor.is(), "FormOperations::impl_initFromForm_throw: invalid form!" ); - m_xCursorProperties = m_xCursorProperties.query ( m_xCursor ); - m_xUpdateCursor = m_xUpdateCursor.query ( m_xCursor ); - m_xLoadableForm = m_xLoadableForm.query ( m_xCursor ); - - if ( !m_xCursor.is() || !m_xCursorProperties.is() || !m_xLoadableForm.is() ) - throw IllegalArgumentException( ::rtl::OUString(), *this, 0 ); - - m_xCursor->addRowSetListener( this ); - m_xCursorProperties->addPropertyChangeListener( PROPERTY_ISMODIFIED,this ); - m_xCursorProperties->addPropertyChangeListener( PROPERTY_ISNEW, this ); - } - - //-------------------------------------------------------------------- - void FormOperations::createWithFormController( const Reference< XFormController >& _rxController ) - { - m_xController = _rxController; - if ( !m_xController.is() ) - throw IllegalArgumentException( ::rtl::OUString(), *this, 0 ); - - impl_initFromController_throw(); - - m_bConstructed = true; - } - - //-------------------------------------------------------------------- - void FormOperations::createWithForm( const Reference< XForm >& _rxForm ) - { - m_xCursor = m_xCursor.query( _rxForm ); - if ( !m_xCursor.is() ) - throw IllegalArgumentException( ::rtl::OUString(), *this, 0 ); - - impl_initFromForm_throw(); - - m_bConstructed = true; - } - - //------------------------------------------------------------------------------ - void FormOperations::impl_invalidateAllSupportedFeatures_nothrow( MethodGuard& _rClearForCallback ) const - { - if ( !m_xFeatureInvalidation.is() ) - // nobody's interested in ... - return; - - Reference< XFeatureInvalidation > xInvalidation = m_xFeatureInvalidation; - _rClearForCallback.clear(); - xInvalidation->invalidateAllFeatures(); - } - - //------------------------------------------------------------------------------ - void FormOperations::impl_invalidateModifyDependentFeatures_nothrow( MethodGuard& _rClearForCallback ) const - { - if ( !m_xFeatureInvalidation.is() ) - // nobody's interested in ... - return; - - static Sequence< sal_Int16 > s_aModifyDependentFeatures; - if ( s_aModifyDependentFeatures.getLength() == 0 ) - { - sal_Int16 pModifyDependentFeatures[] = - { - FormFeature::MoveToNext, - FormFeature::MoveToInsertRow, - FormFeature::SaveRecordChanges, - FormFeature::UndoRecordChanges - }; - size_t nFeatureCount = SAL_N_ELEMENTS( pModifyDependentFeatures ); - s_aModifyDependentFeatures = Sequence< sal_Int16 >( pModifyDependentFeatures, nFeatureCount ); - } - - Reference< XFeatureInvalidation > xInvalidation = m_xFeatureInvalidation; - _rClearForCallback.clear(); - - xInvalidation->invalidateFeatures( s_aModifyDependentFeatures ); - } - - //-------------------------------------------------------------------- - void FormOperations::impl_ensureInitializedParser_nothrow() - { - OSL_PRECOND( m_xCursorProperties.is(), "FormOperations::impl_ensureInitializedParser_nothrow: we're disposed!" ); - if ( m_bInitializedParser ) - return; - - try - { - sal_Bool bUseEscapeProcessing = sal_False; - m_xCursorProperties->getPropertyValue( PROPERTY_ESCAPE_PROCESSING ) >>= bUseEscapeProcessing; - if ( bUseEscapeProcessing ) - { - Reference< XMultiServiceFactory > xFactory( ::dbtools::getConnection( m_xCursor ), UNO_QUERY ); - if ( xFactory.is() ) - { - m_xParser.set( xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.SingleSelectQueryComposer" ) ) ), UNO_QUERY ); - OSL_ENSURE( m_xParser.is(), "FormOperations::impl_ensureInitializedParser_nothrow: factory did not create a parser for us!" ); - } - } - - if ( m_xParser.is() ) - { - if ( m_xLoadableForm.is() && m_xLoadableForm->isLoaded() ) - { - ::rtl::OUString sStatement; - ::rtl::OUString sFilter; - ::rtl::OUString sSort; - - m_xCursorProperties->getPropertyValue( PROPERTY_ACTIVECOMMAND ) >>= sStatement; - m_xCursorProperties->getPropertyValue( PROPERTY_FILTER ) >>= sFilter; - m_xCursorProperties->getPropertyValue( PROPERTY_SORT ) >>= sSort; - - m_xParser->setElementaryQuery( sStatement ); - m_xParser->setFilter ( sFilter ); - m_xParser->setOrder ( sSort ); - } - - // start listening at the order/sort properties at the form, so - // we can keep our parser in sync - m_xCursorProperties->addPropertyChangeListener( PROPERTY_ACTIVECOMMAND, this ); - m_xCursorProperties->addPropertyChangeListener( PROPERTY_FILTER, this ); - m_xCursorProperties->addPropertyChangeListener( PROPERTY_SORT, this ); - } - } - catch( const Exception& ) - { - OSL_FAIL( "FormOperations::impl_ensureInitializedParser_nothrow: caught an exception!" ); - } - - m_bInitializedParser = true; - } - - //-------------------------------------------------------------------- - void FormOperations::impl_disposeParser_nothrow() - { - try - { - // if we have a parser (and a cursor), then we're listening at the cursor's - // properties to keep the parser in sync with the cursor - if ( m_xParser.is() && m_xCursorProperties.is() ) - { - m_xCursorProperties->removePropertyChangeListener( PROPERTY_FILTER, this ); - m_xCursorProperties->removePropertyChangeListener( PROPERTY_ACTIVECOMMAND, this ); - m_xCursorProperties->removePropertyChangeListener( PROPERTY_SORT, this ); - } - - Reference< XComponent > xParserComp( m_xParser, UNO_QUERY ); - if ( xParserComp.is() ) - xParserComp->dispose(); - m_xParser.clear(); - - m_bInitializedParser = false; - } - catch( const Exception& ) - { - OSL_FAIL( "FormOperations::impl_disposeParser_nothrow: caught an exception!" ); - } - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_canMoveLeft_throw( ) const - { - if ( !impl_hasCursor_nothrow() ) - return false; - - return impl_getRowCount_throw() && ( !m_xCursor->isFirst() || impl_isInsertionRow_throw() ); - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_canMoveRight_throw( ) const - { - if ( !impl_hasCursor_nothrow() ) - return false; - - bool bIsNew = impl_isInsertionRow_throw(); - - if ( impl_getRowCount_throw() && !m_xCursor->isLast() && !bIsNew ) - return true; - - if ( ::dbtools::canInsert( m_xCursorProperties ) ) - if ( !bIsNew || impl_isModifiedRow_throw() ) - return true; - - if ( bIsNew && m_bActiveControlModified ) - return true; - - return false; - } - - //-------------------------------------------------------------------- - namespace - { - template < typename TYPE > - TYPE lcl_safeGetPropertyValue_throw( const Reference< XPropertySet >& _rxProperties, const ::rtl::OUString& _rPropertyName, TYPE _Default ) - { - TYPE value( _Default ); - OSL_PRECOND( _rxProperties.is(), "FormOperations::<foo>: no cursor (already disposed?)!" ); - if ( _rxProperties.is() ) - OSL_VERIFY( _rxProperties->getPropertyValue( _rPropertyName ) >>= value ); - return value; - } - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_isInsertionRow_throw() const - { - return lcl_safeGetPropertyValue_throw( m_xCursorProperties, PROPERTY_ISNEW, false ); - } - - //-------------------------------------------------------------------- - sal_Int32 FormOperations::impl_getRowCount_throw() const - { - return lcl_safeGetPropertyValue_throw( m_xCursorProperties, PROPERTY_ROWCOUNT, (sal_Int32)0 ); - } - //-------------------------------------------------------------------- - bool FormOperations::impl_isRowCountFinal_throw() const - { - return lcl_safeGetPropertyValue_throw( m_xCursorProperties, PROPERTY_ROWCOUNTFINAL, false ); - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_isModifiedRow_throw() const - { - return lcl_safeGetPropertyValue_throw( m_xCursorProperties, PROPERTY_ISMODIFIED, false ); - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_isParseable_throw() const - { - const_cast< FormOperations* >( this )->impl_ensureInitializedParser_nothrow(); - return m_xParser.is() && m_xParser->getQuery().getLength(); - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_hasFilterOrOrder_throw() const - { - return impl_isParseable_throw() && ( m_xParser->getFilter().getLength() || m_xParser->getOrder().getLength() ); - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_isInsertOnlyForm_throw() const - { - return lcl_safeGetPropertyValue_throw( m_xCursorProperties, PROPERTY_INSERTONLY, true ); - } - - //------------------------------------------------------------------------------ - Reference< XControlModel > FormOperations::impl_getCurrentControlModel_throw() const - { - Reference< XControl > xControl( m_xController->getCurrentControl() ); - - // special handling for grid controls - Reference< XGrid > xGrid( xControl, UNO_QUERY ); - Reference< XControlModel > xControlModel; - - if ( xGrid.is() ) - { - Reference< XIndexAccess > xColumns( xControl->getModel(), UNO_QUERY_THROW ); - sal_Int16 nCurrentPos = xGrid->getCurrentColumnPosition(); - nCurrentPos = impl_gridView2ModelPos_nothrow( xColumns, nCurrentPos ); - - if ( nCurrentPos != (sal_Int16)-1 ) - xColumns->getByIndex( nCurrentPos ) >>= xControlModel; - } - else if ( xControl.is() ) - { - xControlModel = xControl->getModel(); - } - return xControlModel; - } - - //------------------------------------------------------------------------------ - Reference< XPropertySet > FormOperations::impl_getCurrentBoundField_nothrow( ) const - { - OSL_PRECOND( m_xController.is(), "FormOperations::impl_getCurrentBoundField_nothrow: no controller -> no control!" ); - if ( !m_xController.is() ) - return NULL; - - Reference< XPropertySet > xField; - try - { - Reference< XPropertySet > xControlModel( impl_getCurrentControlModel_throw(), UNO_QUERY ); - - if ( xControlModel.is() && ::comphelper::hasProperty( PROPERTY_BOUNDFIELD, xControlModel ) ) - xControlModel->getPropertyValue( PROPERTY_BOUNDFIELD ) >>= xField; - - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - return xField; - } - - //------------------------------------------------------------------------------ - sal_Int16 FormOperations::impl_gridView2ModelPos_nothrow( const Reference< XIndexAccess >& _rxColumns, sal_Int16 _nViewPos ) const - { - OSL_PRECOND( _rxColumns.is(), "FormOperations::impl_gridView2ModelPos_nothrow: invalid columns container!" ); - try - { - // loop through all columns - sal_Int16 col = 0; - Reference< XPropertySet > xCol; - bool bHidden( false ); - for ( col = 0; col < _rxColumns->getCount(); ++col ) - { - _rxColumns->getByIndex( col ) >>= xCol; - OSL_VERIFY( xCol->getPropertyValue( PROPERTY_HIDDEN ) >>= bHidden ); - if ( bHidden ) - continue; - - // for every visible col : if nViewPos is greater zero, decrement it, else we - // have found the model position - if ( !_nViewPos ) - break; - else - --_nViewPos; - } - if ( col < _rxColumns->getCount() ) - return col; - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - return (sal_Int16)-1; - } - - //------------------------------------------------------------------------------ - bool FormOperations::impl_moveLeft_throw( ) const - { - OSL_PRECOND( impl_hasCursor_nothrow(), "FormOperations::impl_moveLeft_throw: no cursor!" ); - if ( !impl_hasCursor_nothrow() ) - return false; - - sal_Bool bRecordInserted = sal_False; - sal_Bool bSuccess = impl_commitCurrentRecord_throw( &bRecordInserted ); - - if ( !bSuccess ) - return false; - - if ( bRecordInserted ) - { - // retrieve the bookmark of the new record and move to the record preceding this bookmark - Reference< XRowLocate > xLocate( m_xCursor, UNO_QUERY ); - OSL_ENSURE( xLocate.is(), "FormOperations::impl_moveLeft_throw: no XRowLocate!" ); - if ( xLocate.is() ) - xLocate->moveRelativeToBookmark( xLocate->getBookmark(), -1 ); - } - else - { - if ( impl_isInsertionRow_throw() ) - { - // we assume that the inserted record is now the last record in the - // result set - m_xCursor->last(); - } - else - m_xCursor->previous(); - } - - return true; - } - - //-------------------------------------------------------------------- - bool FormOperations::impl_moveRight_throw( ) const - { - OSL_PRECOND( impl_hasCursor_nothrow(), "FormOperations::impl_moveRight_throw: no cursor!" ); - if ( !impl_hasCursor_nothrow() ) - return false; - - sal_Bool bRecordInserted = sal_False; - sal_Bool bSuccess = impl_commitCurrentRecord_throw( &bRecordInserted ); - - if ( !bSuccess ) - return false; - - if ( bRecordInserted ) - { - // go to insert row - m_xUpdateCursor->moveToInsertRow(); - } - else - { - if ( m_xCursor->isLast() ) - m_xUpdateCursor->moveToInsertRow(); - else - m_xCursor->next(); - } - - return true; - } - - //-------------------------------------------------------------------- - void FormOperations::impl_resetAllControls_nothrow() const - { - Reference< XIndexAccess > xContainer( m_xCursor, UNO_QUERY ); - if ( !xContainer.is() ) - return; - - try - { - Reference< XReset > xReset; - sal_Int32 nCount( xContainer->getCount() ); - for ( sal_Int32 i = 0; i < nCount; ++i ) - { - if ( xContainer->getByIndex( i ) >>= xReset ) - { - // no resets on sub forms - Reference< XForm > xAsForm( xReset, UNO_QUERY ); - if ( !xAsForm.is() ) - xReset->reset(); - } - } - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - } - - //------------------------------------------------------------------------------ - void FormOperations::impl_executeAutoSort_throw( bool _bUp ) const - { - OSL_PRECOND( m_xController.is(), "FormOperations::impl_executeAutoSort_throw: need a controller for this!" ); - OSL_PRECOND( impl_hasCursor_nothrow(), "FormOperations::impl_executeAutoSort_throw: need a cursor for this!" ); - OSL_PRECOND( impl_isParseable_throw(), "FormOperations::impl_executeAutoSort_throw: need a parseable statement for this!" ); - if ( !m_xController.is() || !impl_hasCursor_nothrow() || !impl_isParseable_throw() ) - return; - - try - { - Reference< XControl > xControl = m_xController->getCurrentControl(); - if ( !xControl.is() || !impl_commitCurrentControl_throw() || !impl_commitCurrentRecord_throw() ) - return; - - Reference< XPropertySet > xBoundField( impl_getCurrentBoundField_nothrow() ); - if ( !xBoundField.is() ) - return; - - ::rtl::OUString sOriginalSort; - m_xCursorProperties->getPropertyValue( PROPERTY_SORT ) >>= sOriginalSort; - - // automatic sort by field is expected to always resets the previous sort order - m_xParser->setOrder( ::rtl::OUString() ); - - param_appendOrderByColumn aParam; - aParam.xField = xBoundField; - aParam.bUp = _bUp; - impl_doActionInSQLContext_throw( - (Action)&FormOperations::impl_appendOrderByColumn_throw, - static_cast< const void* >( &aParam ), - (sal_uInt16)RID_STR_COULD_NOT_SET_ORDER - ); - - WaitObject aWO( NULL ); - try - { - m_xCursorProperties->setPropertyValue( PROPERTY_SORT, makeAny( m_xParser->getOrder() ) ); - m_xLoadableForm->reload(); - } - catch( const Exception& ) - { - OSL_FAIL( "FormOperations::impl_executeAutoSort_throw: caught an exception while setting the parser properties!" ); - } - - - if ( !m_xLoadableForm->isLoaded() ) - { // something went wrong -> restore the original state - try - { - m_xParser->setOrder( sOriginalSort ); - m_xCursorProperties->setPropertyValue( PROPERTY_SORT, makeAny( m_xParser->getOrder() ) ); - m_xLoadableForm->reload(); - } - catch( const Exception& ) - { - OSL_FAIL( "FormOperations::impl_executeAutoSort_throw: could not reset the form to it's original state!" ); - } - - } - } - catch( const RuntimeException& ) { throw; } - catch( const SQLException& ) { throw; } - catch( const Exception& ) - { - throw WrappedTargetException( ::rtl::OUString(), *const_cast< FormOperations* >( this ), ::cppu::getCaughtException() ); - } - } - - //------------------------------------------------------------------------------ - void FormOperations::impl_executeAutoFilter_throw( ) const - { - OSL_PRECOND( m_xController.is(), "FormOperations::impl_executeAutoFilter_throw: need a controller for this!" ); - OSL_PRECOND( impl_hasCursor_nothrow(), "FormOperations::impl_executeAutoFilter_throw: need a cursor for this!" ); - OSL_PRECOND( impl_isParseable_throw(), "FormOperations::impl_executeAutoFilter_throw: need a parseable statement for this!" ); - if ( !m_xController.is() || !impl_hasCursor_nothrow() || !impl_isParseable_throw() ) - return; - - try - { - Reference< XControl > xControl = m_xController->getCurrentControl(); - if ( !xControl.is() || !impl_commitCurrentControl_throw() || !impl_commitCurrentRecord_throw() ) - return; - - Reference< XPropertySet > xBoundField( impl_getCurrentBoundField_nothrow() ); - if ( !xBoundField.is() ) - return; - - ::rtl::OUString sOriginalFilter; - m_xCursorProperties->getPropertyValue( PROPERTY_FILTER ) >>= sOriginalFilter; - sal_Bool bApplied = sal_True; - m_xCursorProperties->getPropertyValue( PROPERTY_APPLYFILTER ) >>= bApplied; - - // if we have a filter, but it's not applied, then we have to overwrite it, else append one - if ( !bApplied ) - m_xParser->setFilter( ::rtl::OUString() ); - - param_appendFilterByColumn aParam; - aParam.xField = xBoundField; - impl_doActionInSQLContext_throw( - (Action)&FormOperations::impl_appendFilterByColumn_throw, - static_cast< const void* >( &aParam ), - (sal_uInt16)RID_STR_COULD_NOT_SET_FILTER - ); - - WaitObject aWO( NULL ); - try - { - m_xCursorProperties->setPropertyValue( PROPERTY_FILTER, makeAny( m_xParser->getFilter() ) ); - m_xCursorProperties->setPropertyValue( PROPERTY_APPLYFILTER, makeAny( (sal_Bool)sal_True ) ); - - m_xLoadableForm->reload(); - } - catch( const Exception& ) - { - OSL_FAIL( "FormOperations::impl_executeAutoFilter_throw: caught an exception while setting the parser properties!" ); - } - - - if ( !m_xLoadableForm->isLoaded() ) - { // something went wrong -> restore the original state - try - { - m_xParser->setOrder( sOriginalFilter ); - m_xCursorProperties->setPropertyValue( PROPERTY_APPLYFILTER, makeAny( (sal_Bool)bApplied ) ); - m_xCursorProperties->setPropertyValue( PROPERTY_FILTER, makeAny( m_xParser->getFilter() ) ); - m_xLoadableForm->reload(); - } - catch( const Exception& ) - { - OSL_FAIL( "FormOperations::impl_executeAutoFilter_throw: could not reset the form to it's original state!" ); - } - - } - } - catch( const RuntimeException& ) { throw; } - catch( const SQLException& ) { throw; } - catch( const Exception& ) - { - throw WrappedTargetException( ::rtl::OUString(), *const_cast< FormOperations* >( this ), ::cppu::getCaughtException() ); - } - } - - //-------------------------------------------------------------------- - void FormOperations::impl_executeFilterOrSort_throw( bool _bFilter ) const - { - OSL_PRECOND( m_xController.is(), "FormOperations::impl_executeFilterOrSort_throw: need a controller for this!" ); - OSL_PRECOND( impl_hasCursor_nothrow(), "FormOperations::impl_executeFilterOrSort_throw: need a cursor for this!" ); - OSL_PRECOND( impl_isParseable_throw(), "FormOperations::impl_executeFilterOrSort_throw: need a parseable statement for this!" ); - if ( !m_xController.is() || !impl_hasCursor_nothrow() || !impl_isParseable_throw() ) - return; - - if ( !impl_commitCurrentControl_throw() || !impl_commitCurrentRecord_throw() ) - return; - try - { - PropertyValue aFirst; - aFirst.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "QueryComposer" ) ); - aFirst.Value <<= m_xParser; - - PropertyValue aSecond; - aSecond.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RowSet" ) ); - aSecond.Value <<= m_xCursorProperties; - - Sequence<Any> aInit(2); - aInit[0] <<= aFirst; - aInit[1] <<= aSecond; - - ::rtl::OUString sDialogServiceName; - if ( _bFilter ) - sDialogServiceName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.FilterDialog" ) ); - else - sDialogServiceName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.OrderDialog" ) ); - - Reference< XExecutableDialog> xDialog; - m_aContext.createComponentWithArguments( sDialogServiceName, aInit, xDialog ); - - if ( !xDialog.is() ) - { - ShowServiceNotAvailableError( NULL, sDialogServiceName, sal_True ); - return; - } - - if ( RET_OK == xDialog->execute() ) - { - WaitObject aWO( NULL ); - if ( _bFilter ) - m_xCursorProperties->setPropertyValue( PROPERTY_FILTER, makeAny( m_xParser->getFilter() ) ); - else - m_xCursorProperties->setPropertyValue( PROPERTY_SORT, makeAny( m_xParser->getOrder() ) ); - m_xLoadableForm->reload(); - } - - } - catch( const RuntimeException& ) { throw; } - catch( const SQLException& ) { throw; } - catch( const Exception& ) - { - throw WrappedTargetException( ::rtl::OUString(), *const_cast< FormOperations* >( this ), ::cppu::getCaughtException() ); - } - } - - //------------------------------------------------------------------------------ - void FormOperations::impl_appendOrderByColumn_throw( const void* _pActionParam ) const - { - const param_appendOrderByColumn* pParam = static_cast< const param_appendOrderByColumn* >( _pActionParam ); - m_xParser->appendOrderByColumn( pParam->xField, pParam->bUp ); - } - - //------------------------------------------------------------------------------ - void FormOperations::impl_appendFilterByColumn_throw( const void* _pActionParam ) const - { - const param_appendFilterByColumn* pParam = static_cast< const param_appendFilterByColumn* >( _pActionParam ); - sal_Int32 nOp = SQLFilterOperator::EQUAL; - if ( pParam->xField.is() ) - { - sal_Int32 nType = 0; - pParam->xField->getPropertyValue(PROPERTY_FIELDTYPE) >>= nType; - switch(nType) - { - case DataType::VARCHAR: - case DataType::CHAR: - case DataType::LONGVARCHAR: - nOp = SQLFilterOperator::LIKE; - break; - default: - nOp = SQLFilterOperator::EQUAL; - } - } - m_xParser->appendFilterByColumn( pParam->xField, sal_True,nOp ); - } - - //------------------------------------------------------------------------------ - void FormOperations::impl_doActionInSQLContext_throw( Action _pAction, const void* _pParam, sal_uInt16 _nErrorResourceId ) const - { - try - { - (this->*_pAction)( _pParam ); - } - catch( const SQLException& e ) - { - (void)e; - if ( !_nErrorResourceId ) - // no information to prepend - throw; - - SQLExceptionInfo aInfo( ::cppu::getCaughtException() ); - ::rtl::OUString sAdditionalError( FRM_RES_STRING( _nErrorResourceId ) ); - aInfo.prepend( sAdditionalError ); - aInfo.doThrow(); - } - catch( const RuntimeException& ) { throw; } - catch( const Exception& ) - { - ::rtl::OUString sAdditionalError( FRM_RES_STRING( _nErrorResourceId ) ); - throw WrappedTargetException( sAdditionalError, *const_cast< FormOperations* >( this ), ::cppu::getCaughtException() ); - } - } - -//........................................................................ -} // namespace frm -//........................................................................ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |