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
|
|
|
|
*
|
2005-09-08 21:51:18 +00:00
|
|
|
|
* $Revision: 1.52 $
|
2000-09-18 16:07:07 +00:00
|
|
|
|
*
|
2005-09-08 21:51:18 +00:00
|
|
|
|
* last change: $Author: rt $ $Date: 2005-09-08 22:51:18 $
|
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
|
|
|
|
*
|
|
|
|
|
************************************************************************/
|
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
#include "fmshell.hxx"
|
|
|
|
|
#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
|
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
|
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
|
|
|
|
|
#include <svdpagv.hxx>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef _SVX_FMSHIMP_HXX
|
|
|
|
|
#include <fmshimp.hxx>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef _SVX_FMVIEW_HXX
|
|
|
|
|
#include <fmview.hxx>
|
|
|
|
|
#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
|
|
|
|
|
#include "dialmgr.hxx"
|
|
|
|
|
#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
|
|
|
|
|
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;
|
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 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +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;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
//..............................................................................
|
|
|
|
|
IMPL_LINK( FmXFormController, OnInvalidateFeatures, void*, _pNotInterestedInThisParam )
|
|
|
|
|
{
|
|
|
|
|
::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)
|
2004-04-13 10:05:48 +00:00
|
|
|
|
,m_aControllerFeatures( _rxORB, this )
|
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 )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
,m_bDBConnection(sal_False)
|
|
|
|
|
,m_bCycle(sal_False)
|
|
|
|
|
,m_bCanUpdate(sal_False)
|
|
|
|
|
,m_bCanInsert(sal_False)
|
|
|
|
|
,m_bModified(sal_False)
|
|
|
|
|
,m_nLoadEvent( 0 )
|
|
|
|
|
,m_bCommitLock(sal_False)
|
|
|
|
|
,m_bCurrentRecordModified(sal_False)
|
|
|
|
|
,m_bCurrentRecordNew(sal_False)
|
|
|
|
|
,m_bLocked(sal_False)
|
2001-05-21 07:30:40 +00:00
|
|
|
|
,m_aMode(getDataModeIdentifier())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
,m_bFiltering(sal_False)
|
|
|
|
|
,m_bAttachEvents(sal_True)
|
|
|
|
|
,m_bDetachEvents(sal_True)
|
|
|
|
|
,m_nCurrentFilterPosition(0)
|
|
|
|
|
,m_nToggleEvent(0)
|
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();
|
|
|
|
|
}
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
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 ) )
|
|
|
|
|
return (sal_Int64)this;
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +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
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
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
|
|
|
|
|
xParseNode->parseNodeToStr(aCriteria, xMetaData,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);
|
|
|
|
|
} break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
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,
|
|
|
|
|
Sequence< Property >& /* [out] */ _rAggregateProps
|
2000-09-18 16:07:07 +00:00
|
|
|
|
) const
|
|
|
|
|
{
|
|
|
|
|
_rProps.realloc(1);
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
::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() )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
NOTIFY_LISTENERS(m_aActivateListeners, 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();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bNewChanged && m_pView)
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void FmXFormController::toggleAutoFields(sal_Bool bAutoFields)
|
|
|
|
|
{
|
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_pView)
|
|
|
|
|
{
|
2000-09-29 07:26:16 +00:00
|
|
|
|
DBG_ERROR("FmXFormController::toggleAutoFields : you can't call toggleAutoFields when no view exists !");
|
2000-09-18 16:07:07 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Austauschen der Kontrols fuer das aktuelle Formular
|
|
|
|
|
SdrPageView* pCurPageView = m_pView->GetPageViewPvNum(0);
|
2003-11-24 15:38:56 +00:00
|
|
|
|
const SdrPageViewWindow* pWindow = pCurPageView ? pCurPageView->FindWindow(*((OutputDevice*)m_pView->GetActualOutDev())) : 0L;
|
2004-11-16 10:22:40 +00:00
|
|
|
|
if ( !pWindow )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
return;
|
2003-11-24 15:38:56 +00:00
|
|
|
|
|
2004-11-16 10:22:40 +00:00
|
|
|
|
const Reference< XControl >* pControls = m_aControls.getConstArray();
|
|
|
|
|
sal_Int32 nControls = m_aControls.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< XControl > xNewActiveControl;
|
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
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
const 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?
|
2000-10-20 13:18:57 +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
|
|
|
|
{
|
2003-11-24 15:38:56 +00:00
|
|
|
|
//const SdrPageViewWinRec& rWR = pCurPageView->GetWinList()[nPos];
|
|
|
|
|
const SdrUnoControlList& rControlList = pWindow->GetControlList();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
sal_uInt16 nCtrlNum = rControlList.Find(xControl);
|
2003-11-24 15:38:56 +00:00
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (nCtrlNum != SDRUNOCONTROL_NOTFOUND)
|
|
|
|
|
{
|
|
|
|
|
// ok create an autocontrol
|
|
|
|
|
SdrUnoControlRec& rControlRec = (SdrUnoControlRec&)rControlList[nCtrlNum];
|
|
|
|
|
FmXAutoControl* pAutoControl = new FmXAutoControl();
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XControl > xNewControl(pAutoControl);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
|
|
// setting the focus if the current control
|
|
|
|
|
// is the active one
|
2004-04-13 10:05:48 +00:00
|
|
|
|
if ((XControl*)m_xActiveControl.get() == (XControl*)xControl.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
|
|
|
|
xNewActiveControl = xNewControl;
|
|
|
|
|
m_xActiveControl = m_xCurrentControl = NULL;
|
|
|
|
|
}
|
2004-04-13 10:05:48 +00:00
|
|
|
|
else if ((XControl*)m_xCurrentControl.get() == (XControl*)xControl.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
m_xCurrentControl = xNewControl;
|
|
|
|
|
|
|
|
|
|
rControlRec.ReplaceControl(xNewControl);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
const 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?
|
2000-10-20 13:18:57 +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
|
|
|
|
{
|
2003-11-24 15:38:56 +00:00
|
|
|
|
// const SdrPageViewWinRec& rWR = pCurPageView->GetWinList()[nPos];
|
|
|
|
|
// const SdrPageViewWindow& rWindow = pCurPageView->GetPageViewWindows().Get(nPos);
|
|
|
|
|
const SdrUnoControlList& rControlList = pWindow->GetControlList();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
sal_uInt16 nCtrlNum = rControlList.Find(xControl);
|
|
|
|
|
if (nCtrlNum != SDRUNOCONTROL_NOTFOUND)
|
|
|
|
|
{
|
|
|
|
|
// Zuruecksetzen des Controls auf das Defaultcontrol
|
|
|
|
|
SdrUnoControlRec& rControlRec = (SdrUnoControlRec&)rControlList[nCtrlNum];
|
2000-10-20 13:18:57 +00:00
|
|
|
|
::rtl::OUString aServiceName = ::comphelper::getString(xSet->getPropertyValue(FM_PROP_DEFAULTCONTROL));
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XControl > xNewControl(m_xORB->createInstance(aServiceName), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
|
|
// setting the focus if the current control
|
|
|
|
|
// is the active one
|
2004-04-13 10:05:48 +00:00
|
|
|
|
if ((XControl*)m_xActiveControl.get() == (XControl*)xControl.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
|
|
|
|
xNewActiveControl = xNewControl;
|
|
|
|
|
m_xActiveControl = m_xCurrentControl = NULL;
|
|
|
|
|
}
|
2004-04-13 10:05:48 +00:00
|
|
|
|
else if ((XControl*)m_xCurrentControl.get() == (XControl*)xControl.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
m_xCurrentControl = xNewControl;
|
|
|
|
|
|
|
|
|
|
rControlRec.ReplaceControl(xNewControl);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_bDetachEvents = sal_True;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// set the focus async if possible
|
|
|
|
|
// setting the focus to the replacing control
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XWindow > xWindow(xNewActiveControl, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xWindow.is())
|
|
|
|
|
xWindow->setFocus();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
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));
|
|
|
|
|
NOTIFY_LISTENERS(m_aModifyListeners, 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
|
|
|
|
{
|
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
|
2003-04-15 16:31:12 +00:00
|
|
|
|
#if (OSL_DEBUG_LEVEL > 1) || 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();
|
2004-07-05 14:50:20 +00:00
|
|
|
|
DBG_ASSERT(!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 )
|
|
|
|
|
{
|
|
|
|
|
if ( m_aControllerFeatures->canMoveRight() )
|
|
|
|
|
m_aControllerFeatures->moveRight();
|
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
else // backward
|
2004-04-13 10:05:48 +00:00
|
|
|
|
{
|
|
|
|
|
if ( m_aControllerFeatures->canMoveLeft() )
|
|
|
|
|
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 );
|
|
|
|
|
m_pView->GetFormShell()->GetImpl()->invalidateFeatures( aFocusDependentFeatures );
|
|
|
|
|
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);
|
|
|
|
|
m_pView->MakeVisible(aNewRect, *m_pWindow);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
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;
|
2004-04-13 10:05:48 +00:00
|
|
|
|
NOTIFY_LISTENERS(m_aActivateListeners, XFormControllerListener, formActivated, aEvt);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
|
|
// verschicken ob modified
|
|
|
|
|
if (m_bModified)
|
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
NOTIFY_LISTENERS(m_aModifyListeners, 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;
|
2004-04-13 10:05:48 +00:00
|
|
|
|
NOTIFY_LISTENERS(m_aActivateListeners, XFormControllerListener, formDeactivated, aEvt);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-07-05 14:50:20 +00:00
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
void SAL_CALL FmXFormController::mousePressed( const awt::MouseEvent& _rEvent ) throw (RuntimeException)
|
|
|
|
|
{
|
|
|
|
|
// not interested in
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
void SAL_CALL FmXFormController::mouseReleased( const awt::MouseEvent& _rEvent ) throw (RuntimeException)
|
|
|
|
|
{
|
|
|
|
|
// 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!");
|
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!");
|
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-03-10 15:23:20 +00:00
|
|
|
|
::comphelper::removeElementAt( m_aControls, pControls - m_aControls.getArray() - 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);
|
|
|
|
|
sal_Int32 aVal2;
|
|
|
|
|
::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
|
2000-09-29 07:29:06 +00:00
|
|
|
|
if (m_bCurrentRecordNew && m_pView)
|
2000-09-18 16:07:07 +00:00
|
|
|
|
toggleAutoFields(sal_True);
|
|
|
|
|
|
|
|
|
|
return 1L;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +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
|
2000-09-29 07:29:06 +00:00
|
|
|
|
if (m_bCurrentRecordNew && m_pView)
|
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
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +00:00
|
|
|
|
void FmXFormController::rowChanged(const EventObject& event) throw( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
|
|
|
|
// not interested in ...
|
|
|
|
|
}
|
|
|
|
|
//------------------------------------------------------------------------------
|
2004-04-13 10:05:48 +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
|
|
|
|
{
|
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 );
|
|
|
|
|
|
|
|
|
|
// Remove the control
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XControl > xReplControl;
|
2000-11-07 12:16:50 +00:00
|
|
|
|
evt.ReplacedElement >>= xReplControl;
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XFormComponent > xModel(xReplControl->getModel(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xModel.is() && m_xModelAsIndex == xModel->getParent())
|
|
|
|
|
removeControl(xReplControl);
|
|
|
|
|
else if (m_aFilterControls.size())
|
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XTextComponent > xText(xReplControl, 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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add the new one
|
|
|
|
|
elementInserted(evt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
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>!
|
|
|
|
|
}
|
|
|
|
|
else 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-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
|
|
|
|
|
,xMetaData
|
|
|
|
|
,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
|
|
|
|
if (!m_pView)
|
|
|
|
|
{
|
|
|
|
|
DBG_ERROR("FmXFormController::startFiltering : you can't filter if you created me as service !");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
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
|
2004-11-16 10:22:40 +00:00
|
|
|
|
const Reference< XControl >* pControls = m_aControls.getConstArray();
|
|
|
|
|
sal_Int32 nControlCount = m_aControls.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< XControl > xNewActiveControl;
|
|
|
|
|
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;
|
|
|
|
|
|
2004-11-16 10:22:40 +00:00
|
|
|
|
SdrPageView* pCurPageView = m_pView->GetPageViewPvNum(0);
|
2003-11-24 15:38:56 +00:00
|
|
|
|
const SdrPageViewWindow* pWindow = pCurPageView ? pCurPageView->FindWindow(*((OutputDevice*)m_pView->GetActualOutDev())) : 0L;
|
|
|
|
|
|
2004-11-16 10:22:40 +00:00
|
|
|
|
if ( pWindow )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2004-11-16 10:22:40 +00:00
|
|
|
|
for (sal_Int32 i = nControlCount; i > 0;)
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
const Reference< XControl > & xControl = pControls[--i];
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xControl.is())
|
|
|
|
|
{
|
|
|
|
|
// no events for the control anymore
|
|
|
|
|
removeFromEventAttacher(xControl);
|
|
|
|
|
|
|
|
|
|
// do we have a mode selector
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XModeSelector > xSelector(xControl, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xSelector.is())
|
|
|
|
|
{
|
|
|
|
|
xSelector->setMode(FILTER_MODE);
|
|
|
|
|
|
|
|
|
|
// listening for new controls of the selector
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XContainer > xContainer(xSelector, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xContainer.is())
|
|
|
|
|
xContainer->addContainerListener(this);
|
|
|
|
|
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XEnumerationAccess > xElementAccess(xSelector, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xElementAccess.is())
|
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XEnumeration > xEnumeration(xElementAccess->createEnumeration());
|
|
|
|
|
Reference< XControl > xControl;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
while (xEnumeration->hasMoreElements())
|
|
|
|
|
{
|
2000-11-07 12:16:50 +00:00
|
|
|
|
xEnumeration->nextElement() >>= xControl;
|
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
|
|
|
|
|
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
|
|
|
|
{
|
|
|
|
|
aFieldInfos.push_back(FmFieldInfo(xField, xText));
|
|
|
|
|
xText->addTextListener(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2003-03-27 14:06:05 +00:00
|
|
|
|
Reference< XPropertySet > xModel( xControl->getModel(), UNO_QUERY );
|
|
|
|
|
if (xModel.is() && ::comphelper::hasProperty(FM_PROP_BOUNDFIELD, xModel))
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
|
|
|
|
// does the model use a bound field ?
|
2003-03-27 14:06:05 +00:00
|
|
|
|
Any aVal = xModel->getPropertyValue(FM_PROP_BOUNDFIELD);
|
2000-11-07 12:16:50 +00:00
|
|
|
|
Reference< XPropertySet > xField;
|
|
|
|
|
aVal >>= xField;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
|
|
// may we filter the field?
|
|
|
|
|
|
2000-10-20 13:18:57 +00:00
|
|
|
|
if (xField.is() && ::comphelper::hasProperty(FM_PROP_SEARCHABLE, xField) &&
|
|
|
|
|
::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_SEARCHABLE)))
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2003-11-24 15:38:56 +00:00
|
|
|
|
// const SdrPageViewWinRec& rWR = pCurPageView->GetWinList()[nPos];
|
|
|
|
|
// const SdrPageViewWindow& rWindow = pCurPageView->GetPageViewWindows().Get(nPos);
|
|
|
|
|
const SdrUnoControlList& rControlList = pWindow->GetControlList();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
sal_uInt16 nCtrlNum = rControlList.Find(xControl);
|
|
|
|
|
if (nCtrlNum != SDRUNOCONTROL_NOTFOUND)
|
|
|
|
|
{
|
|
|
|
|
// Setzen des FilterControls
|
|
|
|
|
SdrUnoControlRec& rControlRec = (SdrUnoControlRec&)rControlList[nCtrlNum];
|
2003-03-27 14:06:05 +00:00
|
|
|
|
|
|
|
|
|
// create a filter control
|
|
|
|
|
Sequence< Any > aCreationArgs( 3 );
|
|
|
|
|
aCreationArgs[ 0 ] <<= NamedValue( ::rtl::OUString::createFromAscii( "MessageParent" ), makeAny( VCLUnoHelper::GetInterface( m_pWindow ) ) );
|
|
|
|
|
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!" );
|
|
|
|
|
|
|
|
|
|
Reference< XTextComponent > xText( xFilterControl, UNO_QUERY );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
|
|
// merken in der Map
|
|
|
|
|
aFieldInfos.push_back(FmFieldInfo(xField, xText));
|
|
|
|
|
xText->addTextListener(this);
|
|
|
|
|
|
|
|
|
|
// setting the focus if the current control
|
|
|
|
|
// is the active one
|
2003-03-27 14:06:05 +00:00
|
|
|
|
if (m_xActiveControl.get() == xControl.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2003-03-27 14:06:05 +00:00
|
|
|
|
xNewActiveControl = xFilterControl;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
m_xActiveControl = m_xCurrentControl = NULL;
|
|
|
|
|
}
|
2003-03-27 14:06:05 +00:00
|
|
|
|
else if (m_xCurrentControl.get() == xControl.get())
|
|
|
|
|
m_xCurrentControl = xFilterControl;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
2003-03-27 14:06:05 +00:00
|
|
|
|
rControlRec.ReplaceControl( xFilterControl );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// abmelden vom EventManager
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
|
|
|
|
|
// setting the focus to the replacing control
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XWindow > xWindow(xNewActiveControl, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xWindow.is())
|
|
|
|
|
xWindow->setFocus();
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2002-11-04 12:45:49 +00:00
|
|
|
|
if (!m_pView)
|
|
|
|
|
{
|
|
|
|
|
DBG_ERROR("FmXFormController::startFiltering : you can't filter if you created me as service !");
|
2002-03-19 12:12:39 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
|
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
|
2004-11-16 10:22:40 +00:00
|
|
|
|
const Reference< XControl > * pControls = m_aControls.getConstArray();
|
|
|
|
|
sal_Int32 nControlCount = m_aControls.getLength();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
SdrPageView* pCurPageView = m_pView->GetPageViewPvNum(0);
|
2003-11-24 15:38:56 +00:00
|
|
|
|
|
|
|
|
|
// sal_uInt16 nPos = pCurPageView ? pCurPageView->GetWinList().Find((OutputDevice*)m_pView->GetActualOutDev()) : SDRPAGEVIEWWIN_NOTFOUND;
|
|
|
|
|
const SdrPageViewWindow* pWindow = pCurPageView ? pCurPageView->FindWindow(*((OutputDevice*)m_pView->GetActualOutDev())) : 0L;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
|
|
// the control we have to activate after replacement
|
|
|
|
|
Reference< ::com::sun::star::awt::XControl > xNewActiveControl;
|
|
|
|
|
|
|
|
|
|
// 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();
|
|
|
|
|
|
2003-11-24 15:38:56 +00:00
|
|
|
|
if (pWindow)
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2004-11-16 10:22:40 +00:00
|
|
|
|
for ( sal_Int32 i = nControlCount; i > 0; )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
const Reference< XControl > & xControl = pControls[--i];
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xControl.is())
|
|
|
|
|
{
|
|
|
|
|
// now enable eventhandling again
|
|
|
|
|
addToEventAttacher(xControl);
|
|
|
|
|
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XModeSelector > xSelector(xControl, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xSelector.is())
|
|
|
|
|
{
|
|
|
|
|
xSelector->setMode(DATA_MODE);
|
|
|
|
|
|
|
|
|
|
// listening for new controls of the selector
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XContainer > xContainer(xSelector, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xContainer.is())
|
|
|
|
|
xContainer->removeContainerListener(this);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
// may we filter the field?
|
2000-10-20 13:18:57 +00:00
|
|
|
|
if (xField.is() && ::comphelper::hasProperty(FM_PROP_SEARCHABLE, xField) &&
|
|
|
|
|
::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_SEARCHABLE)))
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
2003-11-24 15:38:56 +00:00
|
|
|
|
// const SdrPageViewWinRec& rWR = pCurPageView->GetWinList()[nPos];
|
|
|
|
|
// const SdrPageViewWindow& rWindow = pCurPageView->GetPageViewWindows().Get(nPos);
|
|
|
|
|
const SdrUnoControlList& rControlList = pWindow->GetControlList();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
sal_uInt16 nCtrlNum = rControlList.Find(xControl);
|
|
|
|
|
if (nCtrlNum != SDRUNOCONTROL_NOTFOUND)
|
|
|
|
|
{
|
|
|
|
|
// Zuruecksetzen des Controls auf das Defaultcontrol
|
|
|
|
|
SdrUnoControlRec& rControlRec = (SdrUnoControlRec&)rControlList[nCtrlNum];
|
2000-10-20 13:18:57 +00:00
|
|
|
|
::rtl::OUString aServiceName = ::comphelper::getString(xSet->getPropertyValue(FM_PROP_DEFAULTCONTROL));
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XControl > xNewControl(m_xORB->createInstance(aServiceName), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
|
|
// setting the focus if the current control
|
|
|
|
|
// is the active one
|
2004-04-13 10:05:48 +00:00
|
|
|
|
if ((XControl*)m_xActiveControl.get() == (XControl*)xControl.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
{
|
|
|
|
|
xNewActiveControl = xNewControl;
|
|
|
|
|
m_xActiveControl = m_xCurrentControl = NULL;
|
|
|
|
|
}
|
2004-04-13 10:05:48 +00:00
|
|
|
|
else if ((XControl*)m_xCurrentControl.get() == (XControl*)xControl.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
|
m_xCurrentControl = xNewControl;
|
|
|
|
|
|
|
|
|
|
rControlRec.ReplaceControl(xNewControl);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// setting the focus to the replacing control
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XWindow > xWindow(xNewActiveControl, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xWindow.is())
|
|
|
|
|
xWindow->setFocus();
|
|
|
|
|
|
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;
|
|
|
|
|
if (!pParent)
|
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XControlContainer > xContainer = getContainer();
|
|
|
|
|
Reference< XControl > xCtrl(xContainer, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xCtrl.is())
|
|
|
|
|
{
|
2004-04-13 10:05:48 +00:00
|
|
|
|
Reference< XWindowPeer > xPeer(xCtrl->getPeer(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
if (xPeer.is())
|
|
|
|
|
pParent = VCLUnoHelper::GetWindow(xPeer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
{
|
|
|
|
|
if (m_pView)
|
|
|
|
|
{ // we're working for a FormView
|
|
|
|
|
if (!(m_pWindow || (m_pView->GetActualOutDev() == (const OutputDevice*)m_pWindow ||
|
|
|
|
|
!m_pView->GetActualOutDev() && m_pWindow->IsActive())))
|
|
|
|
|
// we're not active
|
|
|
|
|
return sal_True;
|
|
|
|
|
}
|
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
|
|
|
|
if (m_pView)
|
|
|
|
|
{ // we're working for a FormView
|
|
|
|
|
if (!(m_pWindow || (m_pView->GetActualOutDev() == (const OutputDevice*)m_pWindow ||
|
|
|
|
|
!m_pView->GetActualOutDev() && m_pWindow->IsActive())))
|
|
|
|
|
// we're not active
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::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
|
|
|
|
if (m_pView)
|
|
|
|
|
{ // we're working for a FormView
|
|
|
|
|
if (!(m_pWindow || (m_pView->GetActualOutDev() == (const OutputDevice*)m_pWindow ||
|
|
|
|
|
!m_pView->GetActualOutDev() && m_pWindow->IsActive())))
|
|
|
|
|
// we're not active
|
|
|
|
|
return sal_True;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::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
|
|
|
|
if (m_pView)
|
|
|
|
|
{ // we're working for a FormView
|
|
|
|
|
if (!(m_pWindow || (m_pView->GetActualOutDev() == (const OutputDevice*)m_pWindow ||
|
|
|
|
|
!m_pView->GetActualOutDev() && m_pWindow->IsActive())))
|
|
|
|
|
// we're not active
|
|
|
|
|
return sal_True;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::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 >
|
|
|
|
|
FmXFormController::interceptedQueryDispatch(sal_uInt16 _nId, const URL& aURL,
|
2000-09-18 16:07:07 +00:00
|
|
|
|
const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags)
|
|
|
|
|
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
|
|
|
|
|
sal_Int32 nFeatureId = ::svx::FeatureSlotTranslation::getControllerFeatureIdForURL( aURL.Main );
|
|
|
|
|
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!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void SAL_CALL FmXFormController::removeStatusListener( const Reference< XStatusListener >& _rxListener, const URL& _rURL ) throw (RuntimeException)
|
|
|
|
|
{
|
|
|
|
|
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!");
|
2000-09-18 16:07:07 +00:00
|
|
|
|
#if DBG_UTIL
|
|
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
}
|