2000-09-18 16:07:07 +00:00
/*************************************************************************
*
2005-09-08 21:51:18 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-09-18 16:07:07 +00:00
*
2005-09-08 21:51:18 +00:00
* $ RCSfile : fmctrler . cxx , v $
2000-09-18 16:07:07 +00:00
*
2007-06-27 17:11:37 +00:00
* $ Revision : 1.64 $
2000-09-18 16:07:07 +00:00
*
2007-06-27 17:11:37 +00:00
* last change : $ Author : hr $ $ Date : 2007 - 06 - 27 18 : 11 : 37 $
2000-09-18 16:07:07 +00:00
*
2005-09-08 21:51:18 +00:00
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1 .
2000-09-18 16:07:07 +00:00
*
*
2005-09-08 21:51:18 +00:00
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2005 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
2000-09-18 16:07:07 +00:00
*
2005-09-08 21:51:18 +00:00
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
2000-09-18 16:07:07 +00:00
*
2005-09-08 21:51:18 +00:00
* This library 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 for more details .
2000-09-18 16:07:07 +00:00
*
2005-09-08 21:51:18 +00:00
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
2000-09-18 16:07:07 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-17 04:05:26 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_svx.hxx"
2000-09-18 16:07:07 +00:00
# define USE_PROPERTY_HELPER
# ifndef _SVX_FMCTRLER_HXX
# include "fmctrler.hxx"
# endif
# ifndef _SVX_FMTOOLS_HXX
# include "fmtools.hxx"
# endif
# ifndef _SVX_FMPROP_HRC
# include "fmprop.hrc"
# endif
2000-09-21 11:31:31 +00:00
# ifndef _SVX_FMSHELL_HXX
2007-06-27 17:11:37 +00:00
# include <svx/fmshell.hxx>
2000-09-21 11:31:31 +00:00
# endif
2001-07-25 12:44:28 +00:00
# ifndef SVX_FORM_CONFIRMDELETE_HXX
# include "confirmdelete.hxx"
# endif
2004-07-05 14:50:20 +00:00
# ifndef SVX_SOURCE_INC_FMCONTROLBORDERMANAGER_HXX
# include "fmcontrolbordermanager.hxx"
# endif
# ifndef SVX_SOURCE_INC_FMDOCUMENTCLASSIFICATION_HXX
# include "fmdocumentclassification.hxx"
# endif
2005-01-05 11:20:25 +00:00
# ifndef SVX_SOURCE_INC_FMCONTROLLAYOUT_HXX
# include "fmcontrollayout.hxx"
# endif
2004-04-13 10:05:48 +00:00
# ifndef _SVX_FMURL_HXX
# include "fmurl.hxx"
# endif
# ifndef SVX_FMDISPATCH_HXX
# include "fmdispatch.hxx"
# endif
2006-07-26 06:43:01 +00:00
# ifndef _TRACE_HXX_
# include "trace.hxx"
# endif
2000-09-18 16:07:07 +00:00
2003-03-27 14:06:05 +00:00
# ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_
# include <com/sun/star/beans/NamedValue.hpp>
# endif
2000-09-18 16:07:07 +00:00
# ifndef _COM_SUN_STAR_SDB_ROWCHANGEACTION_HPP_
# include <com/sun/star/sdb/RowChangeAction.hpp>
# endif
# ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
# include <com/sun/star/sdbc/ColumnValue.hpp>
# endif
# ifndef _COM_SUN_STAR_FORM_XLOADABLE_HPP_
# include <com/sun/star/form/XLoadable.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_XCOMBOBOX_HPP_
# include <com/sun/star/awt/XComboBox.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_XCHECKBOX_HPP_
# include <com/sun/star/awt/XCheckBox.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_XLISTBOX_HPP_
# include <com/sun/star/awt/XListBox.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_FOCUSCHANGEREASON_HPP_
# include <com/sun/star/awt/FocusChangeReason.hpp>
# endif
# ifndef _COM_SUN_STAR_UTIL_XURLTRANSFORMER_HPP_
# include <com/sun/star/util/XURLTransformer.hpp>
# endif
2004-04-02 09:29:20 +00:00
# ifndef _COM_SUN_STAR_FORM_VALIDATION_XVALIDATABLEFORMCOMPONENT_HPP_
# include <com/sun/star/form/validation/XValidatableFormComponent.hpp>
# endif
2000-09-18 16:07:07 +00:00
# ifndef _COM_SUN_STAR_FORM_XRESET_HPP_
# include <com/sun/star/form/XReset.hpp>
# endif
# ifndef _COM_SUN_STAR_FORM_TABULATORCYCLE_HPP_
# include <com/sun/star/form/TabulatorCycle.hpp>
# endif
# ifndef _COM_SUN_STAR_FORM_XBOUNDCONTROL_HPP_
# include <com/sun/star/form/XBoundControl.hpp>
# endif
# ifndef _COM_SUN_STAR_FRAME_XCONTROLLER_HPP_
# include <com/sun/star/frame/XController.hpp>
# endif
# ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
# include <com/sun/star/beans/PropertyAttribute.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_XVCLWINDOWPEER_HPP_
# include <com/sun/star/awt/XVclWindowPeer.hpp>
# endif
2003-03-27 14:06:05 +00:00
# ifndef _COM_SUN_STAR_FORM_XBOUNDCOMPONENT_HPP_
# include <com/sun/star/form/XBoundComponent.hpp>
# endif
# ifndef _COM_SUN_STAR_SDB_XINTERACTIONSUPPLYPARAMETERS_HPP_
# include <com/sun/star/sdb/XInteractionSupplyParameters.hpp>
# endif
# ifndef _COM_SUN_STAR_SDB_PARAMETERSREQUEST_HPP_
# include <com/sun/star/sdb/ParametersRequest.hpp>
# endif
2006-11-14 12:24:06 +00:00
# ifndef _COM_SUN_STAR_CONTAINER_XIDENTIFIERREPLACE_HPP_
# include <com/sun/star/container/XIdentifierReplace.hpp>
# endif
2000-09-18 16:07:07 +00:00
# ifndef _TOOLS_DEBUG_HXX //autogen
# include <tools/debug.hxx>
# endif
# ifndef _SV_SVAPP_HXX //autogen
# include <vcl/svapp.hxx>
# endif
# ifndef _SVDPAGV_HXX //autogen
2007-06-27 17:11:37 +00:00
# include <svx/svdpagv.hxx>
2000-09-18 16:07:07 +00:00
# endif
# ifndef _SVX_FMSHIMP_HXX
# include <fmshimp.hxx>
# endif
# ifndef _SVX_FMVIEW_HXX
2007-06-27 17:11:37 +00:00
# include <svx/fmview.hxx>
2000-09-18 16:07:07 +00:00
# endif
# ifndef _SV_MSGBOX_HXX //autogen wg. RET_YES
# include <vcl/msgbox.hxx>
# endif
# ifndef _SVX_FMRESIDS_HRC
# include "fmresids.hrc"
# endif
2000-09-21 11:31:31 +00:00
# ifndef _SFXVIEWSH_HXX
# include <sfx2/viewsh.hxx>
# endif
# ifndef _SFXVIEWFRM_HXX
# include <sfx2/viewfrm.hxx>
# endif
# ifndef _SFX_BINDINGS_HXX
# include <sfx2/bindings.hxx>
# endif
2000-09-18 16:07:07 +00:00
# ifndef _SHL_HXX
# include <tools/shl.hxx>
# endif
# ifndef _SVX_DIALMGR_HXX
2007-06-27 17:11:37 +00:00
# include <svx/dialmgr.hxx>
2000-09-18 16:07:07 +00:00
# endif
2000-10-31 08:31:59 +00:00
# ifndef _SVX_FMSERVS_HXX
# include "fmservs.hxx"
# endif
2000-09-18 16:07:07 +00:00
2000-10-20 13:18:57 +00:00
# ifndef _COMPHELPER_PROPERTY_HXX_
# include <comphelper/property.hxx>
2000-09-18 16:07:07 +00:00
# endif
2000-10-20 13:18:57 +00:00
# ifndef _COMPHELPER_UNO3_HXX_
# include <comphelper/uno3.hxx>
2000-09-18 16:07:07 +00:00
# endif
2000-10-20 13:18:57 +00:00
# ifndef _COMPHELPER_PROPERTY_AGGREGATION_HXX_
# include <comphelper/propagg.hxx>
2000-09-18 16:07:07 +00:00
# endif
2000-10-20 13:18:57 +00:00
# ifndef _COMPHELPER_ENUMHELPER_HXX_
# include <comphelper/enumhelper.hxx>
2000-09-18 16:07:07 +00:00
# endif
2000-10-20 13:18:57 +00:00
# ifndef _COMPHELPER_SEQUENCE_HXX_
# include <comphelper/sequence.hxx>
2000-09-18 16:07:07 +00:00
# endif
# ifndef _CPPUHELPER_QUERYINTERFACE_HXX_
# include <cppuhelper/queryinterface.hxx>
# endif
# ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
# include <cppuhelper/typeprovider.hxx>
# endif
2004-04-13 10:05:48 +00:00
# ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
# include <cppuhelper/typeprovider.hxx>
# endif
2001-03-15 08:02:28 +00:00
# ifndef _COMPHELPER_EXTRACT_HXX_
# include <comphelper/extract.hxx>
2000-09-18 16:07:07 +00:00
# endif
# ifndef _TOOLKIT_UNOHLP_HXX
# include <toolkit/helper/vclunohelper.hxx>
# endif
2000-11-06 06:19:53 +00:00
# ifndef _COMPHELPER_SEQUENCE_HXX_
# include <comphelper/sequence.hxx>
# endif
2000-10-31 08:31:59 +00:00
# ifndef _COMPHELPER_INTERACTION_HXX_
# include <comphelper/interaction.hxx>
# endif
2003-03-27 14:06:05 +00:00
# ifndef _TOOLKIT_CONTROLS_UNOCONTROL_HXX_
# include <toolkit/controls/unocontrol.hxx>
2000-10-31 08:31:59 +00:00
# endif
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
# ifndef _SDRPAGEWINDOW_HXX
2007-06-27 17:11:37 +00:00
# include <svx/sdrpagewindow.hxx>
2006-11-14 12:24:06 +00:00
# endif
2004-04-13 10:05:48 +00:00
# include <algorithm>
2004-09-08 13:40:31 +00:00
# include <functional>
2004-04-13 10:05:48 +00:00
2004-07-05 14:50:20 +00:00
using namespace : : com : : sun : : star ;
2000-09-18 16:07:07 +00:00
using namespace : : com : : sun : : star : : uno ;
2001-05-29 13:15:08 +00:00
using namespace : : com : : sun : : star : : awt ;
2000-10-31 08:31:59 +00:00
using namespace : : com : : sun : : star : : sdb ;
using namespace : : com : : sun : : star : : sdbc ;
2004-04-13 10:05:48 +00:00
using namespace : : com : : sun : : star : : sdbcx ;
2000-10-31 08:31:59 +00:00
using namespace : : com : : sun : : star : : task ;
2001-05-29 13:15:08 +00:00
using namespace : : com : : sun : : star : : lang ;
using namespace : : com : : sun : : star : : util ;
using namespace : : com : : sun : : star : : form ;
2004-04-02 09:29:20 +00:00
using namespace : : com : : sun : : star : : form : : validation ;
2007-05-10 09:05:49 +00:00
using namespace : : com : : sun : : star : : form : : runtime ;
2001-06-15 10:11:14 +00:00
using namespace : : com : : sun : : star : : frame ;
2000-10-31 08:31:59 +00:00
using namespace : : com : : sun : : star : : beans ;
2004-04-13 10:05:48 +00:00
using namespace : : com : : sun : : star : : script ;
2004-04-02 09:29:20 +00:00
using namespace : : com : : sun : : star : : container ;
2000-10-31 08:31:59 +00:00
using namespace : : comphelper ;
2001-05-29 13:15:08 +00:00
using namespace : : connectivity ;
2001-07-25 12:44:28 +00:00
using namespace : : svxform ;
using namespace : : connectivity : : simple ;
2000-09-18 16:07:07 +00:00
2000-10-31 08:31:59 +00:00
//==================================================================
// FmXAutoControl
//==================================================================
class OParameterContinuation : public OInteraction < XInteractionSupplyParameters >
{
Sequence < PropertyValue > m_aValues ;
public :
OParameterContinuation ( ) { }
Sequence < PropertyValue > getValues ( ) const { return m_aValues ; }
// XInteractionSupplyParameters
virtual void SAL_CALL setParameters ( const Sequence < PropertyValue > & _rValues ) throw ( RuntimeException ) ;
} ;
//------------------------------------------------------------------
void SAL_CALL OParameterContinuation : : setParameters ( const Sequence < PropertyValue > & _rValues ) throw ( RuntimeException )
{
m_aValues = _rValues ;
}
2000-09-18 16:07:07 +00:00
//==================================================================
// FmXAutoControl
//==================================================================
struct FmFieldInfo
{
rtl : : OUString aFieldName ;
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xField ;
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
FmFieldInfo ( const Reference < XPropertySet > & _xField , const Reference < XTextComponent > & _xText )
2000-09-18 16:07:07 +00:00
: xField ( _xField )
, xText ( _xText )
{ xField - > getPropertyValue ( FM_PROP_NAME ) > > = aFieldName ; }
} ;
//==================================================================
// FmXAutoControl
//==================================================================
class FmXAutoControl : public UnoControl
{
friend Reference < XInterface > SAL_CALL FmXAutoControl_NewInstance_Impl ( ) ;
public :
FmXAutoControl ( ) { }
virtual : : rtl : : OUString GetComponentServiceName ( ) { return : : rtl : : OUString : : createFromAscii ( " Edit " ) ; }
2004-04-13 10:05:48 +00:00
virtual void SAL_CALL createPeer ( const Reference < XToolkit > & rxToolkit , const Reference < XWindowPeer > & rParentPeer ) throw ( RuntimeException ) ;
2000-09-18 16:07:07 +00:00
protected :
virtual void ImplSetPeerProperty ( const : : rtl : : OUString & rPropName , const Any & rVal ) ;
} ;
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXAutoControl : : createPeer ( const Reference < XToolkit > & rxToolkit , const Reference < XWindowPeer > & rParentPeer ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
UnoControl : : createPeer ( rxToolkit , rParentPeer ) ;
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ( getPeer ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xText . is ( ) )
{
2005-04-13 07:28:58 +00:00
xText - > setText ( : : rtl : : OUString ( String ( SVX_RES ( RID_STR_AUTOFIELD ) ) ) ) ;
2000-09-18 16:07:07 +00:00
xText - > setEditable ( sal_False ) ;
}
}
//------------------------------------------------------------------------------
void FmXAutoControl : : ImplSetPeerProperty ( const : : rtl : : OUString & rPropName , const Any & rVal )
{
// these properties are ignored
if ( rPropName = = FM_PROP_TEXT )
return ;
UnoControl : : ImplSetPeerProperty ( rPropName , rVal ) ;
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
IMPL_LINK ( FmXFormController , OnActivateTabOrder , void * , /*EMPTYTAG*/ )
2000-09-18 16:07:07 +00:00
{
activateTabOrder ( ) ;
return 1 ;
}
2004-04-13 10:05:48 +00:00
//------------------------------------------------------------------------------
struct UpdateAllListeners : public : : std : : unary_function < Reference < XDispatch > , bool >
{
bool operator ( ) ( const Reference < XDispatch > & _rxDispatcher ) const
{
static_cast < : : svx : : OSingleFeatureDispatcher * > ( _rxDispatcher . get ( ) ) - > updateAllListeners ( ) ;
// the return is a dummy only so we can use this struct in a std::compose1 call
return true ;
}
} ;
//..............................................................................
2006-06-19 14:53:21 +00:00
IMPL_LINK ( FmXFormController , OnInvalidateFeatures , void * , /*_pNotInterestedInThisParam*/ )
2004-04-13 10:05:48 +00:00
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
for ( : : std : : set < sal_Int32 > : : const_iterator aLoop = m_aInvalidFeatures . begin ( ) ;
aLoop ! = m_aInvalidFeatures . end ( ) ;
+ + aLoop
)
{
DispatcherContainer : : const_iterator aDispatcherPos = m_aFeatureDispatchers . find ( * aLoop ) ;
if ( aDispatcherPos ! = m_aFeatureDispatchers . end ( ) )
{
// TODO: for the real and actual listener notifications, we should release
// our mutex
UpdateAllListeners ( ) ( aDispatcherPos - > second ) ;
}
}
return 1 ;
}
2000-09-18 16:07:07 +00:00
/*************************************************************************/
//------------------------------------------------------------------
Reference < XInterface > SAL_CALL
2004-04-13 10:05:48 +00:00
FmXFormController_NewInstance_Impl ( const Reference < XMultiServiceFactory > & _rxORB )
2000-09-18 16:07:07 +00:00
{
2000-11-06 06:19:53 +00:00
return * ( new FmXFormController ( _rxORB ) ) ;
2000-09-18 16:07:07 +00:00
}
2001-05-21 07:30:40 +00:00
//------------------------------------------------------------------
namespace fmctrlr
{
const : : rtl : : OUString & getDataModeIdentifier ( )
{
static : : rtl : : OUString s_sDataModeIdentifier = DATA_MODE ;
return s_sDataModeIdentifier ;
}
}
using namespace fmctrlr ;
2002-12-05 08:58:04 +00:00
DBG_NAME ( FmXFormController )
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
FmXFormController : : FmXFormController ( const Reference < XMultiServiceFactory > & _rxORB ,
FmFormView * _pView , Window * _pWindow )
2000-11-06 06:19:53 +00:00
: FmXFormController_BASE1 ( m_aMutex )
, OPropertySetHelper ( FmXFormController_BASE1 : : rBHelper )
2001-07-25 12:44:28 +00:00
, OSQLParserClient ( _rxORB )
2000-11-06 06:19:53 +00:00
, m_xORB ( _rxORB )
2000-09-18 16:07:07 +00:00
, m_aActivateListeners ( m_aMutex )
, m_aModifyListeners ( m_aMutex )
, m_aErrorListeners ( m_aMutex )
, m_aDeleteListeners ( m_aMutex )
, m_aRowSetApproveListeners ( m_aMutex )
, m_aParameterListeners ( m_aMutex )
, m_pView ( _pView )
, m_pWindow ( _pWindow )
2004-07-05 14:50:20 +00:00
, m_pControlBorderManager ( new : : svxform : : ControlBorderManager )
2006-06-19 14:53:21 +00:00
, m_aControllerFeatures ( _rxORB , this )
, m_aMode ( getDataModeIdentifier ( ) )
2000-09-18 16:07:07 +00:00
, m_nLoadEvent ( 0 )
2006-06-19 14:53:21 +00:00
, m_nToggleEvent ( 0 )
, m_nCurrentFilterPosition ( 0 )
2000-09-18 16:07:07 +00:00
, m_bCurrentRecordModified ( sal_False )
, m_bCurrentRecordNew ( sal_False )
, m_bLocked ( sal_False )
2006-06-19 14:53:21 +00:00
, m_bDBConnection ( sal_False )
, m_bCycle ( sal_False )
, m_bCanInsert ( sal_False )
, m_bCanUpdate ( sal_False )
, m_bCommitLock ( sal_False )
, m_bModified ( sal_False )
, m_bControlsSorted ( sal_False )
2000-09-18 16:07:07 +00:00
, m_bFiltering ( sal_False )
, m_bAttachEvents ( sal_True )
, m_bDetachEvents ( sal_True )
2004-11-16 10:22:40 +00:00
, m_bAttemptedHandlerCreation ( false )
2000-09-18 16:07:07 +00:00
{
2002-12-05 08:58:04 +00:00
DBG_CTOR ( FmXFormController , NULL ) ;
2000-10-20 13:18:57 +00:00
: : comphelper : : increment ( m_refCount ) ;
2000-09-18 16:07:07 +00:00
{
2004-04-15 10:26:50 +00:00
{
m_xAggregate = Reference < XAggregation > (
m_xORB - > createInstance ( : : rtl : : OUString : : createFromAscii ( " com.sun.star.awt.TabController " ) ) ,
UNO_QUERY
) ;
DBG_ASSERT ( m_xAggregate . is ( ) , " FmXFormController::FmXFormController : could not create my aggregate ! " ) ;
m_xTabController = Reference < XTabController > ( m_xAggregate , UNO_QUERY ) ;
}
if ( m_xAggregate . is ( ) )
2004-04-13 10:05:48 +00:00
m_xAggregate - > setDelegator ( * this ) ;
}
2000-10-20 13:18:57 +00:00
: : comphelper : : decrement ( m_refCount ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
m_aTabActivationTimer . SetTimeout ( 500 ) ;
m_aTabActivationTimer . SetTimeoutHdl ( LINK ( this , FmXFormController , OnActivateTabOrder ) ) ;
m_aFeatureInvalidationTimer . SetTimeout ( 200 ) ;
m_aFeatureInvalidationTimer . SetTimeoutHdl ( LINK ( this , FmXFormController , OnInvalidateFeatures ) ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------
FmXFormController : : ~ FmXFormController ( )
{
2003-10-21 07:43:57 +00:00
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
if ( m_nLoadEvent )
Application : : RemoveUserEvent ( m_nLoadEvent ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
if ( m_nToggleEvent )
2003-10-21 07:43:57 +00:00
Application : : RemoveUserEvent ( m_nToggleEvent ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
if ( m_aTabActivationTimer . IsActive ( ) )
m_aTabActivationTimer . Stop ( ) ;
2003-10-21 07:43:57 +00:00
}
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
if ( m_aFeatureInvalidationTimer . IsActive ( ) )
m_aFeatureInvalidationTimer . Stop ( ) ;
2005-01-21 15:56:33 +00:00
disposeAllFeaturesAndDispatchers ( ) ;
2004-04-13 10:05:48 +00:00
2000-09-18 16:07:07 +00:00
// Freigeben der Aggregation
2004-04-13 10:05:48 +00:00
if ( m_xAggregate . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
m_xAggregate - > setDelegator ( NULL ) ;
m_xAggregate . clear ( ) ;
2000-09-18 16:07:07 +00:00
}
2002-12-05 08:58:04 +00:00
2004-07-05 14:50:20 +00:00
DELETEZ ( m_pControlBorderManager ) ;
2002-12-05 08:58:04 +00:00
DBG_DTOR ( FmXFormController , NULL ) ;
2000-09-18 16:07:07 +00:00
}
2002-12-05 08:58:04 +00:00
2000-11-06 06:19:53 +00:00
// -----------------------------------------------------------------------------
2000-09-18 16:07:07 +00:00
using namespace : : cppu ;
using namespace : : osl ;
2001-09-12 17:11:08 +00:00
void SAL_CALL FmXFormController : : acquire ( ) throw ( )
2000-11-06 06:19:53 +00:00
{
FmXFormController_BASE1 : : acquire ( ) ;
}
// -----------------------------------------------------------------------------
2001-09-12 17:11:08 +00:00
void SAL_CALL FmXFormController : : release ( ) throw ( )
2000-11-06 06:19:53 +00:00
{
FmXFormController_BASE1 : : release ( ) ;
}
// -----------------------------------------------------------------------------
2000-09-18 16:07:07 +00:00
// XUnoTunnel
Sequence < sal_Int8 > FmXFormController : : getUnoTunnelImplementationId ( )
{
static OImplementationId * pId = 0 ;
if ( ! pId )
{
MutexGuard aGuard ( Mutex : : getGlobalMutex ( ) ) ;
if ( ! pId )
{
static OImplementationId aId ;
pId = & aId ;
}
}
return pId - > getImplementationId ( ) ;
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
FmXFormController * FmXFormController : : getImplementation ( const Reference < XInterface > & _rxComponent )
{
Reference < XUnoTunnel > xTunnel ( _rxComponent , UNO_QUERY ) ;
if ( xTunnel . is ( ) )
return reinterpret_cast < FmXFormController * > ( xTunnel - > getSomething ( getUnoTunnelImplementationId ( ) ) ) ;
return NULL ;
}
//------------------------------------------------------------------------------
2000-09-18 16:07:07 +00:00
sal_Int64 SAL_CALL FmXFormController : : getSomething ( Sequence < sal_Int8 > const & rId ) throw ( RuntimeException )
{
if ( rId . getLength ( ) = = 16 & & 0 = = rtl_compareMemory ( getUnoTunnelImplementationId ( ) . getConstArray ( ) , rId . getConstArray ( ) , 16 ) )
2006-06-19 14:53:21 +00:00
return reinterpret_cast < sal_Int64 > ( this ) ;
2000-09-18 16:07:07 +00:00
return sal_Int64 ( ) ;
}
2004-04-13 10:05:48 +00:00
//------------------------------------------------------------------------------
Sequence < sal_Int8 > SAL_CALL FmXFormController : : getImplementationId ( ) throw ( RuntimeException )
{
static : : cppu : : OImplementationId * pId = 0 ;
if ( ! pId )
{
: : osl : : MutexGuard aGuard ( : : osl : : Mutex : : getGlobalMutex ( ) ) ;
if ( ! pId )
{
static : : cppu : : OImplementationId aId ;
pId = & aId ;
}
}
return pId - > getImplementationId ( ) ;
}
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
Sequence < Type > SAL_CALL FmXFormController : : getTypes ( ) throw ( RuntimeException )
{
2000-11-06 06:19:53 +00:00
return comphelper : : concatSequences ( FmXFormController_BASE1 : : getTypes ( ) , FmXFormController_BASE2 : : getTypes ( ) , FmXFormController_BASE3 : : getTypes ( ) ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------
2000-11-06 06:19:53 +00:00
Any SAL_CALL FmXFormController : : queryAggregation ( const Type & _rType ) throw ( RuntimeException )
{
Any aRet = FmXFormController_BASE1 : : queryAggregation ( _rType ) ;
if ( ! aRet . hasValue ( ) )
{
aRet = OPropertySetHelper : : queryInterface ( _rType ) ;
if ( ! aRet . hasValue ( ) )
{
aRet = FmXFormController_BASE2 : : queryInterface ( _rType ) ;
if ( ! aRet . hasValue ( ) )
aRet = FmXFormController_BASE3 : : queryInterface ( _rType ) ;
}
}
2000-09-18 16:07:07 +00:00
if ( aRet . hasValue ( ) )
return aRet ;
2000-11-06 06:19:53 +00:00
return m_xAggregate - > queryAggregation ( _rType ) ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
// XServiceInfo
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
sal_Bool SAL_CALL FmXFormController : : supportsService ( const : : rtl : : OUString & ServiceName ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
Sequence < : : rtl : : OUString > aSNL ( getSupportedServiceNames ( ) ) ;
2000-09-18 16:07:07 +00:00
const : : rtl : : OUString * pArray = aSNL . getConstArray ( ) ;
for ( sal_Int32 i = 0 ; i < aSNL . getLength ( ) ; i + + )
if ( pArray [ i ] = = ServiceName )
return sal_True ;
return sal_False ;
}
//------------------------------------------------------------------------------
: : rtl : : OUString SAL_CALL FmXFormController : : getImplementationName ( ) throw ( RuntimeException )
{
return : : rtl : : OUString : : createFromAscii ( " com.sun.star.form.FmXFormController " ) ;
}
//------------------------------------------------------------------------------
Sequence < : : rtl : : OUString > SAL_CALL FmXFormController : : getSupportedServiceNames ( void ) throw ( RuntimeException )
{
2004-04-13 10:05:48 +00:00
// service names which are supported only, but cannot be used to created an
// instance at a service factory
Sequence < : : rtl : : OUString > aNonCreatableServiceNames ( 1 ) ;
aNonCreatableServiceNames [ 0 ] = : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.form.FormControllerDispatcher " ) ) ;
// services which can be used to created an instance at a service factory
Sequence < : : rtl : : OUString > aCreatableServiceNames ( getSupportedServiceNames_Static ( ) ) ;
return : : comphelper : : concatSequences ( aCreatableServiceNames , aNonCreatableServiceNames ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
sal_Bool SAL_CALL FmXFormController : : approveReset ( const EventObject & /*rEvent*/ ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
return sal_True ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : resetted ( const EventObject & rEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
if ( getCurrentControl ( ) . is ( ) & & ( getCurrentControl ( ) - > getModel ( ) = = rEvent . Source ) )
m_bModified = sal_False ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Sequence < : : rtl : : OUString > FmXFormController : : getSupportedServiceNames_Static ( void )
2000-09-18 16:07:07 +00:00
{
static Sequence < : : rtl : : OUString > aServices ;
if ( ! aServices . getLength ( ) )
{
aServices . realloc ( 2 ) ;
aServices . getArray ( ) [ 0 ] = : : rtl : : OUString : : createFromAscii ( " com.sun.star.form.FormController " ) ;
aServices . getArray ( ) [ 1 ] = : : rtl : : OUString : : createFromAscii ( " com.sun.star.awt.control.TabController " ) ;
}
return aServices ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : setCurrentFilterPosition ( sal_Int32 nPos )
2000-09-18 16:07:07 +00:00
{
2001-05-16 13:22:30 +00:00
DBG_ASSERT ( nPos < ( sal_Int32 ) m_aFilters . size ( ) , " Invalid Position " ) ;
2000-09-18 16:07:07 +00:00
if ( nPos ! = m_nCurrentFilterPosition )
{
m_nCurrentFilterPosition = nPos ;
// reset the text for all controls
for ( FmFilterControls : : const_iterator iter = m_aFilterControls . begin ( ) ;
iter ! = m_aFilterControls . end ( ) ; iter + + )
( * iter ) . first - > setText ( rtl : : OUString ( ) ) ;
2004-04-13 10:05:48 +00:00
if ( nPos ! = - 1 )
2000-09-18 16:07:07 +00:00
{
// set the text for all filters
2004-04-13 10:05:48 +00:00
OSL_ENSURE ( ( m_aFilters . size ( ) > ( size_t ) m_nCurrentFilterPosition ) & & ( m_nCurrentFilterPosition > = 0 ) ,
" FmXFormController::setCurrentFilterPosition: m_nCurrentFilterPosition too big " ) ;
2004-03-02 11:38:26 +00:00
2004-04-13 10:05:48 +00:00
if ( ( m_nCurrentFilterPosition > = 0 ) & & ( ( size_t ) m_nCurrentFilterPosition < m_aFilters . size ( ) ) )
{
2004-03-02 11:38:26 +00:00
FmFilterRow & rRow = m_aFilters [ m_nCurrentFilterPosition ] ;
for ( FmFilterRow : : const_iterator iter2 = rRow . begin ( ) ;
2004-04-13 10:05:48 +00:00
iter2 ! = rRow . end ( ) ; iter2 + + )
2004-03-02 11:38:26 +00:00
{
( * iter2 ) . first - > setText ( ( * iter2 ) . second ) ;
}
2000-09-18 16:07:07 +00:00
}
}
}
}
// OPropertySetHelper
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
sal_Bool FmXFormController : : convertFastPropertyValue ( Any & /*rConvertedValue*/ , Any & /*rOldValue*/ ,
sal_Int32 /*nHandle*/ , const Any & /*rValue*/ )
2004-04-13 10:05:48 +00:00
throw ( IllegalArgumentException )
2000-09-18 16:07:07 +00:00
{
return sal_False ;
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void FmXFormController : : setFastPropertyValue_NoBroadcast ( sal_Int32 /*nHandle*/ , const Any & /*rValue*/ )
2004-04-13 10:05:48 +00:00
throw ( Exception )
2000-09-18 16:07:07 +00:00
{
}
//------------------------------------------------------------------------------
void FmXFormController : : getFastPropertyValue ( Any & rValue , sal_Int32 nHandle ) const
{
switch ( nHandle )
{
case FM_ATTR_FILTER_CRITERIA :
{
2000-11-06 06:19:53 +00:00
: : rtl : : OUString aFilter ;
2002-10-07 12:09:48 +00:00
OStaticDataAccessTools aStaticTools ;
Reference < XConnection > xConnection ( aStaticTools . getRowSetConnection ( Reference < XRowSet > ( m_xModelAsIndex , UNO_QUERY ) ) ) ;
2000-09-18 16:07:07 +00:00
if ( xConnection . is ( ) )
{
2004-04-13 10:05:48 +00:00
Reference < XDatabaseMetaData > xMetaData ( xConnection - > getMetaData ( ) ) ;
Reference < XNumberFormatsSupplier > xFormatSupplier ( aStaticTools . getNumberFormats ( xConnection , sal_True ) ) ;
Reference < XNumberFormatter > xFormatter ( m_xORB
2000-09-18 16:07:07 +00:00
- > createInstance ( : : rtl : : OUString : : createFromAscii ( " com.sun.star.util.NumberFormatter " ) ) , UNO_QUERY ) ;
xFormatter - > attachNumberFormatsSupplier ( xFormatSupplier ) ;
2004-04-13 10:05:48 +00:00
Reference < XColumnsSupplier > xSupplyCols ( m_xModelAsIndex , UNO_QUERY ) ;
Reference < XNameAccess > xFields ( xSupplyCols - > getColumns ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
2000-11-06 06:19:53 +00:00
: : rtl : : OUString aQuote ( xMetaData - > getIdentifierQuoteString ( ) ) ;
2000-09-18 16:07:07 +00:00
// now add the filter rows
2003-05-19 11:51:00 +00:00
for ( FmFilterRows : : const_iterator i = m_aFilters . begin ( ) ; i ! = m_aFilters . end ( ) ; + + i )
2000-09-18 16:07:07 +00:00
{
2000-11-06 06:19:53 +00:00
: : rtl : : OUString aTest , aErrorMsg , aCriteria ;
2000-09-18 16:07:07 +00:00
const FmFilterRow & rRow = * i ;
if ( ! rRow . empty ( ) )
{
2000-11-06 06:19:53 +00:00
if ( aFilter . getLength ( ) )
aFilter + = : : rtl : : OUString : : createFromAscii ( " OR " ) ;
2000-09-18 16:07:07 +00:00
2000-11-06 06:19:53 +00:00
aFilter + = : : rtl : : OUString : : createFromAscii ( " ( " ) ;
2000-09-18 16:07:07 +00:00
for ( FmFilterRow : : const_iterator j = rRow . begin ( ) ; j ! = rRow . end ( ) ; j + + )
{
// get the field of the controls map
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText = ( * j ) . first ;
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xField = ( * m_aFilterControls . find ( xText ) ) . second ;
2000-09-18 16:07:07 +00:00
DBG_ASSERT ( xField . is ( ) , " NoField found " ) ;
if ( j ! = rRow . begin ( ) )
2000-11-06 06:19:53 +00:00
aFilter + = : : rtl : : OUString : : createFromAscii ( " AND " ) ;
2000-09-18 16:07:07 +00:00
2002-11-14 09:01:03 +00:00
aTest = ( * j ) . second ;
2000-11-06 06:19:53 +00:00
aErrorMsg = : : rtl : : OUString ( ) ;
2001-07-25 12:44:28 +00:00
: : rtl : : Reference < ISQLParseNode > xParseNode = predicateTree ( aErrorMsg , aTest , xFormatter , xField ) ;
if ( xParseNode . is ( ) )
2000-09-18 16:07:07 +00:00
{
2000-11-06 06:19:53 +00:00
aCriteria = : : rtl : : OUString ( ) ;
2002-11-14 09:01:03 +00:00
// don't use a parse context here, we need it unlocalized
2006-12-13 15:42:30 +00:00
xParseNode - > parseNodeToStr ( aCriteria , xConnection , NULL ) ;
2000-09-18 16:07:07 +00:00
aFilter + = aCriteria ;
}
}
2000-11-06 06:19:53 +00:00
aFilter + = : : rtl : : OUString : : createFromAscii ( " ) " ) ;
2000-09-18 16:07:07 +00:00
}
}
}
rValue < < = : : rtl : : OUString ( aFilter ) ;
2007-05-10 09:05:49 +00:00
}
break ;
case FM_ATTR_FORM_OPERATIONS :
rValue < < = m_aControllerFeatures - > getFormOperations ( ) ;
break ;
2000-09-18 16:07:07 +00:00
}
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Reference < XPropertySetInfo > FmXFormController : : getPropertySetInfo ( ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2000-11-06 06:19:53 +00:00
static Reference < XPropertySetInfo > xInfo ( createPropertySetInfo ( getInfoHelper ( ) ) ) ;
2000-09-18 16:07:07 +00:00
return xInfo ;
}
//------------------------------------------------------------------------------
# define DECL_PROP_CORE(varname, type) \
2000-11-06 06:19:53 +00:00
pDesc [ nPos + + ] = Property ( FM_PROP_ # # varname , FM_ATTR_ # # varname , : : getCppuType ( ( const type * ) 0 ) ,
2000-09-18 16:07:07 +00:00
# define DECL_PROP1(varname, type, attrib1) \
2003-06-12 09:29:01 +00:00
DECL_PROP_CORE ( varname , type ) PropertyAttribute : : attrib1 )
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
void FmXFormController : : fillProperties (
2000-11-06 06:19:53 +00:00
Sequence < Property > & /* [out] */ _rProps ,
2006-06-19 14:53:21 +00:00
Sequence < Property > & /* [out] */ /*_rAggregateProps*/
2000-09-18 16:07:07 +00:00
) const
{
2007-05-10 09:05:49 +00:00
_rProps . realloc ( 2 ) ;
2000-09-18 16:07:07 +00:00
sal_Int32 nPos = 0 ;
2000-11-06 06:19:53 +00:00
Property * pDesc = _rProps . getArray ( ) ;
2000-09-18 16:07:07 +00:00
DECL_PROP1 ( FILTER_CRITERIA , rtl : : OUString , READONLY ) ;
2007-05-10 09:05:49 +00:00
DECL_PROP1 ( FORM_OPERATIONS , Reference < XFormOperations > , READONLY ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
: : cppu : : IPropertyArrayHelper & FmXFormController : : getInfoHelper ( )
{
return * getArrayHelper ( ) ;
}
2004-04-13 10:05:48 +00:00
// XElementAccess
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
sal_Bool SAL_CALL FmXFormController : : hasElements ( void ) throw ( RuntimeException )
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2002-11-14 09:01:03 +00:00
return ! m_aChilds . empty ( ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
Type SAL_CALL FmXFormController : : getElementType ( void ) throw ( RuntimeException )
{
2004-04-13 10:05:48 +00:00
return : : getCppuType ( ( const Reference < XFormController > * ) 0 ) ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
// XEnumerationAccess
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Reference < XEnumeration > SAL_CALL FmXFormController : : createEnumeration ( void ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2000-10-20 13:18:57 +00:00
return new : : comphelper : : OEnumerationByIndex ( this ) ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
// XIndexAccess
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
sal_Int32 SAL_CALL FmXFormController : : getCount ( void ) throw ( RuntimeException )
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2000-09-18 16:07:07 +00:00
return m_aChilds . size ( ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Any SAL_CALL FmXFormController : : getByIndex ( sal_Int32 Index ) throw ( IndexOutOfBoundsException , WrappedTargetException , RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2000-09-18 16:07:07 +00:00
if ( Index < 0 | |
2001-05-16 13:22:30 +00:00
Index > = ( sal_Int32 ) m_aChilds . size ( ) )
2004-04-13 10:05:48 +00:00
throw IndexOutOfBoundsException ( ) ;
2000-09-18 16:07:07 +00:00
return makeAny ( m_aChilds [ Index ] ) ;
2004-04-13 10:05:48 +00:00
// , ::getCppuType((const XFormController*)0));
2000-09-18 16:07:07 +00:00
}
//-----------------------------------------------------------------------------
void FmXFormController : : addChild ( FmXFormController * pChild )
{
2004-04-13 10:05:48 +00:00
Reference < XFormController > xController ( pChild ) ;
2000-09-18 16:07:07 +00:00
m_aChilds . push_back ( xController ) ;
2004-04-13 10:05:48 +00:00
pChild - > setParent ( static_cast < XFormController * > ( this ) ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xForm ( pChild - > getModel ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
// search the position of the model within the form
sal_uInt32 nPos = m_xModelAsIndex - > getCount ( ) ;
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xTemp ;
2000-09-18 16:07:07 +00:00
for ( ; nPos ; )
{
2000-11-07 12:16:50 +00:00
m_xModelAsIndex - > getByIndex ( - - nPos ) > > = xTemp ;
2004-04-13 10:05:48 +00:00
if ( ( XFormComponent * ) xForm . get ( ) = = ( XFormComponent * ) xTemp . get ( ) )
2000-09-18 16:07:07 +00:00
{
Reference < XInterface > xIfc ( xController , UNO_QUERY ) ;
m_xModelAsManager - > attach ( nPos , xIfc , makeAny ( xController ) ) ;
break ;
}
}
}
// EventListener
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : disposing ( const EventObject & e ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
// Ist der Container disposed worden
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2004-04-13 10:05:48 +00:00
Reference < XControlContainer > xContainer ( e . Source , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xContainer . is ( ) )
{
2004-04-13 10:05:48 +00:00
setContainer ( Reference < XControlContainer > ( ) ) ;
2000-09-18 16:07:07 +00:00
}
else
{
// ist ein Control disposed worden
2004-04-13 10:05:48 +00:00
Reference < XControl > xControl ( e . Source , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xControl . is ( ) )
{
if ( getContainer ( ) . is ( ) )
removeControl ( xControl ) ;
}
}
}
// OComponentHelper
2005-01-21 15:56:33 +00:00
//-----------------------------------------------------------------------------
void FmXFormController : : disposeAllFeaturesAndDispatchers ( ) SAL_THROW ( ( ) )
{
for ( DispatcherContainer : : iterator aDispatcher = m_aFeatureDispatchers . begin ( ) ;
aDispatcher ! = m_aFeatureDispatchers . end ( ) ;
+ + aDispatcher
)
{
try
{
: : comphelper : : disposeComponent ( aDispatcher - > second ) ;
}
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::disposeAllFeaturesAndDispatchers: caught an exception while disposing a dispatcher! " ) ;
}
}
m_aFeatureDispatchers . clear ( ) ;
m_aControllerFeatures . dispose ( ) ;
}
2000-09-18 16:07:07 +00:00
//-----------------------------------------------------------------------------
void FmXFormController : : disposing ( void )
{
2004-04-13 10:05:48 +00:00
EventObject aEvt ( static_cast < XFormController * > ( this ) ) ;
// if we're still active, simulate a "deactivated" event
if ( m_xActiveControl . is ( ) )
2006-07-26 06:43:01 +00:00
m_aActivateListeners . notifyEach ( & XFormControllerListener : : formDeactivated , aEvt ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
// notify all our listeners
2000-09-18 16:07:07 +00:00
m_aActivateListeners . disposeAndClear ( aEvt ) ;
m_aModifyListeners . disposeAndClear ( aEvt ) ;
m_aErrorListeners . disposeAndClear ( aEvt ) ;
m_aDeleteListeners . disposeAndClear ( aEvt ) ;
m_aRowSetApproveListeners . disposeAndClear ( aEvt ) ;
m_aParameterListeners . disposeAndClear ( aEvt ) ;
2003-05-19 11:51:00 +00:00
removeBoundFieldListener ( ) ;
2002-10-01 13:04:27 +00:00
stopFiltering ( ) ;
2004-07-05 14:50:20 +00:00
m_pControlBorderManager - > restoreAll ( ) ;
2000-09-18 16:07:07 +00:00
m_aFilters . clear ( ) ;
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
m_xActiveControl = m_xCurrentControl = NULL ;
2004-04-13 10:05:48 +00:00
// clean up our children
2000-09-18 16:07:07 +00:00
for ( FmFormControllers : : const_iterator i = m_aChilds . begin ( ) ;
i ! = m_aChilds . end ( ) ; i + + )
{
// search the position of the model within the form
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xForm ( ( * i ) - > getModel ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
sal_uInt32 nPos = m_xModelAsIndex - > getCount ( ) ;
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xTemp ;
2000-09-18 16:07:07 +00:00
for ( ; nPos ; )
{
2004-04-13 10:05:48 +00:00
m_xModelAsIndex - > getByIndex ( - - nPos ) > > = xTemp ;
if ( xForm . get ( ) = = xTemp . get ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
Reference < XInterface > xIfc ( * i , UNO_QUERY ) ;
m_xModelAsManager - > detach ( nPos , xIfc ) ;
2000-09-18 16:07:07 +00:00
break ;
}
}
2004-04-13 10:05:48 +00:00
Reference < XComponent > ( * i , UNO_QUERY ) - > dispose ( ) ;
2000-09-18 16:07:07 +00:00
}
m_aChilds . clear ( ) ;
2005-01-21 15:56:33 +00:00
disposeAllFeaturesAndDispatchers ( ) ;
2004-04-13 10:05:48 +00:00
2000-09-18 16:07:07 +00:00
if ( m_bDBConnection )
unload ( ) ;
2004-04-13 10:05:48 +00:00
setContainer ( NULL ) ;
setModel ( NULL ) ;
setParent ( NULL ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
: : comphelper : : disposeComponent ( m_xComposer ) ;
2000-09-18 16:07:07 +00:00
2000-11-06 06:19:53 +00:00
m_xORB = NULL ;
2000-09-18 16:07:07 +00:00
m_bDBConnection = sal_False ;
}
2004-07-05 14:50:20 +00:00
//------------------------------------------------------------------------------
namespace
{
static bool lcl_shouldUseDynamicControlBorder ( const Reference < XInterface > & _rxForm , const Any & _rDynamicColorProp )
{
bool bDoUse = false ;
if ( ! ( _rDynamicColorProp > > = bDoUse ) )
{
DocumentType eDocType = DocumentClassification : : classifyHostDocument ( _rxForm ) ;
2005-01-05 11:20:25 +00:00
return ControlLayouter : : useDynamicBorderColor ( eDocType ) ;
2004-07-05 14:50:20 +00:00
}
return bDoUse ;
}
}
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : propertyChange ( const PropertyChangeEvent & evt ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2003-05-19 11:51:00 +00:00
if ( evt . PropertyName = = FM_PROP_BOUNDFIELD )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
Reference < XPropertySet > xOldBound ;
evt . OldValue > > = xOldBound ;
if ( ! xOldBound . is ( ) & & evt . NewValue . hasValue ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
Reference < XControlModel > xControlModel ( evt . Source , UNO_QUERY ) ;
Reference < XControl > xControl = findControl ( m_aControls , xControlModel , sal_False , sal_False ) ;
2003-05-19 11:51:00 +00:00
if ( xControl . is ( ) )
{
2004-11-16 10:22:40 +00:00
startControlModifyListening ( xControl ) ;
2003-05-19 11:51:00 +00:00
Reference < XPropertySet > xProp ( xControlModel , UNO_QUERY ) ;
if ( xProp . is ( ) )
xProp - > removePropertyChangeListener ( FM_PROP_BOUNDFIELD , this ) ;
}
2000-09-18 16:07:07 +00:00
}
2003-05-19 11:51:00 +00:00
}
else
{
sal_Bool bModifiedChanged = ( evt . PropertyName = = FM_PROP_ISMODIFIED ) ;
sal_Bool bNewChanged = ( evt . PropertyName = = FM_PROP_ISNEW ) ;
if ( bModifiedChanged | | bNewChanged )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
if ( bModifiedChanged )
m_bCurrentRecordModified = : : comphelper : : getBOOL ( evt . NewValue ) ;
else
m_bCurrentRecordNew = : : comphelper : : getBOOL ( evt . NewValue ) ;
// toggle the locking
if ( m_bLocked ! = determineLockState ( ) )
{
m_bLocked = ! m_bLocked ;
setLocks ( ) ;
if ( isListeningForChanges ( ) )
startListening ( ) ;
else
stopListening ( ) ;
}
2006-11-14 12:24:06 +00:00
if ( bNewChanged )
2003-05-19 11:51:00 +00:00
{
if ( m_nToggleEvent )
Application : : RemoveUserEvent ( m_nToggleEvent ) ;
m_nToggleEvent = Application : : PostUserEvent ( LINK ( this , FmXFormController ,
OnToggleAutoFields ) ) ;
}
2000-09-18 16:07:07 +00:00
2003-05-19 11:51:00 +00:00
if ( ! m_bCurrentRecordModified )
m_bModified = sal_False ;
}
2004-07-05 14:50:20 +00:00
else if ( evt . PropertyName = = FM_PROP_DYNAMIC_CONTROL_BORDER )
{
bool bEnable = lcl_shouldUseDynamicControlBorder ( evt . Source , evt . NewValue ) ;
if ( bEnable )
{
m_pControlBorderManager - > enableDynamicBorderColor ( ) ;
2004-11-16 10:22:40 +00:00
if ( m_xActiveControl . is ( ) )
m_pControlBorderManager - > focusGained ( m_xActiveControl . get ( ) ) ;
2004-07-05 14:50:20 +00:00
}
else
{
m_pControlBorderManager - > disableDynamicBorderColor ( ) ;
}
}
2000-09-18 16:07:07 +00:00
}
}
//------------------------------------------------------------------------------
2006-11-14 12:24:06 +00:00
bool FmXFormController : : replaceControl ( const Reference < XControl > & _rxExistentControl , const Reference < XControl > & _rxNewControl )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
bool bSuccess = false ;
try
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XIdentifierReplace > xContainer ( getContainer ( ) , UNO_QUERY ) ;
DBG_ASSERT ( xContainer . is ( ) , " FmXFormController::replaceControl: yes, it's not required by the service description, but XItentifierReplaces would be nice! " ) ;
if ( xContainer . is ( ) )
{
// look up the ID of _rxExistentControl
Sequence < sal_Int32 > aIdentifiers ( xContainer - > getIdentifiers ( ) ) ;
const sal_Int32 * pIdentifiers = aIdentifiers . getConstArray ( ) ;
const sal_Int32 * pIdentifiersEnd = aIdentifiers . getConstArray ( ) + aIdentifiers . getLength ( ) ;
for ( ; pIdentifiers ! = pIdentifiersEnd ; + + pIdentifiers )
{
Reference < XControl > xCheck ( xContainer - > getByIdentifier ( * pIdentifiers ) , UNO_QUERY ) ;
if ( xCheck = = _rxExistentControl )
break ;
}
DBG_ASSERT ( pIdentifiers ! = pIdentifiersEnd , " FmXFormController::replaceControl: did not find the control in the container! " ) ;
if ( pIdentifiers ! = pIdentifiersEnd )
{
bool bReplacedWasActive = ( m_xActiveControl . get ( ) = = _rxExistentControl . get ( ) ) ;
bool bReplacedWasCurrent = ( m_xCurrentControl . get ( ) = = _rxExistentControl . get ( ) ) ;
if ( bReplacedWasActive )
{
m_xActiveControl = m_xCurrentControl = NULL ;
}
else if ( bReplacedWasCurrent )
m_xCurrentControl = _rxNewControl ;
// carry over the model
_rxNewControl - > setModel ( _rxExistentControl - > getModel ( ) ) ;
xContainer - > replaceByIdentifer ( * pIdentifiers , makeAny ( _rxNewControl ) ) ;
bSuccess = true ;
if ( bReplacedWasActive )
{
Reference < XWindow > xControlWindow ( _rxNewControl , UNO_QUERY ) ;
if ( xControlWindow . is ( ) )
xControlWindow - > setFocus ( ) ;
}
}
}
}
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::replaceControl: caught an exception! " ) ;
2000-09-18 16:07:07 +00:00
}
2006-11-14 12:24:06 +00:00
Reference < XControl > xDisposeIt ( bSuccess ? _rxExistentControl : _rxNewControl ) ;
: : comphelper : : disposeComponent ( xDisposeIt ) ;
return bSuccess ;
}
//------------------------------------------------------------------------------
void FmXFormController : : toggleAutoFields ( sal_Bool bAutoFields )
{
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
2003-11-24 15:38:56 +00:00
2005-10-24 07:26:42 +00:00
Sequence < Reference < XControl > > aControlsCopy ( m_aControls ) ;
const Reference < XControl > * pControls = aControlsCopy . getConstArray ( ) ;
sal_Int32 nControls = aControlsCopy . getLength ( ) ;
2000-09-18 16:07:07 +00:00
if ( bAutoFields )
{
// as we don't want new controls to be attached to the scripting environment
// we change attach flags
m_bAttachEvents = sal_False ;
2004-11-16 10:22:40 +00:00
for ( sal_Int32 i = nControls ; i > 0 ; )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XControl > xControl = pControls [ - - i ] ;
2000-09-18 16:07:07 +00:00
if ( xControl . is ( ) )
{
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xSet ( xControl - > getModel ( ) , UNO_QUERY ) ;
2000-10-20 13:18:57 +00:00
if ( xSet . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xSet ) )
2000-09-18 16:07:07 +00:00
{
// does the model use a bound field ?
2000-11-07 12:16:50 +00:00
Reference < XPropertySet > xField ;
xSet - > getPropertyValue ( FM_PROP_BOUNDFIELD ) > > = xField ;
2000-09-18 16:07:07 +00:00
// is it a autofield?
2006-11-14 12:24:06 +00:00
if ( xField . is ( )
& & : : comphelper : : hasProperty ( FM_PROP_AUTOINCREMENT , xField )
& & : : comphelper : : getBOOL ( xField - > getPropertyValue ( FM_PROP_AUTOINCREMENT ) )
)
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
replaceControl ( xControl , new FmXAutoControl ) ;
2000-09-18 16:07:07 +00:00
}
}
}
}
m_bAttachEvents = sal_True ;
}
else
{
m_bDetachEvents = sal_False ;
2004-11-16 10:22:40 +00:00
for ( sal_Int32 i = nControls ; i > 0 ; )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XControl > xControl = pControls [ - - i ] ;
2000-09-18 16:07:07 +00:00
if ( xControl . is ( ) )
{
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xSet ( xControl - > getModel ( ) , UNO_QUERY ) ;
2000-10-20 13:18:57 +00:00
if ( xSet . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xSet ) )
2000-09-18 16:07:07 +00:00
{
// does the model use a bound field ?
2000-11-07 12:16:50 +00:00
Reference < XPropertySet > xField ;
xSet - > getPropertyValue ( FM_PROP_BOUNDFIELD ) > > = xField ;
2000-09-18 16:07:07 +00:00
// is it a autofield?
2006-11-14 12:24:06 +00:00
if ( xField . is ( )
& & : : comphelper : : hasProperty ( FM_PROP_AUTOINCREMENT , xField )
& & : : comphelper : : getBOOL ( xField - > getPropertyValue ( FM_PROP_AUTOINCREMENT ) )
)
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
: : rtl : : OUString sServiceName ;
OSL_VERIFY ( xSet - > getPropertyValue ( FM_PROP_DEFAULTCONTROL ) > > = sServiceName ) ;
Reference < XControl > xNewControl ( m_xORB - > createInstance ( sServiceName ) , UNO_QUERY ) ;
replaceControl ( xControl , xNewControl ) ;
2000-09-18 16:07:07 +00:00
}
}
}
}
m_bDetachEvents = sal_True ;
}
}
//------------------------------------------------------------------------------
IMPL_LINK ( FmXFormController , OnToggleAutoFields , void * , EMPTYARG )
{
2003-10-21 07:43:57 +00:00
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
m_nToggleEvent = 0 ;
}
2000-09-18 16:07:07 +00:00
toggleAutoFields ( m_bCurrentRecordNew ) ;
return 1L ;
}
2004-04-13 10:05:48 +00:00
// XTextListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : textChanged ( const TextEvent & e ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
if ( m_bFiltering )
{
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ( e . Source , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
: : rtl : : OUString aText = xText - > getText ( ) ;
// Suchen der aktuellen Row
2004-04-13 10:05:48 +00:00
OSL_ENSURE ( ( m_aFilters . size ( ) > ( size_t ) m_nCurrentFilterPosition ) & & ( m_nCurrentFilterPosition > = 0 ) ,
" FmXFormController::textChanged: m_nCurrentFilterPosition too big " ) ;
if ( ( m_nCurrentFilterPosition > = 0 ) & & ( ( size_t ) m_nCurrentFilterPosition < m_aFilters . size ( ) ) )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
FmFilterRow & rRow = m_aFilters [ m_nCurrentFilterPosition ] ;
// do we have a new filter
if ( aText . getLength ( ) )
rRow [ xText ] = aText ;
else
{
// do we have the control in the row
FmFilterRow : : iterator iter = rRow . find ( xText ) ;
// erase the entry out of the row
if ( iter ! = rRow . end ( ) )
rRow . erase ( iter ) ;
}
2000-09-18 16:07:07 +00:00
}
}
else if ( ! m_bModified )
2001-05-29 13:15:08 +00:00
onModify ( e . Source ) ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
// XItemListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : itemStateChanged ( const ItemEvent & rEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
if ( ! m_bModified )
2001-05-29 13:15:08 +00:00
onModify ( rEvent . Source ) ;
2000-09-18 16:07:07 +00:00
}
// XModificationBroadcaster
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : addModifyListener ( const Reference < XModifyListener > & l ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aModifyListeners . addInterface ( l ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : removeModifyListener ( const Reference < XModifyListener > & l ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aModifyListeners . removeInterface ( l ) ;
}
// XModificationListener
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : modified ( const EventObject & rEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
if ( ! m_bModified )
2001-05-29 13:15:08 +00:00
onModify ( rEvent . Source ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2001-05-29 13:15:08 +00:00
void FmXFormController : : onModify ( const Reference < XInterface > & _rxControl )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
if ( ! m_bModified )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
m_bModified = sal_True ;
}
2001-05-29 13:15:08 +00:00
Reference < XControl > xSourceControl ( _rxControl , UNO_QUERY ) ;
if ( xSourceControl . get ( ) ! = m_xCurrentControl . get ( ) )
{ // let this control grab the focus
// (this case may happen if somebody moves the scroll wheel of the mouse over a control
// which does not have the focus)
// 85511 - 29.05.2001 - frank.schoenheit@germany.sun.com
Reference < XWindow > xControlWindow ( _rxControl , UNO_QUERY ) ;
if ( xControlWindow . is ( ) )
xControlWindow - > setFocus ( ) ;
}
EventObject aEvt ( static_cast < cppu : : OWeakObject * > ( this ) ) ;
2006-07-26 06:43:01 +00:00
m_aModifyListeners . notifyEach ( & XModifyListener : : modified , aEvt ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
sal_Bool FmXFormController : : determineLockState ( ) const
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
// a.) in filter mode we are always locked
// b.) if we have no valid model or our model (a result set) is not alive -> we're locked
// c.) if we are inserting everything is OK and we are not locked
// d.) if are not updatable or on invalid position
2004-04-13 10:05:48 +00:00
Reference < XResultSet > xResultSet ( m_xModelAsIndex , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( m_bFiltering | | ! xResultSet . is ( ) | | ! isRowSetAlive ( xResultSet ) )
return sal_True ;
else
return ( m_bCanInsert & & m_bCurrentRecordNew ) ? sal_False
: xResultSet - > isBeforeFirst ( ) | | xResultSet - > isAfterLast ( ) | | xResultSet - > rowDeleted ( ) | | ! m_bCanUpdate ;
}
// FocusListener
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : focusGained ( const FocusEvent & e ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2006-07-26 06:43:01 +00:00
TRACE_RANGE ( " FmXFormController::focusGained " ) ;
2004-07-05 14:50:20 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController::focusGained: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2004-04-13 10:05:48 +00:00
Reference < XControl > xControl ( e . Source , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
m_pControlBorderManager - > focusGained ( e . Source ) ;
2000-09-18 16:07:07 +00:00
if ( m_bDBConnection )
{
// do we need to keep the locking of the commit
// we hold the lock as long as the control differs from the current
// otherwhise we disabled the lock
2004-04-13 10:05:48 +00:00
m_bCommitLock = m_bCommitLock & & ( XControl * ) xControl . get ( ) ! = ( XControl * ) m_xCurrentControl . get ( ) ;
2000-09-18 16:07:07 +00:00
if ( m_bCommitLock )
return ;
// when do we have to commit a value to form or a filter
// a.) if the current value is modified
// b.) there must be a current control
// c.) and it must be different from the new focus owning control or
// d.) the focus is moving around (so we have only one control)
if ( ( m_bModified | | m_bFiltering ) & &
m_xCurrentControl . is ( ) & &
2001-05-29 13:15:08 +00:00
( ( xControl . get ( ) ! = m_xCurrentControl . get ( ) ) | |
2004-04-13 10:05:48 +00:00
( ( e . FocusFlags & FocusChangeReason : : AROUND ) & & ( m_bCycle | | m_bFiltering ) ) )
2000-09-18 16:07:07 +00:00
)
{
// check the old control if the content is ok
2006-10-12 11:44:59 +00:00
# if (OSL_DEBUG_LEVEL > 1) || defined DBG_UTIL
2004-04-13 10:05:48 +00:00
Reference < XBoundControl > xLockingTest ( m_xCurrentControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
sal_Bool bControlIsLocked = xLockingTest . is ( ) & & xLockingTest - > getLock ( ) ;
2006-10-12 11:44:59 +00:00
OSL_ENSURE ( ! bControlIsLocked , " FmXFormController::Gained: I'm modified and the current control is locked ? How this ? " ) ;
2000-09-18 16:07:07 +00:00
// normalerweise sollte ein gelocktes Control nicht modified sein, also muss wohl mein bModified aus einem anderen Kontext
// gesetzt worden sein, was ich nicht verstehen wuerde ...
# endif
DBG_ASSERT ( m_xCurrentControl . is ( ) , " kein CurrentControl gesetzt " ) ;
// zunaechst das Control fragen ob es das IFace unterstuetzt
2003-03-27 14:06:05 +00:00
Reference < XBoundComponent > xBound ( m_xCurrentControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( ! xBound . is ( ) & & m_xCurrentControl . is ( ) )
2003-03-27 14:06:05 +00:00
xBound = Reference < XBoundComponent > ( m_xCurrentControl - > getModel ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
// lock if we lose the focus during commit
m_bCommitLock = sal_True ;
// Commit nicht erfolgreich, Focus zuruecksetzen
if ( xBound . is ( ) & & ! xBound - > commit ( ) )
{
// the commit failed and we don't commit again until the current control
// which couldn't be commit gains the focus again
2004-04-13 10:05:48 +00:00
Reference < XWindow > xWindow ( m_xCurrentControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xWindow . is ( ) )
xWindow - > setFocus ( ) ;
return ;
}
else
{
m_bModified = sal_False ;
m_bCommitLock = sal_False ;
}
}
2004-04-13 10:05:48 +00:00
if ( ! m_bFiltering & & m_bCycle & & ( e . FocusFlags & FocusChangeReason : : AROUND ) & & m_xCurrentControl . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
if ( e . FocusFlags & FocusChangeReason : : FORWARD )
2006-07-26 06:43:01 +00:00
{
2006-12-01 16:25:02 +00:00
if ( m_aControllerFeatures - > isEnabled ( SID_FM_RECORD_NEXT ) )
2004-04-13 10:05:48 +00:00
m_aControllerFeatures - > moveRight ( ) ;
}
2000-09-18 16:07:07 +00:00
else // backward
2004-04-13 10:05:48 +00:00
{
2006-12-01 16:25:02 +00:00
if ( m_aControllerFeatures - > isEnabled ( SID_FM_RECORD_PREV ) )
2004-04-13 10:05:48 +00:00
m_aControllerFeatures - > moveLeft ( ) ;
}
2000-09-18 16:07:07 +00:00
}
}
// Immer noch ein und dasselbe Control
2001-05-29 13:15:08 +00:00
if ( ( m_xActiveControl . get ( ) = = xControl . get ( ) )
& & ( xControl . get ( ) = = m_xCurrentControl . get ( ) )
)
2000-09-18 16:07:07 +00:00
{
DBG_ASSERT ( m_xCurrentControl . is ( ) , " Kein CurrentControl selektiert " ) ;
return ;
}
sal_Bool bActivated = ! m_xActiveControl . is ( ) & & xControl . is ( ) ;
m_xActiveControl = xControl ;
m_xCurrentControl = xControl ;
DBG_ASSERT ( m_xCurrentControl . is ( ) , " Kein CurrentControl selektiert " ) ;
if ( bActivated )
onActivate ( ) ;
2004-04-13 10:05:48 +00:00
// invalidate all features which depend on the currently focused control
if ( m_bDBConnection & & ! m_bFiltering & & m_pView )
{
: : std : : vector < sal_Int32 > aFocusDependentFeatures ;
aFocusDependentFeatures . push_back ( SID_FM_SORTUP ) ;
aFocusDependentFeatures . push_back ( SID_FM_SORTDOWN ) ;
aFocusDependentFeatures . push_back ( SID_FM_AUTOFILTER ) ;
2006-07-26 06:43:01 +00:00
if ( m_pView & & m_pView - > GetFormShell ( ) & & m_pView - > GetFormShell ( ) - > GetImpl ( ) )
m_pView - > GetFormShell ( ) - > GetImpl ( ) - > invalidateFeatures ( aFocusDependentFeatures ) ;
2004-04-13 10:05:48 +00:00
invalidateFeatures ( aFocusDependentFeatures ) ;
}
2000-09-18 16:07:07 +00:00
if ( m_xCurrentControl . is ( ) )
{
// Control erhaelt Focus, dann eventuell in den sichtbaren Bereich
2004-04-13 10:05:48 +00:00
Reference < XWindow > xWindow ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xWindow . is ( ) & & m_pView & & m_pWindow )
{
: : com : : sun : : star : : awt : : Rectangle aRect = xWindow - > getPosSize ( ) ;
2001-05-29 13:15:08 +00:00
: : Rectangle aNewRect ( aRect . X , aRect . Y , aRect . X + aRect . Width , aRect . Y + aRect . Height ) ;
2000-09-18 16:07:07 +00:00
aNewRect = m_pWindow - > PixelToLogic ( aNewRect ) ;
2006-11-14 12:24:06 +00:00
m_pView - > MakeVisible ( aNewRect , * const_cast < Window * > ( m_pWindow ) ) ;
2000-09-18 16:07:07 +00:00
}
}
}
//------------------------------------------------------------------------------
void FmXFormController : : onActivate ( )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
// benachrichtigen, dass form activiert
2004-04-13 10:05:48 +00:00
EventObject aEvt ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2006-07-26 06:43:01 +00:00
m_aActivateListeners . notifyEach ( & XFormControllerListener : : formActivated , aEvt ) ;
2000-09-18 16:07:07 +00:00
// verschicken ob modified
if ( m_bModified )
2006-07-26 06:43:01 +00:00
m_aModifyListeners . notifyEach ( & XModifyListener : : modified , aEvt ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : focusLost ( const FocusEvent & e ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2004-07-05 14:50:20 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController::focusLost: Object already disposed! " ) ;
m_pControlBorderManager - > focusLost ( e . Source ) ;
2004-04-13 10:05:48 +00:00
Reference < XControl > xControl ( e . Source , UNO_QUERY ) ;
Reference < XWindowPeer > xNext ( e . NextFocus , UNO_QUERY ) ;
Reference < XControl > xNextControl = isInList ( xNext ) ;
2000-09-18 16:07:07 +00:00
if ( ! xNextControl . is ( ) )
{
m_xActiveControl = NULL ;
2004-04-13 10:05:48 +00:00
EventObject aEvt ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2006-07-26 06:43:01 +00:00
m_aActivateListeners . notifyEach ( & XFormControllerListener : : formDeactivated , aEvt ) ;
2000-09-18 16:07:07 +00:00
}
}
2004-07-05 14:50:20 +00:00
//--------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void SAL_CALL FmXFormController : : mousePressed ( const awt : : MouseEvent & /*_rEvent*/ ) throw ( RuntimeException )
2004-07-05 14:50:20 +00:00
{
// not interested in
}
//--------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void SAL_CALL FmXFormController : : mouseReleased ( const awt : : MouseEvent & /*_rEvent*/ ) throw ( RuntimeException )
2004-07-05 14:50:20 +00:00
{
// not interested in
}
//--------------------------------------------------------------------
void SAL_CALL FmXFormController : : mouseEntered ( const awt : : MouseEvent & _rEvent ) throw ( RuntimeException )
{
m_pControlBorderManager - > mouseEntered ( _rEvent . Source ) ;
}
//--------------------------------------------------------------------
void SAL_CALL FmXFormController : : mouseExited ( const awt : : MouseEvent & _rEvent ) throw ( RuntimeException )
{
m_pControlBorderManager - > mouseExited ( _rEvent . Source ) ;
}
2004-11-16 10:22:40 +00:00
//--------------------------------------------------------------------
void SAL_CALL FmXFormController : : componentValidityChanged ( const EventObject & _rSource ) throw ( RuntimeException )
{
Reference < XControl > xControl ( findControl ( m_aControls , Reference < XControlModel > ( _rSource . Source , UNO_QUERY ) , sal_False , sal_False ) ) ;
Reference < XValidatableFormComponent > xValidatable ( _rSource . Source , UNO_QUERY ) ;
OSL_ENSURE ( xControl . is ( ) & & xValidatable . is ( ) , " FmXFormController::componentValidityChanged: huh? " ) ;
if ( xControl . is ( ) & & xValidatable . is ( ) )
m_pControlBorderManager - > validityChanged ( xControl , xValidatable ) ;
}
//--------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : setModel ( const Reference < XTabControllerModel > & Model ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::setModel : invalid aggregate ! " ) ;
2004-07-05 14:50:20 +00:00
try
2000-09-18 16:07:07 +00:00
{
2004-07-05 14:50:20 +00:00
// disconnect from the old model
if ( m_xModelAsIndex . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-07-05 14:50:20 +00:00
if ( m_bDBConnection )
{
// we are currently working on the model
EventObject aEvt ( m_xModelAsIndex ) ;
unloaded ( aEvt ) ;
}
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
Reference < XLoadable > xForm ( m_xModelAsIndex , UNO_QUERY ) ;
if ( xForm . is ( ) )
xForm - > removeLoadListener ( this ) ;
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
Reference < XSQLErrorBroadcaster > xBroadcaster ( m_xModelAsIndex , UNO_QUERY ) ;
if ( xBroadcaster . is ( ) )
xBroadcaster - > removeSQLErrorListener ( this ) ;
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
Reference < XDatabaseParameterBroadcaster > xParamBroadcaster ( m_xModelAsIndex , UNO_QUERY ) ;
if ( xParamBroadcaster . is ( ) )
xParamBroadcaster - > removeParameterListener ( this ) ;
}
2000-09-18 16:07:07 +00:00
2005-01-21 15:56:33 +00:00
disposeAllFeaturesAndDispatchers ( ) ;
2004-04-13 10:05:48 +00:00
2004-07-05 14:50:20 +00:00
// set the new model wait for the load event
if ( m_xTabController . is ( ) )
m_xTabController - > setModel ( Model ) ;
m_xModelAsIndex = Reference < XIndexAccess > ( Model , UNO_QUERY ) ;
m_xModelAsManager = Reference < XEventAttacherManager > ( Model , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
// only if both ifaces exit, the controller will work successful
if ( ! m_xModelAsIndex . is ( ) | | ! m_xModelAsManager . is ( ) )
{
m_xModelAsManager = NULL ;
m_xModelAsIndex = NULL ;
}
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
if ( m_xModelAsIndex . is ( ) )
{
m_aControllerFeatures . assign ( this ) ;
2004-04-13 10:05:48 +00:00
2004-07-05 14:50:20 +00:00
// adding load and ui interaction listeners
Reference < XLoadable > xForm ( Model , UNO_QUERY ) ;
if ( xForm . is ( ) )
xForm - > addLoadListener ( this ) ;
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
Reference < XSQLErrorBroadcaster > xBroadcaster ( Model , UNO_QUERY ) ;
if ( xBroadcaster . is ( ) )
xBroadcaster - > addSQLErrorListener ( this ) ;
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
Reference < XDatabaseParameterBroadcaster > xParamBroadcaster ( Model , UNO_QUERY ) ;
if ( xParamBroadcaster . is ( ) )
xParamBroadcaster - > addParameterListener ( this ) ;
2000-09-18 16:07:07 +00:00
2004-07-05 14:50:20 +00:00
// well, is the database already loaded?
// then we have to simulate a load event
Reference < XLoadable > xCursor ( m_xModelAsIndex , UNO_QUERY ) ;
if ( xCursor . is ( ) & & xCursor - > isLoaded ( ) )
{
EventObject aEvt ( xCursor ) ;
loaded ( aEvt ) ;
}
Reference < XPropertySet > xModelProps ( m_xModelAsIndex , UNO_QUERY ) ;
Reference < XPropertySetInfo > xPropInfo ( xModelProps - > getPropertySetInfo ( ) ) ;
if ( xPropInfo . is ( )
& & xModelProps - > getPropertySetInfo ( ) - > hasPropertyByName ( FM_PROP_DYNAMIC_CONTROL_BORDER )
& & xModelProps - > getPropertySetInfo ( ) - > hasPropertyByName ( FM_PROP_CONTROL_BORDER_COLOR_FOCUS )
& & xModelProps - > getPropertySetInfo ( ) - > hasPropertyByName ( FM_PROP_CONTROL_BORDER_COLOR_MOUSE )
2004-11-16 10:22:40 +00:00
& & xModelProps - > getPropertySetInfo ( ) - > hasPropertyByName ( FM_PROP_CONTROL_BORDER_COLOR_INVALID )
2004-07-05 14:50:20 +00:00
)
{
bool bEnableDynamicControlBorder = lcl_shouldUseDynamicControlBorder (
xModelProps . get ( ) , xModelProps - > getPropertyValue ( FM_PROP_DYNAMIC_CONTROL_BORDER ) ) ;
if ( bEnableDynamicControlBorder )
m_pControlBorderManager - > enableDynamicBorderColor ( ) ;
else
m_pControlBorderManager - > disableDynamicBorderColor ( ) ;
sal_Int32 nColor = 0 ;
if ( xModelProps - > getPropertyValue ( FM_PROP_CONTROL_BORDER_COLOR_FOCUS ) > > = nColor )
m_pControlBorderManager - > setStatusColor ( CONTROL_STATUS_FOCUSED , nColor ) ;
if ( xModelProps - > getPropertyValue ( FM_PROP_CONTROL_BORDER_COLOR_MOUSE ) > > = nColor )
m_pControlBorderManager - > setStatusColor ( CONTROL_STATUS_MOUSE_HOVER , nColor ) ;
2004-11-16 10:22:40 +00:00
if ( xModelProps - > getPropertyValue ( FM_PROP_CONTROL_BORDER_COLOR_INVALID ) > > = nColor )
m_pControlBorderManager - > setStatusColor ( CONTROL_STATUS_INVALID , nColor ) ;
2004-07-05 14:50:20 +00:00
}
2000-09-18 16:07:07 +00:00
}
}
2004-07-05 14:50:20 +00:00
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::setModel: caught an exception! " ) ;
}
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Reference < XTabControllerModel > FmXFormController : : getModel ( ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::getModel : invalid aggregate ! " ) ;
if ( ! m_xTabController . is ( ) )
2004-04-13 10:05:48 +00:00
return Reference < XTabControllerModel > ( ) ;
2000-09-18 16:07:07 +00:00
return m_xTabController - > getModel ( ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : addToEventAttacher ( const Reference < XControl > & xControl )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2006-01-19 14:39:43 +00:00
OSL_ENSURE ( xControl . is ( ) , " FmXFormController::addToEventAttacher: invalid control - how did you reach this? " ) ;
if ( ! xControl . is ( ) )
return ; /* throw IllegalArgumentException(); */
2000-09-18 16:07:07 +00:00
// anmelden beim Eventattacher
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xComp ( xControl - > getModel ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xComp . is ( ) & & m_xModelAsIndex . is ( ) )
{
// Und die Position des ControlModel darin suchen
sal_uInt32 nPos = m_xModelAsIndex - > getCount ( ) ;
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xTemp ;
2000-09-18 16:07:07 +00:00
for ( ; nPos ; )
{
2000-11-07 12:16:50 +00:00
m_xModelAsIndex - > getByIndex ( - - nPos ) > > = xTemp ;
2004-04-13 10:05:48 +00:00
if ( ( XFormComponent * ) xComp . get ( ) = = ( XFormComponent * ) xTemp . get ( ) )
2000-09-18 16:07:07 +00:00
{
Reference < XInterface > xIfc ( xControl , UNO_QUERY ) ;
m_xModelAsManager - > attach ( nPos , xIfc , makeAny ( xControl ) ) ;
break ;
}
}
}
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : removeFromEventAttacher ( const Reference < XControl > & xControl )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2006-01-19 14:39:43 +00:00
OSL_ENSURE ( xControl . is ( ) , " FmXFormController::removeFromEventAttacher: invalid control - how did you reach this? " ) ;
if ( ! xControl . is ( ) )
return ; /* throw IllegalArgumentException(); */
2000-09-18 16:07:07 +00:00
// abmelden beim Eventattacher
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xComp ( xControl - > getModel ( ) , UNO_QUERY ) ;
2003-03-27 14:06:05 +00:00
if ( xComp . is ( ) & & m_xModelAsIndex . is ( ) )
2000-09-18 16:07:07 +00:00
{
// Und die Position des ControlModel darin suchen
sal_uInt32 nPos = m_xModelAsIndex - > getCount ( ) ;
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xTemp ;
2000-09-18 16:07:07 +00:00
for ( ; nPos ; )
{
2000-11-07 12:16:50 +00:00
m_xModelAsIndex - > getByIndex ( - - nPos ) > > = xTemp ;
2004-04-13 10:05:48 +00:00
if ( ( XFormComponent * ) xComp . get ( ) = = ( XFormComponent * ) xTemp . get ( ) )
2000-09-18 16:07:07 +00:00
{
Reference < XInterface > xIfc ( xControl , UNO_QUERY ) ;
m_xModelAsManager - > detach ( nPos , xIfc ) ;
break ;
}
}
}
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : setContainer ( const Reference < XControlContainer > & xContainer ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2004-04-13 10:05:48 +00:00
Reference < XTabControllerModel > xTabModel ( getModel ( ) ) ;
2000-09-18 16:07:07 +00:00
DBG_ASSERT ( xTabModel . is ( ) | | ! xContainer . is ( ) , " No Model defined " ) ;
// if we have a new container we need a model
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::setContainer : invalid aggregate ! " ) ;
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2004-04-13 10:05:48 +00:00
Reference < XContainer > xCurrentContainer ;
2000-09-18 16:07:07 +00:00
if ( m_xTabController . is ( ) )
2004-04-13 10:05:48 +00:00
xCurrentContainer = Reference < XContainer > ( m_xTabController - > getContainer ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xCurrentContainer . is ( ) )
{
xCurrentContainer - > removeContainerListener ( this ) ;
2004-04-13 10:05:48 +00:00
if ( m_aTabActivationTimer . IsActive ( ) )
m_aTabActivationTimer . Stop ( ) ;
2000-09-18 16:07:07 +00:00
// clear the filter map
for ( FmFilterControls : : const_iterator iter = m_aFilterControls . begin ( ) ;
2003-03-27 14:06:05 +00:00
iter ! = m_aFilterControls . end ( ) ; + + iter )
2000-09-18 16:07:07 +00:00
( * iter ) . first - > removeTextListener ( this ) ;
m_aFilterControls . clear ( ) ;
// einsammeln der Controls
2004-11-16 10:22:40 +00:00
const Reference < XControl > * pControls = m_aControls . getConstArray ( ) ;
const Reference < XControl > * pControlsEnd = pControls + m_aControls . getLength ( ) ;
while ( pControls ! = pControlsEnd )
implControlRemoved ( * pControls + + , true ) ;
2000-09-18 16:07:07 +00:00
// Datenbank spezifische Dinge vornehmen
if ( m_bDBConnection & & isListeningForChanges ( ) )
stopListening ( ) ;
2004-05-10 12:13:52 +00:00
m_aControls . realloc ( 0 ) ;
2000-09-18 16:07:07 +00:00
}
if ( m_xTabController . is ( ) )
m_xTabController - > setContainer ( xContainer ) ;
// Welche Controls gehoeren zum Container ?
if ( xContainer . is ( ) & & xTabModel . is ( ) )
{
2004-04-13 10:05:48 +00:00
Sequence < Reference < XControlModel > > aModels = xTabModel - > getControlModels ( ) ;
const Reference < XControlModel > * pModels = aModels . getConstArray ( ) ;
2004-11-16 10:22:40 +00:00
Sequence < Reference < XControl > > aAllControls = xContainer - > getControls ( ) ;
2000-09-18 16:07:07 +00:00
sal_Int32 nCount = aModels . getLength ( ) ;
2004-04-13 10:05:48 +00:00
m_aControls = Sequence < Reference < XControl > > ( nCount ) ;
Reference < XControl > * pControls = m_aControls . getArray ( ) ;
2000-09-18 16:07:07 +00:00
// einsammeln der Controls
sal_Int32 i , j ;
2004-11-16 10:22:40 +00:00
for ( i = 0 , j = 0 ; i < nCount ; + + i , + + pModels )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
Reference < XControl > xControl = findControl ( aAllControls , * pModels , sal_False , sal_True ) ;
if ( xControl . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
pControls [ j + + ] = xControl ;
implControlInserted ( xControl , true ) ;
2000-09-18 16:07:07 +00:00
}
}
2004-05-10 12:13:52 +00:00
// not every model had an associated control
2000-09-18 16:07:07 +00:00
if ( j ! = i )
m_aControls . realloc ( j ) ;
// am Container horchen
2004-04-13 10:05:48 +00:00
Reference < XContainer > xNewContainer ( xContainer , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xNewContainer . is ( ) )
xNewContainer - > addContainerListener ( this ) ;
// Datenbank spezifische Dinge vornehmen
if ( m_bDBConnection )
{
m_bLocked = determineLockState ( ) ;
setLocks ( ) ;
if ( ! isLocked ( ) )
startListening ( ) ;
}
}
// befinden sich die Controls in der richtigen Reihenfolge
m_bControlsSorted = sal_True ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Reference < XControlContainer > FmXFormController : : getContainer ( ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::getContainer : invalid aggregate ! " ) ;
if ( ! m_xTabController . is ( ) )
2004-04-13 10:05:48 +00:00
return Reference < XControlContainer > ( ) ;
2000-09-18 16:07:07 +00:00
return m_xTabController - > getContainer ( ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Sequence < Reference < XControl > > FmXFormController : : getControls ( void ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
if ( ! m_bControlsSorted )
{
2004-04-13 10:05:48 +00:00
Reference < XTabControllerModel > xModel = getModel ( ) ;
2000-09-18 16:07:07 +00:00
if ( ! xModel . is ( ) )
return m_aControls ;
2004-04-13 10:05:48 +00:00
Sequence < Reference < XControlModel > > aControlModels = xModel - > getControlModels ( ) ;
const Reference < XControlModel > * pModels = aControlModels . getConstArray ( ) ;
2000-09-18 16:07:07 +00:00
sal_Int32 nModels = aControlModels . getLength ( ) ;
2004-04-13 10:05:48 +00:00
Sequence < Reference < XControl > > aNewControls ( nModels ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
Reference < XControl > * pControls = aNewControls . getArray ( ) ;
2004-11-16 10:22:40 +00:00
Reference < XControl > xControl ;
2000-09-18 16:07:07 +00:00
// Umsortieren der Controls entsprechend der TabReihenfolge
2004-05-12 12:25:29 +00:00
sal_Int32 j = 0 ;
2004-11-16 10:22:40 +00:00
for ( sal_Int32 i = 0 ; i < nModels ; + + i , + + pModels )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
xControl = findControl ( m_aControls , * pModels , sal_True , sal_True ) ;
if ( xControl . is ( ) )
pControls [ j + + ] = xControl ;
2000-09-18 16:07:07 +00:00
}
2004-05-10 12:13:52 +00:00
// not every model had an associated control
if ( j ! = nModels )
aNewControls . realloc ( j ) ;
2000-09-18 16:07:07 +00:00
m_aControls = aNewControls ;
m_bControlsSorted = sal_True ;
}
return m_aControls ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : autoTabOrder ( ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::autoTabOrder : invalid aggregate ! " ) ;
if ( m_xTabController . is ( ) )
m_xTabController - > autoTabOrder ( ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : activateTabOrder ( ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::activateTabOrder : invalid aggregate ! " ) ;
if ( m_xTabController . is ( ) )
m_xTabController - > activateTabOrder ( ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : setControlLock ( const Reference < XControl > & xControl )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
sal_Bool bLocked = isLocked ( ) ;
// es wird gelockt
// a.) wenn der ganze Datensatz gesperrt ist
// b.) wenn das zugehoerige Feld gespeert ist
2004-04-13 10:05:48 +00:00
Reference < XBoundControl > xBound ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xBound . is ( ) & & ( ( bLocked & & bLocked ! = xBound - > getLock ( ) | |
! bLocked ) ) ) // beim entlocken immer einzelne Felder ueberpr<70> fen
{
// gibt es eine Datenquelle
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xSet ( xControl - > getModel ( ) , UNO_QUERY ) ;
2000-10-20 13:18:57 +00:00
if ( xSet . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xSet ) )
2000-09-18 16:07:07 +00:00
{
// wie sieht mit den Properties ReadOnly und Enable aus
sal_Bool bTouch = sal_True ;
2000-10-20 13:18:57 +00:00
if ( : : comphelper : : hasProperty ( FM_PROP_ENABLED , xSet ) )
bTouch = : : comphelper : : getBOOL ( xSet - > getPropertyValue ( FM_PROP_ENABLED ) ) ;
if ( : : comphelper : : hasProperty ( FM_PROP_READONLY , xSet ) )
bTouch = ! : : comphelper : : getBOOL ( xSet - > getPropertyValue ( FM_PROP_READONLY ) ) ;
2000-09-18 16:07:07 +00:00
if ( bTouch )
{
2000-11-07 12:16:50 +00:00
Reference < XPropertySet > xField ;
xSet - > getPropertyValue ( FM_PROP_BOUNDFIELD ) > > = xField ;
2000-09-18 16:07:07 +00:00
if ( xField . is ( ) )
{
if ( bLocked )
xBound - > setLock ( bLocked ) ;
else
{
try
{
Any aVal = xField - > getPropertyValue ( FM_PROP_ISREADONLY ) ;
2000-10-20 13:18:57 +00:00
if ( aVal . hasValue ( ) & & : : comphelper : : getBOOL ( aVal ) )
2000-09-18 16:07:07 +00:00
xBound - > setLock ( sal_True ) ;
else
xBound - > setLock ( bLocked ) ;
}
catch ( . . . )
{
}
}
}
}
}
}
}
//------------------------------------------------------------------------------
void FmXFormController : : setLocks ( )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
// alle Controls, die mit einer Datenquelle verbunden sind locken/unlocken
2004-11-16 10:22:40 +00:00
const Reference < XControl > * pControls = m_aControls . getConstArray ( ) ;
const Reference < XControl > * pControlsEnd = pControls + m_aControls . getLength ( ) ;
while ( pControls ! = pControlsEnd )
setControlLock ( * pControls + + ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-11-16 10:22:40 +00:00
namespace
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
bool lcl_shouldListenForModifications ( const Reference < XControl > & _rxControl , const Reference < XPropertyChangeListener > & _rxBoundFieldListener )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
bool bShould = false ;
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
Reference < XBoundComponent > xBound ( _rxControl , UNO_QUERY ) ;
if ( xBound . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
bShould = true ;
2000-09-18 16:07:07 +00:00
}
2004-11-16 10:22:40 +00:00
else if ( _rxControl . is ( ) )
{
xBound = Reference < XBoundComponent > ( _rxControl - > getModel ( ) , UNO_QUERY ) ;
Reference < XPropertySet > xModelProps ( xBound , UNO_QUERY ) ;
if ( xModelProps . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xModelProps ) )
{
Reference < XPropertySet > xField ;
xModelProps - > getPropertyValue ( FM_PROP_BOUNDFIELD ) > > = xField ;
bShould = xField . is ( ) ;
if ( ! bShould & & _rxBoundFieldListener . is ( ) )
xModelProps - > addPropertyChangeListener ( FM_PROP_BOUNDFIELD , _rxBoundFieldListener ) ;
}
}
return bShould ;
2000-09-18 16:07:07 +00:00
}
2004-11-16 10:22:40 +00:00
}
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
//------------------------------------------------------------------------------
void FmXFormController : : startControlModifyListening ( const Reference < XControl > & xControl )
{
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController::startControlModifyListening: Object already disposed! " ) ;
bool bModifyListening = lcl_shouldListenForModifications ( xControl , this ) ;
// artificial while
while ( bModifyListening )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
Reference < XModifyBroadcaster > xMod ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xMod . is ( ) )
{
xMod - > addModifyListener ( this ) ;
break ;
}
// alle die Text um vorzeitig ein modified zu erkennen
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xText . is ( ) )
{
xText - > addTextListener ( this ) ;
break ;
}
2004-04-13 10:05:48 +00:00
Reference < XCheckBox > xBox ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xBox . is ( ) )
{
xBox - > addItemListener ( this ) ;
break ;
}
2004-04-13 10:05:48 +00:00
Reference < XComboBox > xCbBox ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xCbBox . is ( ) )
{
xCbBox - > addItemListener ( this ) ;
break ;
}
2004-04-13 10:05:48 +00:00
Reference < XListBox > xListBox ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xListBox . is ( ) )
{
xListBox - > addItemListener ( this ) ;
break ;
}
break ;
}
}
//------------------------------------------------------------------------------
2004-11-16 10:22:40 +00:00
void FmXFormController : : stopControlModifyListening ( const Reference < XControl > & xControl )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
bool bModifyListening = lcl_shouldListenForModifications ( xControl , NULL ) ;
2000-09-18 16:07:07 +00:00
// kuenstliches while
while ( bModifyListening )
{
2004-04-13 10:05:48 +00:00
Reference < XModifyBroadcaster > xMod ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xMod . is ( ) )
{
xMod - > removeModifyListener ( this ) ;
break ;
}
// alle die Text um vorzeitig ein modified zu erkennen
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xText . is ( ) )
{
xText - > removeTextListener ( this ) ;
break ;
}
2004-04-13 10:05:48 +00:00
Reference < XCheckBox > xBox ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xBox . is ( ) )
{
xBox - > removeItemListener ( this ) ;
break ;
}
2004-04-13 10:05:48 +00:00
Reference < XComboBox > xCbBox ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xCbBox . is ( ) )
{
xCbBox - > removeItemListener ( this ) ;
break ;
}
2004-04-13 10:05:48 +00:00
Reference < XListBox > xListBox ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xListBox . is ( ) )
{
xListBox - > removeItemListener ( this ) ;
break ;
}
break ;
}
}
//------------------------------------------------------------------------------
void FmXFormController : : startListening ( )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_bModified = sal_False ;
// jetzt anmelden bei gebundenen feldern
2004-11-16 10:22:40 +00:00
const Reference < XControl > * pControls = m_aControls . getConstArray ( ) ;
const Reference < XControl > * pControlsEnd = pControls + m_aControls . getLength ( ) ;
while ( pControls ! = pControlsEnd )
startControlModifyListening ( * pControls + + ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
void FmXFormController : : stopListening ( )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_bModified = sal_False ;
// jetzt anmelden bei gebundenen feldern
2004-11-16 10:22:40 +00:00
const Reference < XControl > * pControls = m_aControls . getConstArray ( ) ;
const Reference < XControl > * pControlsEnd = pControls + m_aControls . getLength ( ) ;
while ( pControls ! = pControlsEnd )
stopControlModifyListening ( * pControls + + ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-11-16 10:22:40 +00:00
Reference < XControl > FmXFormController : : findControl ( Sequence < Reference < XControl > > & _rControls , const Reference < XControlModel > & xCtrlModel , sal_Bool _bRemove , sal_Bool _bOverWrite ) const
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
DBG_ASSERT ( xCtrlModel . is ( ) , " findControl - welches ?! " ) ;
2004-11-16 10:22:40 +00:00
Reference < XControl > * pControls = _rControls . getArray ( ) ;
2004-04-13 10:05:48 +00:00
Reference < XControlModel > xModel ;
2004-11-16 10:22:40 +00:00
for ( sal_Int32 i = 0 , nCount = _rControls . getLength ( ) ; i < nCount ; + + i , + + pControls )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
if ( pControls - > is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
xModel = ( * pControls ) - > getModel ( ) ;
if ( xModel . get ( ) = = xCtrlModel . get ( ) )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
Reference < XControl > xControl ( * pControls ) ;
2003-03-27 14:06:05 +00:00
if ( _bRemove )
2004-11-16 10:22:40 +00:00
: : comphelper : : removeElementAt ( _rControls , i ) ;
2003-05-19 11:51:00 +00:00
else if ( _bOverWrite )
2004-11-16 10:22:40 +00:00
* pControls = Reference < XControl > ( ) ;
return xControl ;
2000-09-18 16:07:07 +00:00
}
}
}
2004-04-13 10:05:48 +00:00
return Reference < XControl > ( ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-11-16 10:22:40 +00:00
void FmXFormController : : implControlInserted ( const Reference < XControl > & _rxControl , bool _bAddToEventAttacher )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
Reference < XWindow > xWindow ( _rxControl , UNO_QUERY ) ;
if ( xWindow . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-07-05 14:50:20 +00:00
xWindow - > addFocusListener ( this ) ;
xWindow - > addMouseListener ( this ) ;
2004-11-16 10:22:40 +00:00
if ( _bAddToEventAttacher )
addToEventAttacher ( _rxControl ) ;
2000-09-18 16:07:07 +00:00
}
2004-11-16 10:22:40 +00:00
// add a dispatch interceptor to the control (if supported)
Reference < XDispatchProviderInterception > xInterception ( _rxControl , UNO_QUERY ) ;
if ( xInterception . is ( ) )
createInterceptor ( xInterception ) ;
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
if ( _rxControl . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
Reference < XControlModel > xModel ( _rxControl - > getModel ( ) ) ;
2000-09-18 16:07:07 +00:00
// we want to know about the reset of the the model of our controls
// (for correctly resetting m_bModified)
2004-11-16 10:22:40 +00:00
Reference < XReset > xReset ( xModel , UNO_QUERY ) ;
if ( xReset . is ( ) )
xReset - > addResetListener ( this ) ;
// and we want to know about the validity, to visually indicate it
Reference < XValidatableFormComponent > xValidatable ( xModel , UNO_QUERY ) ;
if ( xValidatable . is ( ) )
{
xValidatable - > addFormComponentValidityListener ( this ) ;
m_pControlBorderManager - > validityChanged ( _rxControl , xValidatable ) ;
}
2000-09-18 16:07:07 +00:00
}
2004-11-16 10:22:40 +00:00
}
//------------------------------------------------------------------------------
void FmXFormController : : implControlRemoved ( const Reference < XControl > & _rxControl , bool _bRemoveFromEventAttacher )
{
Reference < XWindow > xWindow ( _rxControl , UNO_QUERY ) ;
if ( xWindow . is ( ) )
{
xWindow - > removeFocusListener ( this ) ;
xWindow - > removeMouseListener ( this ) ;
if ( _bRemoveFromEventAttacher )
removeFromEventAttacher ( _rxControl ) ;
}
Reference < XDispatchProviderInterception > xInterception ( _rxControl , UNO_QUERY ) ;
if ( xInterception . is ( ) )
deleteInterceptor ( xInterception ) ;
if ( _rxControl . is ( ) )
{
Reference < XControlModel > xModel ( _rxControl - > getModel ( ) ) ;
Reference < XReset > xReset ( xModel , UNO_QUERY ) ;
if ( xReset . is ( ) )
xReset - > removeResetListener ( this ) ;
Reference < XValidatableFormComponent > xValidatable ( xModel , UNO_QUERY ) ;
if ( xValidatable . is ( ) )
xValidatable - > removeFormComponentValidityListener ( this ) ;
}
}
//------------------------------------------------------------------------------
void FmXFormController : : insertControl ( const Reference < XControl > & xControl )
{
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
m_bControlsSorted = sal_False ;
m_aControls . realloc ( m_aControls . getLength ( ) + 1 ) ;
m_aControls . getArray ( ) [ m_aControls . getLength ( ) - 1 ] = xControl ;
implControlInserted ( xControl , m_bAttachEvents ) ;
2000-09-18 16:07:07 +00:00
if ( m_bDBConnection & & ! m_bFiltering )
setControlLock ( xControl ) ;
if ( isListeningForChanges ( ) & & m_bAttachEvents )
2004-11-16 10:22:40 +00:00
startControlModifyListening ( xControl ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : removeControl ( const Reference < XControl > & xControl )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2004-11-16 10:22:40 +00:00
const Reference < XControl > * pControls = m_aControls . getConstArray ( ) ;
const Reference < XControl > * pControlsEnd = pControls + m_aControls . getLength ( ) ;
while ( pControls ! = pControlsEnd )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
if ( xControl . get ( ) = = ( * pControls + + ) . get ( ) )
2000-09-18 16:07:07 +00:00
{
2005-10-24 07:26:42 +00:00
: : comphelper : : removeElementAt ( m_aControls , pControls - m_aControls . getConstArray ( ) - 1 ) ;
2000-09-18 16:07:07 +00:00
break ;
}
}
if ( m_aFilterControls . size ( ) )
{
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
FmFilterControls : : iterator iter = m_aFilterControls . find ( xText ) ;
if ( iter ! = m_aFilterControls . end ( ) )
m_aFilterControls . erase ( iter ) ;
}
2004-11-16 10:22:40 +00:00
implControlRemoved ( xControl , m_bDetachEvents ) ;
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
if ( isListeningForChanges ( ) & & m_bDetachEvents )
stopControlModifyListening ( xControl ) ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
// XLoadListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : loaded ( const EventObject & rEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2002-12-05 08:58:04 +00:00
OSL_ENSURE ( rEvent . Source = = m_xModelAsIndex , " FmXFormController::loaded: where did this come from? " ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2004-04-13 10:05:48 +00:00
Reference < XRowSet > xForm ( rEvent . Source , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
// do we have a connected data source
2002-10-07 12:09:48 +00:00
OStaticDataAccessTools aStaticTools ;
if ( xForm . is ( ) & & aStaticTools . getRowSetConnection ( xForm ) . is ( ) )
2000-09-18 16:07:07 +00:00
{
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xSet ( xForm , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xSet . is ( ) )
{
Any aVal = xSet - > getPropertyValue ( FM_PROP_CYCLE ) ;
2006-11-21 16:09:15 +00:00
sal_Int32 aVal2 = 0 ;
2000-09-18 16:07:07 +00:00
: : cppu : : enum2int ( aVal2 , aVal ) ;
2004-04-13 10:05:48 +00:00
m_bCycle = ! aVal . hasValue ( ) | | aVal2 = = TabulatorCycle_RECORDS ;
2002-10-07 12:09:48 +00:00
m_bCanUpdate = aStaticTools . canUpdate ( xSet ) ;
m_bCanInsert = aStaticTools . canInsert ( xSet ) ;
2000-10-20 13:18:57 +00:00
m_bCurrentRecordModified = : : comphelper : : getBOOL ( xSet - > getPropertyValue ( FM_PROP_ISMODIFIED ) ) ;
m_bCurrentRecordNew = : : comphelper : : getBOOL ( xSet - > getPropertyValue ( FM_PROP_ISNEW ) ) ;
2000-09-18 16:07:07 +00:00
2002-12-05 08:58:04 +00:00
startFormListening ( xSet , sal_False ) ;
2000-09-18 16:07:07 +00:00
// set the locks for the current controls
if ( getContainer ( ) . is ( ) )
{
if ( m_nLoadEvent )
Application : : RemoveUserEvent ( m_nLoadEvent ) ;
m_nLoadEvent = Application : : PostUserEvent ( LINK ( this , FmXFormController ,
OnLoad ) ) ;
}
}
else
{
m_bCanInsert = m_bCanUpdate = m_bCycle = sal_False ;
m_bCurrentRecordModified = sal_False ;
m_bCurrentRecordNew = sal_False ;
m_bLocked = sal_False ;
}
m_bDBConnection = sal_True ;
}
else
{
m_bDBConnection = sal_False ;
m_bCanInsert = m_bCanUpdate = m_bCycle = sal_False ;
m_bCurrentRecordModified = sal_False ;
m_bCurrentRecordNew = sal_False ;
m_bLocked = sal_False ;
}
2004-04-13 10:05:48 +00:00
updateAllDispatchers ( ) ;
}
//------------------------------------------------------------------------------
void FmXFormController : : updateAllDispatchers ( ) const
{
: : std : : for_each (
m_aFeatureDispatchers . begin ( ) ,
m_aFeatureDispatchers . end ( ) ,
: : std : : compose1 (
UpdateAllListeners ( ) ,
: : std : : select2nd < DispatcherContainer : : value_type > ( )
)
) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
IMPL_LINK ( FmXFormController , OnLoad , void * , EMPTYARG )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_nLoadEvent = 0 ;
m_bLocked = determineLockState ( ) ;
setLocks ( ) ;
if ( ! m_bLocked )
startListening ( ) ;
// just one exception toggle the auto values
2006-11-14 12:24:06 +00:00
if ( m_bCurrentRecordNew )
2000-09-18 16:07:07 +00:00
toggleAutoFields ( sal_True ) ;
return 1L ;
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void FmXFormController : : unloaded ( const EventObject & /*rEvent*/ ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2004-04-13 10:05:48 +00:00
updateAllDispatchers ( ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void FmXFormController : : reloading ( const EventObject & /*aEvent*/ ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2000-09-18 16:07:07 +00:00
// do the same like in unloading
// just one exception toggle the auto values
if ( m_nToggleEvent )
{
Application : : RemoveUserEvent ( m_nToggleEvent ) ;
m_nToggleEvent = 0 ;
}
unload ( ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : reloaded ( const EventObject & aEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
loaded ( aEvent ) ;
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void FmXFormController : : unloading ( const EventObject & /*aEvent*/ ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
unload ( ) ;
}
//------------------------------------------------------------------------------
void FmXFormController : : unload ( ) throw ( RuntimeException )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
if ( m_nLoadEvent )
{
Application : : RemoveUserEvent ( m_nLoadEvent ) ;
m_nLoadEvent = 0 ;
}
// be sure not to have autofields
2006-11-14 12:24:06 +00:00
if ( m_bCurrentRecordNew )
2000-09-18 16:07:07 +00:00
toggleAutoFields ( sal_False ) ;
2003-05-19 11:51:00 +00:00
// remove bound field listing again
removeBoundFieldListener ( ) ;
2000-09-18 16:07:07 +00:00
if ( m_bDBConnection & & isListeningForChanges ( ) )
stopListening ( ) ;
2002-12-05 08:58:04 +00:00
Reference < XPropertySet > xSet ( m_xModelAsIndex , UNO_QUERY ) ;
if ( m_bDBConnection & & xSet . is ( ) )
stopFormListening ( xSet , sal_False ) ;
m_bDBConnection = sal_False ;
m_bCanInsert = m_bCanUpdate = m_bCycle = sal_False ;
m_bCurrentRecordModified = m_bCurrentRecordNew = m_bLocked = sal_False ;
}
2004-11-16 10:22:40 +00:00
2003-05-19 11:51:00 +00:00
// -----------------------------------------------------------------------------
void FmXFormController : : removeBoundFieldListener ( )
{
2004-11-16 10:22:40 +00:00
const Reference < XControl > * pControls = m_aControls . getConstArray ( ) ;
const Reference < XControl > * pControlsEnd = pControls + m_aControls . getLength ( ) ;
while ( pControls ! = pControlsEnd )
2003-05-19 11:51:00 +00:00
{
2004-11-16 10:22:40 +00:00
Reference < XPropertySet > xProp ( * pControls + + , UNO_QUERY ) ;
2003-05-19 11:51:00 +00:00
if ( xProp . is ( ) )
2004-11-16 10:22:40 +00:00
xProp - > removePropertyChangeListener ( FM_PROP_BOUNDFIELD , this ) ;
2003-05-19 11:51:00 +00:00
}
}
2004-11-16 10:22:40 +00:00
2002-12-05 08:58:04 +00:00
//------------------------------------------------------------------------------
void FmXFormController : : startFormListening ( const Reference < XPropertySet > & _rxForm , sal_Bool _bPropertiesOnly )
{
2004-07-05 14:50:20 +00:00
try
2000-09-18 16:07:07 +00:00
{
2004-07-05 14:50:20 +00:00
if ( m_bCanInsert | | m_bCanUpdate ) // form can be modified
2000-09-18 16:07:07 +00:00
{
2004-07-05 14:50:20 +00:00
_rxForm - > addPropertyChangeListener ( FM_PROP_ISNEW , this ) ;
_rxForm - > addPropertyChangeListener ( FM_PROP_ISMODIFIED , this ) ;
if ( ! _bPropertiesOnly )
{
// set the Listener for UI interaction
Reference < XRowSetApproveBroadcaster > xApprove ( _rxForm , UNO_QUERY ) ;
if ( xApprove . is ( ) )
xApprove - > addRowSetApproveListener ( this ) ;
// listener for row set changes
Reference < XRowSet > xRowSet ( _rxForm , UNO_QUERY ) ;
if ( xRowSet . is ( ) )
xRowSet - > addRowSetListener ( this ) ;
}
2002-12-05 08:58:04 +00:00
}
2004-07-05 14:50:20 +00:00
if ( _rxForm - > getPropertySetInfo ( ) . is ( ) & & _rxForm - > getPropertySetInfo ( ) - > hasPropertyByName ( FM_PROP_DYNAMIC_CONTROL_BORDER ) )
_rxForm - > addPropertyChangeListener ( FM_PROP_DYNAMIC_CONTROL_BORDER , this ) ;
}
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::startFormListening: caught an exception! " ) ;
2002-12-05 08:58:04 +00:00
}
}
//------------------------------------------------------------------------------
void FmXFormController : : stopFormListening ( const Reference < XPropertySet > & _rxForm , sal_Bool _bPropertiesOnly )
{
2004-07-05 14:50:20 +00:00
try
2002-12-05 08:58:04 +00:00
{
2004-07-05 14:50:20 +00:00
if ( m_bCanInsert | | m_bCanUpdate )
2002-12-05 08:58:04 +00:00
{
2004-07-05 14:50:20 +00:00
_rxForm - > removePropertyChangeListener ( FM_PROP_ISNEW , this ) ;
_rxForm - > removePropertyChangeListener ( FM_PROP_ISMODIFIED , this ) ;
if ( ! _bPropertiesOnly )
{
Reference < XRowSetApproveBroadcaster > xApprove ( _rxForm , UNO_QUERY ) ;
if ( xApprove . is ( ) )
xApprove - > removeRowSetApproveListener ( this ) ;
2002-12-05 08:58:04 +00:00
2004-07-05 14:50:20 +00:00
Reference < XRowSet > xRowSet ( _rxForm , UNO_QUERY ) ;
if ( xRowSet . is ( ) )
xRowSet - > removeRowSetListener ( this ) ;
}
2000-09-18 16:07:07 +00:00
}
2004-07-05 14:50:20 +00:00
if ( _rxForm - > getPropertySetInfo ( ) . is ( ) & & _rxForm - > getPropertySetInfo ( ) - > hasPropertyByName ( FM_PROP_DYNAMIC_CONTROL_BORDER ) )
_rxForm - > removePropertyChangeListener ( FM_PROP_DYNAMIC_CONTROL_BORDER , this ) ;
}
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::stopFormListening: caught an exception! " ) ;
2000-09-18 16:07:07 +00:00
}
}
// com::sun::star::sdbc::XRowSetListener
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void FmXFormController : : cursorMoved ( const EventObject & /*event*/ ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
// toggle the locking ?
if ( m_bLocked ! = determineLockState ( ) )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
m_bLocked = ! m_bLocked ;
setLocks ( ) ;
if ( isListeningForChanges ( ) )
startListening ( ) ;
else
stopListening ( ) ;
}
2002-12-05 08:58:04 +00:00
// neither the current control nor the current record are modified anymore
m_bCurrentRecordModified = m_bModified = sal_False ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void FmXFormController : : rowChanged ( const EventObject & /*event*/ ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
// not interested in ...
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void FmXFormController : : rowSetChanged ( const EventObject & /*event*/ ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
// not interested in ...
}
2004-04-13 10:05:48 +00:00
// XContainerListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : elementInserted ( const ContainerEvent & evt ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2004-04-13 10:05:48 +00:00
Reference < XControl > xControl ;
2000-11-07 12:16:50 +00:00
evt . Element > > = xControl ;
2000-09-18 16:07:07 +00:00
if ( ! xControl . is ( ) )
return ;
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xModel ( xControl - > getModel ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xModel . is ( ) & & m_xModelAsIndex = = xModel - > getParent ( ) )
{
insertControl ( xControl ) ;
2004-04-13 10:05:48 +00:00
if ( m_aTabActivationTimer . IsActive ( ) )
m_aTabActivationTimer . Stop ( ) ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
m_aTabActivationTimer . Start ( ) ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
// are we in filtermode and a XModeSelector has inserted an element
else if ( m_bFiltering & & Reference < XModeSelector > ( evt . Source , UNO_QUERY ) . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
xModel = Reference < XFormComponent > ( evt . Source , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xModel . is ( ) & & m_xModelAsIndex = = xModel - > getParent ( ) )
{
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xSet ( xControl - > getModel ( ) , UNO_QUERY ) ;
2000-10-20 13:18:57 +00:00
if ( xSet . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xSet ) )
2000-09-18 16:07:07 +00:00
{
// does the model use a bound field ?
2000-11-07 12:16:50 +00:00
Reference < XPropertySet > xField ;
xSet - > getPropertyValue ( FM_PROP_BOUNDFIELD ) > > = xField ;
2000-09-18 16:07:07 +00:00
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
// may we filter the field?
2000-10-20 13:18:57 +00:00
if ( xText . is ( ) & & xField . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_SEARCHABLE , xField ) & &
: : comphelper : : getBOOL ( xField - > getPropertyValue ( FM_PROP_SEARCHABLE ) ) )
2000-09-18 16:07:07 +00:00
{
m_aFilterControls [ xText ] = xField ;
xText - > addTextListener ( this ) ;
}
}
}
}
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : elementReplaced ( const ContainerEvent & evt ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
// simulate an elementRemoved
ContainerEvent aRemoveEvent ( evt ) ;
aRemoveEvent . Element = evt . ReplacedElement ;
aRemoveEvent . ReplacedElement = Any ( ) ;
elementRemoved ( aRemoveEvent ) ;
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
// simulate an elementInserted
ContainerEvent aInsertEvent ( evt ) ;
aInsertEvent . ReplacedElement = Any ( ) ;
elementInserted ( aInsertEvent ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : elementRemoved ( const ContainerEvent & evt ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2004-04-13 10:05:48 +00:00
Reference < XControl > xControl ;
2000-11-07 12:16:50 +00:00
evt . Element > > = xControl ;
2000-09-18 16:07:07 +00:00
if ( ! xControl . is ( ) )
return ;
2004-04-13 10:05:48 +00:00
Reference < XFormComponent > xModel ( xControl - > getModel ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xModel . is ( ) & & m_xModelAsIndex = = xModel - > getParent ( ) )
{
removeControl ( xControl ) ;
// TabOrder nicht neu berechnen, da das intern schon funktionieren mu<6D> !
}
2006-11-14 12:24:06 +00:00
// are we in filtermode and a XModeSelector has inserted an element
else if ( m_bFiltering & & Reference < XModeSelector > ( evt . Source , UNO_QUERY ) . is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
Reference < XTextComponent > xText ( xControl , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
FmFilterControls : : iterator iter = m_aFilterControls . find ( xText ) ;
if ( iter ! = m_aFilterControls . end ( ) )
m_aFilterControls . erase ( iter ) ;
}
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Reference < XControl > FmXFormController : : isInList ( const Reference < XWindowPeer > & xPeer ) const
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2004-11-16 10:22:40 +00:00
const Reference < XControl > * pControls = m_aControls . getConstArray ( ) ;
2000-09-18 16:07:07 +00:00
sal_uInt32 nCtrls = m_aControls . getLength ( ) ;
2004-11-16 10:22:40 +00:00
for ( sal_uInt32 n = 0 ; n < nCtrls & & xPeer . is ( ) ; + + n , + + pControls )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
if ( pControls - > is ( ) )
2000-09-18 16:07:07 +00:00
{
2004-11-16 10:22:40 +00:00
Reference < XVclWindowPeer > xCtrlPeer ( ( * pControls ) - > getPeer ( ) , UNO_QUERY ) ;
if ( ( xCtrlPeer . get ( ) = = xPeer . get ( ) ) | | xCtrlPeer - > isChild ( xPeer ) )
return * pControls ;
2000-09-18 16:07:07 +00:00
}
}
2004-04-13 10:05:48 +00:00
return Reference < XControl > ( ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : activateFirst ( ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::activateFirst : invalid aggregate ! " ) ;
if ( m_xTabController . is ( ) )
m_xTabController - > activateFirst ( ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : activateLast ( ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
DBG_ASSERT ( m_xTabController . is ( ) , " FmXFormController::activateLast : invalid aggregate ! " ) ;
if ( m_xTabController . is ( ) )
m_xTabController - > activateLast ( ) ;
}
2004-04-13 10:05:48 +00:00
// XFormController
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Reference < XControl > SAL_CALL FmXFormController : : getCurrentControl ( void ) throw ( RuntimeException )
2001-05-29 13:15:08 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-29 13:15:08 +00:00
return m_xCurrentControl ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : addActivateListener ( const Reference < XFormControllerListener > & l ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aActivateListeners . addInterface ( l ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : removeActivateListener ( const Reference < XFormControllerListener > & l ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aActivateListeners . removeInterface ( l ) ;
}
//------------------------------------------------------------------------------
void FmXFormController : : setFilter ( vector < FmFieldInfo > & rFieldInfos )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
// create the composer
2001-07-25 12:44:28 +00:00
Reference < XRowSet > xForm ( m_xModelAsIndex , UNO_QUERY ) ;
2002-10-07 12:09:48 +00:00
Reference < XConnection > xConnection ( OStaticDataAccessTools ( ) . getRowSetConnection ( xForm ) ) ;
2000-09-18 16:07:07 +00:00
if ( xForm . is ( ) )
{
2004-04-13 10:05:48 +00:00
Reference < XSQLQueryComposerFactory > xFactory ( xConnection , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xFactory . is ( ) )
{
m_xComposer = xFactory - > createQueryComposer ( ) ;
try
{
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xSet ( xForm , UNO_QUERY ) ;
2000-10-20 13:18:57 +00:00
: : rtl : : OUString aStatement = : : comphelper : : getString ( xSet - > getPropertyValue ( FM_PROP_ACTIVECOMMAND ) ) ;
: : rtl : : OUString aFilter = : : comphelper : : getString ( xSet - > getPropertyValue ( FM_PROP_FILTER_CRITERIA ) ) ;
2000-09-18 16:07:07 +00:00
m_xComposer - > setQuery ( aStatement ) ;
m_xComposer - > setFilter ( aFilter ) ;
}
2002-10-07 12:09:48 +00:00
catch ( const Exception & )
2000-09-18 16:07:07 +00:00
{
2000-11-07 12:16:50 +00:00
DBG_ERROR ( " Exception occured! " ) ;
2000-09-18 16:07:07 +00:00
}
}
}
if ( m_xComposer . is ( ) )
{
2000-11-06 06:19:53 +00:00
Sequence < PropertyValue > aLevel ;
Sequence < Sequence < PropertyValue > > aFilterRows = m_xComposer - > getStructuredFilter ( ) ;
2000-09-18 16:07:07 +00:00
// ok, we recieve the list of filters as sequence of fieldnames, value
// now we have to transform the fieldname into UI names, that could be a label of the field or
// a aliasname or the fieldname itself
// first adjust the field names if necessary
2004-04-13 10:05:48 +00:00
Reference < XNameAccess > xQueryColumns = Reference < XColumnsSupplier >
2000-09-18 16:07:07 +00:00
( m_xComposer , UNO_QUERY ) - > getColumns ( ) ;
for ( vector < FmFieldInfo > : : iterator iter = rFieldInfos . begin ( ) ;
iter ! = rFieldInfos . end ( ) ; iter + + )
{
2002-11-14 09:01:03 +00:00
if ( xQueryColumns - > hasByName ( ( * iter ) . aFieldName ) )
2000-09-18 16:07:07 +00:00
{
2002-11-14 09:01:03 +00:00
if ( ( xQueryColumns - > getByName ( ( * iter ) . aFieldName ) > > = ( * iter ) . xField ) & & ( * iter ) . xField . is ( ) )
( * iter ) . xField - > getPropertyValue ( FM_PROP_REALNAME ) > > = ( * iter ) . aFieldName ;
2000-09-18 16:07:07 +00:00
}
}
2004-04-13 10:05:48 +00:00
Reference < XDatabaseMetaData > xMetaData ( xConnection - > getMetaData ( ) ) ;
2000-09-18 16:07:07 +00:00
// now transfer the filters into Value/TextComponent pairs
2002-11-14 09:01:03 +00:00
: : comphelper : : UStringMixEqual aCompare ( xMetaData - > storesMixedCaseQuotedIdentifiers ( ) ) ;
// need to parse criteria localized
OStaticDataAccessTools aStaticTools ;
2004-04-13 10:05:48 +00:00
Reference < XNumberFormatsSupplier > xFormatSupplier ( aStaticTools . getNumberFormats ( xConnection , sal_True ) ) ;
Reference < XNumberFormatter > xFormatter ( m_xORB
2002-11-14 09:01:03 +00:00
- > createInstance ( : : rtl : : OUString : : createFromAscii ( " com.sun.star.util.NumberFormatter " ) ) , UNO_QUERY ) ;
xFormatter - > attachNumberFormatsSupplier ( xFormatSupplier ) ;
2004-04-13 10:05:48 +00:00
Locale aAppLocale = Application : : GetSettings ( ) . GetUILocale ( ) ;
2002-11-14 09:01:03 +00:00
LocaleDataWrapper aLocaleWrapper ( m_xORB , aAppLocale ) ;
2000-09-18 16:07:07 +00:00
// retrieving the filter
2000-11-06 06:19:53 +00:00
const Sequence < PropertyValue > * pRow = aFilterRows . getConstArray ( ) ;
2000-09-18 16:07:07 +00:00
for ( sal_Int32 i = 0 , nLen = aFilterRows . getLength ( ) ; i < nLen ; + + i )
{
FmFilterRow aRow ;
// search a field for the given name
2000-11-06 06:19:53 +00:00
const PropertyValue * pRefValues = pRow [ i ] . getConstArray ( ) ;
2000-09-18 16:07:07 +00:00
for ( sal_Int32 j = 0 , nLen1 = pRow [ i ] . getLength ( ) ; j < nLen1 ; j + + )
{
// look for the text component
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xField ;
2000-09-18 16:07:07 +00:00
try
{
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xSet ;
2000-09-18 16:07:07 +00:00
: : rtl : : OUString aRealName ;
// first look with the given name
if ( xQueryColumns - > hasByName ( pRefValues [ j ] . Name ) )
{
xQueryColumns - > getByName ( pRefValues [ j ] . Name ) > > = xSet ;
// get the RealName
xSet - > getPropertyValue ( : : rtl : : OUString : : createFromAscii ( " RealName " ) ) > > = aRealName ;
// compare the condition field name and the RealName
if ( aCompare ( aRealName , pRefValues [ j ] . Name ) )
xField = xSet ;
}
if ( ! xField . is ( ) )
{
// no we have to check every column to find the realname
2004-04-13 10:05:48 +00:00
Reference < XIndexAccess > xColumnsByIndex ( xQueryColumns , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
for ( sal_Int32 n = 0 , nCount = xColumnsByIndex - > getCount ( ) ; n < nCount ; n + + )
{
xColumnsByIndex - > getByIndex ( n ) > > = xSet ;
xSet - > getPropertyValue ( : : rtl : : OUString : : createFromAscii ( " RealName " ) ) > > = aRealName ;
if ( aCompare ( aRealName , pRefValues [ j ] . Name ) )
{
// get the column by its alias
xField = xSet ;
break ;
}
}
}
if ( ! xField . is ( ) )
continue ;
}
2001-07-25 12:44:28 +00:00
catch ( const Exception & )
2000-09-18 16:07:07 +00:00
{
continue ;
}
// find the text component
for ( vector < FmFieldInfo > : : iterator iter = rFieldInfos . begin ( ) ;
iter ! = rFieldInfos . end ( ) ; iter + + )
{
// we found the field so insert a new entry to the filter row
if ( ( * iter ) . xField = = xField )
{
// do we already have the control ?
if ( aRow . find ( ( * iter ) . xText ) ! = aRow . end ( ) )
{
2000-11-06 06:19:53 +00:00
: : rtl : : OUString aCompText = aRow [ ( * iter ) . xText ] ;
aCompText + = : : rtl : : OUString : : createFromAscii ( " " ) ;
2001-07-25 12:44:28 +00:00
: : rtl : : OString aVal = m_xParser - > getContext ( ) . getIntlKeywordAscii ( OParseContext : : KEY_AND ) ;
2000-11-06 06:19:53 +00:00
aCompText + = : : rtl : : OUString ( aVal . getStr ( ) , aVal . getLength ( ) , RTL_TEXTENCODING_ASCII_US ) ;
aCompText + = : : rtl : : OUString : : createFromAscii ( " " ) ;
aCompText + = : : comphelper : : getString ( pRefValues [ j ] . Value ) ;
2000-09-18 16:07:07 +00:00
aRow [ ( * iter ) . xText ] = aCompText ;
}
else
2002-11-14 09:01:03 +00:00
{
: : rtl : : OUString sPredicate , sErrorMsg ;
pRefValues [ j ] . Value > > = sPredicate ;
: : rtl : : Reference < ISQLParseNode > xParseNode = predicateTree ( sErrorMsg , sPredicate , xFormatter , xField ) ;
if ( xParseNode . is ( ) )
{
: : rtl : : OUString sCriteria ;
xParseNode - > parseNodeToPredicateStr ( sCriteria
2006-12-13 15:42:30 +00:00
, xConnection
2002-11-14 09:01:03 +00:00
, xFormatter
, xField
, aAppLocale
2003-03-27 14:06:05 +00:00
, ( sal_Char ) aLocaleWrapper . getNumDecimalSep ( ) . GetChar ( 0 )
2002-11-14 09:01:03 +00:00
, getParseContext ( ) ) ;
aRow [ ( * iter ) . xText ] = sCriteria ;
}
}
2000-09-18 16:07:07 +00:00
break ;
}
}
}
if ( aRow . empty ( ) )
continue ;
m_aFilters . push_back ( aRow ) ;
}
}
// now set the filter controls
for ( vector < FmFieldInfo > : : iterator iter = rFieldInfos . begin ( ) ;
iter ! = rFieldInfos . end ( ) ; iter + + )
{
m_aFilterControls [ ( * iter ) . xText ] = ( * iter ) . xField ;
}
// add an empty row
m_aFilters . push_back ( FmFilterRow ( ) ) ;
}
//------------------------------------------------------------------------------
void FmXFormController : : startFiltering ( )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
2002-10-07 12:09:48 +00:00
OStaticDataAccessTools aStaticTools ;
Reference < XConnection > xConnection ( aStaticTools . getRowSetConnection ( Reference < XRowSet > ( m_xModelAsIndex , UNO_QUERY ) ) ) ;
2002-03-19 12:12:39 +00:00
if ( ! xConnection . is ( ) )
// nothing to do - can't filter a form which is not connected
// 98023 - 19.03.2002 - fs@openoffice.org
return ;
2000-09-18 16:07:07 +00:00
// stop listening for controls
if ( isListeningForChanges ( ) )
stopListening ( ) ;
m_bFiltering = sal_True ;
// as we don't want new controls to be attached to the scripting environment
// we change attach flags
m_bAttachEvents = sal_False ;
// Austauschen der Kontrols fuer das aktuelle Formular
2005-10-24 07:26:42 +00:00
Sequence < Reference < XControl > > aControlsCopy ( m_aControls ) ;
const Reference < XControl > * pControls = aControlsCopy . getConstArray ( ) ;
sal_Int32 nControlCount = aControlsCopy . getLength ( ) ;
2000-09-18 16:07:07 +00:00
// the control we have to activate after replacement
2004-04-13 10:05:48 +00:00
Reference < XDatabaseMetaData > xMetaData ( xConnection - > getMetaData ( ) ) ;
Reference < XNumberFormatsSupplier > xFormatSupplier = aStaticTools . getNumberFormats ( xConnection , sal_True ) ;
Reference < XNumberFormatter > xFormatter ( m_xORB
2000-09-18 16:07:07 +00:00
- > createInstance ( : : rtl : : OUString : : createFromAscii ( " com.sun.star.util.NumberFormatter " ) ) , UNO_QUERY ) ;
xFormatter - > attachNumberFormatsSupplier ( xFormatSupplier ) ;
// structure for storing the field info
vector < FmFieldInfo > aFieldInfos ;
2006-11-14 12:24:06 +00:00
for ( sal_Int32 i = nControlCount ; i > 0 ; )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XControl > xControl = pControls [ - - i ] ;
if ( xControl . is ( ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
// no events for the control anymore
removeFromEventAttacher ( xControl ) ;
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
// do we have a mode selector
Reference < XModeSelector > xSelector ( xControl , UNO_QUERY ) ;
if ( xSelector . is ( ) )
{
xSelector - > setMode ( FILTER_MODE ) ;
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
// listening for new controls of the selector
Reference < XContainer > xContainer ( xSelector , UNO_QUERY ) ;
if ( xContainer . is ( ) )
xContainer - > addContainerListener ( this ) ;
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
Reference < XEnumerationAccess > xElementAccess ( xSelector , UNO_QUERY ) ;
if ( xElementAccess . is ( ) )
{
Reference < XEnumeration > xEnumeration ( xElementAccess - > createEnumeration ( ) ) ;
Reference < XControl > xSubControl ;
while ( xEnumeration - > hasMoreElements ( ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
xEnumeration - > nextElement ( ) > > = xSubControl ;
if ( xSubControl . is ( ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XPropertySet > xSet ( xSubControl - > getModel ( ) , UNO_QUERY ) ;
if ( xSet . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xSet ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
// does the model use a bound field ?
Reference < XPropertySet > xField ;
xSet - > getPropertyValue ( FM_PROP_BOUNDFIELD ) > > = xField ;
Reference < XTextComponent > xText ( xSubControl , UNO_QUERY ) ;
// may we filter the field?
if ( xText . is ( ) & & xField . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_SEARCHABLE , xField ) & &
: : comphelper : : getBOOL ( xField - > getPropertyValue ( FM_PROP_SEARCHABLE ) ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
aFieldInfos . push_back ( FmFieldInfo ( xField , xText ) ) ;
xText - > addTextListener ( this ) ;
2000-09-18 16:07:07 +00:00
}
}
}
}
}
2006-11-14 12:24:06 +00:00
continue ;
}
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
Reference < XPropertySet > xModel ( xControl - > getModel ( ) , UNO_QUERY ) ;
if ( xModel . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xModel ) )
{
// does the model use a bound field ?
Any aVal = xModel - > getPropertyValue ( FM_PROP_BOUNDFIELD ) ;
Reference < XPropertySet > xField ;
aVal > > = xField ;
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
// may we filter the field?
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
if ( xField . is ( )
& & : : comphelper : : hasProperty ( FM_PROP_SEARCHABLE , xField )
& & : : comphelper : : getBOOL ( xField - > getPropertyValue ( FM_PROP_SEARCHABLE ) )
)
{
// create a filter control
Sequence < Any > aCreationArgs ( 3 ) ;
aCreationArgs [ 0 ] < < = NamedValue ( : : rtl : : OUString : : createFromAscii ( " MessageParent " ) , makeAny ( VCLUnoHelper : : GetInterface ( getDialogParentWindow ( ) ) ) ) ;
aCreationArgs [ 1 ] < < = NamedValue ( : : rtl : : OUString : : createFromAscii ( " NumberFormatter " ) , makeAny ( xFormatter ) ) ;
aCreationArgs [ 2 ] < < = NamedValue ( : : rtl : : OUString : : createFromAscii ( " ControlModel " ) , makeAny ( xModel ) ) ;
Reference < XControl > xFilterControl (
m_xORB - > createInstanceWithArguments (
: : rtl : : OUString : : createFromAscii ( " com.sun.star.form.control.FilterControl " ) ,
aCreationArgs
) ,
UNO_QUERY
) ;
DBG_ASSERT ( xFilterControl . is ( ) , " FmXFormController::startFiltering: could not create a filter control! " ) ;
if ( replaceControl ( xControl , xFilterControl ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XTextComponent > xFilterText ( xFilterControl , UNO_QUERY ) ;
aFieldInfos . push_back ( FmFieldInfo ( xField , xFilterText ) ) ;
xFilterText - > addTextListener ( this ) ;
2000-09-18 16:07:07 +00:00
}
}
2006-11-14 12:24:06 +00:00
}
else
{
// abmelden vom EventManager
2000-09-18 16:07:07 +00:00
}
}
}
// we have all filter controls now, so the next step is to read the filters from the form
// resolve all aliases and set the current filter to the according structure
setFilter ( aFieldInfos ) ;
2002-12-05 08:58:04 +00:00
Reference < XPropertySet > xSet ( m_xModelAsIndex , UNO_QUERY ) ;
if ( xSet . is ( ) )
stopFormListening ( xSet , sal_True ) ;
2000-09-18 16:07:07 +00:00
// set the text for all filters
2004-04-13 10:05:48 +00:00
OSL_ENSURE ( ( m_aFilters . size ( ) > ( size_t ) m_nCurrentFilterPosition ) & & ( m_nCurrentFilterPosition > = 0 ) ,
" FmXFormController::startFiltering: m_nCurrentFilterPosition too big " ) ;
if ( ( m_nCurrentFilterPosition > = 0 ) & & ( ( size_t ) m_nCurrentFilterPosition < m_aFilters . size ( ) ) )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
FmFilterRow & rRow = m_aFilters [ m_nCurrentFilterPosition ] ;
for ( FmFilterRow : : const_iterator iter2 = rRow . begin ( ) ;
iter2 ! = rRow . end ( ) ; iter2 + + )
{
( * iter2 ) . first - > setText ( ( * iter2 ) . second ) ;
}
2000-09-18 16:07:07 +00:00
}
// lock all controls which are not used for filtering
m_bLocked = determineLockState ( ) ;
setLocks ( ) ;
m_bAttachEvents = sal_True ;
}
//------------------------------------------------------------------------------
void FmXFormController : : stopFiltering ( )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2002-11-04 12:45:49 +00:00
if ( ! m_bFiltering ) // #104693# OJ
{ // nothing to do
2000-09-18 16:07:07 +00:00
return ;
}
m_bFiltering = sal_False ;
m_bDetachEvents = sal_False ;
2000-10-20 13:18:57 +00:00
: : comphelper : : disposeComponent ( m_xComposer ) ;
2000-09-18 16:07:07 +00:00
// Austauschen der Kontrols fuer das aktuelle Formular
2005-10-24 07:26:42 +00:00
Sequence < Reference < XControl > > aControlsCopy ( m_aControls ) ;
const Reference < XControl > * pControls = aControlsCopy . getConstArray ( ) ;
sal_Int32 nControlCount = aControlsCopy . getLength ( ) ;
2006-11-14 12:24:06 +00:00
// SdrPageView* pCurPageView = m_pView->GetSdrPageView();
2003-11-24 15:38:56 +00:00
// sal_uInt16 nPos = pCurPageView ? pCurPageView->GetWinList().Find((OutputDevice*)m_pView->GetActualOutDev()) : SDRPAGEVIEWWIN_NOTFOUND;
2006-11-14 12:24:06 +00:00
// const SdrPageWindow* pWindow = pCurPageView ? pCurPageView->FindPageWindow(*((OutputDevice*)m_pView->GetActualOutDev())) : 0L;
2000-09-18 16:07:07 +00:00
// clear the filter control map
for ( FmFilterControls : : const_iterator iter = m_aFilterControls . begin ( ) ;
iter ! = m_aFilterControls . end ( ) ; iter + + )
( * iter ) . first - > removeTextListener ( this ) ;
m_aFilterControls . clear ( ) ;
2006-11-14 12:24:06 +00:00
for ( sal_Int32 i = nControlCount ; i > 0 ; )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XControl > xControl = pControls [ - - i ] ;
if ( xControl . is ( ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
// now enable eventhandling again
addToEventAttacher ( xControl ) ;
Reference < XModeSelector > xSelector ( xControl , UNO_QUERY ) ;
if ( xSelector . is ( ) )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
xSelector - > setMode ( DATA_MODE ) ;
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
// listening for new controls of the selector
Reference < XContainer > xContainer ( xSelector , UNO_QUERY ) ;
if ( xContainer . is ( ) )
xContainer - > removeContainerListener ( this ) ;
continue ;
}
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
Reference < XPropertySet > xSet ( xControl - > getModel ( ) , UNO_QUERY ) ;
if ( xSet . is ( ) & & : : comphelper : : hasProperty ( FM_PROP_BOUNDFIELD , xSet ) )
{
// does the model use a bound field ?
Reference < XPropertySet > xField ;
xSet - > getPropertyValue ( FM_PROP_BOUNDFIELD ) > > = xField ;
2000-09-18 16:07:07 +00:00
2006-11-14 12:24:06 +00:00
// may we filter the field?
if ( xField . is ( )
& & : : comphelper : : hasProperty ( FM_PROP_SEARCHABLE , xField )
& & : : comphelper : : getBOOL ( xField - > getPropertyValue ( FM_PROP_SEARCHABLE ) )
)
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
: : rtl : : OUString sServiceName ;
OSL_VERIFY ( xSet - > getPropertyValue ( FM_PROP_DEFAULTCONTROL ) > > = sServiceName ) ;
Reference < XControl > xNewControl ( m_xORB - > createInstance ( sServiceName ) , UNO_QUERY ) ;
replaceControl ( xControl , xNewControl ) ;
2000-09-18 16:07:07 +00:00
}
}
}
}
2002-12-05 08:58:04 +00:00
Reference < XPropertySet > xSet ( m_xModelAsIndex , UNO_QUERY ) ;
if ( xSet . is ( ) )
startFormListening ( xSet , sal_True ) ;
2000-09-18 16:07:07 +00:00
m_bDetachEvents = sal_True ;
m_aFilters . clear ( ) ;
m_nCurrentFilterPosition = 0 ;
// release the locks if possible
// lock all controls which are not used for filtering
m_bLocked = determineLockState ( ) ;
setLocks ( ) ;
// restart listening for control modifications
if ( isListeningForChanges ( ) )
startListening ( ) ;
}
2004-04-13 10:05:48 +00:00
// XModeSelector
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : setMode ( const : : rtl : : OUString & Mode ) throw ( NoSupportException , RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
if ( ! supportsMode ( Mode ) )
2004-04-13 10:05:48 +00:00
throw NoSupportException ( ) ;
2000-09-18 16:07:07 +00:00
if ( Mode = = m_aMode )
return ;
m_aMode = Mode ;
if ( Mode = = FILTER_MODE )
startFiltering ( ) ;
else
stopFiltering ( ) ;
for ( FmFormControllers : : const_iterator i = m_aChilds . begin ( ) ;
2003-05-19 11:51:00 +00:00
i ! = m_aChilds . end ( ) ; + + i )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
Reference < XModeSelector > xMode ( * i , UNO_QUERY ) ;
2003-05-19 11:51:00 +00:00
if ( xMode . is ( ) )
xMode - > setMode ( Mode ) ;
2000-09-18 16:07:07 +00:00
}
}
//------------------------------------------------------------------------------
: : rtl : : OUString SAL_CALL FmXFormController : : getMode ( void ) throw ( RuntimeException )
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
return m_aMode ;
}
//------------------------------------------------------------------------------
Sequence < : : rtl : : OUString > SAL_CALL FmXFormController : : getSupportedModes ( void ) throw ( RuntimeException )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
static Sequence < : : rtl : : OUString > aModes ;
if ( ! aModes . getLength ( ) )
{
aModes . realloc ( 2 ) ;
: : rtl : : OUString * pModes = aModes . getArray ( ) ;
pModes [ 0 ] = DATA_MODE ;
pModes [ 1 ] = FILTER_MODE ;
}
return aModes ;
}
//------------------------------------------------------------------------------
sal_Bool SAL_CALL FmXFormController : : supportsMode ( const : : rtl : : OUString & Mode ) throw ( RuntimeException )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
Sequence < : : rtl : : OUString > aModes ( getSupportedModes ( ) ) ;
const : : rtl : : OUString * pModes = aModes . getConstArray ( ) ;
for ( sal_Int32 i = aModes . getLength ( ) ; i > 0 ; )
{
if ( pModes [ - - i ] = = Mode )
return sal_True ;
}
return sal_False ;
}
//------------------------------------------------------------------------------
Window * FmXFormController : : getDialogParentWindow ( )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
Window * pParent = m_pWindow ;
2006-11-14 12:24:06 +00:00
if ( ! pParent )
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
try
2000-09-18 16:07:07 +00:00
{
2006-11-14 12:24:06 +00:00
Reference < XControl > xContainerControl ( getContainer ( ) , UNO_QUERY_THROW ) ;
Reference < XWindowPeer > xContainerPeer ( xContainerControl - > getPeer ( ) , UNO_QUERY_THROW ) ;
pParent = VCLUnoHelper : : GetWindow ( xContainerPeer ) ;
}
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::getDialogParentWindow: caught an exception! " ) ;
2000-09-18 16:07:07 +00:00
}
}
return pParent ;
}
2004-04-02 09:29:20 +00:00
//------------------------------------------------------------------------------
bool FmXFormController : : checkFormComponentValidity ( : : rtl : : OUString & /* [out] */ _rFirstInvalidityExplanation , Reference < XControlModel > & /* [out] */ _rxFirstInvalidModel ) SAL_THROW ( ( ) )
{
try
{
Reference < XEnumerationAccess > xControlEnumAcc ( getModel ( ) , UNO_QUERY ) ;
Reference < XEnumeration > xControlEnumeration ;
if ( xControlEnumAcc . is ( ) )
xControlEnumeration = xControlEnumAcc - > createEnumeration ( ) ;
OSL_ENSURE ( xControlEnumeration . is ( ) , " FmXFormController::checkFormComponentValidity: cannot enumerate the controls! " ) ;
if ( ! xControlEnumeration . is ( ) )
// assume all valid
return true ;
Reference < XValidatableFormComponent > xValidatable ;
while ( xControlEnumeration - > hasMoreElements ( ) )
{
if ( ! ( xControlEnumeration - > nextElement ( ) > > = xValidatable ) )
// control does not support validation
continue ;
if ( xValidatable - > isValid ( ) )
continue ;
Reference < XValidator > xValidator ( xValidatable - > getValidator ( ) ) ;
OSL_ENSURE ( xValidator . is ( ) , " FmXFormController::checkFormComponentValidity: invalid, but no validator? " ) ;
if ( ! xValidator . is ( ) )
// this violates the interface definition of css.form.validation.XValidatableFormComponent ...
continue ;
_rFirstInvalidityExplanation = xValidator - > explainInvalid ( xValidatable - > getCurrentValue ( ) ) ;
_rxFirstInvalidModel = _rxFirstInvalidModel . query ( xValidatable ) ;
return false ;
}
}
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::checkFormComponentValidity: caught an exception! " ) ;
}
return true ;
}
//------------------------------------------------------------------------------
Reference < XControl > FmXFormController : : locateControl ( const Reference < XControlModel > & _rxModel ) SAL_THROW ( ( ) )
{
try
{
Sequence < Reference < XControl > > aControls ( getControls ( ) ) ;
const Reference < XControl > * pControls = aControls . getConstArray ( ) ;
const Reference < XControl > * pControlsEnd = aControls . getConstArray ( ) + aControls . getLength ( ) ;
for ( ; pControls ! = pControlsEnd ; + + pControls )
{
OSL_ENSURE ( pControls - > is ( ) , " FmXFormController::locateControl: NULL-control? " ) ;
if ( pControls - > is ( ) )
{
if ( ( * pControls ) - > getModel ( ) = = _rxModel )
return * pControls ;
}
}
OSL_ENSURE ( sal_False , " FmXFormController::locateControl: did not find a control for this model! " ) ;
}
catch ( const Exception & )
{
OSL_ENSURE ( sal_False , " FmXFormController::locateControl: caught an exception! " ) ;
}
return NULL ;
}
//------------------------------------------------------------------------------
namespace
{
void displayErrorSetFocus ( const String & _rMessage , const Reference < XControl > & _rxFocusControl , Window * _pDialogParent )
{
SQLContext aError ;
aError . Message = String ( SVX_RES ( RID_STR_WRITEERROR ) ) ;
aError . Details = _rMessage ;
displayException ( aError , _pDialogParent ) ;
if ( _rxFocusControl . is ( ) )
{
Reference < XWindow > xControlWindow ( _rxFocusControl , UNO_QUERY ) ;
OSL_ENSURE ( xControlWindow . is ( ) , " displayErrorSetFocus: invalid control! " ) ;
if ( xControlWindow . is ( ) )
xControlWindow - > setFocus ( ) ;
}
}
}
2004-04-13 10:05:48 +00:00
// XRowSetApproveListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
sal_Bool SAL_CALL FmXFormController : : approveRowChange ( const RowChangeEvent & aEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : cppu : : OInterfaceIteratorHelper aIter ( m_aRowSetApproveListeners ) ;
sal_Bool bValid = sal_True ;
if ( aIter . hasMoreElements ( ) )
{
2004-04-13 10:05:48 +00:00
RowChangeEvent aEvt ( aEvent ) ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2004-04-13 10:05:48 +00:00
bValid = ( ( XRowSetApproveListener * ) aIter . next ( ) ) - > approveRowChange ( aEvt ) ;
2000-09-18 16:07:07 +00:00
}
if ( bValid & & (
2004-04-13 10:05:48 +00:00
aEvent . Action = = RowChangeAction : : INSERT | |
aEvent . Action = = RowChangeAction : : UPDATE ) )
2000-09-18 16:07:07 +00:00
{
2004-04-02 09:29:20 +00:00
// if some of the control modes are bound to validators, check them
: : rtl : : OUString sInvalidityExplanation ;
Reference < XControlModel > xInvalidModel ;
if ( ! checkFormComponentValidity ( sInvalidityExplanation , xInvalidModel ) )
{
displayErrorSetFocus ( sInvalidityExplanation , locateControl ( xInvalidModel ) , getDialogParentWindow ( ) ) ;
return false ;
}
2000-09-18 16:07:07 +00:00
// check Values on NULL and required flag
2004-04-13 10:05:48 +00:00
Reference < XColumnsSupplier > xSupplyCols ( aEvent . Source , UNO_QUERY ) ;
Reference < XEnumerationAccess > xEnumAccess ;
2000-09-18 16:07:07 +00:00
if ( xSupplyCols . is ( ) )
2004-04-13 10:05:48 +00:00
xEnumAccess = Reference < XEnumerationAccess > ( xSupplyCols - > getColumns ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( ! xSupplyCols . is ( ) | | ! xEnumAccess . is ( ) )
{
DBG_ERROR ( " FmXFormController::approveRowChange : source is no columns supplier or columns aren't enumerable ! " ) ;
// can't do anything here ...
return sal_True ;
}
2004-04-13 10:05:48 +00:00
Reference < XEnumeration > xEnumeration = xEnumAccess - > createEnumeration ( ) ;
2000-11-07 12:16:50 +00:00
Reference < XPropertySet > xFieldSet ;
2000-09-18 16:07:07 +00:00
while ( xEnumeration - > hasMoreElements ( ) )
{
2000-11-07 12:16:50 +00:00
xEnumeration - > nextElement ( ) > > = xFieldSet ;
2004-04-13 10:05:48 +00:00
Reference < XColumn > xColumn ( xFieldSet , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( ! xFieldSet . is ( ) | | ! xColumn . is ( ) )
{
DBG_ERROR ( " FmXFormController::approveRowChange : invalid field ! " ) ;
continue ;
}
2004-04-13 10:05:48 +00:00
sal_Bool bRequired = : : comphelper : : getINT32 ( xFieldSet - > getPropertyValue ( FM_PROP_ISNULLABLE ) ) = = ColumnValue : : NO_NULLS ;
2000-09-18 16:07:07 +00:00
if ( ! bRequired )
continue ;
2000-10-20 13:18:57 +00:00
sal_Bool bAutoIncrement = : : comphelper : : getBOOL ( xFieldSet - > getPropertyValue ( FM_PROP_AUTOINCREMENT ) ) ;
2000-09-18 16:07:07 +00:00
if ( bAutoIncrement )
continue ;
2000-10-20 13:18:57 +00:00
: : rtl : : OUString aFieldName ( : : comphelper : : getString ( xFieldSet - > getPropertyValue ( FM_PROP_NAME ) ) ) ;
2000-09-18 16:07:07 +00:00
2001-05-11 15:07:05 +00:00
if ( ! xColumn - > getString ( ) . getLength ( ) & & xColumn - > wasNull ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
Sequence < Reference < XControl > > aControls ( getControls ( ) ) ;
2000-09-18 16:07:07 +00:00
sal_Int32 nLength = aControls . getLength ( ) ;
sal_Int32 i ( 0 ) ;
2004-04-13 10:05:48 +00:00
const Reference < XControl > * pControls = aControls . getConstArray ( ) ;
2000-09-18 16:07:07 +00:00
for ( ; i < nLength ; i + + )
{
if ( pControls [ i ] . is ( ) )
{
2000-11-06 06:19:53 +00:00
Reference < XPropertySet > xModel ( pControls [ i ] - > getModel ( ) , UNO_QUERY ) ;
2000-09-18 16:07:07 +00:00
if ( xModel . is ( ) )
{
2000-10-20 13:18:57 +00:00
if ( : : comphelper : : hasProperty ( FM_PROP_CONTROLSOURCE , xModel ) )
2000-09-18 16:07:07 +00:00
{
2000-10-20 13:18:57 +00:00
: : rtl : : OUString aName = : : comphelper : : getString ( xModel - > getPropertyValue ( FM_PROP_CONTROLSOURCE ) ) ;
2000-09-18 16:07:07 +00:00
if ( aName = = aFieldName ) // Control gefunden
break ;
}
}
}
}
2004-04-02 09:29:20 +00:00
String sMessage ( SVX_RES ( RID_ERR_FIELDREQUIRED ) ) ;
sMessage . SearchAndReplace ( ' # ' , aFieldName . getStr ( ) ) ;
displayErrorSetFocus ( sMessage , ( i < nLength ) ? pControls [ i ] : Reference < XControl > ( ) , getDialogParentWindow ( ) ) ;
2001-07-25 12:44:28 +00:00
2000-09-18 16:07:07 +00:00
return sal_False ;
}
}
}
return bValid ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
sal_Bool SAL_CALL FmXFormController : : approveCursorMove ( const EventObject & event ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : cppu : : OInterfaceIteratorHelper aIter ( m_aRowSetApproveListeners ) ;
if ( aIter . hasMoreElements ( ) )
{
2004-04-13 10:05:48 +00:00
EventObject aEvt ( event ) ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2004-04-13 10:05:48 +00:00
return ( ( XRowSetApproveListener * ) aIter . next ( ) ) - > approveCursorMove ( aEvt ) ;
2000-09-18 16:07:07 +00:00
}
return sal_True ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
sal_Bool SAL_CALL FmXFormController : : approveRowSetChange ( const EventObject & event ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : cppu : : OInterfaceIteratorHelper aIter ( m_aRowSetApproveListeners ) ;
if ( aIter . hasMoreElements ( ) )
{
2004-04-13 10:05:48 +00:00
EventObject aEvt ( event ) ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2004-04-13 10:05:48 +00:00
return ( ( XRowSetApproveListener * ) aIter . next ( ) ) - > approveRowSetChange ( aEvt ) ;
2000-09-18 16:07:07 +00:00
}
return sal_True ;
}
2004-04-13 10:05:48 +00:00
// XRowSetApproveBroadcaster
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : addRowSetApproveListener ( const Reference < XRowSetApproveListener > & _rxListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aRowSetApproveListeners . addInterface ( _rxListener ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : removeRowSetApproveListener ( const Reference < XRowSetApproveListener > & _rxListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aRowSetApproveListeners . removeInterface ( _rxListener ) ;
}
2004-04-13 10:05:48 +00:00
// XErrorListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : errorOccured ( const SQLErrorEvent & aEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : cppu : : OInterfaceIteratorHelper aIter ( m_aErrorListeners ) ;
if ( aIter . hasMoreElements ( ) )
{
2004-04-13 10:05:48 +00:00
SQLErrorEvent aEvt ( aEvent ) ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2004-04-13 10:05:48 +00:00
( ( XSQLErrorListener * ) aIter . next ( ) ) - > errorOccured ( aEvt ) ;
2000-09-18 16:07:07 +00:00
}
else
{
displayException ( aEvent ) ;
}
}
2004-04-13 10:05:48 +00:00
// XErrorBroadcaster
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : addSQLErrorListener ( const Reference < XSQLErrorListener > & aListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aErrorListeners . addInterface ( aListener ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : removeSQLErrorListener ( const Reference < XSQLErrorListener > & aListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2003-05-19 11:51:00 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aErrorListeners . removeInterface ( aListener ) ;
}
2004-06-28 15:57:45 +00:00
// XDatabaseParameterBroadcaster2
//------------------------------------------------------------------------------
void SAL_CALL FmXFormController : : addDatabaseParameterListener ( const Reference < XDatabaseParameterListener > & aListener ) throw ( RuntimeException )
{
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController::addDatabaseParameterListener: Object already disposed! " ) ;
m_aParameterListeners . addInterface ( aListener ) ;
}
//------------------------------------------------------------------------------
void SAL_CALL FmXFormController : : removeDatabaseParameterListener ( const Reference < XDatabaseParameterListener > & aListener ) throw ( RuntimeException )
{
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController::removeDatabaseParameterListener: Object already disposed! " ) ;
m_aParameterListeners . removeInterface ( aListener ) ;
}
2004-04-13 10:05:48 +00:00
// XDatabaseParameterBroadcaster
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : addParameterListener ( const Reference < XDatabaseParameterListener > & aListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2004-06-28 15:57:45 +00:00
FmXFormController : : addDatabaseParameterListener ( aListener ) ;
2000-09-18 16:07:07 +00:00
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : removeParameterListener ( const Reference < XDatabaseParameterListener > & aListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2004-06-28 15:57:45 +00:00
FmXFormController : : removeDatabaseParameterListener ( aListener ) ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
// XDatabaseParameterListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
sal_Bool SAL_CALL FmXFormController : : approveParameter ( const DatabaseParameterEvent & aEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : cppu : : OInterfaceIteratorHelper aIter ( m_aParameterListeners ) ;
if ( aIter . hasMoreElements ( ) )
{
2004-04-13 10:05:48 +00:00
DatabaseParameterEvent aEvt ( aEvent ) ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2004-04-13 10:05:48 +00:00
return ( ( XDatabaseParameterListener * ) aIter . next ( ) ) - > approveParameter ( aEvt ) ;
2000-09-18 16:07:07 +00:00
}
else
{
2000-10-31 08:31:59 +00:00
// default handling: instantiate an interaction handler and let it handle the parameter request
try
{
2004-11-16 10:22:40 +00:00
if ( ! ensureInteractionHandler ( ) )
return sal_False ;
2000-10-31 08:31:59 +00:00
// two continuations allowed: OK and Cancel
OParameterContinuation * pParamValues = new OParameterContinuation ;
OInteractionAbort * pAbort = new OInteractionAbort ;
// the request
ParametersRequest aRequest ;
aRequest . Parameters = aEvent . Parameters ;
2002-10-07 12:09:48 +00:00
aRequest . Connection = OStaticDataAccessTools ( ) . getRowSetConnection ( Reference < XRowSet > ( aEvent . Source , UNO_QUERY ) ) ;
2000-10-31 08:31:59 +00:00
OInteractionRequest * pParamRequest = new OInteractionRequest ( makeAny ( aRequest ) ) ;
Reference < XInteractionRequest > xParamRequest ( pParamRequest ) ;
// some knittings
pParamRequest - > addContinuation ( pParamValues ) ;
pParamRequest - > addContinuation ( pAbort ) ;
2004-11-16 10:22:40 +00:00
// handle the request
2000-10-31 08:31:59 +00:00
{
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2004-11-16 10:22:40 +00:00
m_xInteractionHandler - > handle ( xParamRequest ) ;
2000-10-31 08:31:59 +00:00
}
2000-09-18 16:07:07 +00:00
2000-10-31 08:31:59 +00:00
if ( ! pParamValues - > wasSelected ( ) )
// canceled
return sal_False ;
// transfer the values into the parameter supplier
Sequence < PropertyValue > aFinalValues = pParamValues - > getValues ( ) ;
if ( aFinalValues . getLength ( ) ! = aRequest . Parameters - > getCount ( ) )
{
DBG_ERROR ( " FmXFormController::approveParameter: the InteractionHandler returned nonsense! " ) ;
return sal_False ;
}
const PropertyValue * pFinalValues = aFinalValues . getConstArray ( ) ;
for ( sal_Int32 i = 0 ; i < aFinalValues . getLength ( ) ; + + i , + + pFinalValues )
{
Reference < XPropertySet > xParam ;
: : cppu : : extractInterface ( xParam , aRequest . Parameters - > getByIndex ( i ) ) ;
if ( xParam . is ( ) )
{
# ifdef DBG_UTIL
: : rtl : : OUString sName ;
xParam - > getPropertyValue ( FM_PROP_NAME ) > > = sName ;
DBG_ASSERT ( sName . equals ( pFinalValues - > Name ) , " FmXFormController::approveParameter: suspicious value names! " ) ;
# endif
try { xParam - > setPropertyValue ( FM_PROP_VALUE , pFinalValues - > Value ) ; }
catch ( Exception & )
{
DBG_ERROR ( " FmXFormController::approveParameter: setting one of the properties failed! " ) ;
}
}
}
}
catch ( Exception & )
{
DBG_ERROR ( " FmXFormController::approveParameter: caught an Exception (tried to let the InteractionHandler handle it)! " ) ;
}
2000-09-18 16:07:07 +00:00
}
return sal_True ;
}
2004-04-13 10:05:48 +00:00
// XConfirmDeleteBroadcaster
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : addConfirmDeleteListener ( const Reference < XConfirmDeleteListener > & aListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aDeleteListeners . addInterface ( aListener ) ;
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void SAL_CALL FmXFormController : : removeConfirmDeleteListener ( const Reference < XConfirmDeleteListener > & aListener ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
m_aDeleteListeners . removeInterface ( aListener ) ;
}
2004-04-13 10:05:48 +00:00
// XConfirmDeleteListener
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
sal_Bool SAL_CALL FmXFormController : : confirmDelete ( const RowChangeEvent & aEvent ) throw ( RuntimeException )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
: : cppu : : OInterfaceIteratorHelper aIter ( m_aDeleteListeners ) ;
if ( aIter . hasMoreElements ( ) )
{
2004-04-13 10:05:48 +00:00
RowChangeEvent aEvt ( aEvent ) ;
2000-09-18 16:07:07 +00:00
aEvt . Source = * this ;
2004-04-13 10:05:48 +00:00
return ( ( XConfirmDeleteListener * ) aIter . next ( ) ) - > confirmDelete ( aEvt ) ;
2000-09-18 16:07:07 +00:00
}
else
{
// default handling
UniString aTitle ;
sal_Int32 nLength = aEvent . Rows ;
if ( nLength > 1 )
2001-01-17 07:09:42 +00:00
{
2000-09-18 16:07:07 +00:00
aTitle = SVX_RES ( RID_STR_DELETECONFIRM_RECORDS ) ;
2001-01-17 07:09:42 +00:00
aTitle . SearchAndReplace ( ' # ' , String : : CreateFromInt32 ( nLength ) ) ;
}
2000-09-18 16:07:07 +00:00
else
aTitle = SVX_RES ( RID_STR_DELETECONFIRM_RECORD ) ;
2001-07-25 12:44:28 +00:00
ConfirmDeleteDialog aDlg ( getDialogParentWindow ( ) , aTitle ) ;
return RET_YES = = aDlg . Execute ( ) ;
2000-09-18 16:07:07 +00:00
}
}
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : invalidateFeatures ( const : : std : : vector < sal_Int32 > & _rFeatures )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
// for now, just copy the ids of the features, because ....
: : std : : copy ( _rFeatures . begin ( ) , _rFeatures . end ( ) ,
: : std : : insert_iterator < : : std : : set < sal_Int32 > > ( m_aInvalidFeatures , m_aInvalidFeatures . begin ( ) )
) ;
// ... we will do the real invalidation asynchronously
if ( ! m_aFeatureInvalidationTimer . IsActive ( ) )
m_aFeatureInvalidationTimer . Start ( ) ;
}
//------------------------------------------------------------------------------
Reference < XDispatch >
2006-06-19 14:53:21 +00:00
FmXFormController : : interceptedQueryDispatch ( sal_uInt16 /*_nId*/ , const URL & aURL ,
const : : rtl : : OUString & /*aTargetFrameName*/ , sal_Int32 /*nSearchFlags*/ )
2000-09-18 16:07:07 +00:00
throw ( RuntimeException )
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2004-04-13 10:05:48 +00:00
Reference < XDispatch > xReturn ;
2000-09-18 16:07:07 +00:00
// dispatches handled by ourself
2004-11-16 10:22:40 +00:00
if ( ( aURL . Complete = = FMURL_CONFIRM_DELETION )
| | ( ( aURL . Complete . equalsAscii ( " private:/InteractionHandler " ) )
& & ensureInteractionHandler ( )
)
)
xReturn = static_cast < XDispatch * > ( this ) ;
2000-09-18 16:07:07 +00:00
// dispatches of FormSlot-URLs we have to translate
2004-04-13 10:05:48 +00:00
if ( ! xReturn . is ( ) & & m_aControllerFeatures . isAssigned ( ) )
2004-11-16 10:22:40 +00:00
{
2004-04-13 10:05:48 +00:00
// find the slot id which corresponds to the URL
2006-12-01 16:25:02 +00:00
sal_Int32 nFeatureId = : : svx : : FeatureSlotTranslation : : getControllerFeatureSlotIdForURL ( aURL . Main ) ;
2004-04-13 10:05:48 +00:00
if ( nFeatureId > 0 )
2004-11-16 10:22:40 +00:00
{
2004-04-13 10:05:48 +00:00
// get the dispatcher for this feature, create if necessary
DispatcherContainer : : const_iterator aDispatcherPos = m_aFeatureDispatchers . find ( nFeatureId ) ;
if ( aDispatcherPos = = m_aFeatureDispatchers . end ( ) )
2000-09-18 16:07:07 +00:00
{
2004-04-13 10:05:48 +00:00
aDispatcherPos = m_aFeatureDispatchers . insert (
DispatcherContainer : : value_type ( nFeatureId , new : : svx : : OSingleFeatureDispatcher ( aURL , nFeatureId , * m_aControllerFeatures , m_aMutex ) )
) . first ;
2000-09-18 16:07:07 +00:00
}
2004-04-13 10:05:48 +00:00
OSL_ENSURE ( aDispatcherPos - > second . is ( ) , " FmXFormController::interceptedQueryDispatch: should have a dispatcher by now! " ) ;
return aDispatcherPos - > second ;
2000-09-18 16:07:07 +00:00
}
}
// no more to offer
return xReturn ;
}
2001-06-15 10:11:14 +00:00
//------------------------------------------------------------------------------
void SAL_CALL FmXFormController : : dispatch ( const URL & _rURL , const Sequence < PropertyValue > & _rArgs ) throw ( RuntimeException )
{
2004-11-16 10:22:40 +00:00
if ( _rArgs . getLength ( ) ! = 1 )
{
DBG_ERROR ( " FmXFormController::dispatch: no arguments -> no dispatch! " ) ;
return ;
}
if ( _rURL . Complete . equalsAscii ( " private:/InteractionHandler " ) )
{
Reference < XInteractionRequest > xRequest ;
OSL_VERIFY ( _rArgs [ 0 ] . Value > > = xRequest ) ;
if ( xRequest . is ( ) )
handle ( xRequest ) ;
return ;
}
if ( _rURL . Complete = = FMURL_CONFIRM_DELETION )
{
DBG_ERROR ( " FmXFormController::dispatch: How do you expect me to return something via this call? " ) ;
// confirmDelete has a return value - dispatch hasn't
return ;
}
DBG_ERROR ( " FmXFormController::dispatch: unknown URL! " ) ;
2001-06-15 10:11:14 +00:00
}
//------------------------------------------------------------------------------
void SAL_CALL FmXFormController : : addStatusListener ( const Reference < XStatusListener > & _rxListener , const URL & _rURL ) throw ( RuntimeException )
{
if ( _rURL . Complete = = FMURL_CONFIRM_DELETION )
{
if ( _rxListener . is ( ) )
{ // send an initial statusChanged event
FeatureStateEvent aEvent ;
aEvent . FeatureURL = _rURL ;
aEvent . IsEnabled = sal_True ;
_rxListener - > statusChanged ( aEvent ) ;
// and don't add the listener at all (the status will never change)
}
}
else
OSL_ENSURE ( sal_False , " FmXFormController::addStatusListener: invalid (unsupported) URL! " ) ;
}
//------------------------------------------------------------------------------
2006-06-19 14:53:21 +00:00
void SAL_CALL FmXFormController : : removeStatusListener ( const Reference < XStatusListener > & /*_rxListener*/ , const URL & _rURL ) throw ( RuntimeException )
2001-06-15 10:11:14 +00:00
{
2006-06-19 14:53:21 +00:00
( void ) _rURL ;
2001-06-15 10:11:14 +00:00
OSL_ENSURE ( _rURL . Complete = = FMURL_CONFIRM_DELETION , " FmXFormController::removeStatusListener: invalid (unsupported) URL! " ) ;
// we never really added the listener, so we don't need to remove it
}
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
Reference < XDispatchProviderInterceptor > FmXFormController : : createInterceptor ( const Reference < XDispatchProviderInterception > & _xInterception )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2006-10-12 11:44:59 +00:00
# ifdef DBG_UTIL
2000-09-18 16:07:07 +00:00
// check if we already have a interceptor for the given object
for ( ConstInterceptorsIterator aIter = m_aControlDispatchInterceptors . begin ( ) ;
aIter ! = m_aControlDispatchInterceptors . end ( ) ;
+ + aIter
)
{
if ( ( * aIter ) - > getIntercepted ( ) = = _xInterception )
DBG_ERROR ( " FmXFormController::createInterceptor : we already do intercept this objects dispatches ! " ) ;
}
# endif
2000-11-09 09:07:35 +00:00
: : rtl : : OUString sInterceptorScheme ( RTL_CONSTASCII_USTRINGPARAM ( " * " ) ) ;
FmXDispatchInterceptorImpl * pInterceptor = new FmXDispatchInterceptorImpl ( _xInterception , this , 0 , Sequence < : : rtl : : OUString > ( & sInterceptorScheme , 1 ) ) ;
2000-09-18 16:07:07 +00:00
pInterceptor - > acquire ( ) ;
m_aControlDispatchInterceptors . insert ( m_aControlDispatchInterceptors . end ( ) , pInterceptor ) ;
2004-04-13 10:05:48 +00:00
return ( XDispatchProviderInterceptor * ) pInterceptor ;
2000-09-18 16:07:07 +00:00
}
2004-11-16 10:22:40 +00:00
//------------------------------------------------------------------------------
bool FmXFormController : : ensureInteractionHandler ( )
{
if ( m_xInteractionHandler . is ( ) )
return true ;
if ( m_bAttemptedHandlerCreation )
return false ;
m_bAttemptedHandlerCreation = true ;
if ( ! m_xORB . is ( ) )
return false ;
m_xInteractionHandler . set ( m_xORB - > createInstance ( SRV_SDB_INTERACTION_HANDLER ) , UNO_QUERY ) ;
OSL_ENSURE ( m_xInteractionHandler . is ( ) , " FmXFormController::ensureInteractionHandler: could not create an interaction handler! " ) ;
return m_xInteractionHandler . is ( ) ;
}
//------------------------------------------------------------------------------
void SAL_CALL FmXFormController : : handle ( const Reference < XInteractionRequest > & _rRequest ) throw ( RuntimeException )
{
if ( ! ensureInteractionHandler ( ) )
return ;
m_xInteractionHandler - > handle ( _rRequest ) ;
}
2000-09-18 16:07:07 +00:00
//------------------------------------------------------------------------------
2004-04-13 10:05:48 +00:00
void FmXFormController : : deleteInterceptor ( const Reference < XDispatchProviderInterception > & _xInterception )
2000-09-18 16:07:07 +00:00
{
2001-03-23 15:26:54 +00:00
OSL_ENSURE ( ! FmXFormController_BASE1 : : rBHelper . bDisposed , " FmXFormController: Object already disposed! " ) ;
2000-09-18 16:07:07 +00:00
// search the interceptor responsible for the given object
InterceptorsIterator aIter ;
for ( aIter = m_aControlDispatchInterceptors . begin ( ) ;
aIter ! = m_aControlDispatchInterceptors . end ( ) ;
+ + aIter
)
{
if ( ( * aIter ) - > getIntercepted ( ) = = _xInterception )
break ;
}
if ( aIter = = m_aControlDispatchInterceptors . end ( ) )
{
return ;
}
// log off the interception from it's interception object
FmXDispatchInterceptorImpl * pInterceptorImpl = * aIter ;
pInterceptorImpl - > dispose ( ) ;
pInterceptorImpl - > release ( ) ;
// remove the interceptor from our array
m_aControlDispatchInterceptors . erase ( aIter ) ;
}
2004-11-16 10:22:40 +00:00
//--------------------------------------------------------------------
void SAL_CALL FmXFormController : : initialize ( const Sequence < Any > & aArguments ) throw ( Exception , RuntimeException )
{
DBG_ASSERT ( ! m_xInteractionHandler . is ( ) , " FmXFormController::initialize: already initialized! " ) ;
// currently, we only initialize our interaction handler here, so it's sufficient to assert this
NamedValue aNamed ;
PropertyValue aProperty ;
const Any * pArg = aArguments . getConstArray ( ) ;
const Any * pArgEnd = aArguments . getConstArray ( ) + aArguments . getLength ( ) ;
while ( pArg ! = pArgEnd )
{
if ( ( * pArg > > = aNamed ) & & aNamed . Name . equalsAscii ( " InteractionHandler " ) )
{
OSL_VERIFY ( aNamed . Value > > = m_xInteractionHandler ) ;
break ;
}
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
if ( ( * pArg > > = aProperty ) & & aProperty . Name . equalsAscii ( " InteractionHandler " ) )
{
OSL_VERIFY ( aProperty . Value > > = m_xInteractionHandler ) ;
break ;
}
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
if ( * pArg > > = m_xInteractionHandler )
{
break ;
}
2000-09-18 16:07:07 +00:00
2004-11-16 10:22:40 +00:00
+ + pArg ;
}
}