diff options
author | Ocke Janssen [oj] <Ocke.Janssen@sun.com> | 2009-11-16 09:59:12 +0100 |
---|---|---|
committer | Ocke Janssen [oj] <Ocke.Janssen@sun.com> | 2009-11-16 09:59:12 +0100 |
commit | f448a7b94dafd3e80e7cfdc405e2dbccbfdef1d6 (patch) | |
tree | b3d5bcb2ef2cb939f231d95d5c146fb8aa349a08 | |
parent | cc423d4be4338cbd81eed9f96f7c7a277da0ee88 (diff) | |
parent | 1e0bc426a966d9920714d0d3404ae32bdda9bdd7 (diff) |
dba33d: pull from dba33b
63 files changed, 3710 insertions, 3469 deletions
diff --git a/connectivity/inc/connectivity/dbmetadata.hxx b/connectivity/inc/connectivity/dbmetadata.hxx index 1ee1718247ae..4cfab247c10f 100644 --- a/connectivity/inc/connectivity/dbmetadata.hxx +++ b/connectivity/inc/connectivity/dbmetadata.hxx @@ -121,6 +121,17 @@ namespace dbtools */ bool supportsSubqueriesInFrom() const; + /** checks whether the database supports primary keys + + Since there's no dedicated API to ask a database for this, a heuristics needs to be applied. + First, the <code>PrimaryKeySupport<code> settings of the data source is examined. If it is <TRUE/> + or <FALSE/>, then value is returned. If it is <NULL/>, then the database meta data are examined + for support of core SQL grammar, and the result is returned. The assumption is that a database/driver + which supports core SQL grammar usually also supports primary keys, and vice versa. At least, experience + shows this is true most of the time. + */ + bool supportsPrimaryKeys() const; + /** determines whether names in the database should be restricted to SQL-92 identifiers Effectively, this method checks the EnableSQL92Check property of the data source settings, diff --git a/connectivity/source/commontools/dbmetadata.cxx b/connectivity/source/commontools/dbmetadata.cxx index c5b65a9d113b..d30161da497c 100644 --- a/connectivity/source/commontools/dbmetadata.cxx +++ b/connectivity/source/commontools/dbmetadata.cxx @@ -257,6 +257,27 @@ namespace dbtools } //-------------------------------------------------------------------- + bool DatabaseMetaData::supportsPrimaryKeys() const + { + lcl_checkConnected( *m_pImpl ); + + bool doesSupportPrimaryKeys = false; + try + { + Any setting; + if ( !( lcl_getConnectionSetting( "PrimaryKeySupport", *m_pImpl, setting ) ) + || !( setting >>= doesSupportPrimaryKeys ) + ) + doesSupportPrimaryKeys = m_pImpl->xConnectionMetaData->supportsCoreSQLGrammar(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return doesSupportPrimaryKeys; + } + + //-------------------------------------------------------------------- const ::rtl::OUString& DatabaseMetaData::getIdentifierQuoteString() const { return lcl_getConnectionStringSetting( *m_pImpl, m_pImpl->sCachedIdentifierQuoteString, &XDatabaseMetaData::getIdentifierQuoteString ); diff --git a/connectivity/source/drivers/ado/ado.xcu b/connectivity/source/drivers/ado/ado.xcu index 236d38bd7ff7..8a106c70283f 100755 --- a/connectivity/source/drivers/ado/ado.xcu +++ b/connectivity/source/drivers/ado/ado.xcu @@ -115,6 +115,11 @@ <value>true</value> </prop> </node> + <node oor:name="PrimaryKeySupport" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> </node> <node oor:name="MetaData"> <node oor:name="SupportsTableCreation" oor:op="replace"> diff --git a/connectivity/source/drivers/jdbc/jdbc.xcu b/connectivity/source/drivers/jdbc/jdbc.xcu index ae1bbad227e7..f5ac8f20db5c 100755 --- a/connectivity/source/drivers/jdbc/jdbc.xcu +++ b/connectivity/source/drivers/jdbc/jdbc.xcu @@ -145,6 +145,11 @@ <value>true</value> </prop> </node> + <node oor:name="PrimaryKeySupport" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> </node> <node oor:name="MetaData"> <node oor:name="SupportsTableCreation" oor:op="replace"> diff --git a/connectivity/source/drivers/odbc/odbc.xcu b/connectivity/source/drivers/odbc/odbc.xcu index cf306f10d57f..b3a9d7149650 100755 --- a/connectivity/source/drivers/odbc/odbc.xcu +++ b/connectivity/source/drivers/odbc/odbc.xcu @@ -150,6 +150,11 @@ <value>true</value> </prop> </node> + <node oor:name="PrimaryKeySupport" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> </node> <node oor:name="MetaData"> <node oor:name="SupportsTableCreation" oor:op="replace"> diff --git a/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx b/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx index 8d72c3271b82..6e9d87e933ca 100644 --- a/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx +++ b/connectivity/source/drivers/odbcbase/OPreparedStatement.cxx @@ -321,16 +321,6 @@ void SAL_CALL OPreparedStatement::setBoolean( sal_Int32 parameterIndex, sal_Bool setInt (parameterIndex, value); } // ------------------------------------------------------------------------- -#define PREP_BIND_PARAM(_ty,_jt) \ - OTools::bindParameter(m_pConnection, \ - m_aStatementHandle, \ - parameterIndex, \ - bindBuf, \ - getLengthBuf(parameterIndex), \ - (SWORD)_jt, \ - sal_False,m_pConnection->useOldDateFormat(),_pData,(Reference <XInterface>)*this,getOwnConnection()->getTextEncoding()) - - void OPreparedStatement::setParameter(sal_Int32 parameterIndex,sal_Int32 _nType,sal_Int32 _nSize,void* _pData) { ::osl::MutexGuard aGuard( m_aMutex ); @@ -353,6 +343,10 @@ void OPreparedStatement::setParameter(sal_Int32 parameterIndex,sal_Int32 _nType, case SQL_NUMERIC: ++nRealSize; break; + case SQL_BINARY:
+ case SQL_VARBINARY:
+ nRealSize=1; //dummy buffer, binary data isn't copied
+ break; default: break; } @@ -568,6 +562,7 @@ void SAL_CALL OPreparedStatement::setShort( sal_Int32 parameterIndex, sal_Int16 void SAL_CALL OPreparedStatement::setBytes( sal_Int32 parameterIndex, const Sequence< sal_Int8 >& x ) throw(SQLException, RuntimeException) { setParameter(parameterIndex,DataType::BINARY,x.getLength(),(void*)&x); + boundParams[parameterIndex-1].setSequence(x); // this assures that the sequence stays alive } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/odbcbase/OTools.cxx b/connectivity/source/drivers/odbcbase/OTools.cxx index 39c848f34eaf..3cadb33cf188 100644 --- a/connectivity/source/drivers/odbcbase/OTools.cxx +++ b/connectivity/source/drivers/odbcbase/OTools.cxx @@ -210,12 +210,9 @@ void OTools::bindData( SQLSMALLINT _nOdbcType, if(pSeq) { - // memcpy(_pData,pSeq->getConstArray(),pSeq->getLength()); - _pData = (sal_Int8*)((const ::com::sun::star::uno::Sequence< sal_Int8 > *)_pValue)->getConstArray(); + _pData = (sal_Int8*)pSeq->getConstArray(); *pLen = pSeq->getLength(); } - // _pData = (sal_Int8*)((const ::com::sun::star::uno::Sequence< sal_Int8 > *)_pValue)->getConstArray(); - // *pLen = ((const ::com::sun::star::uno::Sequence< sal_Int8 > *)_pValue)->getLength(); } break; case SQL_LONGVARBINARY: diff --git a/connectivity/source/inc/odbc/OBoundParam.hxx b/connectivity/source/inc/odbc/OBoundParam.hxx index c71977a94910..bc896c2361d8 100644 --- a/connectivity/source/inc/odbc/OBoundParam.hxx +++ b/connectivity/source/inc/odbc/OBoundParam.hxx @@ -119,6 +119,11 @@ namespace connectivity paramInputStreamLen = len; } + void setSequence(const ::com::sun::star::uno::Sequence< sal_Int8 >& _aSequence) + { + aSequence = _aSequence; + } + //-------------------------------------------------------------------- // getInputStream // Gets the input stream for the bound parameter @@ -191,6 +196,7 @@ namespace connectivity // data is in native format. ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream> paramInputStream; + ::com::sun::star::uno::Sequence< sal_Int8 > aSequence; // When an input stream is // bound to a parameter, the // input stream is saved diff --git a/svx/inc/pch/precompiled_svx.hxx b/svx/inc/pch/precompiled_svx.hxx index 8e9bc4d17930..b5a092b87eee 100644 --- a/svx/inc/pch/precompiled_svx.hxx +++ b/svx/inc/pch/precompiled_svx.hxx @@ -57,7 +57,7 @@ #include "basic/sbxvar.hxx" #include "boost/scoped_ptr.hpp" #include "boost/shared_ptr.hpp" -#include "boost/spirit/core.hpp" +#include "boost/spirit/include/classic_core.hpp" #include "bootstrp/sstring.hxx" #include "com/sun/star/accessibility/AccessibleEventId.hpp" #include "com/sun/star/accessibility/AccessibleEventObject.hpp" @@ -263,7 +263,7 @@ #include "com/sun/star/form/XDatabaseParameterListener.hpp" #include "com/sun/star/form/XForm.hpp" #include "com/sun/star/form/XFormComponent.hpp" -#include "com/sun/star/form/XFormController.hpp" +#include "com/sun/star/form/runtime/XFormController.hpp" #include "com/sun/star/form/XFormControllerListener.hpp" #include "com/sun/star/form/XFormsSupplier.hpp" #include "com/sun/star/form/XFormsSupplier2.hpp" diff --git a/svx/inc/svx/fmdpage.hxx b/svx/inc/svx/fmdpage.hxx index f71cc4751a63..a9f2783d643a 100644 --- a/svx/inc/svx/fmdpage.hxx +++ b/svx/inc/svx/fmdpage.hxx @@ -31,11 +31,6 @@ #define _SVX_FMDPAGE_HXX #include <com/sun/star/form/XFormsSupplier2.hpp> -#include <com/sun/star/form/XForm.hpp> -#include <com/sun/star/form/XImageProducerSupplier.hpp> -#include <com/sun/star/form/XFormController.hpp> -#include <com/sun/star/form/XFormComponent.hpp> -#include <com/sun/star/form/XFormControllerListener.hpp> #include <svx/unopage.hxx> #include <comphelper/uno3.hxx> #include "svx/svxdllapi.h" diff --git a/svx/inc/svx/fmshell.hxx b/svx/inc/svx/fmshell.hxx index f5d1c7b0c615..9f180156367f 100644 --- a/svx/inc/svx/fmshell.hxx +++ b/svx/inc/svx/fmshell.hxx @@ -58,7 +58,9 @@ class SdrUnoObj; namespace com { namespace sun { namespace star { namespace form { class XForm; - class XFormController; + namespace runtime { + class XFormController; + } } } } } //======================================================================== @@ -147,7 +149,7 @@ public: const OutputDevice& _rDevice, ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _out_rxControl ) const; - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > GetFormController( + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > GetFormController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm, const SdrView& _rView, const OutputDevice& _rDevice diff --git a/svx/inc/svx/fmview.hxx b/svx/inc/svx/fmview.hxx index c79748ddb94f..3b965967ed42 100644 --- a/svx/inc/svx/fmview.hxx +++ b/svx/inc/svx/fmview.hxx @@ -54,7 +54,9 @@ namespace svx { class SdrUnoObj; namespace com { namespace sun { namespace star { namespace form { class XForm; - class XFormController; + namespace runtime { + class XFormController; + } } } } } class SVX_DLLPUBLIC FmFormView : public E3dView @@ -125,7 +127,7 @@ public: /** returns the form controller for a given form and a given device */ - SVX_DLLPRIVATE ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > + SVX_DLLPRIVATE ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > GetFormController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm, const OutputDevice& _rDevice ) const; // SdrView diff --git a/svx/inc/svx/sdr/contact/viewobjectcontactofunocontrol.hxx b/svx/inc/svx/sdr/contact/viewobjectcontactofunocontrol.hxx index 87a1de55ec0a..c8fa03d4e88c 100644 --- a/svx/inc/svx/sdr/contact/viewobjectcontactofunocontrol.hxx +++ b/svx/inc/svx/sdr/contact/viewobjectcontactofunocontrol.hxx @@ -99,12 +99,21 @@ namespace sdr { namespace contact { */ virtual void ActionChanged(); + /** to be called when any aspect of the control which requires view updates changed + */ + struct ImplAccess { friend class ViewObjectContactOfUnoControl_Impl; friend class ViewObjectContactOfUnoControl; private: ImplAccess() { } }; + void onControlChangedOrModified( ImplAccess ) { impl_onControlChangedOrModified(); } + protected: + ViewObjectContactOfUnoControl( ObjectContact& _rObjectContact, ViewContactOfUnoControl& _rViewContact ); ~ViewObjectContactOfUnoControl(); // support for Primitive2D virtual drawinglayer::primitive2d::Primitive2DSequence createPrimitive2DSequence(const DisplayInfo& rDisplayInfo) const; + /// to be called when any aspect of the control which requires view updates changed + void impl_onControlChangedOrModified(); + private: ViewObjectContactOfUnoControl(); // never implemented ViewObjectContactOfUnoControl( const ViewObjectContactOfUnoControl& ); // never implemented diff --git a/svx/source/fmcomp/fmgridcl.cxx b/svx/source/fmcomp/fmgridcl.cxx index c210919bd09d..92f46cf4ad69 100644 --- a/svx/source/fmcomp/fmgridcl.cxx +++ b/svx/source/fmcomp/fmgridcl.cxx @@ -35,6 +35,7 @@ #include "fmgridif.hxx" #include "fmitems.hxx" #include "fmprop.hrc" +#include "fmtools.hxx" #include "fmresids.hrc" #include "fmservs.hxx" #include "fmurl.hxx" diff --git a/svx/source/fmcomp/fmgridif.cxx b/svx/source/fmcomp/fmgridif.cxx index 0bfc7c768973..c7e19499e70a 100644 --- a/svx/source/fmcomp/fmgridif.cxx +++ b/svx/source/fmcomp/fmgridif.cxx @@ -34,14 +34,15 @@ #include "fmgridif.hxx" #include "fmprop.hrc" #include "fmservs.hxx" -#include "fmtools.hxx" #include "fmurl.hxx" +#include "fmtools.hxx" #include "formcontrolfactory.hxx" #include "gridcell.hxx" #include "sdbdatacolumn.hxx" #include "svx/fmgridcl.hxx" #include "svx/svxids.hrc" +/** === begin UNO includes === **/ #include <com/sun/star/awt/PosSize.hpp> #include <com/sun/star/beans/PropertyAttribute.hpp> #include <com/sun/star/form/FormComponentType.hpp> @@ -52,6 +53,8 @@ #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> #include <com/sun/star/util/XURLTransformer.hpp> #include <com/sun/star/view/XSelectionSupplier.hpp> +#include <com/sun/star/sdbcx/XRowLocate.hpp> +/** === end UNO includes === **/ #include <comphelper/container.hxx> #include <comphelper/enumhelper.hxx> @@ -1118,7 +1121,7 @@ namespace fmgridif { const ::rtl::OUString getDataModeIdentifier() { - static ::rtl::OUString s_sDataModeIdentifier = DATA_MODE; + static ::rtl::OUString s_sDataModeIdentifier = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); return s_sDataModeIdentifier; } } @@ -2457,7 +2460,7 @@ void FmXGridPeer::setMode(const ::rtl::OUString& Mode) throw( NoSupportException m_aMode = Mode; FmGridControl* pGrid = (FmGridControl*) GetWindow(); - if (Mode == FILTER_MODE) + if ( Mode == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterMode" ) ) ) pGrid->SetFilterMode(sal_True); else { @@ -2480,8 +2483,8 @@ void FmXGridPeer::setMode(const ::rtl::OUString& Mode) throw( NoSupportException { aModes.realloc(2); ::rtl::OUString* pModes = aModes.getArray(); - pModes[0] = DATA_MODE; - pModes[1] = FILTER_MODE; + pModes[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); + pModes[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterMode" ) ); } return aModes; } diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx index ff7cfd422eb8..5f6f56ac075c 100644 --- a/svx/source/fmcomp/gridcell.cxx +++ b/svx/source/fmcomp/gridcell.cxx @@ -679,7 +679,15 @@ sal_Bool DbCellControl::Commit() // lock the listening for value property changes lockValueProperty(); // commit the content of the control into the model's value property - sal_Bool bReturn = commitControl(); + sal_Bool bReturn = sal_False; + try + { + bReturn = commitControl(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } // unlock the listening for value property changes unlockValueProperty(); // outta here diff --git a/svx/source/fmcomp/gridcols.cxx b/svx/source/fmcomp/gridcols.cxx index da7fe3447b0a..1fb7c69c9835 100644 --- a/svx/source/fmcomp/gridcols.cxx +++ b/svx/source/fmcomp/gridcols.cxx @@ -34,7 +34,8 @@ #include <tools/debug.hxx> #include <comphelper/types.hxx> #include "fmservs.hxx" -#include "fmtools.hxx" + +using namespace ::com::sun::star::uno; //------------------------------------------------------------------------------ const ::comphelper::StringSequence& getColumnTypes() @@ -57,6 +58,36 @@ const ::comphelper::StringSequence& getColumnTypes() return aColumnTypes; } +//------------------------------------------------------------------ +// Vergleichen von PropertyInfo +extern "C" int +#if defined( WNT ) + __cdecl +#endif +#if defined( ICC ) && defined( OS2 ) +_Optlink +#endif + NameCompare(const void* pFirst, const void* pSecond) +{ + return ((::rtl::OUString*)pFirst)->compareTo(*(::rtl::OUString*)pSecond); +} + +namespace +{ + //------------------------------------------------------------------------------ + sal_Int32 lcl_findPos(const ::rtl::OUString& aStr, const Sequence< ::rtl::OUString>& rList) + { + const ::rtl::OUString* pStrList = rList.getConstArray(); + ::rtl::OUString* pResult = (::rtl::OUString*) bsearch(&aStr, (void*)pStrList, rList.getLength(), sizeof(::rtl::OUString), + &NameCompare); + + if (pResult) + return (pResult - pStrList); + else + return -1; + } +} + //------------------------------------------------------------------------------ sal_Int32 getColumnTypeByModelName(const ::rtl::OUString& aModelName) { @@ -79,7 +110,7 @@ sal_Int32 getColumnTypeByModelName(const ::rtl::OUString& aModelName) : aModelName.copy(aCompatibleModelPrefix.getLength()); const ::comphelper::StringSequence& rColumnTypes = getColumnTypes(); - nTypeId = findPos(aColumnType, rColumnTypes); + nTypeId = lcl_findPos(aColumnType, rColumnTypes); } return nTypeId; } diff --git a/svx/source/form/confirmdelete.cxx b/svx/source/form/confirmdelete.cxx deleted file mode 100644 index 819677c3f495..000000000000 --- a/svx/source/form/confirmdelete.cxx +++ /dev/null @@ -1,138 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: confirmdelete.cxx,v $ - * $Revision: 1.10 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svx.hxx" -#include "confirmdelete.hxx" -#include <svx/dialmgr.hxx> -#ifndef _SVX_FMHELP_HRC -#include "fmhelp.hrc" -#endif -#ifndef _SVX_FMRESIDS_HRC -#include "fmresids.hrc" -#endif -#include <unotools/configmgr.hxx> -#include <vcl/msgbox.hxx> - -//........................................................................ -namespace svxform -{ -//........................................................................ - -#define BORDER_HEIGHT 6 // default distance control-dialog -#define BORDER_WIDTH 6 // default distance control-dialog - - using namespace ::com::sun::star::uno; - - //==================================================================== - //= class ConfirmDeleteDialog - //==================================================================== - //------------------------------------------------------------------------------ - ConfirmDeleteDialog::ConfirmDeleteDialog(Window* pParent, const String& _rTitle) - :ButtonDialog(pParent, WB_HORZ | WB_STDDIALOG) - ,m_aInfoImage (this) - ,m_aTitle (this, WB_WORDBREAK | WB_LEFT) - ,m_aMessage (this, WB_WORDBREAK | WB_LEFT) - { - String sMessage(SVX_RES(RID_STR_DELETECONFIRM)); - - // Changed as per BugID 79541 Branding/Configuration - Any aProductName = ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::PRODUCTNAME); - ::rtl::OUString sProductName; - aProductName >>= sProductName; - - String aTitle = sProductName; - aProductName = ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::PRODUCTVERSION); - aProductName >>= sProductName; - aTitle.AppendAscii(" "); - aTitle += String(sProductName); - SetText(aTitle); - - SetHelpId(HID_DLG_DBMSG); - SetSizePixel(LogicToPixel(Size(220, 30),MAP_APPFONT)); - - m_aInfoImage.SetPosSizePixel(LogicToPixel(Point(6, 6),MAP_APPFONT), - LogicToPixel(Size(20, 20),MAP_APPFONT)); - m_aInfoImage.Show(); - - m_aTitle.SetPosSizePixel(LogicToPixel(Point(45, 6),MAP_APPFONT), - LogicToPixel(Size(169, 20),MAP_APPFONT)); - - Font aFont = m_aTitle.GetFont(); - aFont.SetWeight(WEIGHT_SEMIBOLD); - m_aTitle.SetFont(aFont); - m_aTitle.Show(); - - m_aMessage.SetPosSizePixel(LogicToPixel(Point(45, 29),MAP_APPFONT), - LogicToPixel(Size(169, 1),MAP_APPFONT)); - m_aMessage.Show(); - - // Image festlegen - m_aInfoImage.SetImage(WarningBox::GetStandardImage()); - - // Title setzen - m_aTitle.SetText(_rTitle); - - // Ermitteln der Hoehe des Textfeldes und des Dialogs - Size aBorderSize = LogicToPixel(Size(BORDER_WIDTH, BORDER_HEIGHT),MAP_APPFONT); - Rectangle aDlgRect(GetPosPixel(),GetSizePixel()); - Rectangle aMessageRect(m_aMessage.GetPosPixel(),m_aMessage.GetSizePixel()); - Rectangle aTextRect = - GetTextRect(aMessageRect, sMessage, TEXT_DRAW_WORDBREAK | TEXT_DRAW_MULTILINE | TEXT_DRAW_LEFT); - - long nHText = aTextRect.Bottom() > aMessageRect.Bottom() ? aTextRect.Bottom() - aMessageRect.Bottom() : 0; - - aDlgRect.Bottom() += nHText + 2 * aBorderSize.Height(); - aMessageRect.Bottom() += nHText; - - // Dialog anpassen - SetSizePixel(aDlgRect.GetSize()); - SetPageSizePixel(aDlgRect.GetSize()); - - // Message Text anpassen und setzen - m_aMessage.SetSizePixel(aMessageRect.GetSize()); - m_aMessage.SetText(sMessage); - - // Buttons anlegen - AddButton(BUTTON_YES, BUTTONID_YES, 0); - AddButton(BUTTON_NO, BUTTONID_NO, BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON); - } - - //------------------------------------------------------------------------------ - ConfirmDeleteDialog::~ConfirmDeleteDialog() - { - } - -//........................................................................ -} // namespace svxform -//........................................................................ - - - diff --git a/svx/source/form/delayedevent.cxx b/svx/source/form/delayedevent.cxx index c6bce8efec98..a185ef04d389 100644 --- a/svx/source/form/delayedevent.cxx +++ b/svx/source/form/delayedevent.cxx @@ -5,10 +5,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * -* $RCSfile: delayedevent.cxx,v $ -* -* $Revision: 1.1.2.1 $ -* * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/svx/source/form/filtnav.cxx b/svx/source/form/filtnav.cxx index 7ac8f8afbe29..dec2f4c0d5a6 100644 --- a/svx/source/form/filtnav.cxx +++ b/svx/source/form/filtnav.cxx @@ -30,50 +30,40 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" -#ifndef _SVX_FMRESIDS_HRC -#include "fmresids.hrc" -#endif -#include "fmctrler.hxx" -#include "filtnav.hxx" -#include <com/sun/star/util/XNumberFormatter.hpp> -#include <com/sun/star/form/XFormController.hpp> -#include <fmexch.hxx> -#include "fmitems.hxx" -#ifndef _SVX_SVXIDS_HRC -#include <svx/svxids.hrc> -#endif -#ifndef _SVX_FMPROP_HRC +#include "filtnav.hxx" +#include "fmexch.hxx" +#include "fmhelp.hrc" +#include "fmitems.hxx" #include "fmprop.hrc" -#endif +#include "fmresids.hrc" +#include "gridcell.hxx" -#ifndef _SVX_FMHELP_HRC -#include "fmhelp.hrc" -#endif -#include <svx/dialmgr.hxx> -#include <sfx2/dispatch.hxx> -#include <sfx2/objsh.hxx> -#include <sfx2/objitem.hxx> -#include <sfx2/request.hxx> -#include <tools/shl.hxx> +/** === begin UNO includes === **/ +#include <com/sun/star/form/runtime/XFormController.hpp> +#include <com/sun/star/lang/XUnoTunnel.hpp> +#include <com/sun/star/util/XNumberFormatter.hpp> +/** === end UNO includes === **/ -#ifndef _WRKWIN_HXX //autogen -#include <vcl/wrkwin.hxx> -#endif -#include <svx/fmshell.hxx> -#include <fmshimp.hxx> -#include <fmservs.hxx> -#include <fmtools.hxx> -#include <cppuhelper/implbase1.hxx> +#include <comphelper/processfactory.hxx> #include <comphelper/property.hxx> +#include <comphelper/sequence.hxx> #include <comphelper/uno3.hxx> #include <connectivity/dbtools.hxx> -#include <comphelper/processfactory.hxx> -#include <com/sun/star/lang/XUnoTunnel.hpp> -#include <comphelper/sequence.hxx> -#include "gridcell.hxx" +#include <cppuhelper/implbase1.hxx> +#include <fmservs.hxx> +#include <fmshimp.hxx> #include <rtl/logfile.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/objitem.hxx> +#include <sfx2/objsh.hxx> +#include <sfx2/request.hxx> +#include <svx/dialmgr.hxx> +#include <svx/fmshell.hxx> +#include <svx/svxids.hrc> +#include <tools/shl.hxx> +#include <vcl/wrkwin.hxx> #include <functional> @@ -85,11 +75,6 @@ #define DROP_ACTION_TIMER_TICK_BASE 10 // das ist die Basis, mit der beide Angaben multipliziert werden (in ms) -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::sdb; -using namespace ::com::sun::star::beans; using namespace ::svxform; using namespace ::connectivity::simple; using namespace ::connectivity; @@ -100,6 +85,37 @@ namespace svxform { //........................................................................ + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::lang::XMultiServiceFactory; + using ::com::sun::star::awt::TextEvent; + using ::com::sun::star::container::XIndexAccess; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::beans::XPropertySet; + using ::com::sun::star::form::runtime::XFormController; + using ::com::sun::star::form::runtime::XFilterController; + using ::com::sun::star::form::runtime::XFilterControllerListener; + using ::com::sun::star::form::runtime::FilterEvent; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::form::XForm; + using ::com::sun::star::container::XChild; + using ::com::sun::star::awt::XControl; + using ::com::sun::star::sdbc::XConnection; + using ::com::sun::star::util::XNumberFormatsSupplier; + using ::com::sun::star::beans::XPropertySet; + using ::com::sun::star::util::XNumberFormatter; + using ::com::sun::star::sdbc::XRowSet; + using ::com::sun::star::lang::Locale; + using ::com::sun::star::sdb::SQLContext; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::awt::XTextComponent; + using ::com::sun::star::uno::Sequence; + /** === end UNO using === **/ + //======================================================================== OFilterItemExchange::OFilterItemExchange() { @@ -141,8 +157,8 @@ TYPEINIT1(FmParentData, FmFilterData); //------------------------------------------------------------------------ FmParentData::~FmParentData() { - for (::std::vector<FmFilterData*>::const_iterator i = m_aChilds.begin(); - i != m_aChilds.end(); i++) + for (::std::vector<FmFilterData*>::const_iterator i = m_aChildren.begin(); + i != m_aChildren.end(); i++) delete (*i); } @@ -168,16 +184,17 @@ Image FmFormItem::GetImage( BmpColorMode _eMode ) const //======================================================================== TYPEINIT1(FmFilterItems, FmParentData); //------------------------------------------------------------------------ -FmFilterItem* FmFilterItems::Find(const Reference< ::com::sun::star::awt::XTextComponent > & _xText) const +FmFilterItem* FmFilterItems::Find( const ::sal_Int32 _nFilterComponentIndex ) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterItems::Find" ); - for (::std::vector<FmFilterData*>::const_iterator i = m_aChilds.begin(); - i != m_aChilds.end(); ++i) + for ( ::std::vector< FmFilterData* >::const_iterator i = m_aChildren.begin(); + i != m_aChildren.end(); + ++i + ) { - FmFilterItem* pCond = PTR_CAST(FmFilterItem, *i); - DBG_ASSERT(pCond, "Wrong element in container"); - if (_xText == pCond->GetTextComponent()) - return pCond; + FmFilterItem* pCondition = PTR_CAST( FmFilterItem, *i ); + DBG_ASSERT( pCondition, "FmFilterItems::Find: Wrong element in container!" ); + if ( _nFilterComponentIndex == pCondition->GetComponentIndex() ) + return pCondition; } return NULL; } @@ -185,7 +202,6 @@ FmFilterItem* FmFilterItems::Find(const Reference< ::com::sun::star::awt::XTextC //------------------------------------------------------------------------ Image FmFilterItems::GetImage( BmpColorMode _eMode ) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterItems::GetImage" ); static Image aImage; static Image aImage_HC; @@ -203,16 +219,15 @@ Image FmFilterItems::GetImage( BmpColorMode _eMode ) const //======================================================================== TYPEINIT1(FmFilterItem, FmFilterData); //------------------------------------------------------------------------ -FmFilterItem::FmFilterItem(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory, - FmFilterItems* pParent, - const ::rtl::OUString& aFieldName, - const ::rtl::OUString& aText, - const Reference< ::com::sun::star::awt::XTextComponent > & _xText) +FmFilterItem::FmFilterItem( const Reference< XMultiServiceFactory >& _rxFactory, + FmFilterItems* pParent, + const ::rtl::OUString& aFieldName, + const ::rtl::OUString& aText, + const sal_Int32 _nComponentIndex ) :FmFilterData(_rxFactory,pParent, aText) ,m_aFieldName(aFieldName) - ,m_xText(_xText) + ,m_nComponentIndex( _nComponentIndex ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterItems::FmFilterItem" ); } //------------------------------------------------------------------------ @@ -262,17 +277,6 @@ public: TYPEINIT1( FmFilterInsertedHint, FmFilterHint ); //======================================================================== -class FmFilterReplacedHint : public FmFilterHint -{ -public: - TYPEINFO(); - FmFilterReplacedHint(FmFilterData* pData) - :FmFilterHint(pData){} - -}; -TYPEINIT1( FmFilterReplacedHint, FmFilterHint ); - -//======================================================================== class FmFilterRemovedHint : public FmFilterHint { public: @@ -315,243 +319,240 @@ TYPEINIT1( FmFilterCurrentChangedHint, SfxHint ); //======================================================================== // class FmFilterAdapter, Listener an den FilterControls //======================================================================== -class FmFilterAdapter : public ::cppu::WeakImplHelper1< ::com::sun::star::awt::XTextListener > +class FmFilterAdapter : public ::cppu::WeakImplHelper1< XFilterControllerListener > { - FmFilterControls m_aFilterControls; - FmFilterModel* m_pModel; + FmFilterModel* m_pModel; + Reference< XIndexAccess > m_xControllers; public: - FmFilterAdapter(FmFilterModel* pModel, const Reference< ::com::sun::star::container::XIndexAccess >& xControllers); + FmFilterAdapter(FmFilterModel* pModel, const Reference< XIndexAccess >& xControllers); -// ::com::sun::star::lang::XEventListener - virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( RuntimeException ); +// XEventListener + virtual void SAL_CALL disposing(const EventObject& Source) throw( RuntimeException ); -// ::com::sun::star::awt::XTextListener - virtual void SAL_CALL textChanged(const ::com::sun::star::awt::TextEvent& e) throw( ::com::sun::star::uno::RuntimeException ); +// XFilterControllerListener + virtual void SAL_CALL predicateExpressionChanged( const FilterEvent& _Event ) throw (RuntimeException); + virtual void SAL_CALL disjunctiveTermRemoved( const FilterEvent& _Event ) throw (RuntimeException); + virtual void SAL_CALL disjunctiveTermAdded( const FilterEvent& _Event ) throw (RuntimeException); // helpers void dispose() throw( RuntimeException ); - void InsertElements(const Reference< ::com::sun::star::container::XIndexAccess >& xControllers); - void RemoveElement(const Reference< ::com::sun::star::awt::XTextComponent > & xText); + void AddOrRemoveListener( const Reference< XIndexAccess >& _rxControllers, const bool _bAdd ); - Reference< ::com::sun::star::beans::XPropertySet > getField(const Reference< ::com::sun::star::awt::XTextComponent > & xText) const; void setText(sal_Int32 nPos, const FmFilterItem* pFilterItem, const ::rtl::OUString& rText); - void DeleteItemsByText(::std::vector<FmFilterData*>& rItems, const Reference< ::com::sun::star::awt::XTextComponent > & xText); - Reference< ::com::sun::star::form::XForm > findForm(const Reference< ::com::sun::star::container::XChild >& xChild); }; //------------------------------------------------------------------------ -FmFilterAdapter::FmFilterAdapter(FmFilterModel* pModel, const Reference< ::com::sun::star::container::XIndexAccess >& xControllers) - :m_pModel(pModel) +FmFilterAdapter::FmFilterAdapter(FmFilterModel* pModel, const Reference< XIndexAccess >& xControllers) + :m_pModel( pModel ) + ,m_xControllers( xControllers ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::FmFilterAdapter" ); - InsertElements(xControllers); - - // listen on all controls as text listener - for (FmFilterControls::const_iterator iter = m_aFilterControls.begin(); - iter != m_aFilterControls.end(); iter++) - (*iter).first->addTextListener(this); + AddOrRemoveListener( m_xControllers, true ); } //------------------------------------------------------------------------ void FmFilterAdapter::dispose() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::dispose" ); - // 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(); + AddOrRemoveListener( m_xControllers, false ); } -//------------------------------------------------------------------------------ -// delete all items relate to the control -void FmFilterAdapter::DeleteItemsByText(::std::vector<FmFilterData*>& _rItems, - const Reference< ::com::sun::star::awt::XTextComponent > & xText) +//------------------------------------------------------------------------ +void FmFilterAdapter::AddOrRemoveListener( const Reference< XIndexAccess >& _rxControllers, const bool _bAdd ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::DeleteItemsByText" ); - for (::std::vector<FmFilterData*>::reverse_iterator i = _rItems.rbegin(); - // link problems with operator == - i.base() != _rItems.rend().base(); i++) + for (sal_Int32 i = 0, nLen = _rxControllers->getCount(); i < nLen; ++i) { - FmFilterItems* pFilterItems = PTR_CAST(FmFilterItems, *i); - if (pFilterItems) - { - FmFilterItem* pFilterItem = pFilterItems->Find(xText); - if (pFilterItem) - { - // remove the condition - ::std::vector<FmFilterData*>& rItems = pFilterItems->GetChilds(); - ::std::vector<FmFilterData*>::iterator j = ::std::find(rItems.begin(), rItems.end(), pFilterItem); - if (j != rItems.end()) - m_pModel->Remove(j, pFilterItem); - } - continue; - } - FmFormItem* pFormItem = PTR_CAST(FmFormItem, *i); - if (pFormItem) - DeleteItemsByText(pFormItem->GetChilds(), xText); + Reference< XIndexAccess > xElement( _rxControllers->getByIndex(i), UNO_QUERY ); + + // step down + AddOrRemoveListener( xElement, _bAdd ); + + // handle this particular controller + Reference< XFilterController > xController( xElement, UNO_QUERY ); + OSL_ENSURE( xController.is(), "FmFilterAdapter::InsertElements: no XFilterController, cannot sync data!" ); + if ( xController.is() ) + if ( _bAdd ) + xController->addFilterControllerListener( this ); + else + xController->removeFilterControllerListener( this ); } } //------------------------------------------------------------------------ -void FmFilterAdapter::InsertElements(const Reference< ::com::sun::star::container::XIndexAccess >& xControllers) +void FmFilterAdapter::setText(sal_Int32 nRowPos, + const FmFilterItem* pFilterItem, + const ::rtl::OUString& rText) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::InsertElements" ); - for (sal_Int32 i = 0, nLen = xControllers->getCount(); i < nLen; ++i) - { - Reference< ::com::sun::star::container::XIndexAccess > xElement; - xControllers->getByIndex(i) >>= xElement; + FmFormItem* pFormItem = PTR_CAST( FmFormItem, pFilterItem->GetParent()->GetParent() ); - // Insert the Elements of the controller - InsertElements(xElement); + try + { + Reference< XFilterController > xController( pFormItem->GetController(), UNO_QUERY_THROW ); + xController->setPredicateExpression( pFilterItem->GetComponentIndex(), nRowPos, rText ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } +} - // store the filter controls - FmXFormController* pController = FmXFormController::getImplementation( xElement.get() ); - DBG_ASSERT( pController, "FmFilterAdapter::InsertElements: no controller!" ); - const FmFilterControls& rControls = pController->getFilterControls(); - for (FmFilterControls::const_iterator iter = rControls.begin(); iter != rControls.end(); ++iter ) - m_aFilterControls.insert(*iter); - } +// XEventListener +//------------------------------------------------------------------------ +void SAL_CALL FmFilterAdapter::disposing(const EventObject& /*e*/) throw( RuntimeException ) +{ } -//------------------------------------------------------------------------------ -void FmFilterAdapter::RemoveElement(const Reference< ::com::sun::star::awt::XTextComponent > & xText) +//------------------------------------------------------------------------ +namespace { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::RemoveElement" ); - if (xText.is()) + ::rtl::OUString lcl_getLabelName_nothrow( const Reference< XControl >& _rxControl ) { - // alle Level durchlaufen und eintraege entfernen - if (m_pModel) - DeleteItemsByText(m_pModel->GetChilds(), xText); + ::rtl::OUString sLabelName; + try + { + Reference< XControl > xControl( _rxControl, UNO_SET_THROW ); + Reference< XPropertySet > xModel( xControl->getModel(), UNO_QUERY_THROW ); + sLabelName = getLabelName( xModel ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return sLabelName; + } - FmFilterControls::iterator iter = m_aFilterControls.find(xText); - if (iter != m_aFilterControls.end()) - m_aFilterControls.erase(iter); + Reference< XPropertySet > lcl_getBoundField_nothrow( const Reference< XControl >& _rxControl ) + { + Reference< XPropertySet > xField; + try + { + Reference< XControl > xControl( _rxControl, UNO_SET_THROW ); + Reference< XPropertySet > xModelProps( xControl->getModel(), UNO_QUERY_THROW ); + xField.set( xModelProps->getPropertyValue( FM_PROP_BOUNDFIELD ), UNO_QUERY_THROW ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return xField; } } +// XFilterControllerListener //------------------------------------------------------------------------ -Reference< ::com::sun::star::beans::XPropertySet > FmFilterAdapter::getField(const Reference< ::com::sun::star::awt::XTextComponent > & xText) const +void FmFilterAdapter::predicateExpressionChanged( const FilterEvent& _Event ) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::getField" ); - Reference< ::com::sun::star::beans::XPropertySet > xField; - FmFilterControls::const_iterator i = m_aFilterControls.find(xText); - if (i != m_aFilterControls.end()) - xField = (*i).second; + ::vos::OGuard aGuard( Application::GetSolarMutex() ); - return xField; -} + if ( !m_pModel ) + return; -//------------------------------------------------------------------------ -void FmFilterAdapter::setText(sal_Int32 nRowPos, - const FmFilterItem* pFilterItem, - const ::rtl::OUString& rText) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::setText" ); - // set the text for the text component - Reference< ::com::sun::star::awt::XTextComponent > xText(pFilterItem->GetTextComponent()); - xText->setText(rText); + // the controller which sent the event + Reference< XFormController > xController( _Event.Source, UNO_QUERY_THROW ); + Reference< XFilterController > xFilterController( _Event.Source, UNO_QUERY_THROW ); + Reference< XForm > xForm( xController->getModel(), UNO_QUERY_THROW ); - // get the controller of the text component and its filter rows - FmFormItem* pFormItem = PTR_CAST(FmFormItem,pFilterItem->GetParent()->GetParent()); - FmXFormController* pController = FmXFormController::getImplementation( pFormItem->GetController().get() ); - DBG_ASSERT( pController, "FmFilterAdapter::setText: no controller!" ); - FmFilterRows& rRows = pController->getFilterRows(); + FmFormItem* pFormItem = m_pModel->Find( m_pModel->m_aChildren, xForm ); + OSL_ENSURE( pFormItem, "FmFilterAdapter::predicateExpressionChanged: don't know this form!" ); + if ( !pFormItem ) + return; - DBG_ASSERT(nRowPos < (sal_Int32)rRows.size(), "wrong row pos"); - // Suchen der aktuellen Row - FmFilterRow& rRow = rRows[nRowPos]; + const sal_Int32 nActiveTerm( xFilterController->getActiveTerm() ); - // do we have a new filter - if (rText.getLength()) - rRow[xText] = rText; - else + FmFilterItems* pFilter = PTR_CAST( FmFilterItems, pFormItem->GetChildren()[ nActiveTerm ] ); + FmFilterItem* pFilterItem = pFilter->Find( _Event.FilterComponent ); + if ( pFilterItem ) { - // 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); + if ( _Event.PredicateExpression.getLength()) + { + pFilterItem->SetText( _Event.PredicateExpression ); + // UI benachrichtigen + FmFilterTextChangedHint aChangeHint(pFilterItem); + m_pModel->Broadcast( aChangeHint ); + } + else + { + // no text anymore so remove the condition + m_pModel->Remove(pFilterItem); + } } -} + else + { + // searching the component by field name + ::rtl::OUString aFieldName( lcl_getLabelName_nothrow( xFilterController->getFilterComponent( _Event.FilterComponent ) ) ); + pFilterItem = new FmFilterItem( m_pModel->getORB(), pFilter, aFieldName, _Event.PredicateExpression, _Event.FilterComponent ); + m_pModel->Insert(pFilter->GetChildren().end(), pFilterItem); + } -// ::com::sun::star::lang::XEventListener -//------------------------------------------------------------------------ -void SAL_CALL FmFilterAdapter::disposing(const ::com::sun::star::lang::EventObject& e) throw( RuntimeException ) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::disposing" ); - Reference< ::com::sun::star::awt::XTextComponent > xText(e.Source,UNO_QUERY); - if (xText.is()) - RemoveElement(xText); + // ensure there's one empty term in the filter, just in case the active term was previously empty + m_pModel->EnsureEmptyFilterRows( *pFormItem ); } -// XTextListener //------------------------------------------------------------------------ -Reference< ::com::sun::star::form::XForm > FmFilterAdapter::findForm(const Reference< ::com::sun::star::container::XChild >& xChild) +void SAL_CALL FmFilterAdapter::disjunctiveTermRemoved( const FilterEvent& _Event ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::findForm" ); - Reference< ::com::sun::star::form::XForm > xForm; - if (xChild.is()) + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + Reference< XFormController > xController( _Event.Source, UNO_QUERY_THROW ); + Reference< XFilterController > xFilterController( _Event.Source, UNO_QUERY_THROW ); + Reference< XForm > xForm( xController->getModel(), UNO_QUERY_THROW ); + + FmFormItem* pFormItem = m_pModel->Find( m_pModel->m_aChildren, xForm ); + OSL_ENSURE( pFormItem, "FmFilterAdapter::disjunctiveTermRemoved: don't know this form!" ); + if ( !pFormItem ) + return; + + ::std::vector< FmFilterData* >& rTermItems = pFormItem->GetChildren(); + const bool bValidIndex = ( _Event.DisjunctiveTerm >= 0 ) && ( (size_t)_Event.DisjunctiveTerm < rTermItems.size() ); + OSL_ENSURE( bValidIndex, "FmFilterAdapter::disjunctiveTermRemoved: invalid term index!" ); + if ( !bValidIndex ) + return; + + // if the first term was removed, then the to-be first term needs its text updated + if ( _Event.DisjunctiveTerm == 0 ) { - xForm = Reference< ::com::sun::star::form::XForm >(xChild->getParent(), UNO_QUERY); - if (!xForm.is()) - xForm = findForm(Reference< ::com::sun::star::container::XChild >(xChild->getParent(), UNO_QUERY)); + rTermItems[1]->SetText( String( SVX_RES( RID_STR_FILTER_FILTER_FOR ) ) ); + FmFilterTextChangedHint aChangeHint( rTermItems[1] ); + m_pModel->Broadcast( aChangeHint ); } - return xForm; + + // finally remove the entry from the model + m_pModel->Remove( rTermItems.begin() + _Event.DisjunctiveTerm ); + + // ensure there's one empty term in the filter, just in case the currently removed one was the last empty one + m_pModel->EnsureEmptyFilterRows( *pFormItem ); } -// XTextListener //------------------------------------------------------------------------ -void FmFilterAdapter::textChanged(const ::com::sun::star::awt::TextEvent& e) throw( ::com::sun::star::uno::RuntimeException ) +void SAL_CALL FmFilterAdapter::disjunctiveTermAdded( const FilterEvent& _Event ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterAdapter::textChanged" ); - // Find the according formitem in the - Reference< ::com::sun::star::awt::XControl > xControl(e.Source, UNO_QUERY); - if (!m_pModel || !xControl.is()) - return; + ::vos::OGuard aGuard( Application::GetSolarMutex() ); - Reference< ::com::sun::star::form::XForm > xForm(findForm(Reference< ::com::sun::star::container::XChild >(xControl->getModel(), UNO_QUERY))); - if (!xForm.is()) + Reference< XFormController > xController( _Event.Source, UNO_QUERY_THROW ); + Reference< XFilterController > xFilterController( _Event.Source, UNO_QUERY_THROW ); + Reference< XForm > xForm( xController->getModel(), UNO_QUERY_THROW ); + + FmFormItem* pFormItem = m_pModel->Find( m_pModel->m_aChildren, xForm ); + OSL_ENSURE( pFormItem, "FmFilterAdapter::disjunctiveTermAdded: don't know this form!" ); + if ( !pFormItem ) return; - FmFormItem* pFormItem = m_pModel->Find(m_pModel->m_aChilds, xForm); - if (pFormItem) + const sal_Int32 nInsertPos = _Event.DisjunctiveTerm; + bool bValidIndex = ( nInsertPos >= 0 ) && ( (size_t)nInsertPos <= pFormItem->GetChildren().size() ); + if ( !bValidIndex ) { - Reference< ::com::sun::star::awt::XTextComponent > xText(e.Source, UNO_QUERY); - FmFilterItems* pFilter = PTR_CAST(FmFilterItems, pFormItem->GetChilds()[pFormItem->GetCurrentPosition()]); - FmFilterItem* pFilterItem = pFilter->Find(xText); - if (pFilterItem) - { - if (xText->getText().getLength()) - { - pFilterItem->SetText(xText->getText()); - // UI benachrichtigen - FmFilterTextChangedHint aChangeHint(pFilterItem); - m_pModel->Broadcast( aChangeHint ); - } - else - { - // no text anymore so remove the condition - m_pModel->Remove(pFilterItem); - } - } - else - { - // searching the component by field name - ::rtl::OUString aFieldName = getLabelName(Reference< ::com::sun::star::beans::XPropertySet > (Reference< ::com::sun::star::awt::XControl > (xText, UNO_QUERY)->getModel(),UNO_QUERY)); - - pFilterItem = new FmFilterItem(m_pModel->getORB(),pFilter, aFieldName, xText->getText(), xText); - m_pModel->Insert(pFilter->GetChilds().end(), pFilterItem); - } - m_pModel->CheckIntegrity(pFormItem); + OSL_ENSURE( false, "FmFilterAdapter::disjunctiveTermAdded: invalid index!" ); + return; } + + const ::std::vector< FmFilterData* >::iterator insertPos = pFormItem->GetChildren().begin() + nInsertPos; + + FmFilterItems* pFilterItems = new FmFilterItems( m_pModel->getORB(), pFormItem, String( SVX_RES( RID_STR_FILTER_FILTER_OR ) ) ); + m_pModel->Insert( insertPos, pFilterItems ); } //======================================================================== @@ -559,14 +560,13 @@ void FmFilterAdapter::textChanged(const ::com::sun::star::awt::TextEvent& e) thr //======================================================================== TYPEINIT1(FmFilterModel, FmParentData); //------------------------------------------------------------------------ -FmFilterModel::FmFilterModel(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) +FmFilterModel::FmFilterModel(const Reference< XMultiServiceFactory >& _rxFactory) :FmParentData(_rxFactory,NULL, ::rtl::OUString()) ,OSQLParserClient(_rxFactory) ,m_xORB(_rxFactory) ,m_pAdapter(NULL) ,m_pCurrentItems(NULL) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::FmFilterModel" ); } //------------------------------------------------------------------------ @@ -578,7 +578,6 @@ FmFilterModel::~FmFilterModel() //------------------------------------------------------------------------ void FmFilterModel::Clear() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Clear" ); // notify FilterClearingHint aClearedHint; Broadcast( aClearedHint ); @@ -595,18 +594,17 @@ void FmFilterModel::Clear() m_xController = NULL; m_xControllers = NULL; - for (::std::vector<FmFilterData*>::const_iterator i = m_aChilds.begin(); - i != m_aChilds.end(); i++) + for (::std::vector<FmFilterData*>::const_iterator i = m_aChildren.begin(); + i != m_aChildren.end(); i++) delete (*i); - m_aChilds.clear(); + m_aChildren.clear(); } //------------------------------------------------------------------------ -void FmFilterModel::Update(const Reference< ::com::sun::star::container::XIndexAccess > & xControllers, const Reference< ::com::sun::star::form::XFormController > & xCurrent) +void FmFilterModel::Update(const Reference< XIndexAccess > & xControllers, const Reference< XFormController > & xCurrent) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Update" ); - if ((::com::sun::star::form::XFormController*) xCurrent.get() == (::com::sun::star::form::XFormController*) m_xController.get()) + if ( xCurrent == m_xController ) return; if (!xControllers.is()) @@ -616,7 +614,7 @@ void FmFilterModel::Update(const Reference< ::com::sun::star::container::XIndexA } // there is only a new current controller - if ((::com::sun::star::container::XIndexAccess*)m_xControllers.get() != (::com::sun::star::container::XIndexAccess*)xControllers.get()) + if ( m_xControllers != xControllers ) { Clear(); @@ -630,77 +628,95 @@ void FmFilterModel::Update(const Reference< ::com::sun::star::container::XIndexA m_pAdapter->acquire(); SetCurrentController(xCurrent); - CheckIntegrity(this); + EnsureEmptyFilterRows( *this ); } else SetCurrentController(xCurrent); } //------------------------------------------------------------------------ -void FmFilterModel::Update(const Reference< ::com::sun::star::container::XIndexAccess > & xControllers, FmParentData* pParent) +void FmFilterModel::Update(const Reference< XIndexAccess > & xControllers, FmParentData* pParent) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Update" ); - sal_Int32 nCount = xControllers->getCount(); - for (sal_Int32 i = 0; i < nCount; i++) + try { - Reference< ::com::sun::star::form::XFormController > xController; - xControllers->getByIndex(i) >>= xController; - Reference< ::com::sun::star::beans::XPropertySet > xModelAsSet(xController->getModel(), UNO_QUERY); - ::rtl::OUString aName = ::comphelper::getString(xModelAsSet->getPropertyValue(FM_PROP_NAME)); + sal_Int32 nCount = xControllers->getCount(); + for ( sal_Int32 i = 0; i < nCount; ++i ) + { + Reference< XFormController > xController( xControllers->getByIndex(i), UNO_QUERY_THROW ); - // Insert a new ::com::sun::star::form - FmFormItem* pFormItem = new FmFormItem(m_xORB,pParent, xController, aName); - Insert(pParent->GetChilds().end(), pFormItem); + Reference< XPropertySet > xFormProperties( xController->getModel(), UNO_QUERY_THROW ); + ::rtl::OUString aName; + OSL_VERIFY( xFormProperties->getPropertyValue( FM_PROP_NAME ) >>= aName ); - // And now insert the filters for the form - FmXFormController* pController = FmXFormController::getImplementation( pFormItem->GetController().get() ); - DBG_ASSERT( pController, "FmFilterAdapter::Update: no controller!" ); + // Insert a new item for the form + FmFormItem* pFormItem = new FmFormItem( m_xORB, pParent, xController, aName ); + Insert( pParent->GetChildren().end(), pFormItem ); - INT32 nPos = pController->getCurrentFilterPosition(); - pFormItem->SetCurrentPosition(nPos); + Reference< XFilterController > xFilterController( pFormItem->GetFilterController(), UNO_SET_THROW ); - String aTitle(SVX_RES(RID_STR_FILTER_FILTER_FOR)); - const FmFilterRows& rRows = pController->getFilterRows(); - for (FmFilterRows::const_iterator iter = rRows.begin(); iter != rRows.end(); ++iter) - { - const FmFilterRow& rRow = *iter; - // now add the filter rows - // One Row always exists + // insert the existing filters for the form + String aTitle( SVX_RES( RID_STR_FILTER_FILTER_FOR ) ); - FmFilterItems* pFilterItems = new FmFilterItems(m_xORB,pFormItem, aTitle); - Insert(pFormItem->GetChilds().end(), pFilterItems); - for (FmFilterRow::const_iterator iter1 = rRow.begin(); iter1 != rRow.end(); ++iter1) + Sequence< Sequence< ::rtl::OUString > > aExpressions = xFilterController->getPredicateExpressions(); + for ( const Sequence< ::rtl::OUString >* pConjunctionTerm = aExpressions.getConstArray(); + pConjunctionTerm != aExpressions.getConstArray() + aExpressions.getLength(); + ++pConjunctionTerm + ) { - // insert new and conditons - ::rtl::OUString aFieldName = getLabelName(Reference< ::com::sun::star::beans::XPropertySet > (Reference< ::com::sun::star::awt::XControl > ((*iter1).first, UNO_QUERY)->getModel(),UNO_QUERY)); - FmFilterItem* pANDCondition = new FmFilterItem(m_xORB,pFilterItems, aFieldName, (*iter1).second, (*iter1).first); - Insert(pFilterItems->GetChilds().end(), pANDCondition); + // we always display one row, even if there's no term to be displayed + FmFilterItems* pFilterItems = new FmFilterItems( m_xORB, pFormItem, aTitle ); + Insert( pFormItem->GetChildren().end(), pFilterItems ); + + const Sequence< ::rtl::OUString >& rDisjunction( *pConjunctionTerm ); + for ( const ::rtl::OUString* pDisjunctiveTerm = rDisjunction.getConstArray(); + pDisjunctiveTerm != rDisjunction.getConstArray() + rDisjunction.getLength(); + ++pDisjunctiveTerm + ) + { + if ( pDisjunctiveTerm->getLength() == 0 ) + // no condition for this particular component in this particular conjunction term + continue; + + const sal_Int32 nComponentIndex = pDisjunctiveTerm - rDisjunction.getConstArray(); + + // determine the display name of the control + const Reference< XControl > xFilterControl( xFilterController->getFilterComponent( nComponentIndex ) ); + const ::rtl::OUString sDisplayName( lcl_getLabelName_nothrow( xFilterControl ) ); + + // insert a new entry + FmFilterItem* pANDCondition = new FmFilterItem( m_xORB, pFilterItems, sDisplayName, *pDisjunctiveTerm, nComponentIndex ); + Insert( pFilterItems->GetChildren().end(), pANDCondition ); + } + + // title for the next conditions + aTitle = SVX_RES( RID_STR_FILTER_FILTER_OR ); } - // title for the next conditions - aTitle = SVX_RES(RID_STR_FILTER_FILTER_OR); - } - // now add dependent controllers - Reference< ::com::sun::star::container::XIndexAccess > xControllerAsIndex(xController, UNO_QUERY); - Update(xControllerAsIndex, pFormItem); + // now add dependent controllers + Reference< XIndexAccess > xControllerAsIndex( xController, UNO_QUERY ); + Update( xControllerAsIndex, pFormItem ); + } + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); } } //------------------------------------------------------------------------ -FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, const Reference< ::com::sun::star::form::XFormController > & xController) const +FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, const Reference< XFormController > & xController) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Find" ); for (::std::vector<FmFilterData*>::const_iterator i = rItems.begin(); i != rItems.end(); i++) { FmFormItem* pForm = PTR_CAST(FmFormItem,*i); if (pForm) { - if ((::com::sun::star::form::XFormController*)xController.get() == (::com::sun::star::form::XFormController*)pForm->GetController().get()) + if ( xController == pForm->GetController() ) return pForm; else { - pForm = Find(pForm->GetChilds(), xController); + pForm = Find(pForm->GetChildren(), xController); if (pForm) return pForm; } @@ -710,9 +726,8 @@ FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, cons } //------------------------------------------------------------------------ -FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, const Reference< ::com::sun::star::form::XForm >& xForm) const +FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, const Reference< XForm >& xForm) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Find" ); for (::std::vector<FmFilterData*>::const_iterator i = rItems.begin(); i != rItems.end(); i++) { @@ -723,7 +738,7 @@ FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, cons return pForm; else { - pForm = Find(pForm->GetChilds(), xForm); + pForm = Find(pForm->GetChildren(), xForm); if (pForm) return pForm; } @@ -733,58 +748,64 @@ FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, cons } //------------------------------------------------------------------------ -void FmFilterModel::SetCurrentController(const Reference< ::com::sun::star::form::XFormController > & xCurrent) +void FmFilterModel::SetCurrentController(const Reference< XFormController > & xCurrent) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::SetCurrentController" ); - if ((::com::sun::star::form::XFormController*) xCurrent.get() == (::com::sun::star::form::XFormController*) m_xController.get()) + if ( xCurrent == m_xController ) return; m_xController = xCurrent; - FmFormItem* pItem = Find(m_aChilds, xCurrent); - if (pItem) + FmFormItem* pItem = Find( m_aChildren, xCurrent ); + if ( !pItem ) + return; + + try + { + Reference< XFilterController > xFilterController( m_xController, UNO_QUERY_THROW ); + const sal_Int32 nActiveTerm( xFilterController->getActiveTerm() ); + if ( pItem->GetChildren().size() > (size_t)nActiveTerm ) + { + SetCurrentItems( static_cast< FmFilterItems* >( pItem->GetChildren()[ nActiveTerm ] ) ); + } + } + catch( const Exception& ) { - if ( (USHORT)pItem->GetChilds().size() > pItem->GetCurrentPosition() ) - SetCurrentItems( static_cast< FmFilterItems* >( pItem->GetChilds()[ pItem->GetCurrentPosition() ] ) ); + DBG_UNHANDLED_EXCEPTION(); } } //------------------------------------------------------------------------ -void FmFilterModel::AppendFilterItems(FmFormItem* pFormItem) +void FmFilterModel::AppendFilterItems( FmFormItem& _rFormItem ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::AppendFilterItems" ); - DBG_ASSERT(pFormItem, "AppendFilterItems(): no form item present"); - - FmFilterItems* pFilterItems = new FmFilterItems(m_xORB,pFormItem, ::rtl::OUString(String(SVX_RES(RID_STR_FILTER_FILTER_OR)))); // insert the condition behind the last filter items ::std::vector<FmFilterData*>::reverse_iterator iter; - for (iter = pFormItem->GetChilds().rbegin(); - // link problems with operator == - iter.base() != pFormItem->GetChilds().rend().base(); iter++) + for ( iter = _rFormItem.GetChildren().rbegin(); + iter != _rFormItem.GetChildren().rend(); + ++iter + ) { if ((*iter)->ISA(FmFilterItems)) break; } - sal_Int32 nInsertPos = iter.base() - pFormItem->GetChilds().rend().base(); - ::std::vector<FmFilterData*>::iterator i = pFormItem->GetChilds().begin() + nInsertPos; - Insert(i, pFilterItems); - - // do we need a new row - FmXFormController* pController = FmXFormController::getImplementation( pFormItem->GetController().get() ); - DBG_ASSERT( pController, "FmFilterAdapter::AppendFilterItems: no controller!" ); - FmFilterRows& rRows = pController->getFilterRows(); - - // determine the filter position - if (nInsertPos >= (sal_Int32)rRows.size()) - rRows.push_back(FmFilterRow()); + sal_Int32 nInsertPos = iter.base() - _rFormItem.GetChildren().begin(); + // delegate this to the FilterController, it will notify us, which will let us update our model + try + { + Reference< XFilterController > xFilterController( _rFormItem.GetFilterController(), UNO_SET_THROW ); + if ( nInsertPos >= xFilterController->getDisjunctiveTerms() ) + xFilterController->appendEmptyDisjunctiveTerm(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } } //------------------------------------------------------------------------ void FmFilterModel::Insert(const ::std::vector<FmFilterData*>::iterator& rPos, FmFilterData* pData) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Insert" ); - ::std::vector<FmFilterData*>& rItems = pData->GetParent()->GetChilds(); + ::std::vector<FmFilterData*>& rItems = pData->GetParent()->GetChildren(); sal_Int32 nPos = rPos == rItems.end() ? LIST_APPEND : rPos - rItems.begin(); rItems.insert(rPos, pData); @@ -796,9 +817,8 @@ void FmFilterModel::Insert(const ::std::vector<FmFilterData*>::iterator& rPos, F //------------------------------------------------------------------------ void FmFilterModel::Remove(FmFilterData* pData) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Remove" ); FmParentData* pParent = pData->GetParent(); - ::std::vector<FmFilterData*>& rItems = pParent->GetChilds(); + ::std::vector<FmFilterData*>& rItems = pParent->GetChildren(); // erase the item from the model ::std::vector<FmFilterData*>::iterator i = ::std::find(rItems.begin(), rItems.end(), pData); @@ -808,80 +828,32 @@ void FmFilterModel::Remove(FmFilterData* pData) if (pData->ISA(FmFilterItems)) { FmFormItem* pFormItem = (FmFormItem*)pParent; - FmXFormController* pController = FmXFormController::getImplementation( pFormItem->GetController().get() ); - DBG_ASSERT( pController, "FmFilterAdapter::Remove: no controller!" ); - FmFilterRows& rRows = pController->getFilterRows(); - // how many entries do we have - // it's the last row than we just empty it - if (nPos == (sal_Int32)(rRows.size() - 1)) - { - // remove all childs and stay current - ::std::vector<FmFilterData*>& rChilds = ((FmFilterItems*)pData)->GetChilds(); - while (!rChilds.empty()) - { - ::std::vector<FmFilterData*>::iterator j = rChilds.end(); - j--; - - // we stay on the level so delete each item explizit to clean the controls - sal_Int32 nParentPos = j - rChilds.begin(); - // EmptyText removes the filter - FmFilterItem* pFilterItem = PTR_CAST(FmFilterItem, *j); - m_pAdapter->setText(nParentPos, pFilterItem, ::rtl::OUString()); - Remove(j, pFilterItem); - } - } - else // delete the row + try { - // if the row is on the current position we have to away from that position. - // than we can delete it - if (nPos == pFormItem->GetCurrentPosition()) - { - ::std::vector<FmFilterData*>::iterator j = i; - - // give a new current postion - if (nPos < (sal_Int32)(rRows.size() - 1)) - // set it to the next row - ++j; - else - // set it to the previous row - --j; - - // if necessary we have the formItem for the current controller - // than we have to adjust the data displayed in the form - pFormItem->SetCurrentPosition(j - rItems.begin()); - pController->setCurrentFilterPosition(j - rItems.begin()); - - // Keep the view consistent and force and new painting - FmFilterTextChangedHint aChangeHint(*j); - Broadcast( aChangeHint ); - } + Reference< XFilterController > xFilterController( pFormItem->GetFilterController(), UNO_SET_THROW ); - // now delete the entry - // before deleting we have to shift the current position of the form if necessary - if (nPos < pFormItem->GetCurrentPosition()) + bool bEmptyLastTerm = ( ( nPos == 0 ) && xFilterController->getDisjunctiveTerms() == 1 ); + if ( bEmptyLastTerm ) { - pFormItem->SetCurrentPosition(pFormItem->GetCurrentPosition() - 1); - pController->decrementCurrentFilterPosition(); - - // is it the first row, than the nex row has to recieve a different name - if (nPos == 0) + // remove all children (by setting an empty predicate expression) + ::std::vector< FmFilterData* >& rChildren = ((FmFilterItems*)pData)->GetChildren(); + while ( !rChildren.empty() ) { - // ensure that the text labels are consistent - rItems[1]->SetText(String(SVX_RES(RID_STR_FILTER_FILTER_FOR))); - FmFilterTextChangedHint aChangeHint(rItems[1]); - Broadcast( aChangeHint ); + ::std::vector< FmFilterData* >::iterator removePos = rChildren.end() - 1; + FmFilterItem* pFilterItem = PTR_CAST( FmFilterItem, *removePos ); + m_pAdapter->setText( nPos, pFilterItem, ::rtl::OUString() ); + Remove( removePos ); } } - - // delete it - rRows.erase(rRows.begin() + nPos); - - // and keep the controller consistent - DBG_ASSERT(rRows.size() != 0, "wrong row size"); - - // and remove it from the model - Remove(i, pData); + else + { + xFilterController->removeDisjunctiveTerm( nPos ); + } + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); } } else // FormItems can not be deleted @@ -894,26 +866,26 @@ void FmFilterModel::Remove(FmFilterData* pData) else { // find the position of the father within his father - ::std::vector<FmFilterData*>& rParentParentItems = pData->GetParent()->GetParent()->GetChilds(); + ::std::vector<FmFilterData*>& rParentParentItems = pData->GetParent()->GetParent()->GetChildren(); ::std::vector<FmFilterData*>::iterator j = ::std::find(rParentParentItems.begin(), rParentParentItems.end(), pFilterItem->GetParent()); DBG_ASSERT(j != rParentParentItems.end(), "FmFilterModel::Remove(): unknown Item"); sal_Int32 nParentPos = j - rParentParentItems.begin(); // EmptyText removes the filter m_pAdapter->setText(nParentPos, pFilterItem, ::rtl::OUString()); - Remove(i, pData); + Remove( i ); } } } //------------------------------------------------------------------------ -void FmFilterModel::Remove(const ::std::vector<FmFilterData*>::iterator& rPos, FmFilterData* pData) +void FmFilterModel::Remove( const ::std::vector<FmFilterData*>::iterator& rPos ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Remove" ); - ::std::vector<FmFilterData*>& rItems = pData->GetParent()->GetChilds(); - rItems.erase(rPos); + // remove from parent's child list + FmFilterData* pData = *rPos; + pData->GetParent()->GetChildren().erase( rPos ); - // UI benachrichtigen + // notify the view, this will remove the actual SvLBoxEntry FmFilterRemovedHint aRemoveHint( pData ); Broadcast( aRemoveHint ); @@ -923,46 +895,58 @@ void FmFilterModel::Remove(const ::std::vector<FmFilterData*>::iterator& rPos, F //------------------------------------------------------------------------ sal_Bool FmFilterModel::ValidateText(FmFilterItem* pItem, UniString& rText, UniString& rErrorMsg) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::ValidateText" ); - // check the input - Reference< XPropertySet > xField(m_pAdapter->getField(pItem->GetTextComponent())); - - OStaticDataAccessTools aStaticTools; - Reference< XConnection > xConnection(aStaticTools.getRowSetConnection(Reference< XRowSet > (m_xController->getModel(), UNO_QUERY))); - Reference< ::com::sun::star::util::XNumberFormatsSupplier > xFormatSupplier = aStaticTools.getNumberFormats(xConnection, sal_True); - - Reference< ::com::sun::star::util::XNumberFormatter > xFormatter(m_xORB->createInstance(FM_NUMBER_FORMATTER), UNO_QUERY); - xFormatter->attachNumberFormatsSupplier(xFormatSupplier); - - ::rtl::OUString aErr, aTxt(rText); - ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree(aErr, aTxt, xFormatter, xField); - rErrorMsg = aErr; - rText = aTxt; - if (xParseNode.is()) + FmFormItem* pFormItem = PTR_CAST( FmFormItem, pItem->GetParent()->GetParent() ); + try { - ::rtl::OUString aPreparedText; - ::com::sun::star::lang::Locale aAppLocale = Application::GetSettings().GetUILocale(); - xParseNode->parseNodeToPredicateStr( - aPreparedText, xConnection, xFormatter, xField, aAppLocale, '.', getParseContext() ); - rText = aPreparedText; - return sal_True; + Reference< XFormController > xFormController( pFormItem->GetController() ); + // obtain the connection of the form belonging to the controller + OStaticDataAccessTools aStaticTools; + Reference< XRowSet > xRowSet( xFormController->getModel(), UNO_QUERY_THROW ); + Reference< XConnection > xConnection( aStaticTools.getRowSetConnection( xRowSet ) ); + + // obtain a number formatter for this connection + // TODO: shouldn't this be cached? + Reference< XNumberFormatsSupplier > xFormatSupplier = aStaticTools.getNumberFormats( xConnection, sal_True ); + Reference< XNumberFormatter > xFormatter( m_xORB->createInstance( FM_NUMBER_FORMATTER ), UNO_QUERY ); + xFormatter->attachNumberFormatsSupplier( xFormatSupplier ); + + // get the field (database column) which the item is responsible for + Reference< XFilterController > xFilterController( xFormController, UNO_QUERY_THROW ); + Reference< XPropertySet > xField( lcl_getBoundField_nothrow( xFilterController->getFilterComponent( pItem->GetComponentIndex() ) ), UNO_SET_THROW ); + + // parse the given text as filter predicate + ::rtl::OUString aErr, aTxt( rText ); + ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree( aErr, aTxt, xFormatter, xField ); + rErrorMsg = aErr; + rText = aTxt; + if ( xParseNode.is() ) + { + ::rtl::OUString aPreparedText; + Locale aAppLocale = Application::GetSettings().GetUILocale(); + xParseNode->parseNodeToPredicateStr( + aPreparedText, xConnection, xFormatter, xField, aAppLocale, '.', getParseContext() ); + rText = aPreparedText; + return sal_True; + } } - else - return sal_False; + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + + return sal_False; } //------------------------------------------------------------------------ void FmFilterModel::Append(FmFilterItems* pItems, FmFilterItem* pFilterItem) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::Append" ); - Insert(pItems->GetChilds().end(), pFilterItem); + Insert(pItems->GetChildren().end(), pFilterItem); } //------------------------------------------------------------------------ void FmFilterModel::SetTextForItem(FmFilterItem* pItem, const ::rtl::OUString& rText) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::SetTextForItem" ); - ::std::vector<FmFilterData*>& rItems = pItem->GetParent()->GetParent()->GetChilds(); + ::std::vector<FmFilterData*>& rItems = pItem->GetParent()->GetParent()->GetChildren(); ::std::vector<FmFilterData*>::iterator i = ::std::find(rItems.begin(), rItems.end(), pItem->GetParent()); sal_Int32 nParentPos = i - rItems.begin(); @@ -982,7 +966,6 @@ void FmFilterModel::SetTextForItem(FmFilterItem* pItem, const ::rtl::OUString& r //------------------------------------------------------------------------ void FmFilterModel::SetCurrentItems(FmFilterItems* pCurrent) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::SetCurrentItems" ); if (m_pCurrentItems == pCurrent) return; @@ -990,21 +973,26 @@ void FmFilterModel::SetCurrentItems(FmFilterItems* pCurrent) if (pCurrent) { FmFormItem* pFormItem = (FmFormItem*)pCurrent->GetParent(); - ::std::vector<FmFilterData*>& rItems = pFormItem->GetChilds(); + ::std::vector<FmFilterData*>& rItems = pFormItem->GetChildren(); ::std::vector<FmFilterData*>::const_iterator i = ::std::find(rItems.begin(), rItems.end(), pCurrent); if (i != rItems.end()) { // determine the filter position sal_Int32 nPos = i - rItems.begin(); - FmXFormController* pController = FmXFormController::getImplementation( pFormItem->GetController().get() ); - DBG_ASSERT( pController, "FmFilterAdapter::SetCurrentItems: no controller!" ); - pController->setCurrentFilterPosition(nPos); - pFormItem->SetCurrentPosition(nPos); + try + { + Reference< XFilterController > xFilterController( pFormItem->GetFilterController(), UNO_SET_THROW ); + xFilterController->setActiveTerm( nPos ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } - if ((::com::sun::star::form::XFormController*)m_xController.get() != (::com::sun::star::form::XFormController*)pFormItem->GetController().get()) + if ( m_xController != pFormItem->GetController() ) // calls SetCurrentItems again - SetCurrentController(pFormItem->GetController()); + SetCurrentController( pFormItem->GetController() ); else m_pCurrentItems = pCurrent; } @@ -1021,33 +1009,39 @@ void FmFilterModel::SetCurrentItems(FmFilterItems* pCurrent) } //------------------------------------------------------------------------ -void FmFilterModel::CheckIntegrity(FmParentData* pItem) +void FmFilterModel::EnsureEmptyFilterRows( FmParentData& _rItem ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterModel::CheckIntegrity" ); // checks whether for each form there's one free level for input + ::std::vector< FmFilterData* >& rChildren = _rItem.GetChildren(); + sal_Bool bAppendLevel = _rItem.ISA( FmFormItem ); - ::std::vector<FmFilterData*>& rItems = pItem->GetChilds(); - sal_Bool bAppendLevel = sal_False; - - for (::std::vector<FmFilterData*>::iterator i = rItems.begin(); - i != rItems.end(); i++) + for ( ::std::vector<FmFilterData*>::iterator i = rChildren.begin(); + i != rChildren.end(); + ++i + ) { FmFilterItems* pItems = PTR_CAST(FmFilterItems, *i); - if (pItems) + if ( pItems && pItems->GetChildren().empty() ) { - bAppendLevel = !pItems->GetChilds().empty(); - continue; + bAppendLevel = sal_False; + break; } FmFormItem* pFormItem = PTR_CAST(FmFormItem, *i); if (pFormItem) { - CheckIntegrity(pFormItem); + EnsureEmptyFilterRows( *pFormItem ); continue; } } - if (bAppendLevel) - AppendFilterItems((FmFormItem*)pItem); + + if ( bAppendLevel ) + { + FmFormItem* pFormItem = PTR_CAST( FmFormItem, &_rItem ); + OSL_ENSURE( pFormItem, "FmFilterModel::EnsureEmptyFilterRows: no FmFormItem, but a FmFilterItems child?" ); + if ( pFormItem ) + AppendFilterItems( *pFormItem ); + } } //======================================================================== @@ -1069,25 +1063,31 @@ void FmFilterItemsString::Paint(const Point& rPos, SvLBox& rDev, sal_uInt16 /*nF { FmFilterItems* pRow = (FmFilterItems*)pEntry->GetUserData(); FmFormItem* pForm = (FmFormItem*)pRow->GetParent(); + // current filter is significant painted - if (pForm->GetChilds()[pForm->GetCurrentPosition()] == pRow) + const bool bIsCurrentFilter = pForm->GetChildren()[ pForm->GetFilterController()->getActiveTerm() ] == pRow; + if ( bIsCurrentFilter ) { - Color aLineColor(rDev.GetLineColor()); - Rectangle aRect(rPos, GetSize(&rDev, pEntry )); - Point aFirst(rPos.X(), aRect.Bottom() - 6); - Point aSecond(aFirst.X() + 2, aFirst.Y() + 3); + rDev.Push( PUSH_LINECOLOR ); + + rDev.SetLineColor( rDev.GetTextColor() ); - rDev.SetLineColor(rDev.GetTextColor()); - rDev.DrawLine(aFirst, aSecond); + Rectangle aRect( rPos, GetSize( &rDev, pEntry ) ); + Point aFirst( rPos.X(), aRect.Bottom() - 6 ); + Point aSecond(aFirst .X() + 2, aFirst.Y() + 3 ); + + rDev.DrawLine( aFirst, aSecond ); aFirst = aSecond; aFirst.X() += 1; aSecond.X() += 6; aSecond.Y() -= 5; - rDev.DrawLine(aFirst, aSecond); - rDev.SetLineColor( aLineColor ); + rDev.DrawLine( aFirst, aSecond ); + + rDev.Pop(); } + rDev.DrawText( Point(rPos.X() + nxDBmp, rPos.Y()), GetText() ); } @@ -1168,7 +1168,6 @@ FmFilterNavigator::FmFilterNavigator( Window* pParent ) ,m_aTimerCounter( 0 ) ,m_aDropActionType( DA_SCROLLUP ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::FmFilterNavigator" ); SetHelpId( HID_FILTER_NAVIGATOR ); { @@ -1211,14 +1210,12 @@ FmFilterNavigator::~FmFilterNavigator() //------------------------------------------------------------------------ void FmFilterNavigator::Clear() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::Clear" ); m_pModel->Clear(); } //------------------------------------------------------------------------ -void FmFilterNavigator::UpdateContent(const Reference< ::com::sun::star::container::XIndexAccess > & xControllers, const Reference< ::com::sun::star::form::XFormController > & xCurrent) +void FmFilterNavigator::UpdateContent(const Reference< XIndexAccess > & xControllers, const Reference< XFormController > & xCurrent) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::UpdateContent" ); if (xCurrent == m_pModel->GetCurrentController()) return; @@ -1246,7 +1243,6 @@ void FmFilterNavigator::UpdateContent(const Reference< ::com::sun::star::contain //------------------------------------------------------------------------ sal_Bool FmFilterNavigator::EditingEntry( SvLBoxEntry* pEntry, Selection& rSelection ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::EditingEntry" ); m_pEditingCurrently = pEntry; if (!SvTreeListBox::EditingEntry( pEntry, rSelection )) return sal_False; @@ -1257,7 +1253,6 @@ sal_Bool FmFilterNavigator::EditingEntry( SvLBoxEntry* pEntry, Selection& rSelec //------------------------------------------------------------------------ sal_Bool FmFilterNavigator::EditedEntry( SvLBoxEntry* pEntry, const XubString& rNewText ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::EditedEntry" ); DBG_ASSERT(pEntry == m_pEditingCurrently, "FmFilterNavigator::EditedEntry: suspicious entry!"); m_pEditingCurrently = NULL; @@ -1293,7 +1288,6 @@ sal_Bool FmFilterNavigator::EditedEntry( SvLBoxEntry* pEntry, const XubString& r else { // display the error and return sal_False - SQLContext aError; aError.Message = String(SVX_RES(RID_STR_SYNTAXERROR)); aError.Details = aErrorMsg; @@ -1350,7 +1344,6 @@ IMPL_LINK( FmFilterNavigator, OnDropActionTimer, void*, EMPTYARG ) //------------------------------------------------------------------------ sal_Int8 FmFilterNavigator::AcceptDrop( const AcceptDropEvent& rEvt ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::AcceptDrop" ); Point aDropPos = rEvt.maPosPixel; // kuemmern wir uns erst mal um moeglich DropActions (Scrollen und Aufklappen) @@ -1378,7 +1371,7 @@ sal_Int8 FmFilterNavigator::AcceptDrop( const AcceptDropEvent& rEvt ) bNeedTrigger = sal_True; } else - { // auf einem Entry mit Childs, der nicht aufgeklappt ist ? + { // is it an entry whith children, and not yet expanded? SvLBoxEntry* pDropppedOn = GetEntry(aDropPos); if (pDropppedOn && (GetChildCount(pDropppedOn) > 0) && !IsExpanded(pDropppedOn)) { @@ -1457,7 +1450,6 @@ namespace //------------------------------------------------------------------------ sal_Int8 FmFilterNavigator::ExecuteDrop( const ExecuteDropEvent& rEvt ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::ExecuteDrop" ); // ware schlecht, wenn nach dem Droppen noch gescrollt wird ... if (m_aDropActionTimer.IsActive()) m_aDropActionTimer.Stop(); @@ -1491,7 +1483,6 @@ void FmFilterNavigator::InitEntry(SvLBoxEntry* pEntry, const Image& rImg2, SvLBoxButtonKind eButtonKind) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::InitEntry" ); SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind ); SvLBoxString* pString = NULL; @@ -1507,7 +1498,6 @@ void FmFilterNavigator::InitEntry(SvLBoxEntry* pEntry, //------------------------------------------------------------------------ sal_Bool FmFilterNavigator::Select( SvLBoxEntry* pEntry, sal_Bool bSelect ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::Select" ); if (bSelect == IsSelected(pEntry)) // das passiert manchmal, ich glaube, die Basisklasse geht zu sehr auf Nummer sicher ;) return sal_True; @@ -1543,7 +1533,6 @@ sal_Bool FmFilterNavigator::Select( SvLBoxEntry* pEntry, sal_Bool bSelect ) //------------------------------------------------------------------------ void FmFilterNavigator::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::Notify" ); if (rHint.ISA(FmFilterInsertedHint)) { FmFilterInsertedHint* pHint = (FmFilterInsertedHint*)&rHint; @@ -1577,7 +1566,6 @@ void FmFilterNavigator::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) //------------------------------------------------------------------------ SvLBoxEntry* FmFilterNavigator::FindEntry(const FmFilterData* pItem) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::FindEntry" ); SvLBoxEntry* pEntry = NULL; if (pItem) { @@ -1594,23 +1582,23 @@ SvLBoxEntry* FmFilterNavigator::FindEntry(const FmFilterData* pItem) const //------------------------------------------------------------------------ void FmFilterNavigator::Insert(FmFilterData* pItem, sal_Int32 nPos) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::Insert" ); const FmParentData* pParent = pItem->GetParent() ? pItem->GetParent() : GetFilterModel(); // insert the item - SvLBoxEntry* pParentEntry = FindEntry(pParent); + SvLBoxEntry* pParentEntry = FindEntry( pParent ); SvLBoxEntry* pNewEntry = InsertEntry(pItem->GetText(), pItem->GetImage(), pItem->GetImage(), pParentEntry, sal_False, nPos, pItem ); if ( pNewEntry ) { SetExpandedEntryBmp( pNewEntry, pItem->GetImage( BMP_COLOR_HIGHCONTRAST ), BMP_COLOR_HIGHCONTRAST ); SetCollapsedEntryBmp( pNewEntry, pItem->GetImage( BMP_COLOR_HIGHCONTRAST ), BMP_COLOR_HIGHCONTRAST ); } + if ( pParentEntry ) + Expand( pParentEntry ); } //------------------------------------------------------------------------ void FmFilterNavigator::Remove(FmFilterData* pItem) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::Remove" ); // der Entry zu den Daten SvLBoxEntry* pEntry = FindEntry(pItem); @@ -1624,7 +1612,6 @@ void FmFilterNavigator::Remove(FmFilterData* pItem) // ----------------------------------------------------------------------------- FmFormItem* FmFilterNavigator::getSelectedFilterItems(::std::vector<FmFilterItem*>& _rItemList) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::getSelectedFilterItems" ); // be sure that the data is only used within only one form! FmFormItem* pFirstItem = NULL; @@ -1659,35 +1646,37 @@ FmFormItem* FmFilterNavigator::getSelectedFilterItems(::std::vector<FmFilterItem // ----------------------------------------------------------------------------- void FmFilterNavigator::insertFilterItem(const ::std::vector<FmFilterItem*>& _rFilterList,FmFilterItems* _pTargetItems,sal_Bool _bCopy) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::insertFilterItem" ); ::std::vector<FmFilterItem*>::const_iterator aEnd = _rFilterList.end(); - for (::std::vector<FmFilterItem*>::const_iterator i = _rFilterList.begin(); i != aEnd; ++i) + for ( ::std::vector< FmFilterItem* >::const_iterator i = _rFilterList.begin(); + i != aEnd; + ++i + ) { - if ((*i)->GetParent() == _pTargetItems) + FmFilterItem* pLookupItem( *i ); + if ( pLookupItem->GetParent() == _pTargetItems ) continue; - else + + FmFilterItem* pFilterItem = _pTargetItems->Find( pLookupItem->GetComponentIndex() ); + String aText = pLookupItem->GetText(); + if ( !pFilterItem ) { - FmFilterItem* pFilterItem = _pTargetItems->Find((*i)->GetTextComponent()); - String aText = (*i)->GetText(); - if ( !pFilterItem ) - { - pFilterItem = new FmFilterItem(m_pModel->getORB(),_pTargetItems, (*i)->GetFieldName(), aText, (*i)->GetTextComponent()); - m_pModel->Append(_pTargetItems, pFilterItem); - } + pFilterItem = new FmFilterItem( m_pModel->getORB(), _pTargetItems, pLookupItem->GetFieldName(), aText, pLookupItem->GetComponentIndex() ); + m_pModel->Append( _pTargetItems, pFilterItem ); + } - if ( !_bCopy ) - m_pModel->Remove(*i); + if ( !_bCopy ) + m_pModel->Remove( pLookupItem ); - // now set the text for the new dragged item - m_pModel->SetTextForItem(pFilterItem, aText); - } + // now set the text for the new dragged item + m_pModel->SetTextForItem( pFilterItem, aText ); } - m_pModel->CheckIntegrity((FmFormItem*)_pTargetItems->GetParent()); + + m_pModel->EnsureEmptyFilterRows( *_pTargetItems->GetParent() ); } + //------------------------------------------------------------------------------ void FmFilterNavigator::StartDrag( sal_Int8 /*_nAction*/, const Point& /*_rPosPixel*/ ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::StartDrag" ); EndSelection(); // be sure that the data is only used within a only one form! @@ -1705,7 +1694,6 @@ void FmFilterNavigator::StartDrag( sal_Int8 /*_nAction*/, const Point& /*_rPosPi //------------------------------------------------------------------------------ void FmFilterNavigator::Command( const CommandEvent& rEvt ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::Command" ); sal_Bool bHandled = sal_False; switch (rEvt.GetCommand()) { @@ -1750,8 +1738,8 @@ void FmFilterNavigator::Command( const CommandEvent& rEvt ) { // don't delete the only empty row of a form FmFilterItems* pFilterItems = PTR_CAST(FmFilterItems, aSelectList[0]); - if (pFilterItems && pFilterItems->GetChilds().empty() - && pFilterItems->GetParent()->GetChilds().size() == 1) + if (pFilterItems && pFilterItems->GetChildren().empty() + && pFilterItems->GetParent()->GetChildren().size() == 1) aSelectList.clear(); } @@ -1808,7 +1796,6 @@ void FmFilterNavigator::Command( const CommandEvent& rEvt ) // ----------------------------------------------------------------------------- SvLBoxEntry* FmFilterNavigator::getNextEntry(SvLBoxEntry* _pStartWith) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::getNextEntry" ); SvLBoxEntry* pEntry = _pStartWith ? _pStartWith : LastSelected(); pEntry = Next(pEntry); // we need the next filter entry @@ -1819,7 +1806,6 @@ SvLBoxEntry* FmFilterNavigator::getNextEntry(SvLBoxEntry* _pStartWith) // ----------------------------------------------------------------------------- SvLBoxEntry* FmFilterNavigator::getPrevEntry(SvLBoxEntry* _pStartWith) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::getPrevEntry" ); SvLBoxEntry* pEntry = _pStartWith ? _pStartWith : FirstSelected(); pEntry = Prev(pEntry); // check if the previous entry is a filter, if so get the next prev @@ -1835,81 +1821,91 @@ SvLBoxEntry* FmFilterNavigator::getPrevEntry(SvLBoxEntry* _pStartWith) //------------------------------------------------------------------------ void FmFilterNavigator::KeyInput(const KeyEvent& rKEvt) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::KeyInput" ); const KeyCode& rKeyCode = rKEvt.GetKeyCode(); - if ( rKeyCode.IsMod1() - && rKeyCode.IsMod2() - && !rKeyCode.IsShift() - && ( rKeyCode.GetCode() == KEY_UP || rKeyCode.GetCode() == KEY_DOWN ) - ) + + switch ( rKeyCode.GetCode() ) + { + case KEY_UP: + case KEY_DOWN: { + if ( !rKeyCode.IsMod1() || !rKeyCode.IsMod2() || rKeyCode.IsShift() ) + break; + ::std::vector<FmFilterItem*> aItemList; - if ( getSelectedFilterItems(aItemList) ) - { - ::std::mem_fun1_t<SvLBoxEntry*,FmFilterNavigator,SvLBoxEntry*> aGetEntry = ::std::mem_fun(&FmFilterNavigator::getNextEntry); - if ( rKeyCode.GetCode() == KEY_UP ) - aGetEntry = ::std::mem_fun(&FmFilterNavigator::getPrevEntry); + if ( !getSelectedFilterItems( aItemList ) ) + break; - SvLBoxEntry* pTarget = aGetEntry(this,NULL); + ::std::mem_fun1_t<SvLBoxEntry*,FmFilterNavigator,SvLBoxEntry*> getter = ::std::mem_fun(&FmFilterNavigator::getNextEntry); + if ( rKeyCode.GetCode() == KEY_UP ) + getter = ::std::mem_fun(&FmFilterNavigator::getPrevEntry); - if ( pTarget ) + SvLBoxEntry* pTarget = getter( this, NULL ); + if ( !pTarget ) + break; + + FmFilterItems* pTargetItems = getTargetItems( pTarget ); + if ( !pTargetItems ) + break; + + ::std::vector<FmFilterItem*>::const_iterator aEnd = aItemList.end(); + sal_Bool bNextTargetItem = sal_True; + while ( bNextTargetItem ) + { + ::std::vector<FmFilterItem*>::const_iterator i = aItemList.begin(); + for (; i != aEnd; ++i) { - FmFilterItems* pTargetItems = getTargetItems(pTarget); - if ( pTargetItems ) + if ( (*i)->GetParent() == pTargetItems ) { - ::std::vector<FmFilterItem*>::const_iterator aEnd = aItemList.end(); - sal_Bool bNextTargetItem = sal_True; - while ( bNextTargetItem ) - { - ::std::vector<FmFilterItem*>::const_iterator i = aItemList.begin(); - for (; i != aEnd; ++i) - { - if ( (*i)->GetParent() == pTargetItems ) - { - pTarget = aGetEntry(this,pTarget); - if ( !pTarget ) - return; - pTargetItems = getTargetItems(pTarget); - break; - } - else - { - FmFilterItem* pFilterItem = pTargetItems->Find((*i)->GetTextComponent()); - // we found the text component so jump above - if ( pFilterItem ) - { - pTarget = aGetEntry(this,pTarget); - if ( !pTarget ) - return; - pTargetItems = getTargetItems(pTarget); - break; - } - } - } - bNextTargetItem = i != aEnd && pTargetItems; - } - if ( pTargetItems ) - { - insertFilterItem(aItemList,pTargetItems); + pTarget = getter(this,pTarget); + if ( !pTarget ) return; + pTargetItems = getTargetItems( pTarget ); + break; + } + else + { + FmFilterItem* pFilterItem = pTargetItems->Find( (*i)->GetComponentIndex() ); + // we found the text component so jump above + if ( pFilterItem ) + { + pTarget = getter( this, pTarget ); + if ( !pTarget ) + return; + + pTargetItems = getTargetItems( pTarget ); + break; } } } + bNextTargetItem = i != aEnd && pTargetItems; + } + + if ( pTargetItems ) + { + insertFilterItem( aItemList, pTargetItems ); + return; } } - else if (rKeyCode.GetCode() == KEY_DELETE && !rKeyCode.GetModifier()) + break; + + case KEY_DELETE: { - if (!IsSelected(First()) || GetEntryCount() > 1) + if ( rKeyCode.GetModifier() ) + break; + + if ( !IsSelected( First() ) || GetEntryCount() > 1 ) DeleteSelection(); return; } + break; + } + SvTreeListBox::KeyInput(rKEvt); } //------------------------------------------------------------------------------ void FmFilterNavigator::DeleteSelection() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigator::DeleteSelection" ); // to avoid the deletion of an entry twice (e.g. deletion of a parent and afterward // the deletion of it's child, i have to shrink the selecton list ::std::vector<SvLBoxEntry*> aEntryList; @@ -1935,9 +1931,6 @@ void FmFilterNavigator::DeleteSelection() { m_pModel->Remove((FmFilterData*)(*i)->GetUserData()); } - - // now check if we need to insert new items - m_pModel->CheckIntegrity(m_pModel); } // ----------------------------------------------------------------------------- @@ -1949,7 +1942,6 @@ FmFilterNavigatorWin::FmFilterNavigatorWin( SfxBindings* _pBindings, SfxChildWin :SfxDockingWindow( _pBindings, _pMgr, _pParent, WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_ROLLABLE|WB_3DLOOK|WB_DOCKABLE) ) ,SfxControllerItem( SID_FM_FILTER_NAVIGATOR_CONTROL, *_pBindings ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::FmFilterNavigatorWin" ); SetHelpId( HID_FILTER_NAVIGATOR_WIN ); m_pNavigator = new FmFilterNavigator( this ); @@ -1967,22 +1959,21 @@ FmFilterNavigatorWin::~FmFilterNavigatorWin() //----------------------------------------------------------------------- void FmFilterNavigatorWin::UpdateContent(FmFormShell* pFormShell) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::UpdateContent" ); if (!pFormShell) m_pNavigator->UpdateContent( NULL, NULL ); else { - Reference< ::com::sun::star::form::XFormController > xController(pFormShell->GetImpl()->getActiveInternalController()); - Reference< ::com::sun::star::container::XIndexAccess > xContainer; + Reference< XFormController > xController(pFormShell->GetImpl()->getActiveInternalController()); + Reference< XIndexAccess > xContainer; if (xController.is()) { - Reference< ::com::sun::star::container::XChild > xChild(xController, UNO_QUERY); + Reference< XChild > xChild(xController, UNO_QUERY); for (Reference< XInterface > xParent(xChild->getParent()); xParent.is(); xParent = xChild.is() ? xChild->getParent() : Reference< XInterface > ()) { - xContainer = Reference< ::com::sun::star::container::XIndexAccess > (xParent, UNO_QUERY); - xChild = Reference< ::com::sun::star::container::XChild > (xParent, UNO_QUERY); + xContainer = Reference< XIndexAccess > (xParent, UNO_QUERY); + xChild = Reference< XChild > (xParent, UNO_QUERY); } } m_pNavigator->UpdateContent(xContainer, xController); @@ -1992,7 +1983,6 @@ void FmFilterNavigatorWin::UpdateContent(FmFormShell* pFormShell) //----------------------------------------------------------------------- void FmFilterNavigatorWin::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::StateChanged" ); if( !pState || SID_FM_FILTER_NAVIGATOR_CONTROL != nSID ) return; @@ -2008,7 +1998,6 @@ void FmFilterNavigatorWin::StateChanged( sal_uInt16 nSID, SfxItemState eState, c //----------------------------------------------------------------------- sal_Bool FmFilterNavigatorWin::Close() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::Close" ); if ( m_pNavigator && m_pNavigator->IsEditingActive() ) m_pNavigator->EndEditing(); @@ -2023,7 +2012,6 @@ sal_Bool FmFilterNavigatorWin::Close() //----------------------------------------------------------------------- void FmFilterNavigatorWin::FillInfo( SfxChildWinInfo& rInfo ) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::FillInfo" ); SfxDockingWindow::FillInfo( rInfo ); rInfo.bVisible = sal_False; } @@ -2031,7 +2019,6 @@ void FmFilterNavigatorWin::FillInfo( SfxChildWinInfo& rInfo ) const //----------------------------------------------------------------------- Size FmFilterNavigatorWin::CalcDockingSize( SfxChildAlignment eAlign ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::CalcDockingSize" ); if ( ( eAlign == SFX_ALIGN_TOP ) || ( eAlign == SFX_ALIGN_BOTTOM ) ) return Size(); @@ -2041,7 +2028,6 @@ Size FmFilterNavigatorWin::CalcDockingSize( SfxChildAlignment eAlign ) //----------------------------------------------------------------------- SfxChildAlignment FmFilterNavigatorWin::CheckAlignment( SfxChildAlignment eActAlign, SfxChildAlignment eAlign ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::CheckAlignment" ); switch (eAlign) { case SFX_ALIGN_LEFT: @@ -2058,7 +2044,6 @@ SfxChildAlignment FmFilterNavigatorWin::CheckAlignment( SfxChildAlignment eActAl //------------------------------------------------------------------------ void FmFilterNavigatorWin::Resize() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::Resize" ); SfxDockingWindow::Resize(); Size aLogOutputSize = PixelToLogic( GetOutputSizePixel(), MAP_APPFONT ); @@ -2074,7 +2059,6 @@ void FmFilterNavigatorWin::Resize() // ----------------------------------------------------------------------------- void FmFilterNavigatorWin::GetFocus() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFilterNavigatorWin::GetFocus" ); // oj #97405# if ( m_pNavigator ) m_pNavigator->GrabFocus(); diff --git a/svx/source/form/fmcontrolbordermanager.cxx b/svx/source/form/fmcontrolbordermanager.cxx index 17bd10346302..5c6397662844 100644 --- a/svx/source/form/fmcontrolbordermanager.cxx +++ b/svx/source/form/fmcontrolbordermanager.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmcontrolbordermanager.cxx,v $ - * $Revision: 1.8 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/svx/source/form/fmcontrollayout.cxx b/svx/source/form/fmcontrollayout.cxx index 92e987db796c..bc0e15cd9647 100644 --- a/svx/source/form/fmcontrollayout.cxx +++ b/svx/source/form/fmcontrollayout.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmcontrollayout.cxx,v $ - * $Revision: 1.8 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/svx/source/form/fmobj.cxx b/svx/source/form/fmobj.cxx index f2773b7350fa..e6ec36515e87 100644 --- a/svx/source/form/fmobj.cxx +++ b/svx/source/form/fmobj.cxx @@ -30,35 +30,35 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" -#include <tools/resmgr.hxx> -#include <tools/diagnose_ex.h> #include "fmobj.hxx" #include "fmprop.hrc" #include "fmvwimp.hxx" -#include <svx/editeng.hxx> -#include <svx/svdovirt.hxx> +#include "fmtools.hxx" +#include "fmpgeimp.hxx" +#include "fmresids.hrc" +#include "svx/fmview.hxx" +#include "svx/fmglob.hxx" +#include "svx/fmpage.hxx" +#include "svx/editeng.hxx" +#include "svx/svdovirt.hxx" +#include "svx/fmmodel.hxx" +#include "svx/dialmgr.hxx" /** === begin UNO includes === **/ #include <com/sun/star/awt/XDevice.hpp> #include <com/sun/star/script/XEventAttacherManager.hpp> #include <com/sun/star/io/XPersistObject.hpp> #include <com/sun/star/awt/XControlContainer.hpp> +#include <com/sun/star/util/XCloneable.hpp> /** === end UNO includes === **/ -#include <svx/fmmodel.hxx> -#include "fmtools.hxx" -#include <tools/shl.hxx> -#include <svx/dialmgr.hxx> -#include "fmresids.hrc" -#include <svx/fmview.hxx> -#include <svx/fmglob.hxx> - -#include "fmpgeimp.hxx" -#include <svx/fmpage.hxx> +#include <tools/shl.hxx> #include <comphelper/property.hxx> #include <comphelper/processfactory.hxx> #include <toolkit/awt/vclxdevice.hxx> #include <vcl/svapp.hxx> +#include <tools/resmgr.hxx> +#include <tools/diagnose_ex.h> using namespace ::com::sun::star::io; using namespace ::com::sun::star::uno; @@ -422,10 +422,48 @@ void FmFormObj::operator= (const SdrObject& rObj) } //------------------------------------------------------------------ +namespace +{ + String lcl_getFormComponentAccessPath(const Reference< XInterface >& _xElement, Reference< XInterface >& _rTopLevelElement) + { + Reference< ::com::sun::star::form::XFormComponent> xChild(_xElement, UNO_QUERY); + Reference< ::com::sun::star::container::XIndexAccess> xParent; + if (xChild.is()) + xParent = Reference< ::com::sun::star::container::XIndexAccess>(xChild->getParent(), UNO_QUERY); + + // while the current content is a form + String sReturn; + String sCurrentIndex; + while (xChild.is()) + { + // get the content's relative pos within it's parent container + sal_Int32 nPos = getElementPos(xParent, xChild); + + // prepend this current relaive pos + sCurrentIndex = String::CreateFromInt32(nPos); + if (sReturn.Len() != 0) + { + sCurrentIndex += '\\'; + sCurrentIndex += sReturn; + } + + sReturn = sCurrentIndex; + + // travel up + if (::comphelper::query_interface((Reference< XInterface >)xParent,xChild)) + xParent = Reference< ::com::sun::star::container::XIndexAccess>(xChild->getParent(), UNO_QUERY); + } + + _rTopLevelElement = xParent; + return sReturn; + } +} + +//------------------------------------------------------------------ Reference< XInterface > FmFormObj::ensureModelEnv(const Reference< XInterface > & _rSourceContainer, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer > _rTopLevelDestContainer) { Reference< XInterface > xTopLevelSouce; - String sAccessPath = getFormComponentAccessPath(_rSourceContainer, xTopLevelSouce); + String sAccessPath = lcl_getFormComponentAccessPath(_rSourceContainer, xTopLevelSouce); if (!xTopLevelSouce.is()) // somthing went wrong, maybe _rSourceContainer isn't part of a valid forms hierarchy return Reference< XInterface > (); @@ -532,8 +570,8 @@ Reference< XInterface > FmFormObj::ensureModelEnv(const Reference< XInterface > DBG_ASSERT(xSourcePersist.is(), "FmFormObj::ensureModelEnv : invalid form (no persist object) !"); // create and insert (into the destination) a clone of the form - xCurrentDestForm = Reference< XPropertySet > (cloneUsingProperties(xSourcePersist), UNO_QUERY); - DBG_ASSERT(xCurrentDestForm.is(), "FmFormObj::ensureModelEnv : invalid cloned form !"); + Reference< XCloneable > xCloneable( xSourcePersist, UNO_QUERY_THROW ); + xCurrentDestForm.set( xCloneable->createClone(), UNO_QUERY_THROW ); DBG_ASSERT(nCurrentDestIndex == xDestContainer->getCount(), "FmFormObj::ensureModelEnv : something went wrong with the numbers !"); xDestContainer->insertByIndex(nCurrentDestIndex, makeAny(xCurrentDestForm)); diff --git a/svx/source/form/fmobjfac.cxx b/svx/source/form/fmobjfac.cxx index e2c9101b718c..0a8bfe1c7885 100644 --- a/svx/source/form/fmobjfac.cxx +++ b/svx/source/form/fmobjfac.cxx @@ -32,7 +32,6 @@ #include "precompiled_svx.hxx" #include <comphelper/stl_types.hxx> #include <svx/svdobj.hxx> -#include "fmtools.hxx" #include "fmservs.hxx" #ifndef _FM_FMOBJFAC_HXX diff --git a/svx/source/form/fmpage.cxx b/svx/source/form/fmpage.cxx index 0ead41eb87bc..69c04ff862bf 100644 --- a/svx/source/form/fmpage.cxx +++ b/svx/source/form/fmpage.cxx @@ -78,7 +78,6 @@ #include "fmprop.hrc" #endif #include "fmundo.hxx" -#include "fmtools.hxx" using namespace ::svxform; #endif #include <comphelper/property.hxx> diff --git a/svx/source/form/fmservs.cxx b/svx/source/form/fmservs.cxx index b9f40b6ddda2..feef02baa555 100644 --- a/svx/source/form/fmservs.cxx +++ b/svx/source/form/fmservs.cxx @@ -49,7 +49,8 @@ DECL_SERVICE( FmXGridControl ) - DECL_SERVICE( FmXFormController ) + DECL_SERVICE( FormController ) + DECL_SERVICE( LegacyFormController ); // ------------------------------------------------------------------------ @@ -91,7 +92,8 @@ namespace svxform // ------------------------------------------------------------------------ // FormController - REGISTER_SERVICE(FmXFormController, FM_FORM_CONTROLLER); + REGISTER_SERVICE( FormController, FM_FORM_CONTROLLER ); + REGISTER_SERVICE( LegacyFormController, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.FormController" ) ) ); // ------------------------------------------------------------------------ // FormController @@ -102,9 +104,6 @@ namespace svxform REGISTER_SERVICE(FmXGridControl, FM_CONTROL_GRID); // compatibility REGISTER_SERVICE(FmXGridControl, FM_CONTROL_GRIDCONTROL); REGISTER_SERVICE(FmXGridControl, FM_SUN_CONTROL_GRIDCONTROL); - - }; - } // namespace svxform diff --git a/svx/source/form/fmshell.cxx b/svx/source/form/fmshell.cxx index ccdfb2b1af39..4820cf44978b 100644 --- a/svx/source/form/fmshell.cxx +++ b/svx/source/form/fmshell.cxx @@ -32,7 +32,6 @@ #include "precompiled_svx.hxx" #include "fmvwimp.hxx" #include <svx/fmshell.hxx> -#include "fmtools.hxx" #include "fmservs.hxx" #ifndef _SVX_FMPROP_HRC #include "fmprop.hrc" @@ -685,7 +684,15 @@ void FmFormShell::Execute(SfxRequest &rReq) case SID_FM_FILTER_NAVIGATOR: case SID_FM_SHOW_DATANAVIGATOR : { - GetViewShell()->GetViewFrame()->ChildWindowExecute(rReq); + SFX_REQUEST_ARG( rReq, pShowItem, SfxBoolItem, nSlot, sal_False ); + if ( !pShowItem ) + GetViewShell()->GetViewFrame()->ChildWindowExecute( rReq ); + else + { + const sal_Bool bShow = pShowItem->GetValue(); + GetViewShell()->GetViewFrame()->ShowChildWindow( nSlot, bShow ); + } + rReq.Done(); } break; case SID_FM_SHOW_FMEXPLORER: @@ -827,7 +834,7 @@ void FmFormShell::Execute(SfxRequest &rReq) bReopenNavigator = sal_True; } - Reference< XFormController > xController( GetImpl()->getActiveController() ); + Reference< runtime::XFormController > xController( GetImpl()->getActiveController() ); if ( GetViewShell()->GetViewFrame()->HasChildWindow( SID_FM_FILTER_NAVIGATOR ) // closing the window was denied, for instance because of a invalid criterion @@ -857,6 +864,11 @@ void FmFormShell::Execute(SfxRequest &rReq) { GetImpl()->startFiltering(); rReq.Done(); + + // initially open the filter navigator, the whole form based filter is pretty useless without it + SfxBoolItem aIdentifierItem( SID_FM_FILTER_NAVIGATOR, TRUE ); + GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( SID_FM_FILTER_NAVIGATOR, SFX_CALLMODE_ASYNCHRON, + &aIdentifierItem, NULL ); } break; } } @@ -1400,7 +1412,7 @@ SdrUnoObj* FmFormShell::GetFormControl( const Reference< XControlModel >& _rxMod } //------------------------------------------------------------------------ -Reference< XFormController > FmFormShell::GetFormController( const Reference< XForm >& _rxForm, const SdrView& _rView, const OutputDevice& _rDevice ) const +Reference< runtime::XFormController > FmFormShell::GetFormController( const Reference< XForm >& _rxForm, const SdrView& _rView, const OutputDevice& _rDevice ) const { const FmFormView* pFormView = dynamic_cast< const FmFormView* >( &_rView ); if ( !pFormView ) diff --git a/svx/source/form/fmshimp.cxx b/svx/source/form/fmshimp.cxx index 8c5ca61f6691..228f99ace265 100644 --- a/svx/source/form/fmshimp.cxx +++ b/svx/source/form/fmshimp.cxx @@ -30,89 +30,87 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" -#include "gridcols.hxx" -#include <svx/obj3d.hxx> -#include "fmvwimp.hxx" -#include "fmshimp.hxx" -#include "fmtextcontrolshell.hxx" -#include <svx/svdpagv.hxx> -#include <svx/fmpage.hxx> -#include <svx/dialmgr.hxx> -#ifndef _SVX_FMRESIDS_HRC -#include "fmresids.hrc" -#endif + #include "fmitems.hxx" #include "fmobj.hxx" -#include "formtoolbars.hxx" -#include <svx/fmglob.hxx> -#include "svditer.hxx" -#include "fmservs.hxx" #include "fmpgeimp.hxx" -#include "fmtools.hxx" -#ifndef _SVX_FMPROP_HRC #include "fmprop.hrc" -#endif -#include <svx/fmshell.hxx> -#ifndef _SVX_SVXIDS_HRC -#include <svx/svxids.hrc> -#endif -#include <svx/fmmodel.hxx> +#include "fmresids.hrc" +#include "fmservs.hxx" +#include "fmshimp.hxx" +#include "fmtextcontrolshell.hxx" #include "fmundo.hxx" #include "fmurl.hxx" -#include "formcontrolling.hxx" -#include <svx/svxdlg.hxx> -#include <svx/dialogs.hrc> -#include <com/sun/star/frame/FrameSearchFlag.hpp> -#include <com/sun/star/form/XLoadable.hpp> -#include <com/sun/star/container/XNamed.hpp> +#include "fmvwimp.hxx" +#include "formtoolbars.hxx" +#include "gridcols.hxx" +#include "svditer.hxx" +#include "svx/dialmgr.hxx" +#include "svx/dialogs.hrc" +#include "svx/fmglob.hxx" +#include "svx/fmmodel.hxx" +#include "svx/fmpage.hxx" +#include "svx/fmshell.hxx" +#include "svx/obj3d.hxx" +#include "svx/sdrpagewindow.hxx" +#include "svx/svdpagv.hxx" +#include "svx/svxdlg.hxx" +#include "svx/svxids.hrc" + +/** === begin UNO includes === **/ +#include <com/sun/star/awt/XCheckBox.hpp> +#include <com/sun/star/awt/XListBox.hpp> +#include <com/sun/star/awt/XTextComponent.hpp> +#include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> +#include <com/sun/star/beans/XPropertyState.hpp> #include <com/sun/star/container/XContainer.hpp> #include <com/sun/star/container/XEnumeration.hpp> -#include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XEnumerationAccess.hpp> -#include <com/sun/star/frame/FrameSearchFlag.hpp> -#include <com/sun/star/awt/XTextComponent.hpp> -#include <com/sun/star/awt/XListBox.hpp> -#include <com/sun/star/awt/XCheckBox.hpp> -#include <com/sun/star/form/XBoundComponent.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/container/XNamed.hpp> #include <com/sun/star/form/ListSourceType.hpp> -#include <com/sun/star/view/XSelectionSupplier.hpp> -#include <com/sun/star/script/XEventAttacherManager.hpp> +#include <com/sun/star/form/XBoundComponent.hpp> #include <com/sun/star/form/XBoundControl.hpp> -#include <com/sun/star/form/XReset.hpp> #include <com/sun/star/form/XGrid.hpp> #include <com/sun/star/form/XGridPeer.hpp> -#include <com/sun/star/util/XNumberFormatter.hpp> -#include <com/sun/star/util/XModeSelector.hpp> -#include <com/sun/star/util/XModifyBroadcaster.hpp> -#include <com/sun/star/util/XCancellable.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/beans/XPropertyState.hpp> +#include <com/sun/star/form/XLoadable.hpp> +#include <com/sun/star/form/XReset.hpp> #include <com/sun/star/form/binding/XBindableValue.hpp> -#include <com/sun/star/beans/NamedValue.hpp> #include <com/sun/star/form/binding/XListEntrySink.hpp> +#include <com/sun/star/frame/FrameSearchFlag.hpp> +#include <com/sun/star/script/XEventAttacherManager.hpp> #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> +#include <com/sun/star/util/XCancellable.hpp> +#include <com/sun/star/util/XModeSelector.hpp> +#include <com/sun/star/util/XModifyBroadcaster.hpp> +#include <com/sun/star/util/XNumberFormatter.hpp> +#include <com/sun/star/view/XSelectionSupplier.hpp> +#include <com/sun/star/beans/XIntrospection.hpp> +/** === end UNO includes === **/ + +#include <comphelper/extract.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/property.hxx> +#include <comphelper/stl_types.hxx> +#include <connectivity/dbtools.hxx> +#include <cppuhelper/servicefactory.hxx> #include <osl/mutex.hxx> -#include <sfx2/viewsh.hxx> -#include <sfx2/viewfrm.hxx> -#include <sfx2/frame.hxx> -#include <vcl/waitobj.hxx> -#include <tools/shl.hxx> -#include <tools/diagnose_ex.h> -#include <vcl/msgbox.hxx> +#include <rtl/logfile.hxx> #include <sfx2/dispatch.hxx> -#include <sfx2/objsh.hxx> #include <sfx2/docfile.hxx> +#include <sfx2/frame.hxx> +#include <sfx2/objsh.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/viewsh.hxx> +#include <toolkit/helper/vclunohelper.hxx> #include <tools/color.hxx> +#include <tools/diagnose_ex.h> +#include <tools/shl.hxx> #include <tools/urlobj.hxx> -#include <comphelper/property.hxx> -#include <connectivity/dbtools.hxx> -#include <comphelper/stl_types.hxx> -#include <comphelper/processfactory.hxx> -#include <cppuhelper/servicefactory.hxx> -#include <comphelper/extract.hxx> -#include <toolkit/helper/vclunohelper.hxx> -#include <svx/sdrpagewindow.hxx> -#include <rtl/logfile.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/waitobj.hxx> +#include <vos/mutex.hxx> #include <algorithm> #include <functional> @@ -281,6 +279,7 @@ using namespace ::com::sun::star::view; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::util; using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::script; using namespace ::svxform; using namespace ::svx; @@ -289,7 +288,7 @@ using namespace ::svx; //============================================================================== namespace { - //.................................................................... + //.......................................................................... void collectInterfacesFromMarkList( const SdrMarkList& _rMarkList, InterfaceBag& /* [out] */ _rInterfaces ) { _rInterfaces.clear(); @@ -327,6 +326,198 @@ namespace } } + //.......................................................................... + sal_Int16 GridView2ModelPos(const Reference< XIndexAccess>& rColumns, sal_Int16 nViewPos) + { + try + { + if (rColumns.is()) + { + // loop through all columns + sal_Int16 i; + Reference< XPropertySet> xCur; + for (i=0; i<rColumns->getCount(); ++i) + { + rColumns->getByIndex(i) >>= xCur; + if (!::comphelper::getBOOL(xCur->getPropertyValue(FM_PROP_HIDDEN))) + { + // for every visible col : if nViewPos is greater zero, decrement it, else we + // have found the model position + if (!nViewPos) + break; + else + --nViewPos; + } + } + if (i<rColumns->getCount()) + return i; + } + } + catch(const Exception&) + { + DBG_UNHANDLED_EXCEPTION(); + } + return (sal_Int16)-1; + } + + //.......................................................................... + Sequence< ::rtl::OUString> getEventMethods(const Type& type) + { + typelib_InterfaceTypeDescription *pType=0; + type.getDescription( (typelib_TypeDescription**)&pType); + + if(!pType) + return Sequence< ::rtl::OUString>(); + + Sequence< ::rtl::OUString> aNames(pType->nMembers); + ::rtl::OUString* pNames = aNames.getArray(); + for(sal_Int32 i=0;i<pType->nMembers;i++,++pNames) + { + // the decription reference + typelib_TypeDescriptionReference* pMemberDescriptionReference = pType->ppMembers[i]; + // the description for the reference + typelib_TypeDescription* pMemberDescription = NULL; + typelib_typedescriptionreference_getDescription(&pMemberDescription, pMemberDescriptionReference); + if (pMemberDescription) + { + typelib_InterfaceMemberTypeDescription* pRealMemberDescription = + reinterpret_cast<typelib_InterfaceMemberTypeDescription*>(pMemberDescription); + *pNames = pRealMemberDescription->pMemberName; + } + } + typelib_typedescription_release( (typelib_TypeDescription *)pType ); + return aNames; + } + + //.......................................................................... + void TransferEventScripts(const Reference< XControlModel>& xModel, const Reference< XControl>& xControl, + const Sequence< ScriptEventDescriptor>& rTransferIfAvailable) + { + // first check if we have a XEventAttacherManager for the model + Reference< XChild> xModelChild(xModel, UNO_QUERY); + if (!xModelChild.is()) + return; // nothing to do + + Reference< XEventAttacherManager> xEventManager(xModelChild->getParent(), UNO_QUERY); + if (!xEventManager.is()) + return; // nothing to do + + if (!rTransferIfAvailable.getLength()) + return; // nothing to do + + // check for the index of the model within it's parent + Reference< XIndexAccess> xParentIndex(xModelChild->getParent(), UNO_QUERY); + if (!xParentIndex.is()) + return; // nothing to do + sal_Int32 nIndex = getElementPos(xParentIndex, xModel); + if (nIndex<0 || nIndex>=xParentIndex->getCount()) + return; // nothing to do + + // then we need informations about the listeners supported by the control and the model + Sequence< Type> aModelListeners; + Sequence< Type> aControlListeners; + + Reference< XIntrospection> xModelIntrospection(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.beans.Introspection")), UNO_QUERY); + Reference< XIntrospection> xControlIntrospection(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.beans.Introspection")), UNO_QUERY); + + if (xModelIntrospection.is() && xModel.is()) + { + Any aModel(makeAny(xModel)); + aModelListeners = xModelIntrospection->inspect(aModel)->getSupportedListeners(); + } + + if (xControlIntrospection.is() && xControl.is()) + { + Any aControl(makeAny(xControl)); + aControlListeners = xControlIntrospection->inspect(aControl)->getSupportedListeners(); + } + + sal_Int32 nMaxNewLen = aModelListeners.getLength() + aControlListeners.getLength(); + if (!nMaxNewLen) + return; // the model and the listener don't support any listeners (or we were unable to retrieve these infos) + + Sequence< ScriptEventDescriptor> aTransferable(nMaxNewLen); + ScriptEventDescriptor* pTransferable = aTransferable.getArray(); + + const ScriptEventDescriptor* pCurrent = rTransferIfAvailable.getConstArray(); + sal_Int32 i,j,k; + for (i=0; i<rTransferIfAvailable.getLength(); ++i, ++pCurrent) + { + // search the model/control idl classes for the event described by pCurrent + for ( Sequence< Type>* pCurrentArray = &aModelListeners; + pCurrentArray; + pCurrentArray = (pCurrentArray == &aModelListeners) ? &aControlListeners : NULL + ) + { + const Type* pCurrentListeners = pCurrentArray->getConstArray(); + for (j=0; j<pCurrentArray->getLength(); ++j, ++pCurrentListeners) + { + UniString aListener = (*pCurrentListeners).getTypeName(); + xub_StrLen nTokens = aListener.GetTokenCount('.'); + if (nTokens) + aListener = aListener.GetToken(nTokens - 1, '.'); + + if (aListener == pCurrent->ListenerType.getStr()) + // the current ScriptEventDescriptor doesn't match the current listeners class + continue; + + // now check the methods + Sequence< ::rtl::OUString> aMethodsNames = getEventMethods(*pCurrentListeners); + const ::rtl::OUString* pMethodsNames = aMethodsNames.getConstArray(); + for (k=0; k<aMethodsNames.getLength(); ++k, ++pMethodsNames) + { + if ((*pMethodsNames).compareTo(pCurrent->EventMethod) != COMPARE_EQUAL) + // the current ScriptEventDescriptor doesn't match the current listeners current method + continue; + + // we can transfer the script event : the model (control) supports it + *pTransferable = *pCurrent; + ++pTransferable; + break; + } + if (k<aMethodsNames.getLength()) + break; + } + } + } + + sal_Int32 nRealNewLen = pTransferable - aTransferable.getArray(); + aTransferable.realloc(nRealNewLen); + + xEventManager->registerScriptEvents(nIndex, aTransferable); + } + + //------------------------------------------------------------------------------ + ::rtl::OUString getServiceNameByControlType(sal_Int16 nType) + { + switch (nType) + { + case OBJ_FM_EDIT : return FM_COMPONENT_TEXTFIELD; + case OBJ_FM_BUTTON : return FM_COMPONENT_COMMANDBUTTON; + case OBJ_FM_FIXEDTEXT : return FM_COMPONENT_FIXEDTEXT; + case OBJ_FM_LISTBOX : return FM_COMPONENT_LISTBOX; + case OBJ_FM_CHECKBOX : return FM_COMPONENT_CHECKBOX; + case OBJ_FM_RADIOBUTTON : return FM_COMPONENT_RADIOBUTTON; + case OBJ_FM_GROUPBOX : return FM_COMPONENT_GROUPBOX; + case OBJ_FM_COMBOBOX : return FM_COMPONENT_COMBOBOX; + case OBJ_FM_GRID : return FM_COMPONENT_GRIDCONTROL; + case OBJ_FM_IMAGEBUTTON : return FM_COMPONENT_IMAGEBUTTON; + case OBJ_FM_FILECONTROL : return FM_COMPONENT_FILECONTROL; + case OBJ_FM_DATEFIELD : return FM_COMPONENT_DATEFIELD; + case OBJ_FM_TIMEFIELD : return FM_COMPONENT_TIMEFIELD; + case OBJ_FM_NUMERICFIELD : return FM_COMPONENT_NUMERICFIELD; + case OBJ_FM_CURRENCYFIELD : return FM_COMPONENT_CURRENCYFIELD; + case OBJ_FM_PATTERNFIELD : return FM_COMPONENT_PATTERNFIELD; + case OBJ_FM_HIDDEN : return FM_COMPONENT_HIDDENCONTROL; + case OBJ_FM_IMAGECONTROL : return FM_COMPONENT_IMAGECONTROL; + case OBJ_FM_FORMATTEDFIELD : return FM_COMPONENT_FORMATTEDFIELD; + case OBJ_FM_SCROLLBAR : return FM_SUN_COMPONENT_SCROLLBAR; + case OBJ_FM_SPINBUTTON : return FM_SUN_COMPONENT_SPINBUTTON; + case OBJ_FM_NAVIGATIONBAR : return FM_SUN_COMPONENT_NAVIGATIONBAR; + } + return ::rtl::OUString(); + } + } //------------------------------------------------------------------------------ @@ -504,7 +695,6 @@ FmXFormShell::FmXFormShell( FmFormShell& _rShell, SfxViewFrame* _pViewFrame ) ,m_pTextShell( new ::svx::FmTextControlShell( _pViewFrame ) ) ,m_aActiveControllerFeatures( ::comphelper::getProcessServiceFactory(), this ) ,m_aNavControllerFeatures( ::comphelper::getProcessServiceFactory(), this ) - ,m_pExternalViewInterceptor( NULL ) ,m_eDocumentType( eUnknownDocumentType ) ,m_nLockSlotInvalidation( 0 ) ,m_bHadPropertyBrowserInDesignMode( sal_False ) @@ -675,7 +865,8 @@ void SAL_CALL FmXFormShell::disposing(const EventObject& e) throw( RuntimeExcept if (e.Source == m_xExternalViewController) { - Reference< XFormController> xFormController(m_xExternalViewController, UNO_QUERY); + Reference< runtime::XFormController > xFormController( m_xExternalViewController, UNO_QUERY ); + OSL_ENSURE( xFormController.is(), "FmXFormShell::disposing: invalid external view controller!" ); if (xFormController.is()) xFormController->removeActivateListener((XFormControllerListener*)this); @@ -765,7 +956,7 @@ void SAL_CALL FmXFormShell::formActivated(const EventObject& rEvent) throw( Runt if ( impl_checkDisposed() ) return; - Reference< XFormController > xController( rEvent.Source, UNO_QUERY_THROW ); + Reference< runtime::XFormController > xController( rEvent.Source, UNO_QUERY_THROW ); m_pTextShell->formActivated( xController ); setActiveController( xController ); } @@ -777,7 +968,7 @@ void SAL_CALL FmXFormShell::formDeactivated(const EventObject& rEvent) throw( Ru if ( impl_checkDisposed() ) return; - Reference< XFormController > xController( rEvent.Source, UNO_QUERY_THROW ); + Reference< runtime::XFormController > xController( rEvent.Source, UNO_QUERY_THROW ); m_pTextShell->formDeactivated( xController ); } @@ -798,14 +989,6 @@ void FmXFormShell::disposing() // are still uncommitted changes, the user explicitly wanted this. // 2002-11-11 - 104702 - fs@openoffice.org - // dispose our interceptor helpers - if (m_pExternalViewInterceptor) - { - m_pExternalViewInterceptor->dispose(); - m_pExternalViewInterceptor->release(); - m_pExternalViewInterceptor = NULL; - } - m_pTextShell->dispose(); m_xAttachedFrame = NULL; @@ -1703,7 +1886,7 @@ Reference< XResultSet> FmXFormShell::getInternalForm(const Reference< XResultSet if ( impl_checkDisposed() ) return NULL; - Reference< XFormController> xExternalCtrlr(m_xExternalViewController, UNO_QUERY); + Reference< runtime::XFormController> xExternalCtrlr(m_xExternalViewController, UNO_QUERY); if (xExternalCtrlr.is() && (_xForm == xExternalCtrlr->getModel())) { DBG_ASSERT(m_xExternalDisplayedForm.is(), "FmXFormShell::getInternalForm : invalid external form !"); @@ -1719,7 +1902,7 @@ Reference< XForm> FmXFormShell::getInternalForm(const Reference< XForm>& _xForm) if ( impl_checkDisposed() ) return NULL; - Reference< XFormController> xExternalCtrlr(m_xExternalViewController, UNO_QUERY); + Reference< runtime::XFormController > xExternalCtrlr(m_xExternalViewController, UNO_QUERY); if (xExternalCtrlr.is() && (_xForm == xExternalCtrlr->getModel())) { DBG_ASSERT(m_xExternalDisplayedForm.is(), "FmXFormShell::getInternalForm : invalid external form !"); @@ -1808,7 +1991,7 @@ void FmXFormShell::impl_switchActiveControllerListening( const bool _bListen ) } //------------------------------------------------------------------------------ -void FmXFormShell::setActiveController( const Reference< XFormController>& xController, sal_Bool _bNoSaveOldContent ) +void FmXFormShell::setActiveController( const Reference< runtime::XFormController >& xController, sal_Bool _bNoSaveOldContent ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormShell::setActiveController" ); if ( impl_checkDisposed() ) @@ -2103,11 +2286,11 @@ void FmXFormShell::startListening() { // suchen des Controllers, ueber den eine Navigation moeglich ist Reference< XChild> xChild(m_xActiveController, UNO_QUERY); - Reference< XFormController> xParent; + Reference< runtime::XFormController > xParent; while (xChild.is()) { xChild = Reference< XChild>(xChild->getParent(), UNO_QUERY); - xParent = Reference< XFormController>(xChild, UNO_QUERY); + xParent = Reference< runtime::XFormController >(xChild, UNO_QUERY); Reference< XPropertySet> xParentSet; if (xParent.is()) xParentSet = Reference< XPropertySet>(xParent->getModel(), UNO_QUERY); @@ -2936,31 +3119,39 @@ void FmXFormShell::startFiltering() FmWinRecList::iterator i = pXView->findWindow(xContainer); if (i != pXView->getWindowList().end()) { - const ::std::vector< Reference< XFormController> >& rControllerList = (*i)->GetList(); - for (::std::vector< Reference< XFormController> >::const_iterator j = rControllerList.begin(); + const ::std::vector< Reference< runtime::XFormController> >& rControllerList = (*i)->GetList(); + for (::std::vector< Reference< runtime::XFormController> >::const_iterator j = rControllerList.begin(); j != rControllerList.end(); ++j) { Reference< XModeSelector> xModeSelector(*j, UNO_QUERY); if (xModeSelector.is()) - xModeSelector->setMode(FILTER_MODE); + xModeSelector->setMode( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterMode" ) ) ); } } m_bFilterMode = sal_True; m_pShell->UIFeatureChanged(); - m_pShell->GetViewShell()->GetViewFrame()->GetBindings().InvalidateShell(*m_pShell); + SfxViewFrame* pViewFrame = m_pShell->GetViewShell()->GetViewFrame(); + pViewFrame->GetBindings().InvalidateShell( *m_pShell ); + + if ( pViewFrame->KnowsChildWindow( SID_FM_FILTER_NAVIGATOR ) + && !pViewFrame->HasChildWindow( SID_FM_FILTER_NAVIGATOR ) + ) + { + pViewFrame->ToggleChildWindow( SID_FM_FILTER_NAVIGATOR ); + } } //------------------------------------------------------------------------------ -void saveFilter(const Reference< XFormController>& _rxController) +void saveFilter(const Reference< runtime::XFormController >& _rxController) { Reference< XPropertySet> xFormAsSet(_rxController->getModel(), UNO_QUERY); Reference< XPropertySet> xControllerAsSet(_rxController, UNO_QUERY); Reference< XIndexAccess> xControllerAsIndex(_rxController, UNO_QUERY); // call the subcontroller - Reference< XFormController> xController; + Reference< runtime::XFormController > xController; for (sal_Int32 i = 0, nCount = xControllerAsIndex->getCount(); i < nCount; ++i) { xControllerAsIndex->getByIndex(i) >>= xController; @@ -2995,7 +3186,7 @@ void FmXFormShell::stopFiltering(sal_Bool bSave) Reference< XControlContainer> xContainer; if (getActiveController() == m_xExternalViewController) { - DBG_ASSERT(m_xExtViewTriggerController.is(), "FmXFormShell::startFiltering : inconsistent : active external controller, but noone triggered this !"); + DBG_ASSERT(m_xExtViewTriggerController.is(), "FmXFormShell::stopFiltering : inconsistent : active external controller, but noone triggered this !"); xContainer = m_xExtViewTriggerController->getContainer(); } else @@ -3004,13 +3195,13 @@ void FmXFormShell::stopFiltering(sal_Bool bSave) FmWinRecList::iterator i = pXView->findWindow(xContainer); if (i != pXView->getWindowList().end()) { - const ::std::vector< Reference< XFormController> >& rControllerList = (*i)->GetList(); + const ::std::vector< Reference< runtime::XFormController > >& rControllerList = (*i)->GetList(); ::std::vector < ::rtl::OUString > aOriginalFilters; ::std::vector < sal_Bool > aOriginalApplyFlags; if (bSave) { - for (::std::vector< Reference< XFormController> > ::const_iterator j = rControllerList.begin(); + for (::std::vector< Reference< runtime::XFormController > > ::const_iterator j = rControllerList.begin(); j != rControllerList.end(); ++j) { if (bSave) @@ -3035,18 +3226,18 @@ void FmXFormShell::stopFiltering(sal_Bool bSave) saveFilter(*j); } } - for (::std::vector< Reference< XFormController> > ::const_iterator j = rControllerList.begin(); + for (::std::vector< Reference< runtime::XFormController > > ::const_iterator j = rControllerList.begin(); j != rControllerList.end(); ++j) { Reference< XModeSelector> xModeSelector(*j, UNO_QUERY); if (xModeSelector.is()) - xModeSelector->setMode(DATA_MODE); + xModeSelector->setMode( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ) ); } if (bSave) // execute the filter { - const ::std::vector< Reference< XFormController> > & rControllers = (*i)->GetList(); - for (::std::vector< Reference< XFormController> > ::const_iterator j = rControllers.begin(); + const ::std::vector< Reference< runtime::XFormController > > & rControllers = (*i)->GetList(); + for (::std::vector< Reference< runtime::XFormController > > ::const_iterator j = rControllers.begin(); j != rControllers.end(); ++j) { Reference< XLoadable> xReload((*j)->getModel(), UNO_QUERY); @@ -3087,13 +3278,13 @@ void FmXFormShell::stopFiltering(sal_Bool bSave) } //------------------------------------------------------------------------------ -void clearFilter(const Reference< XFormController>& _rxController) +void clearFilter(const Reference< runtime::XFormController >& _rxController) { Reference< XPropertySet> xControllerAsSet(_rxController, UNO_QUERY); Reference< XIndexAccess> xControllerAsIndex(_rxController, UNO_QUERY); // call the subcontroller - Reference< XFormController> xController; + Reference< runtime::XFormController > xController; for (sal_Int32 i = 0, nCount = xControllerAsIndex->getCount(); i < nCount; i++) { @@ -3132,7 +3323,7 @@ void FmXFormShell::clearFilter() Reference< XControlContainer> xContainer; if (getActiveController() == m_xExternalViewController) { - DBG_ASSERT(m_xExtViewTriggerController.is(), "FmXFormShell::startFiltering : inconsistent : active external controller, but noone triggered this !"); + DBG_ASSERT(m_xExtViewTriggerController.is(), "FmXFormShell::clearFilter : inconsistent : active external controller, but noone triggered this !"); xContainer = m_xExtViewTriggerController->getContainer(); } else @@ -3141,8 +3332,8 @@ void FmXFormShell::clearFilter() FmWinRecList::iterator i = pXView->findWindow(xContainer); if (i != pXView->getWindowList().end()) { - const ::std::vector< Reference< XFormController> > & rControllerList = (*i)->GetList(); - for (::std::vector< Reference< XFormController> > ::const_iterator j = rControllerList.begin(); + const ::std::vector< Reference< runtime::XFormController > > & rControllerList = (*i)->GetList(); + for (::std::vector< Reference< runtime::XFormController > > ::const_iterator j = rControllerList.begin(); j != rControllerList.end(); ++j) { ::clearFilter(*j); @@ -3253,7 +3444,7 @@ void FmXFormShell::restoreControlLocks() } //------------------------------------------------------------------------------ -void FmXFormShell::DoAsyncCursorAction(const Reference< XFormController>& _xController, CURSOR_ACTION _eWhat) +void FmXFormShell::DoAsyncCursorAction(const Reference< runtime::XFormController >& _xController, CURSOR_ACTION _eWhat) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormShell::DoAsyncCursorAction" ); if ( impl_checkDisposed() ) @@ -3329,7 +3520,7 @@ sal_Bool FmXFormShell::HasPendingCursorAction(const Reference< XResultSet>& _xFo } //------------------------------------------------------------------------------ -sal_Bool FmXFormShell::HasPendingCursorAction(const Reference< XFormController>& xController) const +sal_Bool FmXFormShell::HasPendingCursorAction(const Reference< runtime::XFormController >& xController) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormShell::HasPendingCursorAction" ); if ( impl_checkDisposed() ) @@ -3471,7 +3662,7 @@ void FmXFormShell::CreateExternalView() ::rtl::OUString sFrameName = ::rtl::OUString::createFromAscii("_beamer"); sal_Int32 nSearchFlags = ::com::sun::star::frame::FrameSearchFlag::CHILDREN | ::com::sun::star::frame::FrameSearchFlag::CREATE; - Reference< XFormController> xCurrentNavController( getNavController()); + Reference< runtime::XFormController > xCurrentNavController( getNavController()); // the creation of the "partwindow" may cause a deactivate of the document which will result in our nav controller to be set to NULL // _first_ check if we have any valid fields we can use for the grid view @@ -3538,12 +3729,12 @@ void FmXFormShell::CreateExternalView() { if ( m_xExternalViewController == getActiveController() ) { - Reference< XFormController > xAsFormController( m_xExternalViewController, UNO_QUERY ); + Reference< runtime::XFormController > xAsFormController( m_xExternalViewController, UNO_QUERY ); ControllerFeatures aHelper( ::comphelper::getProcessServiceFactory(), xAsFormController, NULL ); aHelper->commitCurrentControl(); } - Reference< XFormController> xNewController(m_xExtViewTriggerController); + Reference< runtime::XFormController > xNewController(m_xExtViewTriggerController); CloseExternalFormViewer(); setActiveController(xNewController); return; @@ -3557,28 +3748,8 @@ void FmXFormShell::CreateExternalView() xClear->dispatch(aClearURL, Sequence< PropertyValue>()); } - // interception of slots of the external view - if (m_pExternalViewInterceptor) - { // already intercepting ... - if (m_pExternalViewInterceptor->getIntercepted() != xExternalViewFrame) - { // ... but another frame -> create a new interceptor - m_pExternalViewInterceptor->dispose(); - m_pExternalViewInterceptor->release(); - m_pExternalViewInterceptor = NULL; - } - } - - if (!m_pExternalViewInterceptor) - { - Reference< ::com::sun::star::frame::XDispatchProviderInterception> xSupplier(xExternalViewFrame, UNO_QUERY); - ::rtl::OUString sInterceptorScheme = FMURL_FORMSLOTS_PREFIX; - sInterceptorScheme += ::rtl::OUString::createFromAscii("*"); -// m_pExternalViewInterceptor = new FmXDispatchInterceptorImpl(xSupplier, this, 1, Sequence< ::rtl::OUString >(&sInterceptorScheme, 1)); -// m_pExternalViewInterceptor->acquire(); - // TODO: re-implement this in a easier way than before: We need an interceptor at the xSupplier, which - // forwards all queryDispatch requests to the FormController instance for which this "external view" - // was triggered - } + // TODO: We need an interceptor at the xSupplier, which forwards all queryDispatch requests to the FormController + // instance for which this "external view" was triggered // get the dispatch interface of the frame so we can communicate (interceptable) with the controller Reference< ::com::sun::star::frame::XDispatchProvider> xCommLink(xExternalViewFrame, UNO_QUERY); @@ -3876,7 +4047,8 @@ void FmXFormShell::CreateExternalView() // we want to know modifications done in the external view // if the external controller is a XFormController we can use all our default handlings for it - Reference< XFormController> xFormController(m_xExternalViewController, UNO_QUERY); + Reference< runtime::XFormController > xFormController( m_xExternalViewController, UNO_QUERY ); + OSL_ENSURE( xFormController.is(), "FmXFormShell::CreateExternalView:: invalid external view controller!" ); if (xFormController.is()) xFormController->addActivateListener((XFormControllerListener*)this); } @@ -4158,6 +4330,44 @@ IMPL_LINK( FmXFormShell, OnLoadForms, FmFormPage*, /*_pPage*/ ) return 0L; } +//------------------------------------------------------------------------------ +namespace +{ + sal_Bool lcl_isLoadable( const Reference< XInterface >& _rxLoadable ) + { + // determines whether a form should be loaded or not + // if there is no datasource or connection there is no reason to load a form + Reference< XPropertySet > xSet( _rxLoadable, UNO_QUERY ); + if ( !xSet.is() ) + return sal_False; + try + { + Reference< XConnection > xConn; + if ( OStaticDataAccessTools().isEmbeddedInDatabase( _rxLoadable.get(), xConn ) ) + return sal_True; + + // is there already a active connection + xSet->getPropertyValue(FM_PROP_ACTIVE_CONNECTION) >>= xConn; + if ( xConn.is() ) + return sal_True; + + ::rtl::OUString sPropertyValue; + OSL_VERIFY( xSet->getPropertyValue( FM_PROP_DATASOURCE ) >>= sPropertyValue ); + if ( sPropertyValue.getLength() ) + return sal_True; + + OSL_VERIFY( xSet->getPropertyValue( FM_PROP_URL ) >>= sPropertyValue ); + if ( sPropertyValue.getLength() ) + return sal_True; + } + catch(const Exception&) + { + DBG_UNHANDLED_EXCEPTION(); + } + return sal_False; + } +} + //------------------------------------------------------------------------ void FmXFormShell::loadForms( FmFormPage* _pPage, const sal_uInt16 _nBehaviour /* FORMS_LOAD | FORMS_SYNC */ ) { @@ -4202,7 +4412,7 @@ void FmXFormShell::loadForms( FmFormPage* _pPage, const sal_uInt16 _nBehaviour / { if ( 0 == ( _nBehaviour & FORMS_UNLOAD ) ) { - if ( ::isLoadable( xForm ) && !xForm->isLoaded() ) + if ( lcl_isLoadable( xForm ) && !xForm->isLoaded() ) xForm->load(); } else diff --git a/svx/source/form/fmsrcimp.cxx b/svx/source/form/fmsrcimp.cxx index 3d1235624802..91384d3274d5 100644 --- a/svx/source/form/fmsrcimp.cxx +++ b/svx/source/form/fmsrcimp.cxx @@ -34,7 +34,6 @@ #ifndef _SVX_FMRESIDS_HRC #include "fmresids.hrc" #endif -#include "fmtools.hxx" #include "fmsrccfg.hxx" #include <tools/debug.hxx> #include <tools/diagnose_ex.h> diff --git a/svx/source/form/fmstring.src b/svx/source/form/fmstring.src index 8b42ccadc6a6..da9b47de43cf 100644 --- a/svx/source/form/fmstring.src +++ b/svx/source/form/fmstring.src @@ -130,7 +130,7 @@ String RID_STR_DELETECONFIRM_RECORDS }; String RID_STR_DELETECONFIRM { - Text [ en-US ] = "If you click Yes, you won't be able to undo this operation!\nDo you want to continue anyway?"; + Text [ en-US ] = "If you click Yes, you won't be able to undo this operation.\nDo you want to continue anyway?"; }; String RID_ERR_NO_ELEMENT diff --git a/svx/source/form/fmtextcontrolshell.cxx b/svx/source/form/fmtextcontrolshell.cxx index fc7f1aa78558..66feffd2feba 100644 --- a/svx/source/form/fmtextcontrolshell.cxx +++ b/svx/source/form/fmtextcontrolshell.cxx @@ -89,6 +89,7 @@ namespace svx using namespace ::com::sun::star::uno; using namespace ::com::sun::star::awt; using namespace ::com::sun::star::form; + using namespace ::com::sun::star::form::runtime; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::frame; using namespace ::com::sun::star::util; diff --git a/svx/source/form/fmtools.cxx b/svx/source/form/fmtools.cxx index df8b51b8b82f..c3df100cd873 100644 --- a/svx/source/form/fmtools.cxx +++ b/svx/source/form/fmtools.cxx @@ -30,83 +30,74 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/io/XPersistObject.hpp> -#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> -#include <com/sun/star/sdb/XCompletedConnection.hpp> -#include <com/sun/star/sdbcx/Privilege.hpp> -#include <com/sun/star/lang/Locale.hpp> + +#include "fmprop.hrc" +#include "fmservs.hxx" #include "fmtools.hxx" #include "svx/dbtoolsclient.hxx" -#include "fmservs.hxx" -#include <svx/fmglob.hxx> -#include <vcl/stdtext.hxx> -#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ -#include <toolkit/unohlp.hxx> -#endif +#include "svx/fmglob.hxx" -#include <stdlib.h> -#include <stdio.h> -#include <wchar.h> -#include <com/sun/star/uno/XNamingService.hpp> -#include <com/sun/star/sdbc/XDataSource.hpp> +/** === begin UNO includes === **/ +#include <com/sun/star/awt/LineEndFormat.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> +#include <com/sun/star/beans/XIntrospection.hpp> +#include <com/sun/star/container/XChild.hpp> +#include <com/sun/star/form/XForm.hpp> +#include <com/sun/star/form/XFormComponent.hpp> +#include <com/sun/star/form/XGridColumnFactory.hpp> +#include <com/sun/star/io/XActiveDataSink.hpp> +#include <com/sun/star/io/XActiveDataSource.hpp> +#include <com/sun/star/io/XObjectInputStream.hpp> +#include <com/sun/star/io/XObjectOutputStream.hpp> +#include <com/sun/star/io/XPersistObject.hpp> +#include <com/sun/star/lang/Locale.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/sdb/CommandType.hpp> -#include <com/sun/star/sdb/XQueriesSupplier.hpp> +#include <com/sun/star/sdb/ErrorCondition.hpp> #include <com/sun/star/sdb/SQLContext.hpp> -#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#include <com/sun/star/sdb/XCompletedConnection.hpp> +#include <com/sun/star/sdb/XQueriesSupplier.hpp> #include <com/sun/star/sdb/XResultSetAccess.hpp> -#include <com/sun/star/sdb/ErrorCondition.hpp> #include <com/sun/star/sdbc/DataType.hpp> -#include <com/sun/star/util/NumberFormat.hpp> -#include <com/sun/star/io/XActiveDataSink.hpp> -#include <com/sun/star/io/XActiveDataSource.hpp> -#include <com/sun/star/script/XEventAttacherManager.hpp> -#include <com/sun/star/form/XForm.hpp> -#include <com/sun/star/form/XFormComponent.hpp> -#include <com/sun/star/util/XNumberFormatter.hpp> -#include <com/sun/star/util/XNumberFormatsSupplier.hpp> +#include <com/sun/star/sdbc/XDataSource.hpp> +#include <com/sun/star/sdbcx/Privilege.hpp> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#include <com/sun/star/task/XInteractionHandler.hpp> +#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> +#include <com/sun/star/uno/XNamingService.hpp> #include <com/sun/star/util/Language.hpp> -#include <com/sun/star/util/XNumberFormats.hpp> -#include <com/sun/star/util/XNumberFormatTypes.hpp> +#include <com/sun/star/util/NumberFormat.hpp> #include <com/sun/star/util/XCloneable.hpp> -#include <com/sun/star/io/XObjectInputStream.hpp> -#include <com/sun/star/io/XObjectOutputStream.hpp> -#include <com/sun/star/reflection/XIdlClass.hpp> -#include <com/sun/star/reflection/XIdlMethod.hpp> -#include <com/sun/star/beans/XIntrospection.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/container/XChild.hpp> -#include <com/sun/star/task/XInteractionHandler.hpp> -#include <com/sun/star/awt/LineEndFormat.hpp> -#include <com/sun/star/form/XGridColumnFactory.hpp> - +#include <com/sun/star/util/XNumberFormatTypes.hpp> +#include <com/sun/star/util/XNumberFormats.hpp> +#include <com/sun/star/util/XNumberFormatsSupplier.hpp> +#include <com/sun/star/util/XNumberFormatter.hpp> +/** === end UNO includes === **/ -#include <tools/debug.hxx> -#include <tools/string.hxx> #include <basic/sbxvar.hxx> -#include <rtl/math.hxx> -#include <vcl/svapp.hxx> - -#ifndef _SVX_FMPROP_HRC -#include "fmprop.hrc" -#endif -#include <sfx2/bindings.hxx> -#include <svtools/eitem.hxx> -#include <svtools/stritem.hxx> -#include <cppuhelper/servicefactory.hxx> -#include <comphelper/types.hxx> -#include <comphelper/property.hxx> #include <comphelper/container.hxx> -#include <connectivity/dbtools.hxx> +#include <comphelper/extract.hxx> #include <comphelper/processfactory.hxx> +#include <comphelper/property.hxx> #include <comphelper/sequence.hxx> -#include <comphelper/extract.hxx> +#include <comphelper/types.hxx> #include <comphelper/uno3.hxx> #include <connectivity/dbexception.hxx> -#include <comphelper/extract.hxx> +#include <connectivity/dbtools.hxx> +#include <cppuhelper/servicefactory.hxx> #include <cppuhelper/typeprovider.hxx> -#include <algorithm> #include <rtl/logfile.hxx> +#include <rtl/math.hxx> +#include <sfx2/bindings.hxx> +#include <svtools/eitem.hxx> +#include <svtools/stritem.hxx> +#include <toolkit/unohlp.hxx> +#include <tools/debug.hxx> +#include <tools/string.hxx> +#include <vcl/stdtext.hxx> +#include <vcl/svapp.hxx> + +#include <algorithm> using namespace ::com::sun::star::uno; using namespace ::com::sun::star::util; @@ -204,106 +195,8 @@ void displayException(const ::com::sun::star::sdb::SQLErrorEvent& _rEvent, Windo } //------------------------------------------------------------------------------ -Reference< XInterface > cloneUsingProperties(const Reference< ::com::sun::star::io::XPersistObject>& _xObj) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::cloneUsingProperties" ); - if (!_xObj.is()) - return Reference< XInterface >(); - - // create a new object - ::rtl::OUString aObjectService = _xObj->getServiceName(); - Reference< ::com::sun::star::beans::XPropertySet> xDestSet(::comphelper::getProcessServiceFactory()->createInstance(aObjectService), UNO_QUERY); - if (!xDestSet.is()) - { - DBG_ERROR("cloneUsingProperties : could not instantiate an object of the given type !"); - return Reference< XInterface >(); - } - // transfer properties - Reference< XPropertySet > xSourceSet(_xObj, UNO_QUERY); - Reference< XPropertySetInfo > xSourceInfo( xSourceSet->getPropertySetInfo()); - Sequence< Property> aSourceProperties = xSourceInfo->getProperties(); - Reference< XPropertySetInfo > xDestInfo( xDestSet->getPropertySetInfo()); - Sequence< Property> aDestProperties = xDestInfo->getProperties(); - int nDestLen = aDestProperties.getLength(); - - Property* pSourceProps = aSourceProperties.getArray(); - Property* pSourceEnd = pSourceProps + aSourceProperties.getLength(); - Property* pDestProps = aDestProperties.getArray(); - - for (; pSourceProps != pSourceEnd; ++pSourceProps) - { - ::com::sun::star::beans::Property* pResult = ::std::lower_bound( - pDestProps, - pDestProps + nDestLen, - pSourceProps->Name, - ::comphelper::PropertyStringLessFunctor() - ); - - if ( ( pResult != pDestProps + nDestLen ) - && ( pResult->Name == pSourceProps->Name ) - && ( pResult->Attributes == pSourceProps->Attributes ) - && ( (pResult->Attributes & PropertyAttribute::READONLY ) == 0 ) - && ( pResult->Type.equals( pSourceProps->Type ) ) - ) - { // Attribute/type are the same and the prop isn't readonly - try - { - xDestSet->setPropertyValue(pResult->Name, xSourceSet->getPropertyValue(pResult->Name)); - } - catch(IllegalArgumentException e) - { - (void)e; -#ifdef DBG_UTIL - ::rtl::OString sMessage("cloneUsingProperties : could not transfer the value for property \""); - sMessage = sMessage + ::rtl::OString(pResult->Name.getStr(), pResult->Name.getLength(), RTL_TEXTENCODING_ASCII_US); - sMessage = sMessage + '\"'; - DBG_ERROR(sMessage); -#endif - } - - } - } - - return xDestSet.get(); -} - -//------------------------------------------------------------------------------ -sal_Bool searchElement(const Reference< ::com::sun::star::container::XIndexAccess>& xCont, const Reference< XInterface >& xElement) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::searchElement" ); - if (!xCont.is() || !xElement.is()) - return sal_False; - - sal_Int32 nCount = xCont->getCount(); - Reference< XInterface > xComp; - for (sal_Int32 i = 0; i < nCount; i++) - { - try - { - xCont->getByIndex(i) >>= xComp; - if (xComp.is()) - { - if ( xElement == xComp ) - return sal_True; - else - { - Reference< ::com::sun::star::container::XIndexAccess> xCont2(xComp, UNO_QUERY); - if (xCont2.is() && searchElement(xCont2, xElement)) - return sal_True; - } - } - } - catch(Exception&) - { - } - } - return sal_False; -} - -//------------------------------------------------------------------------------ sal_Int32 getElementPos(const Reference< ::com::sun::star::container::XIndexAccess>& xCont, const Reference< XInterface >& xElement) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::getElementPos" ); sal_Int32 nIndex = -1; if (!xCont.is()) return nIndex; @@ -336,127 +229,6 @@ sal_Int32 getElementPos(const Reference< ::com::sun::star::container::XIndexAcce } //------------------------------------------------------------------ -String getFormComponentAccessPath(const Reference< XInterface >& _xElement, Reference< XInterface >& _rTopLevelElement) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::getFormComponentAccessPath" ); - Reference< ::com::sun::star::form::XFormComponent> xChild(_xElement, UNO_QUERY); - Reference< ::com::sun::star::container::XIndexAccess> xParent; - if (xChild.is()) - xParent = Reference< ::com::sun::star::container::XIndexAccess>(xChild->getParent(), UNO_QUERY); - - // while the current content is a form - String sReturn; - String sCurrentIndex; - while (xChild.is()) - { - // get the content's relative pos within it's parent container - sal_Int32 nPos = getElementPos(xParent, xChild); - - // prepend this current relaive pos - sCurrentIndex = String::CreateFromInt32(nPos); - if (sReturn.Len() != 0) - { - sCurrentIndex += '\\'; - sCurrentIndex += sReturn; - } - - sReturn = sCurrentIndex; - - // travel up - if (::comphelper::query_interface((Reference< XInterface >)xParent,xChild)) - xParent = Reference< ::com::sun::star::container::XIndexAccess>(xChild->getParent(), UNO_QUERY); - } - - _rTopLevelElement = xParent; - return sReturn; -} - -//------------------------------------------------------------------ -String getFormComponentAccessPath(const Reference< XInterface >& _xElement) -{ - Reference< XInterface > xDummy; - return getFormComponentAccessPath(_xElement, xDummy); -} - -//------------------------------------------------------------------------------ -Reference< XInterface > getElementFromAccessPath(const Reference< ::com::sun::star::container::XIndexAccess>& _xParent, const String& _rRelativePath) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::getElementFromAccessPath" ); - if (!_xParent.is()) - return Reference< XInterface >(); - Reference< ::com::sun::star::container::XIndexAccess> xContainer(_xParent); - Reference< XInterface > xElement( _xParent); - - String sPath(_rRelativePath); - while (sPath.Len() && xContainer.is()) - { - xub_StrLen nSepPos = sPath.Search((sal_Unicode)'\\'); - - String sIndex(sPath.Copy(0, (nSepPos == STRING_NOTFOUND) ? sPath.Len() : nSepPos)); - // DBG_ASSERT(sIndex.IsNumeric(), "getElementFromAccessPath : invalid path !"); - - sPath = sPath.Copy((nSepPos == STRING_NOTFOUND) ? sPath.Len() : nSepPos+1); - - ::cppu::extractInterface(xElement, xContainer->getByIndex(sIndex.ToInt32())); - xContainer = Reference< ::com::sun::star::container::XIndexAccess>::query(xElement); - } - - if (sPath.Len() != 0) - // the loop terminated because an element wasn't a container, but we stil have a path -> the path is invalid - xElement = NULL; - - return xElement; -} - -//------------------------------------------------------------------ -// Vergleichen von PropertyInfo -extern "C" int -#if defined( WNT ) - __cdecl -#endif -#if defined( ICC ) && defined( OS2 ) -_Optlink -#endif - NameCompare(const void* pFirst, const void* pSecond) -{ - return ((::rtl::OUString*)pFirst)->compareTo(*(::rtl::OUString*)pSecond); -} - -//------------------------------------------------------------------------------ -sal_Int32 findPos(const ::rtl::OUString& aStr, const Sequence< ::rtl::OUString>& rList) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::findPos" ); - const ::rtl::OUString* pStrList = rList.getConstArray(); - ::rtl::OUString* pResult = (::rtl::OUString*) bsearch(&aStr, (void*)pStrList, rList.getLength(), sizeof(::rtl::OUString), - &NameCompare); - - if (pResult) - return (pResult - pStrList); - else - return -1; -} - -//------------------------------------------------------------------ -Reference< ::com::sun::star::frame::XModel> getXModel(const Reference< XInterface >& xIface) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::getXModel" ); - Reference< ::com::sun::star::frame::XModel> xModel(xIface, UNO_QUERY); - if (xModel.is()) - return xModel; - else - { - Reference< ::com::sun::star::container::XChild> xChild(xIface, UNO_QUERY); - if (xChild.is()) - { - Reference< XInterface > xParent( xChild->getParent()); - return getXModel(xParent); - } - else - return NULL; - } -} - -//------------------------------------------------------------------ ::rtl::OUString getLabelName(const Reference< ::com::sun::star::beans::XPropertySet>& xControlModel) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::getLabelName" ); @@ -690,412 +462,6 @@ sal_Int16 getControlTypeByObject(const Reference< ::com::sun::star::lang::XServi } //------------------------------------------------------------------------------ -::rtl::OUString getServiceNameByControlType(sal_Int16 nType) -{ - switch (nType) - { - case OBJ_FM_EDIT : return FM_COMPONENT_TEXTFIELD; - case OBJ_FM_BUTTON : return FM_COMPONENT_COMMANDBUTTON; - case OBJ_FM_FIXEDTEXT : return FM_COMPONENT_FIXEDTEXT; - case OBJ_FM_LISTBOX : return FM_COMPONENT_LISTBOX; - case OBJ_FM_CHECKBOX : return FM_COMPONENT_CHECKBOX; - case OBJ_FM_RADIOBUTTON : return FM_COMPONENT_RADIOBUTTON; - case OBJ_FM_GROUPBOX : return FM_COMPONENT_GROUPBOX; - case OBJ_FM_COMBOBOX : return FM_COMPONENT_COMBOBOX; - case OBJ_FM_GRID : return FM_COMPONENT_GRIDCONTROL; - case OBJ_FM_IMAGEBUTTON : return FM_COMPONENT_IMAGEBUTTON; - case OBJ_FM_FILECONTROL : return FM_COMPONENT_FILECONTROL; - case OBJ_FM_DATEFIELD : return FM_COMPONENT_DATEFIELD; - case OBJ_FM_TIMEFIELD : return FM_COMPONENT_TIMEFIELD; - case OBJ_FM_NUMERICFIELD : return FM_COMPONENT_NUMERICFIELD; - case OBJ_FM_CURRENCYFIELD : return FM_COMPONENT_CURRENCYFIELD; - case OBJ_FM_PATTERNFIELD : return FM_COMPONENT_PATTERNFIELD; - case OBJ_FM_HIDDEN : return FM_COMPONENT_HIDDENCONTROL; - case OBJ_FM_IMAGECONTROL : return FM_COMPONENT_IMAGECONTROL; - case OBJ_FM_FORMATTEDFIELD : return FM_COMPONENT_FORMATTEDFIELD; - case OBJ_FM_SCROLLBAR : return FM_SUN_COMPONENT_SCROLLBAR; - case OBJ_FM_SPINBUTTON : return FM_SUN_COMPONENT_SPINBUTTON; - case OBJ_FM_NAVIGATIONBAR : return FM_SUN_COMPONENT_NAVIGATIONBAR; - } - return ::rtl::OUString(); -} -//------------------------------------------------------------------------------ -Sequence< ::rtl::OUString> getEventMethods(const Type& type) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::getEventMethods" ); - typelib_InterfaceTypeDescription *pType=0; - type.getDescription( (typelib_TypeDescription**)&pType); - - if(!pType) - return Sequence< ::rtl::OUString>(); - - Sequence< ::rtl::OUString> aNames(pType->nMembers); - ::rtl::OUString* pNames = aNames.getArray(); - for(sal_Int32 i=0;i<pType->nMembers;i++,++pNames) - { - // the decription reference - typelib_TypeDescriptionReference* pMemberDescriptionReference = pType->ppMembers[i]; - // the description for the reference - typelib_TypeDescription* pMemberDescription = NULL; - typelib_typedescriptionreference_getDescription(&pMemberDescription, pMemberDescriptionReference); - if (pMemberDescription) - { - typelib_InterfaceMemberTypeDescription* pRealMemberDescription = - reinterpret_cast<typelib_InterfaceMemberTypeDescription*>(pMemberDescription); - *pNames = pRealMemberDescription->pMemberName; - } - } - typelib_typedescription_release( (typelib_TypeDescription *)pType ); - return aNames; -} - - -//------------------------------------------------------------------------------ -void TransferEventScripts(const Reference< ::com::sun::star::awt::XControlModel>& xModel, const Reference< ::com::sun::star::awt::XControl>& xControl, - const Sequence< ::com::sun::star::script::ScriptEventDescriptor>& rTransferIfAvailable) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::TransferEventScripts" ); - // first check if we have a XEventAttacherManager for the model - Reference< ::com::sun::star::container::XChild> xModelChild(xModel, UNO_QUERY); - if (!xModelChild.is()) - return; // nothing to do - - Reference< ::com::sun::star::script::XEventAttacherManager> xEventManager(xModelChild->getParent(), UNO_QUERY); - if (!xEventManager.is()) - return; // nothing to do - - if (!rTransferIfAvailable.getLength()) - return; // nothing to do - - // check for the index of the model within it's parent - Reference< ::com::sun::star::container::XIndexAccess> xParentIndex(xModelChild->getParent(), UNO_QUERY); - if (!xParentIndex.is()) - return; // nothing to do - sal_Int32 nIndex = getElementPos(xParentIndex, xModel); - if (nIndex<0 || nIndex>=xParentIndex->getCount()) - return; // nothing to do - - // then we need informations about the listeners supported by the control and the model - Sequence< Type> aModelListeners; - Sequence< Type> aControlListeners; - - Reference< ::com::sun::star::beans::XIntrospection> xModelIntrospection(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.beans.Introspection")), UNO_QUERY); - Reference< ::com::sun::star::beans::XIntrospection> xControlIntrospection(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.beans.Introspection")), UNO_QUERY); - - if (xModelIntrospection.is() && xModel.is()) - { - Any aModel(makeAny(xModel)); - aModelListeners = xModelIntrospection->inspect(aModel)->getSupportedListeners(); - } - - if (xControlIntrospection.is() && xControl.is()) - { - Any aControl(makeAny(xControl)); - aControlListeners = xControlIntrospection->inspect(aControl)->getSupportedListeners(); - } - - sal_Int32 nMaxNewLen = aModelListeners.getLength() + aControlListeners.getLength(); - if (!nMaxNewLen) - return; // the model and the listener don't support any listeners (or we were unable to retrieve these infos) - - Sequence< ::com::sun::star::script::ScriptEventDescriptor> aTransferable(nMaxNewLen); - ::com::sun::star::script::ScriptEventDescriptor* pTransferable = aTransferable.getArray(); - - const ::com::sun::star::script::ScriptEventDescriptor* pCurrent = rTransferIfAvailable.getConstArray(); - sal_Int32 i,j,k; - for (i=0; i<rTransferIfAvailable.getLength(); ++i, ++pCurrent) - { - // search the model/control idl classes for the event described by pCurrent - for ( Sequence< Type>* pCurrentArray = &aModelListeners; - pCurrentArray; - pCurrentArray = (pCurrentArray == &aModelListeners) ? &aControlListeners : NULL - ) - { - const Type* pCurrentListeners = pCurrentArray->getConstArray(); - for (j=0; j<pCurrentArray->getLength(); ++j, ++pCurrentListeners) - { - UniString aListener = (*pCurrentListeners).getTypeName(); - xub_StrLen nTokens = aListener.GetTokenCount('.'); - if (nTokens) - aListener = aListener.GetToken(nTokens - 1, '.'); - - if (aListener == pCurrent->ListenerType.getStr()) - // the current ::com::sun::star::script::ScriptEventDescriptor doesn't match the current listeners class - continue; - - // now check the methods - Sequence< ::rtl::OUString> aMethodsNames = getEventMethods(*pCurrentListeners); - const ::rtl::OUString* pMethodsNames = aMethodsNames.getConstArray(); - for (k=0; k<aMethodsNames.getLength(); ++k, ++pMethodsNames) - { - if ((*pMethodsNames).compareTo(pCurrent->EventMethod) != COMPARE_EQUAL) - // the current ::com::sun::star::script::ScriptEventDescriptor doesn't match the current listeners current method - continue; - - // we can transfer the script event : the model (control) supports it - *pTransferable = *pCurrent; - ++pTransferable; - break; - } - if (k<aMethodsNames.getLength()) - break; - } - } - } - - sal_Int32 nRealNewLen = pTransferable - aTransferable.getArray(); - aTransferable.realloc(nRealNewLen); - - xEventManager->registerScriptEvents(nIndex, aTransferable); -} - -//------------------------------------------------------------------------------ -sal_Int16 GridView2ModelPos(const Reference< ::com::sun::star::container::XIndexAccess>& rColumns, sal_Int16 nViewPos) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::GridView2ModelPos" ); - try - { - if (rColumns.is()) - { - // loop through all columns - sal_Int16 i; - Reference< ::com::sun::star::beans::XPropertySet> xCur; - for (i=0; i<rColumns->getCount(); ++i) - { - rColumns->getByIndex(i) >>= xCur; - if (!::comphelper::getBOOL(xCur->getPropertyValue(FM_PROP_HIDDEN))) - { - // for every visible col : if nViewPos is greater zero, decrement it, else we - // have found the model position - if (!nViewPos) - break; - else - --nViewPos; - } - } - if (i<rColumns->getCount()) - return i; - } - } - catch(const Exception&) - { - DBG_ERROR("GridView2ModelPos Exception occured!"); - } - return (sal_Int16)-1; -} - -//======================================================================== -//= FmXDispatchInterceptorImpl -//======================================================================== - -DBG_NAME(FmXDispatchInterceptorImpl); -//------------------------------------------------------------------------ -FmXDispatchInterceptorImpl::FmXDispatchInterceptorImpl( - const Reference< XDispatchProviderInterception >& _rxToIntercept, FmDispatchInterceptor* _pMaster, - sal_Int16 _nId, Sequence< ::rtl::OUString > _rInterceptedSchemes) - :FmXDispatchInterceptorImpl_BASE(_pMaster && _pMaster->getInterceptorMutex() ? *_pMaster->getInterceptorMutex() : m_aFallback) - ,m_xIntercepted(_rxToIntercept) - ,m_bListening(sal_False) - ,m_pMaster(_pMaster) - ,m_nId(_nId) - ,m_aInterceptedURLSchemes(_rInterceptedSchemes) -{ - DBG_CTOR(FmXDispatchInterceptorImpl,NULL); - - ::osl::MutexGuard aGuard(getAccessSafety()); - ::comphelper::increment(m_refCount); - if (_rxToIntercept.is()) - { - _rxToIntercept->registerDispatchProviderInterceptor((::com::sun::star::frame::XDispatchProviderInterceptor*)this); - // this should make us the top-level dispatch-provider for the component, via a call to our - // setDispatchProvider we should have got an fallback for requests we (i.e. our master) cannot fullfill - Reference< ::com::sun::star::lang::XComponent> xInterceptedComponent(_rxToIntercept, UNO_QUERY); - if (xInterceptedComponent.is()) - { - xInterceptedComponent->addEventListener(this); - m_bListening = sal_True; - } - } - ::comphelper::decrement(m_refCount); -} - -//------------------------------------------------------------------------ -FmXDispatchInterceptorImpl::~FmXDispatchInterceptorImpl() -{ - if (!rBHelper.bDisposed) - dispose(); - - DBG_DTOR(FmXDispatchInterceptorImpl,NULL); -} - -//------------------------------------------------------------------------------ -Sequence< sal_Int8 > SAL_CALL FmXDispatchInterceptorImpl::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(); -} - -//------------------------------------------------------------------------------ -Reference< ::com::sun::star::frame::XDispatch > SAL_CALL FmXDispatchInterceptorImpl::queryDispatch( const URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags ) throw(RuntimeException) -{ - ::osl::MutexGuard aGuard(getAccessSafety()); - Reference< ::com::sun::star::frame::XDispatch> xResult; - // ask our 'real' interceptor - if (m_pMaster) - xResult = m_pMaster->interceptedQueryDispatch(m_nId, aURL, aTargetFrameName, nSearchFlags); - - // ask our slave provider - if (!xResult.is() && m_xSlaveDispatcher.is()) - xResult = m_xSlaveDispatcher->queryDispatch(aURL, aTargetFrameName, nSearchFlags); - - return xResult; -} - -//------------------------------------------------------------------------------ -Sequence< Reference< ::com::sun::star::frame::XDispatch > > SAL_CALL -FmXDispatchInterceptorImpl::queryDispatches( const Sequence< ::com::sun::star::frame::DispatchDescriptor >& aDescripts ) throw(RuntimeException) -{ - ::osl::MutexGuard aGuard(getAccessSafety()); - Sequence< Reference< ::com::sun::star::frame::XDispatch> > aReturn(aDescripts.getLength()); - Reference< ::com::sun::star::frame::XDispatch>* pReturn = aReturn.getArray(); - const ::com::sun::star::frame::DispatchDescriptor* pDescripts = aDescripts.getConstArray(); - for (sal_Int16 i=0; i<aDescripts.getLength(); ++i, ++pReturn, ++pDescripts) - { - *pReturn = queryDispatch(pDescripts->FeatureURL, pDescripts->FrameName, pDescripts->SearchFlags); - } - return aReturn; -} - -//------------------------------------------------------------------------------ -Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL FmXDispatchInterceptorImpl::getSlaveDispatchProvider( ) throw(RuntimeException) -{ - ::osl::MutexGuard aGuard(getAccessSafety()); - return m_xSlaveDispatcher; -} - -//------------------------------------------------------------------------------ -void SAL_CALL FmXDispatchInterceptorImpl::setSlaveDispatchProvider(const Reference< ::com::sun::star::frame::XDispatchProvider>& xNewDispatchProvider) throw( RuntimeException ) -{ - ::osl::MutexGuard aGuard(getAccessSafety()); - m_xSlaveDispatcher = xNewDispatchProvider; -} - -//------------------------------------------------------------------------------ -Reference< ::com::sun::star::frame::XDispatchProvider> SAL_CALL FmXDispatchInterceptorImpl::getMasterDispatchProvider(void) throw( RuntimeException ) -{ - ::osl::MutexGuard aGuard(getAccessSafety()); - return m_xMasterDispatcher; -} - -//------------------------------------------------------------------------------ -void SAL_CALL FmXDispatchInterceptorImpl::setMasterDispatchProvider(const Reference< ::com::sun::star::frame::XDispatchProvider>& xNewSupplier) throw( RuntimeException ) -{ - ::osl::MutexGuard aGuard(getAccessSafety()); - m_xMasterDispatcher = xNewSupplier; -} - -//------------------------------------------------------------------------------ -Sequence< ::rtl::OUString > SAL_CALL FmXDispatchInterceptorImpl::getInterceptedURLs( ) throw(RuntimeException) -{ - return m_aInterceptedURLSchemes; -} - -//------------------------------------------------------------------------------ -void SAL_CALL FmXDispatchInterceptorImpl::disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException ) -{ - if (m_bListening) - { - Reference< XDispatchProviderInterception > xIntercepted(m_xIntercepted.get(), UNO_QUERY); - if (Source.Source == xIntercepted) - ImplDetach(); - } -} - -//------------------------------------------------------------------------------ -void FmXDispatchInterceptorImpl::ImplDetach() -{ - ::osl::MutexGuard aGuard(getAccessSafety()); - OSL_ENSURE(m_bListening, "FmXDispatchInterceptorImpl::ImplDetach: invalid call!"); - - // deregister ourself from the interception component - Reference< XDispatchProviderInterception > xIntercepted(m_xIntercepted.get(), UNO_QUERY); - if (xIntercepted.is()) - xIntercepted->releaseDispatchProviderInterceptor(static_cast<XDispatchProviderInterceptor*>(this)); - -// m_xIntercepted = Reference< XDispatchProviderInterception >(); - // Don't reset m_xIntercepted: It may be needed by our owner to check for which object we were - // responsible. As we hold the object with a weak reference only, this should be no problem. - // 88936 - 23.07.2001 - frank.schoenheit@sun.com - m_pMaster = NULL; - m_bListening = sal_False; -} - -//------------------------------------------------------------------------------ -void FmXDispatchInterceptorImpl::disposing() -{ - // remove ourself as event listener from the interception component - if (m_bListening) - { - Reference< ::com::sun::star::lang::XComponent> xInterceptedComponent(m_xIntercepted.get(), UNO_QUERY); - if (xInterceptedComponent.is()) - xInterceptedComponent->removeEventListener(static_cast<XEventListener*>(this)); - - // detach from the interception component - ImplDetach(); - } -} - -//============================================================================== -//============================================================================== - -//------------------------------------------------------------------------------ -sal_Bool isLoadable( const Reference< XInterface >& _rxLoadable ) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::isLoadable" ); - // determines whether a form should be loaded or not - // if there is no datasource or connection there is no reason to load a form - Reference< XPropertySet > xSet( _rxLoadable, UNO_QUERY ); - if ( xSet.is() ) - { - try - { - Reference< XConnection > xConn; - if ( OStaticDataAccessTools().isEmbeddedInDatabase( _rxLoadable.get(), xConn ) ) - return sal_True; - - // is there already a active connection - xSet->getPropertyValue(FM_PROP_ACTIVE_CONNECTION) >>= xConn; - if ( xConn.is() ) - return sal_True; - - ::rtl::OUString sPropertyValue; - OSL_VERIFY( xSet->getPropertyValue( FM_PROP_DATASOURCE ) >>= sPropertyValue ); - if ( sPropertyValue.getLength() ) - return sal_True; - - OSL_VERIFY( xSet->getPropertyValue( FM_PROP_URL ) >>= sPropertyValue ); - if ( sPropertyValue.getLength() ) - return sal_True; - } - catch(Exception&) - { - DBG_ERROR( "isLoadable: caught an exception!" ); - } - - } - return sal_False; -} - -//------------------------------------------------------------------------------ void setConnection(const Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet, const Reference< ::com::sun::star::sdbc::XConnection>& _rxConn) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "fmtools::setConnection" ); diff --git a/svx/source/form/fmundo.cxx b/svx/source/form/fmundo.cxx index 2436113312cc..3295d011f9ff 100644 --- a/svx/source/form/fmundo.cxx +++ b/svx/source/form/fmundo.cxx @@ -30,12 +30,23 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" + #include "fmundo.hxx" +#include "fmtools.hxx" +#include "fmpgeimp.hxx" +#include "svx/dbtoolsclient.hxx" +#include "svditer.hxx" +#include "fmobj.hxx" +#include "fmprop.hrc" +#include "fmresids.hrc" +#include "svx/fmglob.hxx" +#include "svx/dialmgr.hxx" +#include "svx/fmmodel.hxx" +#include "svx/fmpage.hxx" /** === begin UNO includes === **/ #include <com/sun/star/util/XModifyBroadcaster.hpp> #include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/form/XFormController.hpp> #include <com/sun/star/container/XContainer.hpp> #include <com/sun/star/container/XContainerListener.hpp> #include <com/sun/star/script/XEventAttacherManager.hpp> @@ -44,18 +55,7 @@ #include <com/sun/star/reflection/XInterfaceMethodTypeDescription.hpp> /** === end UNO includes === **/ -#ifndef _FM_FMMODEL_HXX -#include <svx/fmmodel.hxx> -#endif -#include "fmtools.hxx" -#include <svx/fmpage.hxx> -#ifndef _SVX_FMRESIDS_HRC -#include "fmresids.hrc" -#endif #include <rtl/logfile.hxx> -#include <svx/dialmgr.hxx> -#include "fmpgeimp.hxx" -#include "svx/dbtoolsclient.hxx" #include <svtools/macitem.hxx> #include <tools/shl.hxx> #include <tools/diagnose_ex.h> @@ -64,13 +64,8 @@ #include <sfx2/app.hxx> #include <sfx2/sfx.hrc> #include <sfx2/event.hxx> -#include "svditer.hxx" -#include "fmobj.hxx" #include <osl/mutex.hxx> -#include <svx/fmglob.hxx> -#ifndef _SVX_FMPROP_HRC -#include "fmprop.hrc" -#endif +#include <vos/mutex.hxx> #include <comphelper/property.hxx> #include <comphelper/uno3.hxx> #include <comphelper/stl_types.hxx> @@ -301,6 +296,42 @@ void FmXUndoEnvironment::Inserted(SdrObject* pObj) } //------------------------------------------------------------------------------ +namespace +{ + sal_Bool lcl_searchElement(const Reference< XIndexAccess>& xCont, const Reference< XInterface >& xElement) + { + if (!xCont.is() || !xElement.is()) + return sal_False; + + sal_Int32 nCount = xCont->getCount(); + Reference< XInterface > xComp; + for (sal_Int32 i = 0; i < nCount; i++) + { + try + { + xCont->getByIndex(i) >>= xComp; + if (xComp.is()) + { + if ( xElement == xComp ) + return sal_True; + else + { + Reference< XIndexAccess> xCont2(xComp, UNO_QUERY); + if (xCont2.is() && lcl_searchElement(xCont2, xElement)) + return sal_True; + } + } + } + catch(const Exception&) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + return sal_False; + } +} + +//------------------------------------------------------------------------------ void FmXUndoEnvironment::Inserted(FmFormObj* pObj) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXUndoEnvironment::Inserted" ); @@ -326,7 +357,7 @@ void FmXUndoEnvironment::Inserted(FmFormObj* pObj) Reference< XIndexContainer > xNewParent; Reference< XForm > xForm; sal_Int32 nPos = -1; - if ( searchElement( xForms, xObjectParent ) ) + if ( lcl_searchElement( xForms, xObjectParent ) ) { // the form which was the parent of the object when it was removed is still // part of the form component hierachy of the current page diff --git a/svx/source/form/fmview.cxx b/svx/source/form/fmview.cxx index 222407a36021..24029a98a393 100644 --- a/svx/source/form/fmview.cxx +++ b/svx/source/form/fmview.cxx @@ -61,7 +61,6 @@ #include <svx/fmpage.hxx> #include <svx/fmshell.hxx> #include "fmpgeimp.hxx" -#include "fmtools.hxx" #include "fmshimp.hxx" #include "fmservs.hxx" #include "fmprop.hrc" @@ -626,7 +625,7 @@ void FmFormView::createControlLabelPair( OutputDevice* _pOutDev, sal_Int32 _nXOf ); } // ----------------------------------------------------------------------------- -Reference< XFormController > FmFormView::GetFormController( const Reference< XForm >& _rxForm, const OutputDevice& _rDevice ) const +Reference< runtime::XFormController > FmFormView::GetFormController( const Reference< XForm >& _rxForm, const OutputDevice& _rDevice ) const { return pImpl->getFormController( _rxForm, _rDevice ); } diff --git a/svx/source/form/fmvwimp.cxx b/svx/source/form/fmvwimp.cxx index 46750d524a4d..fc4bbc62b58e 100644 --- a/svx/source/form/fmvwimp.cxx +++ b/svx/source/form/fmvwimp.cxx @@ -31,7 +31,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" -#include "fmctrler.hxx" #include "fmdocumentclassification.hxx" #include "fmobj.hxx" #include "fmpgeimp.hxx" @@ -39,7 +38,6 @@ #include "fmresids.hrc" #include "fmservs.hxx" #include "fmshimp.hxx" -#include "fmtools.hxx" #include "fmundo.hxx" #include "fmvwimp.hxx" #include "formcontrolfactory.hxx" @@ -84,68 +82,88 @@ #include <com/sun/star/sdbcx/XTablesSupplier.hpp> #include <com/sun/star/sdbc/XPreparedStatement.hpp> #include <com/sun/star/sdb/XQueriesSupplier.hpp> +#include <com/sun/star/container/XContainer.hpp> /** === end UNO includes === **/ #include <comphelper/enumhelper.hxx> #include <comphelper/extract.hxx> +#include <comphelper/namedvaluecollection.hxx> #include <comphelper/numbers.hxx> #include <comphelper/property.hxx> +#include <cppuhelper/exc_hlp.hxx> #include <svtools/moduleoptions.hxx> #include <tools/diagnose_ex.h> #include <vcl/msgbox.hxx> #include <vcl/stdtext.hxx> +#include <vos/mutex.hxx> #include <rtl/logfile.hxx> #include <algorithm> -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::sdb; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::form; -using namespace ::com::sun::star::awt; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::util; -using namespace ::com::sun::star::script; -using namespace ::com::sun::star::style; -using namespace ::com::sun::star::task; -using namespace ::com::sun::star::ui::dialogs; using namespace ::comphelper; -using namespace ::svxform; using namespace ::svx; -using com::sun::star::style::VerticalAlignment_MIDDLE; -using ::com::sun::star::form::binding::XValueBinding; -using ::com::sun::star::form::binding::XBindableValue; - -namespace svxform -{ - //======================================================================== - class OAutoDispose - { - protected: - Reference< XComponent > m_xComp; - - public: - OAutoDispose( const Reference< XInterface > _rxObject ); - ~OAutoDispose(); - }; +using namespace ::svxform; - //------------------------------------------------------------------------ - OAutoDispose::OAutoDispose( const Reference< XInterface > _rxObject ) - :m_xComp(_rxObject, UNO_QUERY) - { - } - - //------------------------------------------------------------------------ - OAutoDispose::~OAutoDispose() - { - if (m_xComp.is()) - m_xComp->dispose(); - } -} + using namespace ::com::sun::star; + /** === begin UNO using === **/ + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Type; + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::style::VerticalAlignment_MIDDLE; + using ::com::sun::star::form::FormButtonType_SUBMIT; + using ::com::sun::star::form::binding::XValueBinding; + using ::com::sun::star::form::binding::XBindableValue; + using ::com::sun::star::lang::XComponent; + using ::com::sun::star::container::XIndexAccess; + using ::com::sun::star::form::XForm; + using ::com::sun::star::form::runtime::XFormController; + using ::com::sun::star::script::XEventAttacherManager; + using ::com::sun::star::awt::XTabControllerModel; + using ::com::sun::star::container::XChild; + using ::com::sun::star::container::XEnumeration; + using ::com::sun::star::task::XInteractionHandler; + using ::com::sun::star::lang::XInitialization; + using ::com::sun::star::awt::XTabController; + using ::com::sun::star::lang::XUnoTunnel; + using ::com::sun::star::awt::XControlContainer; + using ::com::sun::star::awt::XControl; + using ::com::sun::star::form::XFormComponent; + using ::com::sun::star::form::XForm; + using ::com::sun::star::lang::IndexOutOfBoundsException; + using ::com::sun::star::lang::WrappedTargetException; + using ::com::sun::star::container::XContainer; + using ::com::sun::star::container::ContainerEvent; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::beans::NamedValue; + using ::com::sun::star::sdb::SQLErrorEvent; + using ::com::sun::star::sdbc::XRowSet; + using ::com::sun::star::beans::XPropertySet; + using ::com::sun::star::container::XElementAccess; + using ::com::sun::star::awt::XWindow; + using ::com::sun::star::awt::FocusEvent; + using ::com::sun::star::ui::dialogs::XExecutableDialog; + using ::com::sun::star::sdbc::XDataSource; + using ::com::sun::star::container::XIndexContainer; + using ::com::sun::star::sdbc::XConnection; + using ::com::sun::star::container::XNameAccess; + using ::com::sun::star::sdb::SQLContext; + using ::com::sun::star::sdbc::SQLWarning; + using ::com::sun::star::sdbc::SQLException; + using ::com::sun::star::util::XNumberFormatsSupplier; + using ::com::sun::star::util::XNumberFormats; + using ::com::sun::star::beans::XPropertySetInfo; + /** === end UNO using === **/ + namespace FormComponentType = ::com::sun::star::form::FormComponentType; + namespace CommandType = ::com::sun::star::sdb::CommandType; + namespace DataType = ::com::sun::star::sdbc::DataType; //------------------------------------------------------------------------------ class FmXFormView::ObjectRemoveListener : public SfxListener @@ -181,7 +199,7 @@ FmXPageViewWinRec::FmXPageViewWinRec( const ::comphelper::ComponentContext& _rCo { Reference< XForm > xForm( xForms->getByIndex(i), UNO_QUERY ); if ( xForm.is() ) - setController( xForm ); + setController( xForm, NULL ); } } catch( const Exception& ) @@ -207,7 +225,7 @@ void FmXPageViewWinRec::dispose() { try { - Reference< XFormController > xController( *i, UNO_SET_THROW ); + Reference< XFormController > xController( *i, UNO_QUERY_THROW ); // detaching the events Reference< XChild > xControllerModel( xController->getModel(), UNO_QUERY ); @@ -276,6 +294,21 @@ Any SAL_CALL FmXPageViewWinRec::getByIndex(sal_Int32 nIndex) throw( IndexOutOfBo } //------------------------------------------------------------------------ +void SAL_CALL FmXPageViewWinRec::makeVisible( const Reference< XControl >& _Control ) throw (RuntimeException) +{ + ::vos::OGuard aSolarGuard(Application::GetSolarMutex()); + + Reference< XWindow > xWindow( _Control, UNO_QUERY ); + if ( xWindow.is() && m_pViewImpl->getView() && m_pWindow ) + { + awt::Rectangle aRect = xWindow->getPosSize(); + ::Rectangle aNewRect( aRect.X, aRect.Y, aRect.X + aRect.Width, aRect.Y + aRect.Height ); + aNewRect = m_pWindow->PixelToLogic( aNewRect ); + m_pViewImpl->getView()->MakeVisible( aNewRect, *m_pWindow ); + } +} + +//------------------------------------------------------------------------ Reference< XFormController > getControllerSearchChilds( const Reference< XIndexAccess > & xIndex, const Reference< XTabControllerModel > & xModel) { if (xIndex.is() && xIndex->getCount()) @@ -319,9 +352,8 @@ Reference< XFormController > FmXPageViewWinRec::getController( const Reference< } //------------------------------------------------------------------------ -void FmXPageViewWinRec::setController(const Reference< XForm > & xForm, FmXFormController* _pParent ) +void FmXPageViewWinRec::setController(const Reference< XForm > & xForm, const Reference< XFormController >& _rxParentController ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXPageViewWinRec::setController" ); DBG_ASSERT( xForm.is(), "FmXPageViewWinRec::setController: there should be a form!" ); Reference< XIndexAccess > xFormCps(xForm, UNO_QUERY); if (!xFormCps.is()) @@ -330,58 +362,52 @@ void FmXPageViewWinRec::setController(const Reference< XForm > & xForm, FmXForm Reference< XTabControllerModel > xTabOrder(xForm, UNO_QUERY); // create a form controller - FmXFormController* pController = new FmXFormController( m_aContext.getLegacyServiceFactory(), m_pViewImpl->getView(), m_pWindow ); - Reference< XFormController > xController( pController ); + Reference< XFormController > xController( m_aContext.createComponent( FM_FORM_CONTROLLER ), UNO_QUERY ); + if ( !xController.is() ) + { + ShowServiceNotAvailableError( m_pWindow, FM_FORM_CONTROLLER, sal_True ); + return; + } Reference< XInteractionHandler > xHandler; - if ( _pParent ) - xHandler = _pParent->getInteractionHandler(); + if ( _rxParentController.is() ) + xHandler = _rxParentController->getInteractionHandler(); else { // TODO: should we create a default handler? Not really necessary, since the // FormController itself has a default fallback } if ( xHandler.is() ) - { - Reference< XInitialization > xInitController( xController, UNO_QUERY ); - DBG_ASSERT( xInitController.is(), "FmXPageViewWinRec::setController: can't initialize the controller!" ); - if ( xInitController.is() ) - { - Sequence< Any > aInitArgs( 1 ); - aInitArgs[ 0 ] <<= NamedValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ) ), makeAny( xHandler ) ); - xInitController->initialize( aInitArgs ); - } - } + xController->setInteractionHandler( xHandler ); - pController->setModel(xTabOrder); - pController->setContainer( m_xControlContainer ); - pController->activateTabOrder(); - pController->addActivateListener(m_pViewImpl); + xController->setContext( this ); - if ( _pParent ) - _pParent->addChild(pController); + xController->setModel( xTabOrder ); + xController->setContainer( m_xControlContainer ); + xController->activateTabOrder(); + xController->addActivateListener( m_pViewImpl ); + + if ( _rxParentController.is() ) + _rxParentController->addChildController( xController ); else { - // Reference< XFormController > xController(pController); m_aControllerList.push_back(xController); - pController->setParent(*this); + xController->setParent( *this ); // attaching the events - Reference< XEventAttacherManager > xEventManager(xForm->getParent(), UNO_QUERY); + Reference< XEventAttacherManager > xEventManager( xForm->getParent(), UNO_QUERY ); Reference< XInterface > xIfc(xController, UNO_QUERY); xEventManager->attach(m_aControllerList.size() - 1, xIfc, makeAny(xController) ); } - - // jetzt die Subforms durchgehen sal_uInt32 nLength = xFormCps->getCount(); Reference< XForm > xSubForm; for (sal_uInt32 i = 0; i < nLength; i++) { if ( xFormCps->getByIndex(i) >>= xSubForm ) - setController(xSubForm, pController); + setController( xSubForm, xController ); } } @@ -406,18 +432,12 @@ void FmXPageViewWinRec::updateTabOrder( const Reference< XForm >& _rxForm ) // if it's a sub form, then we must ensure there exist TabControllers // for all its ancestors, too Reference< XForm > xParentForm( _rxForm->getParent(), UNO_QUERY ); - FmXFormController* pFormController = NULL; // there is a parent form -> look for the respective controller + Reference< XFormController > xParentController; if ( xParentForm.is() ) - xTabCtrl = Reference< XTabController >( getController( xParentForm ), UNO_QUERY ); + xParentController.set( getController( xParentForm ), UNO_QUERY ); - if ( xTabCtrl.is() ) - { - Reference< XUnoTunnel > xTunnel( xTabCtrl, UNO_QUERY_THROW ); - pFormController = reinterpret_cast< FmXFormController* >( xTunnel->getSomething( FmXFormController::getUnoTunnelImplementationId() ) ); - } - - setController( _rxForm, pFormController ); + setController( _rxForm, xParentController ); } } catch( const Exception& ) @@ -1068,20 +1088,14 @@ IMPL_LINK( FmXFormView, OnStartControlWizard, void*, /**/ ) if ( pWizardAsciiName ) { // build the argument list - Sequence< Any > aWizardArgs(1); - // the object affected - aWizardArgs[0] = makeAny( PropertyValue( - ::rtl::OUString::createFromAscii("ObjectModel"), - 0, - makeAny( m_xLastCreatedControlModel ), - PropertyState_DIRECT_VALUE - ) ); + ::comphelper::NamedValueCollection aWizardArgs; + aWizardArgs.put( "ObjectModel", m_xLastCreatedControlModel ); // create the wizard object Reference< XExecutableDialog > xWizard; try { - m_aContext.createComponentWithArguments( pWizardAsciiName, aWizardArgs, xWizard ); + m_aContext.createComponentWithArguments( pWizardAsciiName, aWizardArgs.getWrappedPropertyValues(), xWizard ); } catch( const Exception& ) { @@ -1187,9 +1201,10 @@ SdrObject* FmXFormView::implCreateFieldControl( const ::svx::ODataAccessDescript m_aContext.getLegacyServiceFactory() ) ); } - catch(const SQLContext& e) { aError.Reason <<= e; } - catch(const SQLWarning& e) { aError.Reason <<= e; } - catch(const SQLException& e) { aError.Reason <<= e; } + catch ( const SQLException& ) + { + aError.Reason = ::cppu::getCaughtException(); + } catch( const Exception& ) { /* will be asserted below */ } if (aError.Reason.hasValue()) { @@ -1217,14 +1232,11 @@ SdrObject* FmXFormView::implCreateFieldControl( const ::svx::ODataAccessDescript if (xFields.is() && xFields->hasByName(sFieldName)) xFields->getByName(sFieldName) >>= xField; - - Reference< XNumberFormatsSupplier > xSupplier = aDBATools.getNumberFormats(xConnection, sal_False); - if (!xSupplier.is() || !xField.is()) + if ( !xField.is() ) return NULL; - Reference< XNumberFormats > xNumberFormats(xSupplier->getNumberFormats()); - if (!xNumberFormats.is()) - return NULL; + Reference< XNumberFormatsSupplier > xSupplier( aDBATools.getNumberFormats( xConnection, sal_False ), UNO_SET_THROW ); + Reference< XNumberFormats > xNumberFormats( xSupplier->getNumberFormats(), UNO_SET_THROW ); ::rtl::OUString sLabelPostfix; diff --git a/svx/source/form/fmctrler.cxx b/svx/source/form/formcontroller.cxx index 48db5acbb01e..ed3e37c3812b 100644 --- a/svx/source/form/fmctrler.cxx +++ b/svx/source/form/formcontroller.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmctrler.cxx,v $ - * $Revision: 1.71 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -31,24 +28,18 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" -#include "confirmdelete.hxx" #include "fmcontrolbordermanager.hxx" #include "fmcontrollayout.hxx" -#include "fmctrler.hxx" -#include "fmdispatch.hxx" +#include "formcontroller.hxx" +#include "formfeaturedispatcher.hxx" #include "fmdocumentclassification.hxx" +#include "formcontrolling.hxx" #include "fmprop.hrc" +#include "svx/dialmgr.hxx" #include "fmresids.hrc" #include "fmservs.hxx" -#include "fmshimp.hxx" -#include "fmtools.hxx" #include "fmurl.hxx" -#include "svx/dialmgr.hxx" -#include "svx/fmshell.hxx" -#include "svx/fmview.hxx" -#include "svx/sdrpagewindow.hxx" -#include "svx/svdpagv.hxx" -#include "trace.hxx" +#include "fmtools.hxx" /** === begin UNO includes === **/ #include <com/sun/star/awt/FocusChangeReason.hpp> @@ -72,6 +63,13 @@ #include <com/sun/star/sdb/XInteractionSupplyParameters.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> #include <com/sun/star/util/XURLTransformer.hpp> +#include <com/sun/star/form/runtime/FormOperations.hpp> +#include <com/sun/star/form/runtime/FormFeature.hpp> +#include <com/sun/star/container/XContainer.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/util/XNumberFormatter.hpp> +#include <com/sun/star/sdb/SQLContext.hpp> +#include <com/sun/star/sdb/XColumn.hpp> /** === end UNO includes === **/ #include <comphelper/enumhelper.hxx> @@ -84,9 +82,6 @@ #include <comphelper/uno3.hxx> #include <cppuhelper/queryinterface.hxx> #include <cppuhelper/typeprovider.hxx> -#include <sfx2/bindings.hxx> -#include <sfx2/viewfrm.hxx> -#include <sfx2/viewsh.hxx> #include <toolkit/controls/unocontrol.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <tools/debug.hxx> @@ -94,32 +89,126 @@ #include <tools/shl.hxx> #include <vcl/msgbox.hxx> #include <vcl/svapp.hxx> +#include <vos/mutex.hxx> #include <rtl/logfile.hxx> #include <algorithm> #include <functional> using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::awt; -using namespace ::com::sun::star::sdb; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::task; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::util; -using namespace ::com::sun::star::form; -using namespace ::com::sun::star::form::validation; -using namespace ::com::sun::star::form::runtime; -using namespace ::com::sun::star::frame; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::script; -using namespace ::com::sun::star::container; using namespace ::comphelper; using namespace ::connectivity; -using namespace ::svxform; using namespace ::connectivity::simple; +//------------------------------------------------------------------ +::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL + FormController_NewInstance_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & _rxORB ) +{ + return *( new ::svxform::FormController( _rxORB ) ); +} + +namespace svxform +{ + + /** === begin UNO using === **/ + using ::com::sun::star::sdb::XColumn; + using ::com::sun::star::awt::XControl; + using ::com::sun::star::awt::XTabController; + using ::com::sun::star::awt::XToolkit; + using ::com::sun::star::awt::XWindowPeer; + using ::com::sun::star::form::XGrid; + using ::com::sun::star::beans::XPropertySet; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::container::XIndexAccess; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Reference; + using ::com::sun::star::beans::XPropertySetInfo; + using ::com::sun::star::beans::PropertyValue; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::lang::IndexOutOfBoundsException; + using ::com::sun::star::sdb::XInteractionSupplyParameters; + using ::com::sun::star::awt::XTextComponent; + using ::com::sun::star::awt::XTextListener; + using ::com::sun::star::uno::Any; + using ::com::sun::star::frame::XDispatch; + using ::com::sun::star::lang::XMultiServiceFactory; + using ::com::sun::star::uno::XAggregation; + using ::com::sun::star::uno::Type; + using ::com::sun::star::lang::IllegalArgumentException; + using ::com::sun::star::sdbc::XConnection; + using ::com::sun::star::sdbc::XRowSet; + using ::com::sun::star::sdbc::XDatabaseMetaData; + using ::com::sun::star::util::XNumberFormatsSupplier; + using ::com::sun::star::util::XNumberFormatter; + using ::com::sun::star::sdbcx::XColumnsSupplier; + using ::com::sun::star::container::XNameAccess; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::beans::Property; + using ::com::sun::star::container::XEnumeration; + using ::com::sun::star::form::XFormComponent; + using ::com::sun::star::form::runtime::XFormOperations; + using ::com::sun::star::form::runtime::FilterEvent; + using ::com::sun::star::form::runtime::XFilterControllerListener; + using ::com::sun::star::awt::XControlContainer; + using ::com::sun::star::container::XIdentifierReplace; + using ::com::sun::star::lang::WrappedTargetException; + using ::com::sun::star::form::XFormControllerListener; + using ::com::sun::star::awt::XWindow; + using ::com::sun::star::sdbc::XResultSet; + using ::com::sun::star::awt::XControlModel; + using ::com::sun::star::awt::XTabControllerModel; + using ::com::sun::star::beans::PropertyChangeEvent; + using ::com::sun::star::form::validation::XValidatableFormComponent; + using ::com::sun::star::form::XLoadable; + using ::com::sun::star::script::XEventAttacherManager; + using ::com::sun::star::form::XBoundControl; + using ::com::sun::star::beans::XPropertyChangeListener; + using ::com::sun::star::awt::TextEvent; + using ::com::sun::star::form::XBoundComponent; + using ::com::sun::star::awt::XCheckBox; + using ::com::sun::star::awt::XComboBox; + using ::com::sun::star::awt::XListBox; + using ::com::sun::star::awt::ItemEvent; + using ::com::sun::star::util::XModifyListener; + using ::com::sun::star::form::XReset; + using ::com::sun::star::frame::XDispatchProviderInterception; + using ::com::sun::star::form::XGridControl; + using ::com::sun::star::awt::XVclWindowPeer; + using ::com::sun::star::form::validation::XValidator; + using ::com::sun::star::awt::FocusEvent; + using ::com::sun::star::sdb::SQLContext; + using ::com::sun::star::container::XChild; + using ::com::sun::star::form::TabulatorCycle_RECORDS; + using ::com::sun::star::container::ContainerEvent; + using ::com::sun::star::lang::DisposedException; + using ::com::sun::star::lang::Locale; + using ::com::sun::star::beans::NamedValue; + using ::com::sun::star::lang::NoSupportException; + using ::com::sun::star::sdb::RowChangeEvent; + using ::com::sun::star::frame::XStatusListener; + using ::com::sun::star::frame::XDispatchProviderInterceptor; + using ::com::sun::star::sdb::SQLErrorEvent; + using ::com::sun::star::form::DatabaseParameterEvent; + using ::com::sun::star::sdb::ParametersRequest; + using ::com::sun::star::task::XInteractionRequest; + using ::com::sun::star::util::URL; + using ::com::sun::star::frame::FeatureStateEvent; + using ::com::sun::star::form::runtime::XFormControllerContext; + using ::com::sun::star::task::XInteractionHandler; + using ::com::sun::star::form::runtime::FormOperations; + using ::com::sun::star::container::XContainer; + using ::com::sun::star::sdbc::SQLWarning; + /** === end UNO using === **/ + namespace ColumnValue = ::com::sun::star::sdbc::ColumnValue; + namespace PropertyAttribute = ::com::sun::star::beans::PropertyAttribute; + namespace FocusChangeReason = ::com::sun::star::awt::FocusChangeReason; + namespace RowChangeAction = ::com::sun::star::sdb::RowChangeAction; + namespace FormFeature = ::com::sun::star::form::runtime::FormFeature; + //============================================================================== // ColumnInfo //============================================================================== @@ -184,7 +273,6 @@ ColumnInfoCache::ColumnInfoCache( const Reference< XColumnsSupplier >& _rxColSup :m_aColumns() ,m_bControlsInitialized( false ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "ColumnInfoCache::ColumnInfoCache" ); try { m_aColumns.clear(); @@ -242,7 +330,6 @@ namespace //------------------------------------------------------------------------------ void ColumnInfoCache::deinitializeControls() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "ColumnInfoCache::deinitializeControls" ); for ( ColumnInfos::iterator col = m_aColumns.begin(); col != m_aColumns.end(); ++col @@ -255,7 +342,6 @@ void ColumnInfoCache::deinitializeControls() //------------------------------------------------------------------------------ void ColumnInfoCache::initializeControls( const Sequence< Reference< XControl > >& _rControls ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "ColumnInfoCache::initializeControls" ); try { // for every of our known columns, find the controls which are bound to this column @@ -338,7 +424,6 @@ void ColumnInfoCache::initializeControls( const Sequence< Reference< XControl > //------------------------------------------------------------------------------ const ColumnInfo& ColumnInfoCache::getColumnInfo( size_t _pos ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "ColumnInfoCache::getColumnInfo" ); if ( _pos >= m_aColumns.size() ) throw IndexOutOfBoundsException(); @@ -424,7 +509,7 @@ void FmXAutoControl::ImplSetPeerProperty( const ::rtl::OUString& rPropName, cons } //------------------------------------------------------------------------------ -IMPL_LINK( FmXFormController, OnActivateTabOrder, void*, /*EMPTYTAG*/ ) +IMPL_LINK( FormController, OnActivateTabOrder, void*, /*EMPTYTAG*/ ) { activateTabOrder(); return 1; @@ -441,10 +526,10 @@ struct UpdateAllListeners : public ::std::unary_function< Reference< XDispatch > } }; //.............................................................................. -IMPL_LINK( FmXFormController, OnInvalidateFeatures, void*, /*_pNotInterestedInThisParam*/ ) +IMPL_LINK( FormController, OnInvalidateFeatures, void*, /*_pNotInterestedInThisParam*/ ) { ::osl::MutexGuard aGuard( m_aMutex ); - for ( ::std::set< sal_Int32 >::const_iterator aLoop = m_aInvalidFeatures.begin(); + for ( ::std::set< sal_Int16 >::const_iterator aLoop = m_aInvalidFeatures.begin(); aLoop != m_aInvalidFeatures.end(); ++aLoop ) @@ -462,48 +547,28 @@ IMPL_LINK( FmXFormController, OnInvalidateFeatures, void*, /*_pNotInterestedInTh /*************************************************************************/ +DBG_NAME( FormController ) //------------------------------------------------------------------ -Reference< XInterface > SAL_CALL - FmXFormController_NewInstance_Impl(const Reference< XMultiServiceFactory > & _rxORB) -{ - return *(new FmXFormController(_rxORB)); -} - -//------------------------------------------------------------------ -namespace fmctrlr -{ - const ::rtl::OUString& getDataModeIdentifier() - { - static ::rtl::OUString s_sDataModeIdentifier = DATA_MODE; - return s_sDataModeIdentifier; - } -} -using namespace fmctrlr; - -DBG_NAME( FmXFormController ) -//------------------------------------------------------------------ -FmXFormController::FmXFormController(const Reference< XMultiServiceFactory > & _rxORB, - FmFormView* _pView, Window* _pWindow ) - :FmXFormController_BASE( m_aMutex ) - ,OPropertySetHelper( FmXFormController_BASE::rBHelper ) - ,OSQLParserClient(_rxORB) - ,m_xORB(_rxORB) +FormController::FormController(const Reference< XMultiServiceFactory > & _rxORB ) + :FormController_BASE( m_aMutex ) + ,OPropertySetHelper( FormController_BASE::rBHelper ) + ,OSQLParserClient( _rxORB ) + ,m_aContext( _rxORB ) ,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) + ,m_aFilterListeners(m_aMutex) ,m_pControlBorderManager( new ::svxform::ControlBorderManager ) - ,m_aControllerFeatures( _rxORB, this ) - ,m_aMode(getDataModeIdentifier()) - ,m_aLoadEvent( LINK( this, FmXFormController, OnLoad ) ) - ,m_aToggleEvent( LINK( this, FmXFormController, OnToggleAutoFields ) ) - ,m_aActivationEvent( LINK( this, FmXFormController, OnActivated ) ) - ,m_aDeactivationEvent( LINK( this, FmXFormController, OnDeactivated ) ) - ,m_nCurrentFilterPosition(0) + ,m_xFormOperations() + ,m_aMode( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ) ) + ,m_aLoadEvent( LINK( this, FormController, OnLoad ) ) + ,m_aToggleEvent( LINK( this, FormController, OnToggleAutoFields ) ) + ,m_aActivationEvent( LINK( this, FormController, OnActivated ) ) + ,m_aDeactivationEvent( LINK( this, FormController, OnDeactivated ) ) + ,m_nCurrentFilterPosition(-1) ,m_bCurrentRecordModified(sal_False) ,m_bCurrentRecordNew(sal_False) ,m_bLocked(sal_False) @@ -519,17 +584,16 @@ FmXFormController::FmXFormController(const Reference< XMultiServiceFactory > & _ ,m_bDetachEvents(sal_True) ,m_bAttemptedHandlerCreation( false ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::FmXFormController" ); - DBG_CTOR( FmXFormController, NULL ); + DBG_CTOR( FormController, NULL ); ::comphelper::increment(m_refCount); { { m_xAggregate = Reference< XAggregation >( - m_xORB->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.awt.TabController" ) ), + m_aContext.createComponent( "com.sun.star.awt.TabController" ), UNO_QUERY ); - DBG_ASSERT( m_xAggregate.is(), "FmXFormController::FmXFormController : could not create my aggregate !" ); + DBG_ASSERT( m_xAggregate.is(), "FormController::FormController : could not create my aggregate !" ); m_xTabController = Reference< XTabController >( m_xAggregate, UNO_QUERY ); } @@ -539,14 +603,14 @@ FmXFormController::FmXFormController(const Reference< XMultiServiceFactory > & _ ::comphelper::decrement(m_refCount); m_aTabActivationTimer.SetTimeout( 500 ); - m_aTabActivationTimer.SetTimeoutHdl( LINK( this, FmXFormController, OnActivateTabOrder ) ); + m_aTabActivationTimer.SetTimeoutHdl( LINK( this, FormController, OnActivateTabOrder ) ); m_aFeatureInvalidationTimer.SetTimeout( 200 ); - m_aFeatureInvalidationTimer.SetTimeoutHdl( LINK( this, FmXFormController, OnInvalidateFeatures ) ); + m_aFeatureInvalidationTimer.SetTimeoutHdl( LINK( this, FormController, OnInvalidateFeatures ) ); } //------------------------------------------------------------------ -FmXFormController::~FmXFormController() +FormController::~FormController() { { ::osl::MutexGuard aGuard( m_aMutex ); @@ -565,6 +629,10 @@ FmXFormController::~FmXFormController() disposeAllFeaturesAndDispatchers(); + if ( m_xFormOperations.is() ) + m_xFormOperations->dispose(); + m_xFormOperations.clear(); + // Freigeben der Aggregation if ( m_xAggregate.is() ) { @@ -574,28 +642,25 @@ FmXFormController::~FmXFormController() DELETEZ( m_pControlBorderManager ); - DBG_DTOR( FmXFormController, NULL ); + DBG_DTOR( FormController, NULL ); } // ----------------------------------------------------------------------------- -void SAL_CALL FmXFormController::acquire() throw () +void SAL_CALL FormController::acquire() throw () { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::acquire" ); - FmXFormController_BASE::acquire(); + FormController_BASE::acquire(); } // ----------------------------------------------------------------------------- -void SAL_CALL FmXFormController::release() throw () +void SAL_CALL FormController::release() throw () { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::release" ); - FmXFormController_BASE::release(); + FormController_BASE::release(); } //------------------------------------------------------------------ -Any SAL_CALL FmXFormController::queryInterface( const Type& _rType ) throw(RuntimeException) +Any SAL_CALL FormController::queryInterface( const Type& _rType ) throw(RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::queryInterface" ); - Any aRet = FmXFormController_BASE::queryInterface( _rType ); + Any aRet = FormController_BASE::queryInterface( _rType ); if ( !aRet.hasValue() ) aRet = OPropertySetHelper::queryInterface( _rType ); if ( !aRet.hasValue() ) @@ -604,9 +669,8 @@ Any SAL_CALL FmXFormController::queryInterface( const Type& _rType ) throw(Runti } //------------------------------------------------------------------------------ -Sequence< sal_Int8 > SAL_CALL FmXFormController::getImplementationId() throw( RuntimeException ) +Sequence< sal_Int8 > SAL_CALL FormController::getImplementationId() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getImplementationId" ); static ::cppu::OImplementationId* pId = NULL; if ( !pId ) { @@ -621,56 +685,18 @@ Sequence< sal_Int8 > SAL_CALL FmXFormController::getImplementationId() throw( Ru } //------------------------------------------------------------------------------ -Sequence< Type > SAL_CALL FmXFormController::getTypes( ) throw(RuntimeException) +Sequence< Type > SAL_CALL FormController::getTypes( ) throw(RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getTypes" ); return comphelper::concatSequences( - FmXFormController_BASE::getTypes(), + FormController_BASE::getTypes(), ::cppu::OPropertySetHelper::getTypes() ); } -// ----------------------------------------------------------------------------- -// XUnoTunnel -Sequence< sal_Int8 > FmXFormController::getUnoTunnelImplementationId() -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getUnoTunnelImplementationId" ); - static ::cppu::OImplementationId * pId = NULL; - if ( !pId ) - { - ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); - if ( !pId ) - { - static ::cppu::OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); -} -//------------------------------------------------------------------------------ -FmXFormController* FmXFormController::getImplementation( const Reference< XInterface >& _rxComponent ) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getImplementation" ); - Reference< XUnoTunnel > xTunnel( _rxComponent, UNO_QUERY ); - if ( xTunnel.is() ) - return reinterpret_cast< FmXFormController* >( xTunnel->getSomething( getUnoTunnelImplementationId() ) ); - return NULL; -} -//------------------------------------------------------------------------------ -sal_Int64 SAL_CALL FmXFormController::getSomething(Sequence<sal_Int8> const& rId)throw( RuntimeException ) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getSomething" ); - if (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) - return reinterpret_cast< sal_Int64 >( this ); - - return sal_Int64(); -} - // XServiceInfo //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::supportsService(const ::rtl::OUString& ServiceName) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::supportsService(const ::rtl::OUString& ServiceName) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::supportsService" ); Sequence< ::rtl::OUString> aSNL(getSupportedServiceNames()); const ::rtl::OUString * pArray = aSNL.getConstArray(); for( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) @@ -680,16 +706,14 @@ sal_Bool SAL_CALL FmXFormController::supportsService(const ::rtl::OUString& Serv } //------------------------------------------------------------------------------ -::rtl::OUString SAL_CALL FmXFormController::getImplementationName() throw( RuntimeException ) +::rtl::OUString SAL_CALL FormController::getImplementationName() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getImplementationName" ); - return ::rtl::OUString::createFromAscii("com.sun.star.form.FmXFormController"); + return ::rtl::OUString::createFromAscii( "org.openoffice.comp.svx.FormController" ); } //------------------------------------------------------------------------------ -Sequence< ::rtl::OUString> SAL_CALL FmXFormController::getSupportedServiceNames(void) throw( RuntimeException ) +Sequence< ::rtl::OUString> SAL_CALL FormController::getSupportedServiceNames(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getSupportedServiceNames" ); // service names which are supported only, but cannot be used to created an // instance at a service factory Sequence< ::rtl::OUString > aNonCreatableServiceNames( 1 ); @@ -701,94 +725,107 @@ Sequence< ::rtl::OUString> SAL_CALL FmXFormController::getSupportedServiceNames( } //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::approveReset(const EventObject& /*rEvent*/) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::approveReset(const EventObject& /*rEvent*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::approveReset" ); return sal_True; } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::resetted(const EventObject& rEvent) throw( RuntimeException ) +void SAL_CALL FormController::resetted(const EventObject& rEvent) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::resetted" ); ::osl::MutexGuard aGuard(m_aMutex); if (getCurrentControl().is() && (getCurrentControl()->getModel() == rEvent.Source)) m_bModified = sal_False; } //------------------------------------------------------------------------------ -Sequence< ::rtl::OUString> FmXFormController::getSupportedServiceNames_Static(void) +Sequence< ::rtl::OUString> FormController::getSupportedServiceNames_Static(void) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getSupportedServiceNames_Static" ); static Sequence< ::rtl::OUString> aServices; if (!aServices.getLength()) { aServices.realloc(2); - aServices.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.form.FormController"); + aServices.getArray()[0] = FM_FORM_CONTROLLER; aServices.getArray()[1] = ::rtl::OUString::createFromAscii("com.sun.star.awt.control.TabController"); } return aServices; } -//------------------------------------------------------------------------------ -void FmXFormController::setCurrentFilterPosition( sal_Int32 nPos ) +// ----------------------------------------------------------------------------- +namespace { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setCurrentFilterPosition" ); - DBG_ASSERT(nPos < (sal_Int32)m_aFilters.size(), "Invalid Position"); - - if (nPos != m_nCurrentFilterPosition) + struct ResetComponentText : public ::std::unary_function< Reference< XTextComponent >, void > { - m_nCurrentFilterPosition = nPos; + void operator()( const Reference< XTextComponent >& _rxText ) + { + _rxText->setText( ::rtl::OUString() ); + } + }; - // reset the text for all controls - for (FmFilterControls::const_iterator iter = m_aFilterControls.begin(); - iter != m_aFilterControls.end(); iter++) - (*iter).first->setText(rtl::OUString()); + struct RemoveComponentTextListener : public ::std::unary_function< Reference< XTextComponent >, void > + { + RemoveComponentTextListener( const Reference< XTextListener >& _rxListener ) + :m_xListener( _rxListener ) + { + } - if ( nPos != -1 ) + void operator()( const Reference< XTextComponent >& _rxText ) { - impl_setTextOnAllFilter_throw(); + _rxText->removeTextListener( m_xListener ); } - } + + private: + Reference< XTextListener > m_xListener; + }; } + // ----------------------------------------------------------------------------- -void FmXFormController::impl_setTextOnAllFilter_throw() +void FormController::impl_setTextOnAllFilter_throw() { + // reset the text for all controls + ::std::for_each( m_aFilterComponents.begin(), m_aFilterComponents.end(), ResetComponentText() ); + + if ( m_aFilterRows.empty() ) + // nothing to do anymore + return; + + if ( m_nCurrentFilterPosition < 0 ) + return; + // set the text for all filters - OSL_ENSURE( ( m_aFilters.size() > (size_t)m_nCurrentFilterPosition ) && ( m_nCurrentFilterPosition >= 0 ), - "FmXFormController::setCurrentFilterPosition: m_nCurrentFilterPosition too big" ); + OSL_ENSURE( m_aFilterRows.size() > (size_t)m_nCurrentFilterPosition, + "FormController::impl_setTextOnAllFilter_throw: m_nCurrentFilterPosition too big" ); - if ( ( m_nCurrentFilterPosition >= 0 ) && ( (size_t)m_nCurrentFilterPosition < m_aFilters.size() ) ) + if ( (size_t)m_nCurrentFilterPosition < m_aFilterRows.size() ) { - FmFilterRow& rRow = m_aFilters[m_nCurrentFilterPosition]; - for (FmFilterRow::const_iterator iter2 = rRow.begin(); - iter2 != rRow.end(); iter2++) + FmFilterRow& rRow = m_aFilterRows[ m_nCurrentFilterPosition ]; + for ( FmFilterRow::const_iterator iter2 = rRow.begin(); + iter2 != rRow.end(); + ++iter2 + ) { - (*iter2).first->setText((*iter2).second); + iter2->first->setText( iter2->second ); } - } // if ( ( m_nCurrentFilterPosition >= 0 ) && ( (size_t)m_nCurrentFilterPosition < m_aFilters.size() ) ) + } } // OPropertySetHelper //------------------------------------------------------------------------------ -sal_Bool FmXFormController::convertFastPropertyValue( Any & /*rConvertedValue*/, Any & /*rOldValue*/, +sal_Bool FormController::convertFastPropertyValue( Any & /*rConvertedValue*/, Any & /*rOldValue*/, sal_Int32 /*nHandle*/, const Any& /*rValue*/ ) throw( IllegalArgumentException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::convertFastPropertyValue" ); return sal_False; } //------------------------------------------------------------------------------ -void FmXFormController::setFastPropertyValue_NoBroadcast( sal_Int32 /*nHandle*/, const Any& /*rValue*/ ) +void FormController::setFastPropertyValue_NoBroadcast( sal_Int32 /*nHandle*/, const Any& /*rValue*/ ) throw( Exception ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setFastPropertyValue_NoBroadcast" ); } //------------------------------------------------------------------------------ -void FmXFormController::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const +void FormController::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getFastPropertyValue" ); switch (nHandle) { case FM_ATTR_FILTER: @@ -799,9 +836,8 @@ void FmXFormController::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) c if (xConnection.is()) { Reference< XDatabaseMetaData> xMetaData(xConnection->getMetaData()); - Reference< XNumberFormatsSupplier> xFormatSupplier( aStaticTools.getNumberFormats(xConnection, sal_True)); - Reference< XNumberFormatter> xFormatter(m_xORB - ->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")), UNO_QUERY); + Reference< XNumberFormatsSupplier> xFormatSupplier( aStaticTools.getNumberFormats( xConnection, sal_True ) ); + Reference< XNumberFormatter> xFormatter( m_aContext.createComponent( "com.sun.star.util.NumberFormatter" ), UNO_QUERY_THROW ); xFormatter->attachNumberFormatsSupplier(xFormatSupplier); Reference< XColumnsSupplier> xSupplyCols(m_xModelAsIndex, UNO_QUERY); @@ -809,40 +845,48 @@ void FmXFormController::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) c ::rtl::OUString aQuote( xMetaData->getIdentifierQuoteString() ); - // now add the filter rows - for ( FmFilterRows::const_iterator row = m_aFilters.begin(); row != m_aFilters.end(); ++row ) + // now add the filter rows + try { - const FmFilterRow& rRow = *row; + for ( FmFilterRows::const_iterator row = m_aFilterRows.begin(); row != m_aFilterRows.end(); ++row ) + { + const FmFilterRow& rRow = *row; - if ( rRow.empty() ) - continue; + if ( rRow.empty() ) + continue; - if ( aFilter.getLength() ) - aFilter.appendAscii( " OR " ); + if ( aFilter.getLength() ) + aFilter.appendAscii( " OR " ); - aFilter.appendAscii( "( " ); - for ( FmFilterRow::const_iterator condition = rRow.begin(); condition != rRow.end(); ++condition ) - { - // get the field of the controls map - Reference< XTextComponent > xText = condition->first; - Reference< XPropertySet > xField = m_aFilterControls.find( xText )->second; - DBG_ASSERT( xField.is(), "FmXFormController::getFastPropertyValue: no field found!" ); - if ( condition != rRow.begin() ) - aFilter.appendAscii( " AND " ); - - ::rtl::OUString sFilterValue( condition->second ); - - ::rtl::OUString sErrorMsg, sCriteria; - ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree( sErrorMsg, sFilterValue, xFormatter, xField ); - OSL_ENSURE( xParseNode.is(), "FmXFormController::getFastPropertyValue: could not parse the field value predicate!" ); - if ( xParseNode.is() ) + aFilter.appendAscii( "( " ); + for ( FmFilterRow::const_iterator condition = rRow.begin(); condition != rRow.end(); ++condition ) { - // don't use a parse context here, we need it unlocalized - xParseNode->parseNodeToStr( sCriteria, xConnection, NULL ); - aFilter.append( sCriteria ); + // get the field of the controls map + Reference< XControl > xControl( condition->first, UNO_QUERY_THROW ); + Reference< XPropertySet > xModelProps( xControl->getModel(), UNO_QUERY_THROW ); + Reference< XPropertySet > xField( xModelProps->getPropertyValue( FM_PROP_BOUNDFIELD ), UNO_QUERY_THROW ); + if ( condition != rRow.begin() ) + aFilter.appendAscii( " AND " ); + + ::rtl::OUString sFilterValue( condition->second ); + + ::rtl::OUString sErrorMsg, sCriteria; + ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree( sErrorMsg, sFilterValue, xFormatter, xField ); + OSL_ENSURE( xParseNode.is(), "FormController::getFastPropertyValue: could not parse the field value predicate!" ); + if ( xParseNode.is() ) + { + // don't use a parse context here, we need it unlocalized + xParseNode->parseNodeToStr( sCriteria, xConnection, NULL ); + aFilter.append( sCriteria ); + } } + aFilter.appendAscii( " )" ); } - aFilter.appendAscii( " )" ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + aFilter.setLength(0); } } rValue <<= aFilter.makeStringAndClear(); @@ -850,15 +894,14 @@ void FmXFormController::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) c break; case FM_ATTR_FORM_OPERATIONS: - rValue <<= m_aControllerFeatures->getFormOperations(); + rValue <<= m_xFormOperations; break; } } //------------------------------------------------------------------------------ -Reference< XPropertySetInfo > FmXFormController::getPropertySetInfo() throw( RuntimeException ) +Reference< XPropertySetInfo > FormController::getPropertySetInfo() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getPropertySetInfo" ); static Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) ); return xInfo; } @@ -872,12 +915,11 @@ pDesc[nPos++] = Property(FM_PROP_##varname, FM_ATTR_##varname, ::getCppuType((co DECL_PROP_CORE(varname, type) PropertyAttribute::attrib1) //------------------------------------------------------------------------------ -void FmXFormController::fillProperties( +void FormController::fillProperties( Sequence< Property >& /* [out] */ _rProps, Sequence< Property >& /* [out] */ /*_rAggregateProps*/ ) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::fillProperties" ); _rProps.realloc(2); sal_Int32 nPos = 0; Property* pDesc = _rProps.getArray(); @@ -886,90 +928,229 @@ void FmXFormController::fillProperties( } //------------------------------------------------------------------------------ -::cppu::IPropertyArrayHelper& FmXFormController::getInfoHelper() +::cppu::IPropertyArrayHelper& FormController::getInfoHelper() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getInfoHelper" ); return *getArrayHelper(); } +// XFilterController +//------------------------------------------------------------------------------ +void SAL_CALL FormController::addFilterControllerListener( const Reference< XFilterControllerListener >& _Listener ) throw( RuntimeException ) +{ + m_aFilterListeners.addInterface( _Listener ); +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::removeFilterControllerListener( const Reference< XFilterControllerListener >& _Listener ) throw( RuntimeException ) +{ + m_aFilterListeners.removeInterface( _Listener ); +} + +//------------------------------------------------------------------------------ +::sal_Int32 SAL_CALL FormController::getFilterComponents() throw( ::com::sun::star::uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + return m_aFilterComponents.size(); +} + +//------------------------------------------------------------------------------ +::sal_Int32 SAL_CALL FormController::getDisjunctiveTerms() throw( ::com::sun::star::uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + return m_aFilterRows.size(); +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::setPredicateExpression( ::sal_Int32 _Component, ::sal_Int32 _Term, const ::rtl::OUString& _PredicateExpression ) throw( RuntimeException, IndexOutOfBoundsException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + if ( ( _Component < 0 ) || ( _Component >= getFilterComponents() ) || ( _Term < 0 ) || ( _Term >= getDisjunctiveTerms() ) ) + throw IndexOutOfBoundsException( ::rtl::OUString(), *this ); + + Reference< XTextComponent > xText( m_aFilterComponents[ _Component ] ); + xText->setText( _PredicateExpression ); + + FmFilterRow& rFilterRow = m_aFilterRows[ _Term ]; + if ( _PredicateExpression.getLength() ) + rFilterRow[ xText ] = _PredicateExpression; + else + rFilterRow.erase( xText ); +} + +//------------------------------------------------------------------------------ +Reference< XControl > FormController::getFilterComponent( ::sal_Int32 _Component ) throw( RuntimeException, IndexOutOfBoundsException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + if ( ( _Component < 0 ) || ( _Component >= getFilterComponents() ) ) + throw IndexOutOfBoundsException( ::rtl::OUString(), *this ); + + return Reference< XControl >( m_aFilterComponents[ _Component ], UNO_QUERY ); +} + +//------------------------------------------------------------------------------ +Sequence< Sequence< ::rtl::OUString > > FormController::getPredicateExpressions() throw( RuntimeException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + Sequence< Sequence< ::rtl::OUString > > aExpressions( m_aFilterRows.size() ); + sal_Int32 termIndex = 0; + for ( FmFilterRows::const_iterator row = m_aFilterRows.begin(); + row != m_aFilterRows.end(); + ++row, ++termIndex + ) + { + const FmFilterRow& rRow( *row ); + + Sequence< ::rtl::OUString > aConjunction( m_aFilterComponents.size() ); + sal_Int32 componentIndex = 0; + for ( FilterComponents::const_iterator comp = m_aFilterComponents.begin(); + comp != m_aFilterComponents.end(); + ++comp, ++componentIndex + ) + { + FmFilterRow::const_iterator predicate = rRow.find( *comp ); + if ( predicate != rRow.end() ) + aConjunction[ componentIndex ] = predicate->second; + } + + aExpressions[ termIndex ] = aConjunction; + } + + return aExpressions; +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::removeDisjunctiveTerm( ::sal_Int32 _Term ) throw (IndexOutOfBoundsException, RuntimeException) +{ + // SYNCHRONIZED --> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + if ( ( _Term < 0 ) || ( _Term >= getDisjunctiveTerms() ) ) + throw IndexOutOfBoundsException( ::rtl::OUString(), *this ); + + // if the to-be-deleted row is our current row, we need to shift + if ( _Term == m_nCurrentFilterPosition ) + { + if ( m_nCurrentFilterPosition < sal_Int32( m_aFilterRows.size() - 1 ) ) + ++m_nCurrentFilterPosition; + else + --m_nCurrentFilterPosition; + } + + FmFilterRows::iterator pos = m_aFilterRows.begin() + _Term; + m_aFilterRows.erase( pos ); + + // adjust m_nCurrentFilterPosition if the removed row preceeded it + if ( _Term < m_nCurrentFilterPosition ) + --m_nCurrentFilterPosition; + + OSL_POSTCOND( ( m_nCurrentFilterPosition < 0 ) == ( m_aFilterRows.empty() ), + "FormController::removeDisjunctiveTerm: inconsistency!" ); + + // update the texts in the filter controls + impl_setTextOnAllFilter_throw(); + + FilterEvent aEvent; + aEvent.Source = *this; + aEvent.DisjunctiveTerm = _Term; + aGuard.clear(); + // <-- SYNCHRONIZED + + m_aFilterListeners.notifyEach( &XFilterControllerListener::disjunctiveTermRemoved, aEvent ); +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::appendEmptyDisjunctiveTerm() throw (RuntimeException) +{ + // SYNCHRONIZED --> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + impl_appendEmptyFilterRow( aGuard ); + // <-- SYNCHRONIZED +} + +//------------------------------------------------------------------------------ +::sal_Int32 SAL_CALL FormController::getActiveTerm() throw (RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + return m_nCurrentFilterPosition; +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::setActiveTerm( ::sal_Int32 _ActiveTerm ) throw (IndexOutOfBoundsException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + if ( ( _ActiveTerm < 0 ) || ( _ActiveTerm >= getDisjunctiveTerms() ) ) + throw IndexOutOfBoundsException( ::rtl::OUString(), *this ); + + if ( _ActiveTerm == getActiveTerm() ) + return; + + m_nCurrentFilterPosition = _ActiveTerm; + impl_setTextOnAllFilter_throw(); +} + // XElementAccess //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::hasElements(void) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::hasElements(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::hasElements" ); -::osl::MutexGuard aGuard( m_aMutex ); + ::osl::MutexGuard aGuard( m_aMutex ); return !m_aChilds.empty(); } //------------------------------------------------------------------------------ -Type SAL_CALL FmXFormController::getElementType(void) throw( RuntimeException ) +Type SAL_CALL FormController::getElementType(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getElementType" ); return ::getCppuType((const Reference< XFormController>*)0); } // XEnumerationAccess //------------------------------------------------------------------------------ -Reference< XEnumeration > SAL_CALL FmXFormController::createEnumeration(void) throw( RuntimeException ) +Reference< XEnumeration > SAL_CALL FormController::createEnumeration(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::createEnumeration" ); ::osl::MutexGuard aGuard( m_aMutex ); return new ::comphelper::OEnumerationByIndex(this); } // XIndexAccess //------------------------------------------------------------------------------ -sal_Int32 SAL_CALL FmXFormController::getCount(void) throw( RuntimeException ) +sal_Int32 SAL_CALL FormController::getCount(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getCount" ); ::osl::MutexGuard aGuard( m_aMutex ); return m_aChilds.size(); } //------------------------------------------------------------------------------ -Any SAL_CALL FmXFormController::getByIndex(sal_Int32 Index) throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) +Any SAL_CALL FormController::getByIndex(sal_Int32 Index) throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getByIndex" ); ::osl::MutexGuard aGuard( m_aMutex ); if (Index < 0 || Index >= (sal_Int32)m_aChilds.size()) throw IndexOutOfBoundsException(); - return makeAny(m_aChilds[Index]); - // , ::getCppuType((const XFormController*)0)); -} - -//----------------------------------------------------------------------------- -void FmXFormController::addChild(FmXFormController* pChild) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addChild" ); - Reference< XFormController > xController(pChild); - m_aChilds.push_back(xController); - pChild->setParent(static_cast< XFormController* >(this)); - - Reference< XFormComponent > xForm(pChild->getModel(), UNO_QUERY); - - // search the position of the model within the form - sal_uInt32 nPos = m_xModelAsIndex->getCount(); - Reference< XFormComponent > xTemp; - for( ; nPos; ) - { - m_xModelAsIndex->getByIndex(--nPos) >>= xTemp; - if ((XFormComponent*)xForm.get() == (XFormComponent*)xTemp.get()) - { - Reference< XInterface > xIfc(xController, UNO_QUERY); - m_xModelAsManager->attach( nPos, xIfc, makeAny( xController) ); - break; - } - } + return makeAny( m_aChilds[ Index ] ); } // EventListener //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::disposing(const EventObject& e) throw( RuntimeException ) +void SAL_CALL FormController::disposing(const EventObject& e) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::disposing" ); // Ist der Container disposed worden ::osl::MutexGuard aGuard( m_aMutex ); Reference< XControlContainer > xContainer(e.Source, UNO_QUERY); @@ -991,9 +1172,8 @@ void SAL_CALL FmXFormController::disposing(const EventObject& e) throw( RuntimeE // OComponentHelper //----------------------------------------------------------------------------- -void FmXFormController::disposeAllFeaturesAndDispatchers() SAL_THROW(()) +void FormController::disposeAllFeaturesAndDispatchers() SAL_THROW(()) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::disposeAllFeaturesAndDispatchers" ); for ( DispatcherContainer::iterator aDispatcher = m_aFeatureDispatchers.begin(); aDispatcher != m_aFeatureDispatchers.end(); ++aDispatcher @@ -1005,18 +1185,16 @@ void FmXFormController::disposeAllFeaturesAndDispatchers() SAL_THROW(()) } catch( const Exception& ) { - OSL_ENSURE( sal_False, "FmXFormController::disposeAllFeaturesAndDispatchers: caught an exception while disposing a dispatcher!" ); + DBG_UNHANDLED_EXCEPTION(); } } m_aFeatureDispatchers.clear(); - m_aControllerFeatures.dispose(); } //----------------------------------------------------------------------------- -void FmXFormController::disposing(void) +void FormController::disposing(void) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::disposing" ); - EventObject aEvt(static_cast< XFormController* >(this)); + EventObject aEvt( *this ); // if we're still active, simulate a "deactivated" event if ( m_xActiveControl.is() ) @@ -1029,13 +1207,14 @@ void FmXFormController::disposing(void) m_aDeleteListeners.disposeAndClear(aEvt); m_aRowSetApproveListeners.disposeAndClear(aEvt); m_aParameterListeners.disposeAndClear(aEvt); + m_aFilterListeners.disposeAndClear(aEvt); removeBoundFieldListener(); stopFiltering(); m_pControlBorderManager->restoreAll(); - m_aFilters.clear(); + m_aFilterRows.clear(); ::osl::MutexGuard aGuard( m_aMutex ); m_xActiveControl = NULL; @@ -1067,6 +1246,10 @@ void FmXFormController::disposing(void) disposeAllFeaturesAndDispatchers(); + if ( m_xFormOperations.is() ) + m_xFormOperations->dispose(); + m_xFormOperations.clear(); + if (m_bDBConnection) unload(); @@ -1076,7 +1259,6 @@ void FmXFormController::disposing(void) ::comphelper::disposeComponent( m_xComposer ); - m_xORB = NULL; m_bDBConnection = sal_False; } @@ -1096,10 +1278,9 @@ namespace } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::propertyChange(const PropertyChangeEvent& evt) throw( RuntimeException ) +void SAL_CALL FormController::propertyChange(const PropertyChangeEvent& evt) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::propertyChange" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); if ( evt.PropertyName == FM_PROP_BOUNDFIELD ) { Reference<XPropertySet> xOldBound; @@ -1164,14 +1345,13 @@ void SAL_CALL FmXFormController::propertyChange(const PropertyChangeEvent& evt) } //------------------------------------------------------------------------------ -bool FmXFormController::replaceControl( const Reference< XControl >& _rxExistentControl, const Reference< XControl >& _rxNewControl ) +bool FormController::replaceControl( const Reference< XControl >& _rxExistentControl, const Reference< XControl >& _rxNewControl ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::replaceControl" ); bool bSuccess = false; try { Reference< XIdentifierReplace > xContainer( getContainer(), UNO_QUERY ); - DBG_ASSERT( xContainer.is(), "FmXFormController::replaceControl: yes, it's not required by the service description, but XItentifierReplaces would be nice!" ); + DBG_ASSERT( xContainer.is(), "FormController::replaceControl: yes, it's not required by the service description, but XItentifierReplaces would be nice!" ); if ( xContainer.is() ) { // look up the ID of _rxExistentControl @@ -1184,7 +1364,7 @@ bool FmXFormController::replaceControl( const Reference< XControl >& _rxExistent if ( xCheck == _rxExistentControl ) break; } - DBG_ASSERT( pIdentifiers != pIdentifiersEnd, "FmXFormController::replaceControl: did not find the control in the container!" ); + DBG_ASSERT( pIdentifiers != pIdentifiersEnd, "FormController::replaceControl: did not find the control in the container!" ); if ( pIdentifiers != pIdentifiersEnd ) { bool bReplacedWasActive = ( m_xActiveControl.get() == _rxExistentControl.get() ); @@ -1217,7 +1397,7 @@ bool FmXFormController::replaceControl( const Reference< XControl >& _rxExistent } catch( const Exception& ) { - OSL_ENSURE( sal_False, "FmXFormController::replaceControl: caught an exception!" ); + DBG_UNHANDLED_EXCEPTION(); } Reference< XControl > xDisposeIt( bSuccess ? _rxExistentControl : _rxNewControl ); @@ -1226,10 +1406,9 @@ bool FmXFormController::replaceControl( const Reference< XControl >& _rxExistent } //------------------------------------------------------------------------------ -void FmXFormController::toggleAutoFields(sal_Bool bAutoFields) +void FormController::toggleAutoFields(sal_Bool bAutoFields) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::toggleAutoFields" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); Sequence< Reference< XControl > > aControlsCopy( m_aControls ); @@ -1289,7 +1468,7 @@ void FmXFormController::toggleAutoFields(sal_Bool bAutoFields) { ::rtl::OUString sServiceName; OSL_VERIFY( xSet->getPropertyValue( FM_PROP_DEFAULTCONTROL ) >>= sServiceName ); - Reference< XControl > xNewControl( m_xORB->createInstance( sServiceName ), UNO_QUERY ); + Reference< XControl > xNewControl( m_aContext.createComponent( sServiceName ), UNO_QUERY ); replaceControl( xControl, xNewControl ); } } @@ -1300,9 +1479,9 @@ void FmXFormController::toggleAutoFields(sal_Bool bAutoFields) } //------------------------------------------------------------------------------ -IMPL_LINK(FmXFormController, OnToggleAutoFields, void*, EMPTYARG) +IMPL_LINK(FormController, OnToggleAutoFields, void*, EMPTYARG) { - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); toggleAutoFields(m_bCurrentRecordNew); return 1L; @@ -1310,35 +1489,52 @@ IMPL_LINK(FmXFormController, OnToggleAutoFields, void*, EMPTYARG) // XTextListener //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::textChanged(const TextEvent& e) throw( RuntimeException ) +void SAL_CALL FormController::textChanged(const TextEvent& e) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::textChanged" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + // SYNCHRONIZED --> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); if (m_bFiltering) { Reference< XTextComponent > xText(e.Source,UNO_QUERY); ::rtl::OUString aText = xText->getText(); - // Suchen der aktuellen Row - OSL_ENSURE( ( m_aFilters.size() > (size_t)m_nCurrentFilterPosition ) && ( m_nCurrentFilterPosition >= 0 ), - "FmXFormController::textChanged: m_nCurrentFilterPosition too big" ); + if ( m_aFilterRows.empty() ) + appendEmptyDisjunctiveTerm(); - if ( ( m_nCurrentFilterPosition >= 0 ) && ( (size_t)m_nCurrentFilterPosition < m_aFilters.size() ) ) + // Suchen der aktuellen Row + if ( ( (size_t)m_nCurrentFilterPosition >= m_aFilterRows.size() ) || ( m_nCurrentFilterPosition < 0 ) ) { - FmFilterRow& rRow = m_aFilters[m_nCurrentFilterPosition]; + OSL_ENSURE( false, "FormController::textChanged: m_nCurrentFilterPosition is wrong!" ); + return; + } - // 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); - } + FmFilterRow& rRow = m_aFilterRows[ 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); } + + // multiplex the event to our FilterControllerListeners + FilterEvent aEvent; + aEvent.Source = *this; + aEvent.FilterComponent = ::std::find( m_aFilterComponents.begin(), m_aFilterComponents.end(), xText ) - m_aFilterComponents.begin(); + aEvent.DisjunctiveTerm = getActiveTerm(); + aEvent.PredicateExpression = aText; + + aGuard.clear(); + // <-- SYNCHRONIZED + + // notify the changed filter expression + m_aFilterListeners.notifyEach( &XFilterControllerListener::predicateExpressionChanged, aEvent ); } else impl_onModify(); @@ -1346,36 +1542,34 @@ void SAL_CALL FmXFormController::textChanged(const TextEvent& e) throw( RuntimeE // XItemListener //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::itemStateChanged(const ItemEvent& /*rEvent*/) throw( RuntimeException ) +void SAL_CALL FormController::itemStateChanged(const ItemEvent& /*rEvent*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::itemStateChanged" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); impl_onModify(); } // XModificationBroadcaster //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addModifyListener(const Reference< XModifyListener > & l) throw( RuntimeException ) +void SAL_CALL FormController::addModifyListener(const Reference< XModifyListener > & l) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addModifyListener" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); m_aModifyListeners.addInterface( l ); } //------------------------------------------------------------------------------ -void FmXFormController::removeModifyListener(const Reference< XModifyListener > & l) throw( RuntimeException ) +void FormController::removeModifyListener(const Reference< XModifyListener > & l) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeModifyListener" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); m_aModifyListeners.removeInterface( l ); } // XModificationListener //------------------------------------------------------------------------------ -void FmXFormController::modified( const EventObject& _rEvent ) throw( RuntimeException ) +void FormController::modified( const EventObject& _rEvent ) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::modified" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); try { @@ -1400,10 +1594,16 @@ void FmXFormController::modified( const EventObject& _rEvent ) throw( RuntimeExc } //------------------------------------------------------------------------------ -void FmXFormController::impl_onModify() +void FormController::impl_checkDisposed_throw() const +{ + if ( impl_isDisposed_nofail() ) + throw DisposedException( ::rtl::OUString(), *const_cast< FormController* >( this ) ); +} + +//------------------------------------------------------------------------------ +void FormController::impl_onModify() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::onModify" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); { ::osl::MutexGuard aGuard( m_aMutex ); @@ -1416,10 +1616,36 @@ void FmXFormController::impl_onModify() } //------------------------------------------------------------------------------ -sal_Bool FmXFormController::determineLockState() const +void FormController::impl_addFilterRow( const FmFilterRow& _row ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::determineLockState" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + m_aFilterRows.push_back( _row ); + + if ( m_aFilterRows.size() == 1 ) + { // that's the first row ever + OSL_ENSURE( m_nCurrentFilterPosition == -1, "FormController::impl_addFilterRow: inconsistency!" ); + m_nCurrentFilterPosition = 0; + } +} + +//------------------------------------------------------------------------------ +void FormController::impl_appendEmptyFilterRow( ::osl::ClearableMutexGuard& _rClearBeforeNotify ) +{ + // SYNCHRONIZED --> + impl_addFilterRow( FmFilterRow() ); + + // notify the listeners + FilterEvent aEvent; + aEvent.Source = *this; + aEvent.DisjunctiveTerm = (sal_Int32)m_aFilterRows.size() - 1; + _rClearBeforeNotify.clear(); + // <-- SYNCHRONIZED + m_aFilterListeners.notifyEach( &XFilterControllerListener::disjunctiveTermAdded, aEvent ); +} + +//------------------------------------------------------------------------------ +sal_Bool FormController::determineLockState() const +{ + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); // 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 @@ -1434,17 +1660,15 @@ sal_Bool FmXFormController::determineLockState() const // FocusListener //------------------------------------------------------------------------------ -void FmXFormController::focusGained(const FocusEvent& e) throw( RuntimeException ) +void FormController::focusGained(const FocusEvent& e) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::focusGained" ); - TRACE_RANGE( "FmXFormController::focusGained" ); - - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); - ::osl::MutexGuard aGuard( m_aMutex ); - Reference< XControl > xControl(e.Source, UNO_QUERY); + // SYNCHRONIZED --> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); m_pControlBorderManager->focusGained( e.Source ); + Reference< XControl > xControl(e.Source, UNO_QUERY); if (m_bDBConnection) { // do we need to keep the locking of the commit @@ -1473,7 +1697,7 @@ void FmXFormController::focusGained(const FocusEvent& e) throw( RuntimeException #if (OSL_DEBUG_LEVEL > 1) || defined DBG_UTIL Reference< XBoundControl > xLockingTest(m_xCurrentControl, UNO_QUERY); sal_Bool bControlIsLocked = xLockingTest.is() && xLockingTest->getLock(); - OSL_ENSURE(!bControlIsLocked, "FmXFormController::Gained: I'm modified and the current control is locked ? How this ?"); + OSL_ENSURE(!bControlIsLocked, "FormController::Gained: I'm modified and the current control is locked ? How this ?"); // 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 @@ -1505,22 +1729,33 @@ void FmXFormController::focusGained(const FocusEvent& e) throw( RuntimeException if (!m_bFiltering && m_bCycle && (e.FocusFlags & FocusChangeReason::AROUND) && m_xCurrentControl.is()) { - if ( e.FocusFlags & FocusChangeReason::FORWARD ) + SQLErrorEvent aErrorEvent; + OSL_ENSURE( m_xFormOperations.is(), "FormController::focusGained: hmm?" ); + // should have been created in setModel + try { - if ( m_aControllerFeatures->isEnabled( SID_FM_RECORD_NEXT ) ) - m_aControllerFeatures->moveRight(); + if ( e.FocusFlags & FocusChangeReason::FORWARD ) + { + if ( m_xFormOperations.is() && m_xFormOperations->isEnabled( FormFeature::MoveToNext ) ) + m_xFormOperations->execute( FormFeature::MoveToNext ); + } + else // backward + { + if ( m_xFormOperations.is() && m_xFormOperations->isEnabled( FormFeature::MoveToPrevious ) ) + m_xFormOperations->execute( FormFeature::MoveToPrevious ); + } } - else // backward + catch ( const Exception& ) { - if ( m_aControllerFeatures->isEnabled( SID_FM_RECORD_PREV ) ) - m_aControllerFeatures->moveLeft(); + // don't handle this any further. That's an ... admissible error. + DBG_UNHANDLED_EXCEPTION(); } } } // Immer noch ein und dasselbe Control - if ( (m_xActiveControl.get() == xControl.get()) - && (xControl.get() == m_xCurrentControl.get()) + if ( ( m_xActiveControl == xControl ) + && ( xControl == m_xCurrentControl ) ) { DBG_ASSERT(m_xCurrentControl.is(), "Kein CurrentControl selektiert"); @@ -1545,25 +1780,24 @@ void FmXFormController::focusGained(const FocusEvent& e) throw( RuntimeException } // invalidate all features which depend on the currently focused control - if ( m_bDBConnection && !m_bFiltering && m_pView ) + if ( m_bDBConnection && !m_bFiltering ) implInvalidateCurrentControlDependentFeatures(); - if (m_xCurrentControl.is()) - { - // Control erhaelt Focus, dann eventuell in den sichtbaren Bereich - Reference< XWindow > xWindow(xControl, UNO_QUERY); - if (xWindow.is() && m_pView && m_pWindow) - { - ::com::sun::star::awt::Rectangle aRect = xWindow->getPosSize(); - ::Rectangle aNewRect(aRect.X,aRect.Y,aRect.X+aRect.Width,aRect.Y+aRect.Height); - aNewRect = m_pWindow->PixelToLogic(aNewRect); - m_pView->MakeVisible( aNewRect, *const_cast< Window* >( m_pWindow ) ); - } - } + if ( !m_xCurrentControl.is() ) + return; + + // Control erhaelt Focus, dann eventuell in den sichtbaren Bereich + Reference< XFormControllerContext > xContext( m_xContext ); + Reference< XControl > xCurrentControl( m_xCurrentControl ); + aGuard.clear(); + // <-- SYNCHRONIZED + + if ( xContext.is() ) + xContext->makeVisible( xCurrentControl ); } //------------------------------------------------------------------------------ -IMPL_LINK( FmXFormController, OnActivated, void*, /**/ ) +IMPL_LINK( FormController, OnActivated, void*, /**/ ) { EventObject aEvent; aEvent.Source = *this; @@ -1573,7 +1807,7 @@ IMPL_LINK( FmXFormController, OnActivated, void*, /**/ ) } //------------------------------------------------------------------------------ -IMPL_LINK( FmXFormController, OnDeactivated, void*, /**/ ) +IMPL_LINK( FormController, OnDeactivated, void*, /**/ ) { EventObject aEvent; aEvent.Source = *this; @@ -1583,10 +1817,9 @@ IMPL_LINK( FmXFormController, OnDeactivated, void*, /**/ ) } //------------------------------------------------------------------------------ -void FmXFormController::focusLost(const FocusEvent& e) throw( RuntimeException ) +void FormController::focusLost(const FocusEvent& e) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::focusLost" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); m_pControlBorderManager->focusLost( e.Source ); @@ -1601,53 +1834,48 @@ void FmXFormController::focusLost(const FocusEvent& e) throw( RuntimeException ) } //-------------------------------------------------------------------- -void SAL_CALL FmXFormController::mousePressed( const awt::MouseEvent& /*_rEvent*/ ) throw (RuntimeException) +void SAL_CALL FormController::mousePressed( const awt::MouseEvent& /*_rEvent*/ ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::mousePressed" ); // not interested in } //-------------------------------------------------------------------- -void SAL_CALL FmXFormController::mouseReleased( const awt::MouseEvent& /*_rEvent*/ ) throw (RuntimeException) +void SAL_CALL FormController::mouseReleased( const awt::MouseEvent& /*_rEvent*/ ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::mouseReleased" ); // not interested in } //-------------------------------------------------------------------- -void SAL_CALL FmXFormController::mouseEntered( const awt::MouseEvent& _rEvent ) throw (RuntimeException) +void SAL_CALL FormController::mouseEntered( const awt::MouseEvent& _rEvent ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::mouseEntered" ); m_pControlBorderManager->mouseEntered( _rEvent.Source ); } //-------------------------------------------------------------------- -void SAL_CALL FmXFormController::mouseExited( const awt::MouseEvent& _rEvent ) throw (RuntimeException) +void SAL_CALL FormController::mouseExited( const awt::MouseEvent& _rEvent ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::mouseExited" ); m_pControlBorderManager->mouseExited( _rEvent.Source ); } //-------------------------------------------------------------------- -void SAL_CALL FmXFormController::componentValidityChanged( const EventObject& _rSource ) throw (RuntimeException) +void SAL_CALL FormController::componentValidityChanged( const EventObject& _rSource ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::componentValidityChanged" ); 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?" ); + OSL_ENSURE( xControl.is() && xValidatable.is(), "FormController::componentValidityChanged: huh?" ); if ( xControl.is() && xValidatable.is() ) m_pControlBorderManager->validityChanged( xControl, xValidatable ); } //-------------------------------------------------------------------- -void FmXFormController::setModel(const Reference< XTabControllerModel > & Model) throw( RuntimeException ) +void FormController::setModel(const Reference< XTabControllerModel > & Model) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setModel" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); - DBG_ASSERT(m_xTabController.is(), "FmXFormController::setModel : invalid aggregate !"); + impl_checkDisposed_throw(); + + DBG_ASSERT(m_xTabController.is(), "FormController::setModel : invalid aggregate !"); try { @@ -1672,10 +1900,15 @@ void FmXFormController::setModel(const Reference< XTabControllerModel > & Model) Reference< XDatabaseParameterBroadcaster > xParamBroadcaster(m_xModelAsIndex, UNO_QUERY); if (xParamBroadcaster.is()) xParamBroadcaster->removeParameterListener(this); + } disposeAllFeaturesAndDispatchers(); + if ( m_xFormOperations.is() ) + m_xFormOperations->dispose(); + m_xFormOperations.clear(); + // set the new model wait for the load event if (m_xTabController.is()) m_xTabController->setModel(Model); @@ -1691,7 +1924,9 @@ void FmXFormController::setModel(const Reference< XTabControllerModel > & Model) if (m_xModelAsIndex.is()) { - m_aControllerFeatures.assign( this ); + // re-create m_xFormOperations + m_xFormOperations.set( FormOperations::createWithFormController( m_aContext.getUNOContext(), this ), UNO_SET_THROW ); + m_xFormOperations->setFeatureInvalidation( this ); // adding load and ui interaction listeners Reference< XLoadable > xForm(Model, UNO_QUERY); @@ -1743,27 +1978,27 @@ void FmXFormController::setModel(const Reference< XTabControllerModel > & Model) } catch( const Exception& ) { - OSL_ENSURE( sal_False, "FmXFormController::setModel: caught an exception!" ); + DBG_UNHANDLED_EXCEPTION(); } } //------------------------------------------------------------------------------ -Reference< XTabControllerModel > FmXFormController::getModel() throw( RuntimeException ) +Reference< XTabControllerModel > FormController::getModel() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getModel" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); - DBG_ASSERT(m_xTabController.is(), "FmXFormController::getModel : invalid aggregate !"); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + DBG_ASSERT(m_xTabController.is(), "FormController::getModel : invalid aggregate !"); if (!m_xTabController.is()) return Reference< XTabControllerModel > (); return m_xTabController->getModel(); } //------------------------------------------------------------------------------ -void FmXFormController::addToEventAttacher(const Reference< XControl > & xControl) +void FormController::addToEventAttacher(const Reference< XControl > & xControl) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addToEventAttacher" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); - OSL_ENSURE( xControl.is(), "FmXFormController::addToEventAttacher: invalid control - how did you reach this?" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); + OSL_ENSURE( xControl.is(), "FormController::addToEventAttacher: invalid control - how did you reach this?" ); if ( !xControl.is() ) return; /* throw IllegalArgumentException(); */ @@ -1788,11 +2023,10 @@ void FmXFormController::addToEventAttacher(const Reference< XControl > & xContro } //------------------------------------------------------------------------------ -void FmXFormController::removeFromEventAttacher(const Reference< XControl > & xControl) +void FormController::removeFromEventAttacher(const Reference< XControl > & xControl) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeFromEventAttacher" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); - OSL_ENSURE( xControl.is(), "FmXFormController::removeFromEventAttacher: invalid control - how did you reach this?" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); + OSL_ENSURE( xControl.is(), "FormController::removeFromEventAttacher: invalid control - how did you reach this?" ); if ( !xControl.is() ) return; /* throw IllegalArgumentException(); */ @@ -1817,14 +2051,13 @@ void FmXFormController::removeFromEventAttacher(const Reference< XControl > & xC } //------------------------------------------------------------------------------ -void FmXFormController::setContainer(const Reference< XControlContainer > & xContainer) throw( RuntimeException ) +void FormController::setContainer(const Reference< XControlContainer > & xContainer) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setContainer" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); Reference< XTabControllerModel > xTabModel(getModel()); 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 !"); + DBG_ASSERT(m_xTabController.is(), "FormController::setContainer : invalid aggregate !"); ::osl::MutexGuard aGuard( m_aMutex ); Reference< XContainer > xCurrentContainer; @@ -1838,11 +2071,8 @@ void FmXFormController::setContainer(const Reference< XControlContainer > & xCon m_aTabActivationTimer.Stop(); // clear the filter map - for (FmFilterControls::const_iterator iter = m_aFilterControls.begin(); - iter != m_aFilterControls.end(); ++iter) - (*iter).first->removeTextListener(this); - - m_aFilterControls.clear(); + ::std::for_each( m_aFilterComponents.begin(), m_aFilterComponents.end(), RemoveComponentTextListener( this ) ); + m_aFilterComponents.clear(); // einsammeln der Controls const Reference< XControl >* pControls = m_aControls.getConstArray(); @@ -1906,23 +2136,23 @@ void FmXFormController::setContainer(const Reference< XControlContainer > & xCon } //------------------------------------------------------------------------------ -Reference< XControlContainer > FmXFormController::getContainer() throw( RuntimeException ) +Reference< XControlContainer > FormController::getContainer() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getContainer" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); - DBG_ASSERT(m_xTabController.is(), "FmXFormController::getContainer : invalid aggregate !"); + impl_checkDisposed_throw(); + + DBG_ASSERT(m_xTabController.is(), "FormController::getContainer : invalid aggregate !"); if (!m_xTabController.is()) return Reference< XControlContainer > (); return m_xTabController->getContainer(); } //------------------------------------------------------------------------------ -Sequence< Reference< XControl > > FmXFormController::getControls(void) throw( RuntimeException ) +Sequence< Reference< XControl > > FormController::getControls(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getControls" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + if (!m_bControlsSorted) { Reference< XTabControllerModel > xModel = getModel(); @@ -1958,32 +2188,31 @@ Sequence< Reference< XControl > > FmXFormController::getControls(void) throw( Ru } //------------------------------------------------------------------------------ -void FmXFormController::autoTabOrder() throw( RuntimeException ) +void FormController::autoTabOrder() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::autoTabOrder" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); - DBG_ASSERT(m_xTabController.is(), "FmXFormController::autoTabOrder : invalid aggregate !"); + impl_checkDisposed_throw(); + + DBG_ASSERT(m_xTabController.is(), "FormController::autoTabOrder : invalid aggregate !"); if (m_xTabController.is()) m_xTabController->autoTabOrder(); } //------------------------------------------------------------------------------ -void FmXFormController::activateTabOrder() throw( RuntimeException ) +void FormController::activateTabOrder() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::activateTabOrder" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); - DBG_ASSERT(m_xTabController.is(), "FmXFormController::activateTabOrder : invalid aggregate !"); + impl_checkDisposed_throw(); + + DBG_ASSERT(m_xTabController.is(), "FormController::activateTabOrder : invalid aggregate !"); if (m_xTabController.is()) m_xTabController->activateTabOrder(); } //------------------------------------------------------------------------------ -void FmXFormController::setControlLock(const Reference< XControl > & xControl) +void FormController::setControlLock(const Reference< XControl > & xControl) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setControlLock" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); sal_Bool bLocked = isLocked(); // es wird gelockt @@ -2022,8 +2251,9 @@ void FmXFormController::setControlLock(const Reference< XControl > & xControl) else xBound->setLock(bLocked); } - catch(...) + catch( const Exception& ) { + DBG_UNHANDLED_EXCEPTION(); } } @@ -2034,10 +2264,9 @@ void FmXFormController::setControlLock(const Reference< XControl > & xControl) } //------------------------------------------------------------------------------ -void FmXFormController::setLocks() +void FormController::setLocks() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setLocks" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); // alle Controls, die mit einer Datenquelle verbunden sind locken/unlocken const Reference< XControl >* pControls = m_aControls.getConstArray(); const Reference< XControl >* pControlsEnd = pControls + m_aControls.getLength(); @@ -2076,10 +2305,9 @@ namespace } //------------------------------------------------------------------------------ -void FmXFormController::startControlModifyListening(const Reference< XControl > & xControl) +void FormController::startControlModifyListening(const Reference< XControl > & xControl) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::startControlModifyListening" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); bool bModifyListening = lcl_shouldListenForModifications( xControl, this ); @@ -2126,10 +2354,9 @@ void FmXFormController::startControlModifyListening(const Reference< XControl > } //------------------------------------------------------------------------------ -void FmXFormController::stopControlModifyListening(const Reference< XControl > & xControl) +void FormController::stopControlModifyListening(const Reference< XControl > & xControl) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::stopControlModifyListening" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); bool bModifyListening = lcl_shouldListenForModifications( xControl, NULL ); @@ -2175,10 +2402,9 @@ void FmXFormController::stopControlModifyListening(const Reference< XControl > & } //------------------------------------------------------------------------------ -void FmXFormController::startListening() +void FormController::startListening() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::startListening" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); m_bModified = sal_False; // jetzt anmelden bei gebundenen feldern @@ -2189,10 +2415,9 @@ void FmXFormController::startListening() } //------------------------------------------------------------------------------ -void FmXFormController::stopListening() +void FormController::stopListening() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::stopListening" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); m_bModified = sal_False; // jetzt anmelden bei gebundenen feldern @@ -2204,10 +2429,9 @@ void FmXFormController::stopListening() //------------------------------------------------------------------------------ -Reference< XControl > FmXFormController::findControl(Sequence< Reference< XControl > >& _rControls, const Reference< XControlModel > & xCtrlModel ,sal_Bool _bRemove,sal_Bool _bOverWrite) const +Reference< XControl > FormController::findControl(Sequence< Reference< XControl > >& _rControls, const Reference< XControlModel > & xCtrlModel ,sal_Bool _bRemove,sal_Bool _bOverWrite) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::findControl" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); DBG_ASSERT( xCtrlModel.is(), "findControl - welches ?!" ); Reference< XControl >* pControls = _rControls.getArray(); @@ -2232,9 +2456,8 @@ Reference< XControl > FmXFormController::findControl(Sequence< Reference< XCont } //------------------------------------------------------------------------------ -void FmXFormController::implControlInserted( const Reference< XControl>& _rxControl, bool _bAddToEventAttacher ) +void FormController::implControlInserted( const Reference< XControl>& _rxControl, bool _bAddToEventAttacher ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::implControlInserted" ); Reference< XWindow > xWindow( _rxControl, UNO_QUERY ); if ( xWindow.is() ) { @@ -2272,9 +2495,8 @@ void FmXFormController::implControlInserted( const Reference< XControl>& _rxCont } //------------------------------------------------------------------------------ -void FmXFormController::implControlRemoved( const Reference< XControl>& _rxControl, bool _bRemoveFromEventAttacher ) +void FormController::implControlRemoved( const Reference< XControl>& _rxControl, bool _bRemoveFromEventAttacher ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::implControlRemoved" ); Reference< XWindow > xWindow( _rxControl, UNO_QUERY ); if ( xWindow.is() ) { @@ -2304,9 +2526,8 @@ void FmXFormController::implControlRemoved( const Reference< XControl>& _rxContr } //------------------------------------------------------------------------------ -void FmXFormController::implSetCurrentControl( const Reference< XControl >& _rxControl ) +void FormController::implSetCurrentControl( const Reference< XControl >& _rxControl ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::implSetCurrentControl" ); if ( m_xCurrentControl.get() == _rxControl.get() ) return; @@ -2322,10 +2543,9 @@ void FmXFormController::implSetCurrentControl( const Reference< XControl >& _rxC } //------------------------------------------------------------------------------ -void FmXFormController::insertControl(const Reference< XControl > & xControl) +void FormController::insertControl(const Reference< XControl > & xControl) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::insertControl" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); m_bControlsSorted = sal_False; m_aControls.realloc(m_aControls.getLength() + 1); m_aControls.getArray()[m_aControls.getLength() - 1] = xControl; @@ -2343,10 +2563,9 @@ void FmXFormController::insertControl(const Reference< XControl > & xControl) } //------------------------------------------------------------------------------ -void FmXFormController::removeControl(const Reference< XControl > & xControl) +void FormController::removeControl(const Reference< XControl > & xControl) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeControl" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); const Reference< XControl >* pControls = m_aControls.getConstArray(); const Reference< XControl >* pControlsEnd = pControls + m_aControls.getLength(); while ( pControls != pControlsEnd ) @@ -2358,13 +2577,9 @@ void FmXFormController::removeControl(const Reference< XControl > & xControl) } } - if (m_aFilterControls.size()) - { - Reference< XTextComponent > xText(xControl, UNO_QUERY); - FmFilterControls::iterator iter = m_aFilterControls.find(xText); - if (iter != m_aFilterControls.end()) - m_aFilterControls.erase(iter); - } + FilterComponents::iterator componentPos = ::std::find( m_aFilterComponents.begin(), m_aFilterComponents.end(), xControl ); + if ( componentPos != m_aFilterComponents.end() ) + m_aFilterComponents.erase( componentPos ); implControlRemoved( xControl, m_bDetachEvents ); @@ -2374,12 +2589,11 @@ void FmXFormController::removeControl(const Reference< XControl > & xControl) // XLoadListener //------------------------------------------------------------------------------ -void FmXFormController::loaded(const EventObject& rEvent) throw( RuntimeException ) +void FormController::loaded(const EventObject& rEvent) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::loaded" ); - OSL_ENSURE( rEvent.Source == m_xModelAsIndex, "FmXFormController::loaded: where did this come from?" ); + OSL_ENSURE( rEvent.Source == m_xModelAsIndex, "FormController::loaded: where did this come from?" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); Reference< XRowSet > xForm(rEvent.Source, UNO_QUERY); // do we have a connected data source @@ -2431,9 +2645,8 @@ void FmXFormController::loaded(const EventObject& rEvent) throw( RuntimeExceptio } //------------------------------------------------------------------------------ -void FmXFormController::updateAllDispatchers() const +void FormController::updateAllDispatchers() const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::updateAllDispatchers" ); ::std::for_each( m_aFeatureDispatchers.begin(), m_aFeatureDispatchers.end(), @@ -2445,9 +2658,9 @@ void FmXFormController::updateAllDispatchers() const } //------------------------------------------------------------------------------ -IMPL_LINK(FmXFormController, OnLoad, void*, EMPTYARG) +IMPL_LINK(FormController, OnLoad, void*, EMPTYARG) { - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); m_bLocked = determineLockState(); setLocks(); @@ -2463,19 +2676,20 @@ IMPL_LINK(FmXFormController, OnLoad, void*, EMPTYARG) } //------------------------------------------------------------------------------ -void FmXFormController::unloaded(const EventObject& /*rEvent*/) throw( RuntimeException ) +void FormController::unloaded(const EventObject& /*rEvent*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::unloaded" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + updateAllDispatchers(); } //------------------------------------------------------------------------------ -void FmXFormController::reloading(const EventObject& /*aEvent*/) throw( RuntimeException ) +void FormController::reloading(const EventObject& /*aEvent*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::reloading" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + // do the same like in unloading // just one exception toggle the auto values m_aToggleEvent.CancelPendingCall(); @@ -2483,27 +2697,28 @@ void FmXFormController::reloading(const EventObject& /*aEvent*/) throw( RuntimeE } //------------------------------------------------------------------------------ -void FmXFormController::reloaded(const EventObject& aEvent) throw( RuntimeException ) +void FormController::reloaded(const EventObject& aEvent) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::reloaded" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + loaded(aEvent); } //------------------------------------------------------------------------------ -void FmXFormController::unloading(const EventObject& /*aEvent*/) throw( RuntimeException ) +void FormController::unloading(const EventObject& /*aEvent*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::unloading" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + unload(); } //------------------------------------------------------------------------------ -void FmXFormController::unload() throw( RuntimeException ) +void FormController::unload() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::unload" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); m_aLoadEvent.CancelPendingCall(); @@ -2529,9 +2744,8 @@ void FmXFormController::unload() throw( RuntimeException ) } // ----------------------------------------------------------------------------- -void FmXFormController::removeBoundFieldListener() +void FormController::removeBoundFieldListener() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeBoundFieldListener" ); const Reference< XControl >* pControls = m_aControls.getConstArray(); const Reference< XControl >* pControlsEnd = pControls + m_aControls.getLength(); while ( pControls != pControlsEnd ) @@ -2543,9 +2757,8 @@ void FmXFormController::removeBoundFieldListener() } //------------------------------------------------------------------------------ -void FmXFormController::startFormListening( const Reference< XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ) +void FormController::startFormListening( const Reference< XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::startFormListening" ); try { if ( m_bCanInsert || m_bCanUpdate ) // form can be modified @@ -2573,14 +2786,13 @@ void FmXFormController::startFormListening( const Reference< XPropertySet >& _rx } catch( const Exception& ) { - OSL_ENSURE( sal_False, "FmXFormController::startFormListening: caught an exception!" ); + DBG_UNHANDLED_EXCEPTION(); } } //------------------------------------------------------------------------------ -void FmXFormController::stopFormListening( const Reference< XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ) +void FormController::stopFormListening( const Reference< XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::stopFormListening" ); try { if ( m_bCanInsert || m_bCanUpdate ) @@ -2606,20 +2818,20 @@ void FmXFormController::stopFormListening( const Reference< XPropertySet >& _rxF } catch( const Exception& ) { - OSL_ENSURE( sal_False, "FmXFormController::stopFormListening: caught an exception!" ); + DBG_UNHANDLED_EXCEPTION(); } } // com::sun::star::sdbc::XRowSetListener //------------------------------------------------------------------------------ -void FmXFormController::cursorMoved(const EventObject& /*event*/) throw( RuntimeException ) +void FormController::cursorMoved(const EventObject& /*event*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::cursorMoved" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + // toggle the locking ? if (m_bLocked != determineLockState()) { - ::osl::MutexGuard aGuard( m_aMutex ); m_bLocked = !m_bLocked; setLocks(); if (isListeningForChanges()) @@ -2633,31 +2845,28 @@ void FmXFormController::cursorMoved(const EventObject& /*event*/) throw( Runtime } //------------------------------------------------------------------------------ -void FmXFormController::rowChanged(const EventObject& /*event*/) throw( RuntimeException ) +void FormController::rowChanged(const EventObject& /*event*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::rowChanged" ); // not interested in ... } //------------------------------------------------------------------------------ -void FmXFormController::rowSetChanged(const EventObject& /*event*/) throw( RuntimeException ) +void FormController::rowSetChanged(const EventObject& /*event*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::rowSetChanged" ); // not interested in ... } // XContainerListener //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::elementInserted(const ContainerEvent& evt) throw( RuntimeException ) +void SAL_CALL FormController::elementInserted(const ContainerEvent& evt) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::elementInserted" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); - Reference< XControl > xControl; - evt.Element >>= xControl; - if (!xControl.is()) + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + Reference< XControl > xControl( evt.Element, UNO_QUERY ); + if ( !xControl.is() ) return; - ::osl::MutexGuard aGuard( m_aMutex ); Reference< XFormComponent > xModel(xControl->getModel(), UNO_QUERY); if (xModel.is() && m_xModelAsIndex == xModel->getParent()) { @@ -2686,8 +2895,8 @@ void SAL_CALL FmXFormController::elementInserted(const ContainerEvent& evt) thro if (xText.is() && xField.is() && ::comphelper::hasProperty(FM_PROP_SEARCHABLE, xField) && ::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_SEARCHABLE))) { - m_aFilterControls[xText] = xField; - xText->addTextListener(this); + m_aFilterComponents.push_back( xText ); + xText->addTextListener( this ); } } } @@ -2695,9 +2904,8 @@ void SAL_CALL FmXFormController::elementInserted(const ContainerEvent& evt) thro } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::elementReplaced(const ContainerEvent& evt) throw( RuntimeException ) +void SAL_CALL FormController::elementReplaced(const ContainerEvent& evt) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::elementReplaced" ); // simulate an elementRemoved ContainerEvent aRemoveEvent( evt ); aRemoveEvent.Element = evt.ReplacedElement; @@ -2711,11 +2919,10 @@ void SAL_CALL FmXFormController::elementReplaced(const ContainerEvent& evt) thro } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::elementRemoved(const ContainerEvent& evt) throw( RuntimeException ) +void SAL_CALL FormController::elementRemoved(const ContainerEvent& evt) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::elementRemoved" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); Reference< XControl > xControl; evt.Element >>= xControl; @@ -2731,18 +2938,17 @@ void SAL_CALL FmXFormController::elementRemoved(const ContainerEvent& evt) throw // are we in filtermode and a XModeSelector has inserted an element else if (m_bFiltering && Reference< XModeSelector > (evt.Source, UNO_QUERY).is()) { - Reference< XTextComponent > xText(xControl, UNO_QUERY); - FmFilterControls::iterator iter = m_aFilterControls.find(xText); - if (iter != m_aFilterControls.end()) - m_aFilterControls.erase(iter); + FilterComponents::iterator componentPos = ::std::find( + m_aFilterComponents.begin(), m_aFilterComponents.end(), xControl ); + if ( componentPos != m_aFilterComponents.end() ) + m_aFilterComponents.erase( componentPos ); } } //------------------------------------------------------------------------------ -Reference< XControl > FmXFormController::isInList(const Reference< XWindowPeer > & xPeer) const +Reference< XControl > FormController::isInList(const Reference< XWindowPeer > & xPeer) const { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::isInList" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); const Reference< XControl >* pControls = m_aControls.getConstArray(); sal_uInt32 nCtrls = m_aControls.getLength(); @@ -2759,58 +2965,134 @@ Reference< XControl > FmXFormController::isInList(const Reference< XWindowPeer } //------------------------------------------------------------------------------ -void FmXFormController::activateFirst() throw( RuntimeException ) +void FormController::activateFirst() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::activateFirst" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); - DBG_ASSERT(m_xTabController.is(), "FmXFormController::activateFirst : invalid aggregate !"); + impl_checkDisposed_throw(); + + DBG_ASSERT(m_xTabController.is(), "FormController::activateFirst : invalid aggregate !"); if (m_xTabController.is()) m_xTabController->activateFirst(); } //------------------------------------------------------------------------------ -void FmXFormController::activateLast() throw( RuntimeException ) +void FormController::activateLast() throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::activateLast" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::osl::MutexGuard aGuard( m_aMutex ); - DBG_ASSERT(m_xTabController.is(), "FmXFormController::activateLast : invalid aggregate !"); + impl_checkDisposed_throw(); + + DBG_ASSERT(m_xTabController.is(), "FormController::activateLast : invalid aggregate !"); if (m_xTabController.is()) m_xTabController->activateLast(); } // XFormController //------------------------------------------------------------------------------ -Reference< XControl> SAL_CALL FmXFormController::getCurrentControl(void) throw( RuntimeException ) +Reference< XFormOperations > SAL_CALL FormController::getFormOperations() throw (RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + return m_xFormOperations; +} + +//------------------------------------------------------------------------------ +Reference< XControl> SAL_CALL FormController::getCurrentControl(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getCurrentControl" ); ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); return m_xCurrentControl; } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addActivateListener(const Reference< XFormControllerListener > & l) throw( RuntimeException ) +void SAL_CALL FormController::addActivateListener(const Reference< XFormControllerListener > & l) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addActivateListener" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); m_aActivateListeners.addInterface(l); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::removeActivateListener(const Reference< XFormControllerListener > & l) throw( RuntimeException ) +void SAL_CALL FormController::removeActivateListener(const Reference< XFormControllerListener > & l) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeActivateListener" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); m_aActivateListeners.removeInterface(l); } //------------------------------------------------------------------------------ -void FmXFormController::setFilter(::std::vector<FmFieldInfo>& rFieldInfos) +void SAL_CALL FormController::addChildController( const Reference< XFormController >& _ChildController ) throw( RuntimeException, IllegalArgumentException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + + if ( !_ChildController.is() ) + throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); + // TODO: (localized) error message + + // the parent of our (to-be-)child must be our own model + Reference< XFormComponent > xFormOfChild( _ChildController->getModel(), UNO_QUERY ); + if ( !xFormOfChild.is() ) + throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); + // TODO: (localized) error message + + if ( xFormOfChild->getParent() != m_xModelAsIndex ) + throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); + // TODO: (localized) error message + + m_aChilds.push_back( _ChildController ); + _ChildController->setParent( *this ); + + // search the position of the model within the form + sal_uInt32 nPos = m_xModelAsIndex->getCount(); + Reference< XFormComponent > xTemp; + for( ; nPos; ) + { + m_xModelAsIndex->getByIndex(--nPos) >>= xTemp; + if ( xFormOfChild == xTemp ) + { + Reference< XInterface > xIfc( _ChildController, UNO_QUERY ); + m_xModelAsManager->attach( nPos, xIfc, makeAny( _ChildController) ); + break; + } + } +} + +//------------------------------------------------------------------------------ +Reference< XFormControllerContext > SAL_CALL FormController::getContext() throw (RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + return m_xContext; +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::setContext( const Reference< XFormControllerContext >& _context ) throw (RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + m_xContext = _context; +} + +//------------------------------------------------------------------------------ +Reference< XInteractionHandler > SAL_CALL FormController::getInteractionHandler() throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setFilter" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + return m_xInteractionHandler; +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::setInteractionHandler( const Reference< XInteractionHandler >& _interactionHandler ) throw (RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + m_xInteractionHandler = _interactionHandler; +} + +//------------------------------------------------------------------------------ +void FormController::setFilter(::std::vector<FmFieldInfo>& rFieldInfos) +{ + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); // create the composer Reference< XRowSet > xForm(m_xModelAsIndex, UNO_QUERY); Reference< XConnection > xConnection(OStaticDataAccessTools().getRowSetConnection(xForm)); @@ -2865,11 +3147,10 @@ void FmXFormController::setFilter(::std::vector<FmFieldInfo>& rFieldInfos) // need to parse criteria localized OStaticDataAccessTools aStaticTools; Reference< XNumberFormatsSupplier> xFormatSupplier( aStaticTools.getNumberFormats(xConnection, sal_True)); - Reference< XNumberFormatter> xFormatter(m_xORB - ->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")), UNO_QUERY); + Reference< XNumberFormatter> xFormatter( m_aContext.createComponent( "com.sun.star.util.NumberFormatter" ), UNO_QUERY ); xFormatter->attachNumberFormatsSupplier(xFormatSupplier); Locale aAppLocale = Application::GetSettings().GetUILocale(); - LocaleDataWrapper aLocaleWrapper(m_xORB,aAppLocale); + LocaleDataWrapper aLocaleWrapper( m_aContext.getLegacyServiceFactory(), aAppLocale ); // retrieving the filter const Sequence < PropertyValue >* pRow = aFilterRows.getConstArray(); @@ -2967,26 +3248,24 @@ void FmXFormController::setFilter(::std::vector<FmFieldInfo>& rFieldInfos) if (aRow.empty()) continue; - m_aFilters.push_back(aRow); + impl_addFilterRow( aRow ); } } // now set the filter controls - for (::std::vector<FmFieldInfo>::iterator iter = rFieldInfos.begin(); - iter != rFieldInfos.end(); iter++) + for ( ::std::vector<FmFieldInfo>::iterator field = rFieldInfos.begin(); + field != rFieldInfos.end(); + ++field + ) { - m_aFilterControls[(*iter).xText] = (*iter).xField; + m_aFilterComponents.push_back( field->xText ); } - - // add an empty row - m_aFilters.push_back(FmFilterRow()); } //------------------------------------------------------------------------------ -void FmXFormController::startFiltering() +void FormController::startFiltering() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::startFiltering" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); OStaticDataAccessTools aStaticTools; Reference< XConnection > xConnection( aStaticTools.getRowSetConnection( Reference< XRowSet >( m_xModelAsIndex, UNO_QUERY ) ) ); @@ -3013,8 +3292,7 @@ void FmXFormController::startFiltering() // the control we have to activate after replacement Reference< XDatabaseMetaData > xMetaData(xConnection->getMetaData()); Reference< XNumberFormatsSupplier > xFormatSupplier = aStaticTools.getNumberFormats(xConnection, sal_True); - Reference< XNumberFormatter > xFormatter(m_xORB - ->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")), UNO_QUERY); + Reference< XNumberFormatter > xFormatter( m_aContext.createComponent( "com.sun.star.util.NumberFormatter" ), UNO_QUERY ); xFormatter->attachNumberFormatsSupplier(xFormatSupplier); // structure for storing the field info @@ -3032,7 +3310,7 @@ void FmXFormController::startFiltering() Reference< XModeSelector > xSelector(xControl, UNO_QUERY); if (xSelector.is()) { - xSelector->setMode(FILTER_MODE); + xSelector->setMode( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterMode" ) ) ); // listening for new controls of the selector Reference< XContainer > xContainer(xSelector, UNO_QUERY); @@ -3092,13 +3370,10 @@ void FmXFormController::startFiltering() 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 - ), + m_aContext.createComponentWithArguments( "com.sun.star.form.control.FilterControl", aCreationArgs ), UNO_QUERY ); - DBG_ASSERT( xFilterControl.is(), "FmXFormController::startFiltering: could not create a filter control!" ); + DBG_ASSERT( xFilterControl.is(), "FormController::startFiltering: could not create a filter control!" ); if ( replaceControl( xControl, xFilterControl ) ) { @@ -3132,10 +3407,9 @@ void FmXFormController::startFiltering() } //------------------------------------------------------------------------------ -void FmXFormController::stopFiltering() +void FormController::stopFiltering() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::stopFiltering" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); if ( !m_bFiltering ) // #104693# OJ { // nothing to do return; @@ -3150,17 +3424,10 @@ void FmXFormController::stopFiltering() Sequence< Reference< XControl > > aControlsCopy( m_aControls ); const Reference< XControl > * pControls = aControlsCopy.getConstArray(); sal_Int32 nControlCount = aControlsCopy.getLength(); - // SdrPageView* pCurPageView = m_pView->GetSdrPageView(); - - // sal_uInt16 nPos = pCurPageView ? pCurPageView->GetWinList().Find((OutputDevice*)m_pView->GetActualOutDev()) : SDRPAGEVIEWWIN_NOTFOUND; - // const SdrPageWindow* pWindow = pCurPageView ? pCurPageView->FindPageWindow(*((OutputDevice*)m_pView->GetActualOutDev())) : 0L; // 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(); + ::std::for_each( m_aFilterComponents.begin(), m_aFilterComponents.end(), RemoveComponentTextListener( this ) ); + m_aFilterComponents.clear(); for ( sal_Int32 i = nControlCount; i > 0; ) { @@ -3173,7 +3440,7 @@ void FmXFormController::stopFiltering() Reference< XModeSelector > xSelector(xControl, UNO_QUERY); if (xSelector.is()) { - xSelector->setMode(DATA_MODE); + xSelector->setMode( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ) ); // listening for new controls of the selector Reference< XContainer > xContainer(xSelector, UNO_QUERY); @@ -3197,7 +3464,7 @@ void FmXFormController::stopFiltering() { ::rtl::OUString sServiceName; OSL_VERIFY( xSet->getPropertyValue( FM_PROP_DEFAULTCONTROL ) >>= sServiceName ); - Reference< XControl > xNewControl( m_xORB->createInstance( sServiceName ), UNO_QUERY ); + Reference< XControl > xNewControl( m_aContext.createComponent( sServiceName ), UNO_QUERY ); replaceControl( xControl, xNewControl ); } } @@ -3210,8 +3477,8 @@ void FmXFormController::stopFiltering() m_bDetachEvents = sal_True; - m_aFilters.clear(); - m_nCurrentFilterPosition = 0; + m_aFilterRows.clear(); + m_nCurrentFilterPosition = -1; // release the locks if possible // lock all controls which are not used for filtering @@ -3225,12 +3492,11 @@ void FmXFormController::stopFiltering() // XModeSelector //------------------------------------------------------------------------------ -void FmXFormController::setMode(const ::rtl::OUString& Mode) throw( NoSupportException, RuntimeException ) +void FormController::setMode(const ::rtl::OUString& Mode) throw( NoSupportException, RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::setMode" ); ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); if (!supportsMode(Mode)) throw NoSupportException(); @@ -3239,7 +3505,7 @@ void FmXFormController::setMode(const ::rtl::OUString& Mode) throw( NoSupportExc m_aMode = Mode; - if (Mode == FILTER_MODE) + if ( Mode.equalsAscii( "FilterMode" ) ) startFiltering(); else stopFiltering(); @@ -3254,35 +3520,37 @@ void FmXFormController::setMode(const ::rtl::OUString& Mode) throw( NoSupportExc } //------------------------------------------------------------------------------ -::rtl::OUString SAL_CALL FmXFormController::getMode(void) throw( RuntimeException ) +::rtl::OUString SAL_CALL FormController::getMode(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getMode" ); -::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + return m_aMode; } //------------------------------------------------------------------------------ -Sequence< ::rtl::OUString > SAL_CALL FmXFormController::getSupportedModes(void) throw( RuntimeException ) +Sequence< ::rtl::OUString > SAL_CALL FormController::getSupportedModes(void) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getSupportedModes" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + static Sequence< ::rtl::OUString > aModes; if (!aModes.getLength()) { aModes.realloc(2); ::rtl::OUString* pModes = aModes.getArray(); - pModes[0] = DATA_MODE; - pModes[1] = FILTER_MODE; + pModes[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); + pModes[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterMode" ) ); } return aModes; } //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::supportsMode(const ::rtl::OUString& Mode) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::supportsMode(const ::rtl::OUString& Mode) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::supportsMode" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + Sequence< ::rtl::OUString > aModes(getSupportedModes()); const ::rtl::OUString* pModes = aModes.getConstArray(); for (sal_Int32 i = aModes.getLength(); i > 0; ) @@ -3294,37 +3562,32 @@ sal_Bool SAL_CALL FmXFormController::supportsMode(const ::rtl::OUString& Mode) t } //------------------------------------------------------------------------------ -Window* FmXFormController::getDialogParentWindow() +Window* FormController::getDialogParentWindow() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::getDialogParentWindow" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); - Window* pParent = m_pWindow; - if ( !pParent ) + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); + Window* pParentWindow = NULL; + try { - try - { - Reference< XControl > xContainerControl( getContainer(), UNO_QUERY_THROW ); - Reference< XWindowPeer > xContainerPeer( xContainerControl->getPeer(), UNO_QUERY_THROW ); - pParent = VCLUnoHelper::GetWindow( xContainerPeer ); - } - catch( const Exception& ) - { - OSL_ENSURE( sal_False, "FmXFormController::getDialogParentWindow: caught an exception!" ); - } + Reference< XControl > xContainerControl( getContainer(), UNO_QUERY_THROW ); + Reference< XWindowPeer > xContainerPeer( xContainerControl->getPeer(), UNO_QUERY_THROW ); + pParentWindow = VCLUnoHelper::GetWindow( xContainerPeer ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); } - return pParent; + return pParentWindow; } //------------------------------------------------------------------------------ -bool FmXFormController::checkFormComponentValidity( ::rtl::OUString& /* [out] */ _rFirstInvalidityExplanation, Reference< XControlModel >& /* [out] */ _rxFirstInvalidModel ) SAL_THROW(()) +bool FormController::checkFormComponentValidity( ::rtl::OUString& /* [out] */ _rFirstInvalidityExplanation, Reference< XControlModel >& /* [out] */ _rxFirstInvalidModel ) SAL_THROW(()) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::checkFormComponentValidity" ); 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!" ); + OSL_ENSURE( xControlEnumeration.is(), "FormController::checkFormComponentValidity: cannot enumerate the controls!" ); if ( !xControlEnumeration.is() ) // assume all valid return true; @@ -3340,7 +3603,7 @@ bool FmXFormController::checkFormComponentValidity( ::rtl::OUString& /* [out] */ continue; Reference< XValidator > xValidator( xValidatable->getValidator() ); - OSL_ENSURE( xValidator.is(), "FmXFormController::checkFormComponentValidity: invalid, but no validator?" ); + OSL_ENSURE( xValidator.is(), "FormController::checkFormComponentValidity: invalid, but no validator?" ); if ( !xValidator.is() ) // this violates the interface definition of css.form.validation.XValidatableFormComponent ... continue; @@ -3352,15 +3615,14 @@ bool FmXFormController::checkFormComponentValidity( ::rtl::OUString& /* [out] */ } catch( const Exception& ) { - OSL_ENSURE( sal_False, "FmXFormController::checkFormComponentValidity: caught an exception!" ); + DBG_UNHANDLED_EXCEPTION(); } return true; } //------------------------------------------------------------------------------ -Reference< XControl > FmXFormController::locateControl( const Reference< XControlModel >& _rxModel ) SAL_THROW(()) +Reference< XControl > FormController::locateControl( const Reference< XControlModel >& _rxModel ) SAL_THROW(()) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::locateControl" ); try { Sequence< Reference< XControl > > aControls( getControls() ); @@ -3369,18 +3631,18 @@ Reference< XControl > FmXFormController::locateControl( const Reference< XContro for ( ; pControls != pControlsEnd; ++pControls ) { - OSL_ENSURE( pControls->is(), "FmXFormController::locateControl: NULL-control?" ); + OSL_ENSURE( pControls->is(), "FormController::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!" ); + OSL_ENSURE( sal_False, "FormController::locateControl: did not find a control for this model!" ); } catch( const Exception& ) { - OSL_ENSURE( sal_False, "FmXFormController::locateControl: caught an exception!" ); + DBG_UNHANDLED_EXCEPTION(); } return NULL; } @@ -3448,12 +3710,11 @@ namespace // XRowSetApproveListener //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::approveRowChange(const RowChangeEvent& _rEvent) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::approveRowChange(const RowChangeEvent& _rEvent) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::approveRowChange" ); ::osl::ClearableMutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); ::cppu::OInterfaceIteratorHelper aIter(m_aRowSetApproveListeners); sal_Bool bValid = sal_True; if (aIter.hasMoreElements()) @@ -3486,7 +3747,7 @@ sal_Bool SAL_CALL FmXFormController::approveRowChange(const RowChangeEvent& _rEv if ( !lcl_shouldValidateRequiredFields_nothrow( _rEvent.Source ) ) return sal_True; - OSL_ENSURE( m_pColumnInfoCache.get(), "FmXFormController::approveRowChange: no column infos!" ); + OSL_ENSURE( m_pColumnInfoCache.get(), "FormController::approveRowChange: no column infos!" ); if ( !m_pColumnInfoCache.get() ) return sal_True; @@ -3537,11 +3798,11 @@ sal_Bool SAL_CALL FmXFormController::approveRowChange(const RowChangeEvent& _rEv } //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::approveCursorMove(const EventObject& event) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::approveCursorMove(const EventObject& event) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::approveCursorMove" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); + ::cppu::OInterfaceIteratorHelper aIter(m_aRowSetApproveListeners); if (aIter.hasMoreElements()) { @@ -3554,11 +3815,11 @@ sal_Bool SAL_CALL FmXFormController::approveCursorMove(const EventObject& event) } //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::approveRowSetChange(const EventObject& event) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::approveRowSetChange(const EventObject& event) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::approveRowSetChange" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); + ::cppu::OInterfaceIteratorHelper aIter(m_aRowSetApproveListeners); if (aIter.hasMoreElements()) { @@ -3572,30 +3833,29 @@ sal_Bool SAL_CALL FmXFormController::approveRowSetChange(const EventObject& even // XRowSetApproveBroadcaster //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addRowSetApproveListener(const Reference< XRowSetApproveListener > & _rxListener) throw( RuntimeException ) +void SAL_CALL FormController::addRowSetApproveListener(const Reference< XRowSetApproveListener > & _rxListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addRowSetApproveListener" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); + m_aRowSetApproveListeners.addInterface(_rxListener); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::removeRowSetApproveListener(const Reference< XRowSetApproveListener > & _rxListener) throw( RuntimeException ) +void SAL_CALL FormController::removeRowSetApproveListener(const Reference< XRowSetApproveListener > & _rxListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeRowSetApproveListener" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); + m_aRowSetApproveListeners.removeInterface(_rxListener); } // XErrorListener //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::errorOccured(const SQLErrorEvent& aEvent) throw( RuntimeException ) +void SAL_CALL FormController::errorOccured(const SQLErrorEvent& aEvent) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::errorOccured" ); ::osl::ClearableMutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); ::cppu::OInterfaceIteratorHelper aIter(m_aErrorListeners); if (aIter.hasMoreElements()) @@ -3613,61 +3873,62 @@ void SAL_CALL FmXFormController::errorOccured(const SQLErrorEvent& aEvent) throw // XErrorBroadcaster //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addSQLErrorListener(const Reference< XSQLErrorListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::addSQLErrorListener(const Reference< XSQLErrorListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addSQLErrorListener" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); + m_aErrorListeners.addInterface(aListener); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::removeSQLErrorListener(const Reference< XSQLErrorListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::removeSQLErrorListener(const Reference< XSQLErrorListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeSQLErrorListener" ); ::osl::MutexGuard aGuard( m_aMutex ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + impl_checkDisposed_throw(); + m_aErrorListeners.removeInterface(aListener); } // XDatabaseParameterBroadcaster2 //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addDatabaseParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::addDatabaseParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addDatabaseParameterListener" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + m_aParameterListeners.addInterface(aListener); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::removeDatabaseParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::removeDatabaseParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeDatabaseParameterListener" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + m_aParameterListeners.removeInterface(aListener); } // XDatabaseParameterBroadcaster //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::addParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addParameterListener" ); - FmXFormController::addDatabaseParameterListener( aListener ); + FormController::addDatabaseParameterListener( aListener ); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::removeParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::removeParameterListener(const Reference< XDatabaseParameterListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeParameterListener" ); - FmXFormController::removeDatabaseParameterListener( aListener ); + FormController::removeDatabaseParameterListener( aListener ); } // XDatabaseParameterListener //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::approveParameter(const DatabaseParameterEvent& aEvent) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::approveParameter(const DatabaseParameterEvent& aEvent) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::approveParameter" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::vos::OGuard aSolarGuard(Application::GetSolarMutex()); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); ::cppu::OInterfaceIteratorHelper aIter(m_aParameterListeners); if (aIter.hasMoreElements()) @@ -3698,10 +3959,7 @@ sal_Bool SAL_CALL FmXFormController::approveParameter(const DatabaseParameterEve pParamRequest->addContinuation(pAbort); // handle the request - { - ::vos::OGuard aGuard(Application::GetSolarMutex()); - m_xInteractionHandler->handle(xParamRequest); - } + m_xInteractionHandler->handle(xParamRequest); if (!pParamValues->wasSelected()) // canceled @@ -3711,7 +3969,7 @@ sal_Bool SAL_CALL FmXFormController::approveParameter(const DatabaseParameterEve Sequence< PropertyValue > aFinalValues = pParamValues->getValues(); if (aFinalValues.getLength() != aRequest.Parameters->getCount()) { - DBG_ERROR("FmXFormController::approveParameter: the InteractionHandler returned nonsense!"); + DBG_ERROR("FormController::approveParameter: the InteractionHandler returned nonsense!"); return sal_False; } const PropertyValue* pFinalValues = aFinalValues.getConstArray(); @@ -3724,19 +3982,19 @@ sal_Bool SAL_CALL FmXFormController::approveParameter(const DatabaseParameterEve #ifdef DBG_UTIL ::rtl::OUString sName; xParam->getPropertyValue(FM_PROP_NAME) >>= sName; - DBG_ASSERT(sName.equals(pFinalValues->Name), "FmXFormController::approveParameter: suspicious value names!"); + DBG_ASSERT(sName.equals(pFinalValues->Name), "FormController::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!"); + DBG_ERROR("FormController::approveParameter: setting one of the properties failed!"); } } } } catch(Exception&) { - DBG_ERROR("FmXFormController::approveParameter: caught an Exception (tried to let the InteractionHandler handle it)!"); + DBG_UNHANDLED_EXCEPTION(); } } return sal_True; @@ -3744,27 +4002,29 @@ sal_Bool SAL_CALL FmXFormController::approveParameter(const DatabaseParameterEve // XConfirmDeleteBroadcaster //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addConfirmDeleteListener(const Reference< XConfirmDeleteListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::addConfirmDeleteListener(const Reference< XConfirmDeleteListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addConfirmDeleteListener" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + m_aDeleteListeners.addInterface(aListener); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::removeConfirmDeleteListener(const Reference< XConfirmDeleteListener > & aListener) throw( RuntimeException ) +void SAL_CALL FormController::removeConfirmDeleteListener(const Reference< XConfirmDeleteListener > & aListener) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeConfirmDeleteListener" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); + m_aDeleteListeners.removeInterface(aListener); } // XConfirmDeleteListener //------------------------------------------------------------------------------ -sal_Bool SAL_CALL FmXFormController::confirmDelete(const RowChangeEvent& aEvent) throw( RuntimeException ) +sal_Bool SAL_CALL FormController::confirmDelete(const RowChangeEvent& aEvent) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::confirmDelete" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + ::osl::MutexGuard aGuard( m_aMutex ); + impl_checkDisposed_throw(); ::cppu::OInterfaceIteratorHelper aIter(m_aDeleteListeners); if (aIter.hasMoreElements()) @@ -3773,32 +4033,62 @@ sal_Bool SAL_CALL FmXFormController::confirmDelete(const RowChangeEvent& aEvent) aEvt.Source = *this; return ((XConfirmDeleteListener*)aIter.next())->confirmDelete(aEvt); } + // default handling: instantiate an interaction handler and let it handle the request + + String sTitle; + sal_Int32 nLength = aEvent.Rows; + if ( nLength > 1 ) + { + sTitle = SVX_RES( RID_STR_DELETECONFIRM_RECORDS ); + sTitle.SearchAndReplace( '#', String::CreateFromInt32( nLength ) ); + } else + sTitle = SVX_RES( RID_STR_DELETECONFIRM_RECORD ); + + try { - // default handling - UniString aTitle; - sal_Int32 nLength = aEvent.Rows; - if (nLength > 1) - { - aTitle = SVX_RES(RID_STR_DELETECONFIRM_RECORDS); - aTitle.SearchAndReplace('#', String::CreateFromInt32(nLength)); - } - else - aTitle = SVX_RES(RID_STR_DELETECONFIRM_RECORD); + if ( !ensureInteractionHandler() ) + return sal_False; + + // two continuations allowed: Yes and No + OInteractionApprove* pApprove = new OInteractionApprove; + OInteractionDisapprove* pDisapprove = new OInteractionDisapprove; - ConfirmDeleteDialog aDlg(getDialogParentWindow(), aTitle); - return RET_YES == aDlg.Execute(); + // the request + SQLWarning aWarning; + aWarning.Message = sTitle; + SQLWarning aDetails; + aDetails.Message = String( SVX_RES( RID_STR_DELETECONFIRM ) ); + aWarning.NextException <<= aDetails; + + OInteractionRequest* pRequest = new OInteractionRequest( makeAny( aWarning ) ); + Reference< XInteractionRequest > xRequest( pRequest ); + + // some knittings + pRequest->addContinuation( pApprove ); + pRequest->addContinuation( pDisapprove ); + + // handle the request + m_xInteractionHandler->handle( xRequest ); + + if ( pApprove->wasSelected() ) + return sal_True; + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); } + + return sal_False; } //------------------------------------------------------------------------------ -void FmXFormController::invalidateFeatures( const ::std::vector< sal_Int32 >& _rFeatures ) +void SAL_CALL FormController::invalidateFeatures( const Sequence< ::sal_Int16 >& _Features ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::invalidateFeatures" ); ::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() ) + ::std::copy( _Features.getConstArray(), _Features.getConstArray() + _Features.getLength(), + ::std::insert_iterator< ::std::set< sal_Int16 > >( m_aInvalidFeatures, m_aInvalidFeatures.begin() ) ); // ... we will do the real invalidation asynchronously @@ -3807,13 +4097,30 @@ void FmXFormController::invalidateFeatures( const ::std::vector< sal_Int32 >& _r } //------------------------------------------------------------------------------ +void SAL_CALL FormController::invalidateAllFeatures( ) throw (RuntimeException) +{ + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + Sequence< sal_Int16 > aInterceptedFeatures( m_aFeatureDispatchers.size() ); + ::std::transform( + m_aFeatureDispatchers.begin(), + m_aFeatureDispatchers.end(), + aInterceptedFeatures.getArray(), + ::std::select1st< DispatcherContainer::value_type >() + ); + + aGuard.clear(); + if ( aInterceptedFeatures.getLength() ) + invalidateFeatures( aInterceptedFeatures ); +} + +//------------------------------------------------------------------------------ Reference< XDispatch > -FmXFormController::interceptedQueryDispatch(sal_uInt16 /*_nId*/, const URL& aURL, +FormController::interceptedQueryDispatch( const URL& aURL, const ::rtl::OUString& /*aTargetFrameName*/, sal_Int32 /*nSearchFlags*/) throw( RuntimeException ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::interceptedQueryDispatch" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); Reference< XDispatch > xReturn; // dispatches handled by ourself if ( ( aURL.Complete == FMURL_CONFIRM_DELETION ) @@ -3824,22 +4131,23 @@ FmXFormController::interceptedQueryDispatch(sal_uInt16 /*_nId*/, const URL& aURL xReturn = static_cast< XDispatch* >( this ); // dispatches of FormSlot-URLs we have to translate - if ( !xReturn.is() && m_aControllerFeatures.isAssigned() ) + if ( !xReturn.is() && m_xFormOperations.is() ) { // find the slot id which corresponds to the URL - sal_Int32 nFeatureId = ::svx::FeatureSlotTranslation::getControllerFeatureSlotIdForURL( aURL.Main ); - if ( nFeatureId > 0 ) + sal_Int32 nFeatureSlotId = ::svx::FeatureSlotTranslation::getControllerFeatureSlotIdForURL( aURL.Main ); + sal_Int16 nFormFeature = ( nFeatureSlotId != -1 ) ? ::svx::FeatureSlotTranslation::getFormFeatureForSlotId( nFeatureSlotId ) : -1; + if ( nFormFeature > 0 ) { // get the dispatcher for this feature, create if necessary - DispatcherContainer::const_iterator aDispatcherPos = m_aFeatureDispatchers.find( nFeatureId ); + DispatcherContainer::const_iterator aDispatcherPos = m_aFeatureDispatchers.find( nFormFeature ); if ( aDispatcherPos == m_aFeatureDispatchers.end() ) { aDispatcherPos = m_aFeatureDispatchers.insert( - DispatcherContainer::value_type( nFeatureId, new ::svx::OSingleFeatureDispatcher( aURL, nFeatureId, *m_aControllerFeatures, m_aMutex ) ) + DispatcherContainer::value_type( nFormFeature, new ::svx::OSingleFeatureDispatcher( aURL, nFormFeature, m_xFormOperations, m_aMutex ) ) ).first; } - OSL_ENSURE( aDispatcherPos->second.is(), "FmXFormController::interceptedQueryDispatch: should have a dispatcher by now!" ); + OSL_ENSURE( aDispatcherPos->second.is(), "FormController::interceptedQueryDispatch: should have a dispatcher by now!" ); return aDispatcherPos->second; } } @@ -3849,12 +4157,11 @@ FmXFormController::interceptedQueryDispatch(sal_uInt16 /*_nId*/, const URL& aURL } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::dispatch( const URL& _rURL, const Sequence< PropertyValue >& _rArgs ) throw (RuntimeException) +void SAL_CALL FormController::dispatch( const URL& _rURL, const Sequence< PropertyValue >& _rArgs ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::dispatch" ); if ( _rArgs.getLength() != 1 ) { - DBG_ERROR( "FmXFormController::dispatch: no arguments -> no dispatch!" ); + DBG_ERROR( "FormController::dispatch: no arguments -> no dispatch!" ); return; } @@ -3869,18 +4176,17 @@ void SAL_CALL FmXFormController::dispatch( const URL& _rURL, const Sequence< Pro if ( _rURL.Complete == FMURL_CONFIRM_DELETION ) { - DBG_ERROR( "FmXFormController::dispatch: How do you expect me to return something via this call?" ); + DBG_ERROR( "FormController::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!" ); + DBG_ERROR( "FormController::dispatch: unknown URL!" ); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::addStatusListener( const Reference< XStatusListener >& _rxListener, const URL& _rURL ) throw (RuntimeException) +void SAL_CALL FormController::addStatusListener( const Reference< XStatusListener >& _rxListener, const URL& _rURL ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::addStatusListener" ); if (_rURL.Complete == FMURL_CONFIRM_DELETION) { if (_rxListener.is()) @@ -3893,23 +4199,33 @@ void SAL_CALL FmXFormController::addStatusListener( const Reference< XStatusList } } else - OSL_ENSURE(sal_False, "FmXFormController::addStatusListener: invalid (unsupported) URL!"); + OSL_ENSURE(sal_False, "FormController::addStatusListener: invalid (unsupported) URL!"); +} + +//------------------------------------------------------------------------------ +Reference< XInterface > SAL_CALL FormController::getParent() throw( RuntimeException ) +{ + return m_xParent; +} + +//------------------------------------------------------------------------------ +void SAL_CALL FormController::setParent( const Reference< XInterface >& Parent) throw( NoSupportException, RuntimeException ) +{ + m_xParent = Parent; } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::removeStatusListener( const Reference< XStatusListener >& /*_rxListener*/, const URL& _rURL ) throw (RuntimeException) +void SAL_CALL FormController::removeStatusListener( const Reference< XStatusListener >& /*_rxListener*/, const URL& _rURL ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::removeStatusListener" ); (void)_rURL; - OSL_ENSURE(_rURL.Complete == FMURL_CONFIRM_DELETION, "FmXFormController::removeStatusListener: invalid (unsupported) URL!"); + OSL_ENSURE(_rURL.Complete == FMURL_CONFIRM_DELETION, "FormController::removeStatusListener: invalid (unsupported) URL!"); // we never really added the listener, so we don't need to remove it } //------------------------------------------------------------------------------ -Reference< XDispatchProviderInterceptor > FmXFormController::createInterceptor(const Reference< XDispatchProviderInterception > & _xInterception) +Reference< XDispatchProviderInterceptor > FormController::createInterceptor(const Reference< XDispatchProviderInterception > & _xInterception) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::createInterceptor" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); #ifdef DBG_UTIL // check if we already have a interceptor for the given object for ( ConstInterceptorsIterator aIter = m_aControlDispatchInterceptors.begin(); @@ -3918,49 +4234,43 @@ Reference< XDispatchProviderInterceptor > FmXFormController::createInterceptor( ) { if ((*aIter)->getIntercepted() == _xInterception) - DBG_ERROR("FmXFormController::createInterceptor : we already do intercept this objects dispatches !"); + DBG_ERROR("FormController::createInterceptor : we already do intercept this objects dispatches !"); } #endif - ::rtl::OUString sInterceptorScheme(RTL_CONSTASCII_USTRINGPARAM("*")); - FmXDispatchInterceptorImpl* pInterceptor = new FmXDispatchInterceptorImpl(_xInterception, this, 0, Sequence< ::rtl::OUString >(&sInterceptorScheme, 1)); + DispatchInterceptionMultiplexer* pInterceptor = new DispatchInterceptionMultiplexer( _xInterception, this ); pInterceptor->acquire(); - m_aControlDispatchInterceptors.insert(m_aControlDispatchInterceptors.end(), pInterceptor); + m_aControlDispatchInterceptors.insert( m_aControlDispatchInterceptors.end(), pInterceptor ); - return (XDispatchProviderInterceptor*)pInterceptor; + return pInterceptor; } //------------------------------------------------------------------------------ -bool FmXFormController::ensureInteractionHandler() +bool FormController::ensureInteractionHandler() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "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!" ); + m_xInteractionHandler.set( m_aContext.createComponent( (::rtl::OUString)SRV_SDB_INTERACTION_HANDLER ), UNO_QUERY ); + OSL_ENSURE( m_xInteractionHandler.is(), "FormController::ensureInteractionHandler: could not create an interaction handler!" ); return m_xInteractionHandler.is(); } //------------------------------------------------------------------------------ -void SAL_CALL FmXFormController::handle( const Reference< XInteractionRequest >& _rRequest ) throw (RuntimeException) +void SAL_CALL FormController::handle( const Reference< XInteractionRequest >& _rRequest ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::handle" ); if ( !ensureInteractionHandler() ) return; m_xInteractionHandler->handle( _rRequest ); } //------------------------------------------------------------------------------ -void FmXFormController::deleteInterceptor(const Reference< XDispatchProviderInterception > & _xInterception) +void FormController::deleteInterceptor(const Reference< XDispatchProviderInterception > & _xInterception) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::deleteInterceptor" ); - OSL_ENSURE( !impl_isDisposed_nofail(), "FmXFormController: already disposed!" ); + OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" ); // search the interceptor responsible for the given object InterceptorsIterator aIter; for ( aIter = m_aControlDispatchInterceptors.begin(); @@ -3977,7 +4287,7 @@ void FmXFormController::deleteInterceptor(const Reference< XDispatchProviderInte } // log off the interception from it's interception object - FmXDispatchInterceptorImpl* pInterceptorImpl = *aIter; + DispatchInterceptionMultiplexer* pInterceptorImpl = *aIter; pInterceptorImpl->dispose(); pInterceptorImpl->release(); @@ -3986,35 +4296,22 @@ void FmXFormController::deleteInterceptor(const Reference< XDispatchProviderInte } //-------------------------------------------------------------------- -void SAL_CALL FmXFormController::initialize( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException) +void FormController::implInvalidateCurrentControlDependentFeatures() { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::initialize" ); - DBG_ASSERT( !m_xInteractionHandler.is(), "FmXFormController::initialize: already initialized!" ); - // currently, we only initialize our interaction handler here, so it's sufficient to assert this + Sequence< sal_Int16 > aCurrentControlDependentFeatures(4); - ::comphelper::NamedValueCollection aArgs( aArguments ); - m_xInteractionHandler = aArgs.getOrDefault( "InteractionHandler", m_xInteractionHandler ); -} - -//-------------------------------------------------------------------- -void FmXFormController::implInvalidateCurrentControlDependentFeatures() -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::implInvalidateCurrentControlDependentFeatures" ); - ::std::vector< sal_Int32 > aCurrentControlDependentFeatures; - - aCurrentControlDependentFeatures.push_back( SID_FM_SORTUP ); - aCurrentControlDependentFeatures.push_back( SID_FM_SORTDOWN ); - aCurrentControlDependentFeatures.push_back( SID_FM_AUTOFILTER ); - aCurrentControlDependentFeatures.push_back( SID_FM_REFRESH_FORM_CONTROL ); + aCurrentControlDependentFeatures[0] = FormFeature::SortAscending; + aCurrentControlDependentFeatures[1] = FormFeature::SortDescending; + aCurrentControlDependentFeatures[2] = FormFeature::AutoFilter; + aCurrentControlDependentFeatures[3] = FormFeature::RefreshCurrentControl; - if ( m_pView && m_pView->GetFormShell() && m_pView->GetFormShell()->GetImpl() ) - m_pView->GetFormShell()->GetImpl()->invalidateFeatures( aCurrentControlDependentFeatures ); invalidateFeatures( aCurrentControlDependentFeatures ); } //-------------------------------------------------------------------- -void SAL_CALL FmXFormController::columnChanged( const EventObject& /*_event*/ ) throw (RuntimeException) +void SAL_CALL FormController::columnChanged( const EventObject& /*_event*/ ) throw (RuntimeException) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmXFormController::columnChanged" ); implInvalidateCurrentControlDependentFeatures(); } + +} // namespace svxform diff --git a/svx/source/form/formcontrolling.cxx b/svx/source/form/formcontrolling.cxx index 104d2f423eb5..63f2ddf69d8e 100644 --- a/svx/source/form/formcontrolling.cxx +++ b/svx/source/form/formcontrolling.cxx @@ -33,7 +33,7 @@ #include "formcontrolling.hxx" #include "fmurl.hxx" -#include <svx/svxids.hrc> +#include "svx/svxids.hrc" #include "fmprop.hrc" #include "fmtools.hxx" @@ -60,7 +60,7 @@ namespace svx /** === begin UNO using === **/ using ::com::sun::star::uno::Reference; using ::com::sun::star::lang::XMultiServiceFactory; - using ::com::sun::star::form::XFormController; + using ::com::sun::star::form::runtime::XFormController; using ::com::sun::star::form::XForm; using ::com::sun::star::form::runtime::FormOperations; using ::com::sun::star::uno::Exception; diff --git a/svx/source/form/formdispatchinterceptor.cxx b/svx/source/form/formdispatchinterceptor.cxx new file mode 100644 index 000000000000..903d27d6e650 --- /dev/null +++ b/svx/source/form/formdispatchinterceptor.cxx @@ -0,0 +1,213 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* <http://www.openoffice.org/license.html> +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" + +#include "formdispatchinterceptor.hxx" + +/** === begin UNO includes === **/ +/** === end UNO includes === **/ + +#include <tools/debug.hxx> + +//........................................................................ +namespace svxform +{ +//........................................................................ + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::frame::XDispatchProviderInterception; + using ::com::sun::star::frame::XDispatchProviderInterceptor; + using ::com::sun::star::lang::XComponent; + using ::com::sun::star::util::URL; + using ::com::sun::star::frame::XDispatch; + using ::com::sun::star::frame::DispatchDescriptor; + using ::com::sun::star::frame::XDispatchProvider; + using ::com::sun::star::lang::EventObject; + /** === end UNO using === **/ + + //======================================================================== + //= DispatchInterceptionMultiplexer + //======================================================================== + + DBG_NAME(DispatchInterceptionMultiplexer); + //------------------------------------------------------------------------ + DispatchInterceptionMultiplexer::DispatchInterceptionMultiplexer( + const Reference< XDispatchProviderInterception >& _rxToIntercept, DispatchInterceptor* _pMaster ) + :DispatchInterceptionMultiplexer_BASE(_pMaster && _pMaster->getInterceptorMutex() ? *_pMaster->getInterceptorMutex() : m_aFallback) + ,m_aFallback() + ,m_pMutex( _pMaster && _pMaster->getInterceptorMutex() ? _pMaster->getInterceptorMutex() : &m_aFallback ) + ,m_xIntercepted(_rxToIntercept) + ,m_bListening(sal_False) + ,m_pMaster(_pMaster) + { + DBG_CTOR(DispatchInterceptionMultiplexer,NULL); + + ::osl::MutexGuard aGuard( *m_pMutex ); + ::comphelper::increment(m_refCount); + if (_rxToIntercept.is()) + { + _rxToIntercept->registerDispatchProviderInterceptor((XDispatchProviderInterceptor*)this); + // this should make us the top-level dispatch-provider for the component, via a call to our + // setDispatchProvider we should have got an fallback for requests we (i.e. our master) cannot fullfill + Reference< XComponent> xInterceptedComponent(_rxToIntercept, UNO_QUERY); + if (xInterceptedComponent.is()) + { + xInterceptedComponent->addEventListener(this); + m_bListening = sal_True; + } + } + ::comphelper::decrement(m_refCount); + } + + //------------------------------------------------------------------------ + DispatchInterceptionMultiplexer::~DispatchInterceptionMultiplexer() + { + if (!rBHelper.bDisposed) + dispose(); + + DBG_DTOR(DispatchInterceptionMultiplexer,NULL); + } + + //------------------------------------------------------------------------------ + Reference< XDispatch > SAL_CALL DispatchInterceptionMultiplexer::queryDispatch( const URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags ) throw(RuntimeException) + { + ::osl::MutexGuard aGuard( *m_pMutex ); + Reference< XDispatch> xResult; + // ask our 'real' interceptor + if (m_pMaster) + xResult = m_pMaster->interceptedQueryDispatch( aURL, aTargetFrameName, nSearchFlags); + + // ask our slave provider + if (!xResult.is() && m_xSlaveDispatcher.is()) + xResult = m_xSlaveDispatcher->queryDispatch(aURL, aTargetFrameName, nSearchFlags); + + return xResult; + } + + //------------------------------------------------------------------------------ + Sequence< Reference< XDispatch > > SAL_CALL + DispatchInterceptionMultiplexer::queryDispatches( const Sequence< DispatchDescriptor >& aDescripts ) throw(RuntimeException) + { + ::osl::MutexGuard aGuard( *m_pMutex ); + Sequence< Reference< XDispatch> > aReturn(aDescripts.getLength()); + Reference< XDispatch>* pReturn = aReturn.getArray(); + const DispatchDescriptor* pDescripts = aDescripts.getConstArray(); + for (sal_Int16 i=0; i<aDescripts.getLength(); ++i, ++pReturn, ++pDescripts) + { + *pReturn = queryDispatch(pDescripts->FeatureURL, pDescripts->FrameName, pDescripts->SearchFlags); + } + return aReturn; + } + + //------------------------------------------------------------------------------ + Reference< XDispatchProvider > SAL_CALL DispatchInterceptionMultiplexer::getSlaveDispatchProvider( ) throw(RuntimeException) + { + ::osl::MutexGuard aGuard( *m_pMutex ); + return m_xSlaveDispatcher; + } + + //------------------------------------------------------------------------------ + void SAL_CALL DispatchInterceptionMultiplexer::setSlaveDispatchProvider(const Reference< XDispatchProvider>& xNewDispatchProvider) throw( RuntimeException ) + { + ::osl::MutexGuard aGuard( *m_pMutex ); + m_xSlaveDispatcher = xNewDispatchProvider; + } + + //------------------------------------------------------------------------------ + Reference< XDispatchProvider> SAL_CALL DispatchInterceptionMultiplexer::getMasterDispatchProvider(void) throw( RuntimeException ) + { + ::osl::MutexGuard aGuard( *m_pMutex ); + return m_xMasterDispatcher; + } + + //------------------------------------------------------------------------------ + void SAL_CALL DispatchInterceptionMultiplexer::setMasterDispatchProvider(const Reference< XDispatchProvider>& xNewSupplier) throw( RuntimeException ) + { + ::osl::MutexGuard aGuard( *m_pMutex ); + m_xMasterDispatcher = xNewSupplier; + } + + //------------------------------------------------------------------------------ + void SAL_CALL DispatchInterceptionMultiplexer::disposing(const EventObject& Source) throw( RuntimeException ) + { + if (m_bListening) + { + Reference< XDispatchProviderInterception > xIntercepted(m_xIntercepted.get(), UNO_QUERY); + if (Source.Source == xIntercepted) + ImplDetach(); + } + } + + //------------------------------------------------------------------------------ + void DispatchInterceptionMultiplexer::ImplDetach() + { + ::osl::MutexGuard aGuard( *m_pMutex ); + OSL_ENSURE(m_bListening, "DispatchInterceptionMultiplexer::ImplDetach: invalid call!"); + + // deregister ourself from the interception component + Reference< XDispatchProviderInterception > xIntercepted(m_xIntercepted.get(), UNO_QUERY); + if (xIntercepted.is()) + xIntercepted->releaseDispatchProviderInterceptor(static_cast<XDispatchProviderInterceptor*>(this)); + + // m_xIntercepted = Reference< XDispatchProviderInterception >(); + // Don't reset m_xIntercepted: It may be needed by our owner to check for which object we were + // responsible. As we hold the object with a weak reference only, this should be no problem. + // 88936 - 23.07.2001 - frank.schoenheit@sun.com + m_pMaster = NULL; + m_pMutex = &m_aFallback; + m_bListening = sal_False; + } + + //------------------------------------------------------------------------------ + void DispatchInterceptionMultiplexer::disposing() + { + // remove ourself as event listener from the interception component + if (m_bListening) + { + Reference< XComponent> xInterceptedComponent(m_xIntercepted.get(), UNO_QUERY); + if (xInterceptedComponent.is()) + xInterceptedComponent->removeEventListener(static_cast<XEventListener*>(this)); + + // detach from the interception component + ImplDetach(); + } + } + +//........................................................................ +} // namespace svxform +//........................................................................ diff --git a/svx/source/form/fmdispatch.cxx b/svx/source/form/formfeaturedispatcher.cxx index 154063409bef..82ca17812562 100644 --- a/svx/source/form/fmdispatch.cxx +++ b/svx/source/form/formfeaturedispatcher.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmdispatch.cxx,v $ - * $Revision: 1.7 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -30,8 +27,11 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" -#include "fmdispatch.hxx" -#include "formcontrolling.hxx" + +#include "formfeaturedispatcher.hxx" + +#include <comphelper/namedvaluecollection.hxx> +#include <tools/diagnose_ex.h> //........................................................................ namespace svx @@ -49,13 +49,13 @@ namespace svx //= OSingleFeatureDispatcher //==================================================================== //-------------------------------------------------------------------- - OSingleFeatureDispatcher::OSingleFeatureDispatcher( const URL& _rFeatureURL, sal_Int32 _nFeatureId, - const FormControllerHelper& _rController, ::osl::Mutex& _rMutex ) + OSingleFeatureDispatcher::OSingleFeatureDispatcher( const URL& _rFeatureURL, const sal_Int16 _nFormFeature, + const Reference< XFormOperations >& _rxFormOperations, ::osl::Mutex& _rMutex ) :m_rMutex( _rMutex ) ,m_aStatusListeners( _rMutex ) - ,m_rController( _rController ) + ,m_xFormOperations( _rxFormOperations ) ,m_aFeatureURL( _rFeatureURL ) - ,m_nFeatureId( _nFeatureId ) + ,m_nFormFeature( _nFormFeature ) ,m_bLastKnownEnabled( sal_False ) ,m_bDisposed( sal_False ) { @@ -82,10 +82,9 @@ namespace svx //-------------------------------------------------------------------- void OSingleFeatureDispatcher::getUnoState( FeatureStateEvent& /* [out] */ _rState ) const { - FeatureState aState; _rState.Source = *const_cast< OSingleFeatureDispatcher* >( this ); - m_rController.getState( m_nFeatureId, aState ); + FeatureState aState( m_xFormOperations->getState( m_nFormFeature ) ); _rState.FeatureURL = m_aFeatureURL; _rState.IsEnabled = aState.Enabled; @@ -161,21 +160,34 @@ namespace svx OSL_ENSURE( _rURL.Complete == m_aFeatureURL.Complete, "OSingleFeatureDispatcher::dispatch: not responsible for this URL!" ); (void)_rURL; - if ( m_rController.isEnabled( m_nFeatureId ) ) - { - // release our mutex before executing the slot? - sal_Int32 nFeatureId( m_nFeatureId ); - aGuard.clear(); + if ( !m_xFormOperations->isEnabled( m_nFormFeature ) ) + return; + // release our mutex before executing the command + sal_Int16 nFormFeature( m_nFormFeature ); + Reference< XFormOperations > xFormOperations( m_xFormOperations ); + aGuard.clear(); + + try + { if ( !_rArguments.getLength() ) { - m_rController.execute( nFeatureId ); + xFormOperations->execute( nFormFeature ); } else { // at the moment we only support one parameter - m_rController.execute( nFeatureId, _rArguments[0].Name, _rArguments[0].Value ); + ::comphelper::NamedValueCollection aArgs( _rArguments ); + xFormOperations->executeWithArguments( nFormFeature, aArgs.getNamedValues() ); } } + catch( const RuntimeException& ) + { + throw; + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } } //-------------------------------------------------------------------- diff --git a/svx/source/form/legacyformcontroller.cxx b/svx/source/form/legacyformcontroller.cxx new file mode 100644 index 000000000000..47805a8d6ee1 --- /dev/null +++ b/svx/source/form/legacyformcontroller.cxx @@ -0,0 +1,225 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* <http://www.openoffice.org/license.html> +* for a copy of the LGPLv3 License. +************************************************************************/ +
+// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" + +#include "fmservs.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/form/XFormController.hpp> +#include <com/sun/star/form/runtime/XFormController.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +/** === end UNO includes === **/ + +#include <cppuhelper/implbase2.hxx> + +//........................................................................ +namespace svxform +{ +//........................................................................ + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::lang::XMultiServiceFactory; + using ::com::sun::star::awt::XControl; + using ::com::sun::star::awt::XTabControllerModel; + using ::com::sun::star::awt::XControlContainer; + using ::com::sun::star::lang::XServiceInfo; + /** === end UNO using === **/ + + using namespace ::com::sun::star; + + //==================================================================== + //= LegacyFormController + //==================================================================== + typedef ::cppu::WeakImplHelper2 < form::XFormController + , XServiceInfo + > LegacyFormController_Base; + /** is an implementation of the legacy form controller service, namely css.form.FormController, supporting the + css.form.XFormController interface. + + This legacy API is superseded by css.form.runtime.(X)FormController, and though we migrated all OOo-internal + usage of this old API, their might be clients external to OOo still using it (though this is rather unlikely). + */ + class LegacyFormController : public LegacyFormController_Base + { + public: + static Reference< XInterface > Create( const Reference< XMultiServiceFactory >& _rxFactory ) + { + return *( new LegacyFormController( _rxFactory ) ); + } + + protected: + LegacyFormController( const Reference< XMultiServiceFactory >& _rxFactory ) + :m_xDelegator( _rxFactory->createInstance( FM_FORM_CONTROLLER ), UNO_QUERY_THROW ) + { + } + + // form::XFormController + virtual Reference< XControl > SAL_CALL getCurrentControl( ) throw (RuntimeException); + virtual void SAL_CALL addActivateListener( const Reference< form::XFormControllerListener >& l ) throw (RuntimeException); + virtual void SAL_CALL removeActivateListener( const Reference< form::XFormControllerListener >& l ) throw (RuntimeException); + + // awt::XTabController + virtual void SAL_CALL setModel( const Reference< XTabControllerModel >& Model ) throw (RuntimeException); + virtual Reference< XTabControllerModel > SAL_CALL getModel( ) throw (RuntimeException); + virtual void SAL_CALL setContainer( const Reference< XControlContainer >& Container ) throw (RuntimeException); + virtual Reference< XControlContainer > SAL_CALL getContainer( ) throw (RuntimeException); + virtual Sequence< Reference< XControl > > SAL_CALL getControls( ) throw (RuntimeException); + virtual void SAL_CALL autoTabOrder( ) throw (RuntimeException); + virtual void SAL_CALL activateTabOrder( ) throw (RuntimeException); + virtual void SAL_CALL activateFirst( ) throw (RuntimeException); + virtual void SAL_CALL activateLast( ) throw (RuntimeException); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException); + virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); + + private: + const Reference< form::runtime::XFormController > m_xDelegator; + }; + + //-------------------------------------------------------------------- + Reference< XControl > SAL_CALL LegacyFormController::getCurrentControl( ) throw (RuntimeException) + { + return m_xDelegator->getCurrentControl(); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::addActivateListener( const Reference< form::XFormControllerListener >& _listener ) throw (RuntimeException) + { + m_xDelegator->addActivateListener( _listener ); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::removeActivateListener( const Reference< form::XFormControllerListener >& _listener ) throw (RuntimeException) + { + m_xDelegator->removeActivateListener( _listener ); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::setModel( const Reference< XTabControllerModel >& _model ) throw (RuntimeException) + { + m_xDelegator->setModel( _model ); + } + + //-------------------------------------------------------------------- + Reference< XTabControllerModel > SAL_CALL LegacyFormController::getModel( ) throw (RuntimeException) + { + return m_xDelegator->getModel(); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::setContainer( const Reference< XControlContainer >& _container ) throw (RuntimeException) + { + m_xDelegator->setContainer( _container ); + } + + //-------------------------------------------------------------------- + Reference< XControlContainer > SAL_CALL LegacyFormController::getContainer( ) throw (RuntimeException) + { + return m_xDelegator->getContainer(); + } + + //-------------------------------------------------------------------- + Sequence< Reference< XControl > > SAL_CALL LegacyFormController::getControls( ) throw (RuntimeException) + { + return m_xDelegator->getControls(); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::autoTabOrder( ) throw (RuntimeException) + { + m_xDelegator->autoTabOrder(); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::activateTabOrder( ) throw (RuntimeException) + { + m_xDelegator->activateTabOrder(); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::activateFirst( ) throw (RuntimeException) + { + m_xDelegator->activateFirst(); + } + + //-------------------------------------------------------------------- + void SAL_CALL LegacyFormController::activateLast( ) throw (RuntimeException) + { + m_xDelegator->activateLast(); + } + + //-------------------------------------------------------------------- + ::rtl::OUString SAL_CALL LegacyFormController::getImplementationName( ) throw (RuntimeException) + { + return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "org.openoffice.comp.svx.LegacyFormController" ) ); + } + + //-------------------------------------------------------------------- + ::sal_Bool SAL_CALL LegacyFormController::supportsService( const ::rtl::OUString& _serviceName ) throw (RuntimeException) + { + Sequence< ::rtl::OUString > aServices( getSupportedServiceNames() ); + const ::rtl::OUString* pServices = aServices.getConstArray(); + for ( sal_Int32 i = 0; i < aServices.getLength(); ++i, ++pServices ) + if( pServices->equals( _serviceName ) ) + return sal_True; + return sal_False; + } + + //-------------------------------------------------------------------- + Sequence< ::rtl::OUString > SAL_CALL LegacyFormController::getSupportedServiceNames( ) throw (RuntimeException) + { + Sequence< ::rtl::OUString > aServices(2); + aServices.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.FormController" ) ); + aServices.getArray()[1] = ::rtl::OUString::createFromAscii("com.sun.star.awt.control.TabController"); + return aServices; + } + +//........................................................................ +} // namespace svxform +//........................................................................ + +//------------------------------------------------------------------ +::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL + LegacyFormController_NewInstance_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & _rxORB ) +{ + return ::svxform::LegacyFormController::Create( _rxORB ); +} + diff --git a/svx/source/form/makefile.mk b/svx/source/form/makefile.mk index b649be94d106..71002531544c 100644 --- a/svx/source/form/makefile.mk +++ b/svx/source/form/makefile.mk @@ -65,7 +65,6 @@ LIB1OBJFILES= \ $(SLO)$/fmtextcontrolshell.obj \ $(SLO)$/ParseContext.obj \ $(SLO)$/typeconversionclient.obj \ - $(SLO)$/confirmdelete.obj \ $(SLO)$/dbtoolsclient.obj \ $(SLO)$/sqlparserclient.obj \ $(SLO)$/dataaccessdescriptor.obj \ @@ -75,7 +74,7 @@ LIB1OBJFILES= \ $(SLO)$/navigatortree.obj \ $(SLO)$/navigatortreemodel.obj \ $(SLO)$/fmexpl.obj \ - $(SLO)$/fmctrler.obj \ + $(SLO)$/formcontroller.obj \ $(SLO)$/fmpgeimp.obj \ $(SLO)$/fmvwimp.obj \ $(SLO)$/fmdpage.obj \ @@ -91,14 +90,16 @@ LIB1OBJFILES= \ $(SLO)$/fmview.obj \ $(SLO)$/sdbdatacolumn.obj \ $(SLO)$/formcontrolling.obj \ - $(SLO)$/fmdispatch.obj \ + $(SLO)$/formfeaturedispatcher.obj \ + $(SLO)$/formdispatchinterceptor.obj \ $(SLO)$/datanavi.obj \ $(SLO)$/xfm_addcondition.obj \ $(SLO)$/datalistener.obj \ $(SLO)$/fmscriptingenv.obj \ $(SLO)$/stringlistresource.obj \ $(SLO)$/delayedevent.obj \ - $(SLO)$/formcontrolfactory.obj + $(SLO)$/formcontrolfactory.obj \ + $(SLO)$/legacyformcontroller.obj LIB2TARGET= $(SLB)$/$(TARGET).lib LIB2OBJFILES= \ diff --git a/svx/source/form/tabwin.cxx b/svx/source/form/tabwin.cxx index 4ad118418981..39c246b99730 100644 --- a/svx/source/form/tabwin.cxx +++ b/svx/source/form/tabwin.cxx @@ -32,7 +32,6 @@ #include "precompiled_svx.hxx" #include "tabwin.hxx" -#include "fmtools.hxx" #include "fmservs.hxx" #include "stringlistresource.hxx" diff --git a/svx/source/inc/confirmdelete.hxx b/svx/source/inc/confirmdelete.hxx deleted file mode 100644 index a06e297a8748..000000000000 --- a/svx/source/inc/confirmdelete.hxx +++ /dev/null @@ -1,62 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: confirmdelete.hxx,v $ - * $Revision: 1.4 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef SVX_FORM_CONFIRMDELETE_HXX -#define SVX_FORM_CONFIRMDELETE_HXX - -#include <vcl/btndlg.hxx> -#include <vcl/fixed.hxx> - -//........................................................................ -namespace svxform -{ -//........................................................................ - - //==================================================================== - //= class ConfirmDeleteDialog - //==================================================================== - class ConfirmDeleteDialog : public ButtonDialog - { - FixedImage m_aInfoImage; - FixedText m_aTitle; - FixedText m_aMessage; - - public: - ConfirmDeleteDialog(Window* pParent, const String& _rTitle); - ~ConfirmDeleteDialog(); - }; - -//........................................................................ -} // namespace svxform -//........................................................................ - -#endif // SVX_FORM_CONFIRMDELETE_HXX - - diff --git a/svx/source/inc/delayedevent.hxx b/svx/source/inc/delayedevent.hxx index 151b998f2f8c..bd8194a00c82 100644 --- a/svx/source/inc/delayedevent.hxx +++ b/svx/source/inc/delayedevent.hxx @@ -5,10 +5,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * -* $RCSfile: delayedevent.hxx,v $ -* -* $Revision: 1.1.2.1 $ -* * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/svx/source/inc/filtnav.hxx b/svx/source/inc/filtnav.hxx index 2bb298836d02..08db2e8ae7dc 100644 --- a/svx/source/inc/filtnav.hxx +++ b/svx/source/inc/filtnav.hxx @@ -30,8 +30,10 @@ #ifndef _SVX_FILTNAV_HXX #define _SVX_FILTNAV_HXX -#include <com/sun/star/awt/XTextComponent.hpp> #include <com/sun/star/form/XForm.hpp> +#include <com/sun/star/form/runtime/XFormController.hpp> +#include <com/sun/star/form/runtime/XFilterController.hpp> + #include <svtools/lstner.hxx> #include <svtools/brdcst.hxx> #include <vcl/window.hxx> @@ -46,7 +48,6 @@ #include <vcl/dialog.hxx> #include <vcl/group.hxx> #include <vcl/dockwin.hxx> -#include "fmtools.hxx" #include "fmexch.hxx" #include <connectivity/sqlparse.hxx> #include "fmexch.hxx" @@ -93,8 +94,7 @@ public: class FmParentData : public FmFilterData { protected: - ::std::vector<FmFilterData*> m_aChilds; - + ::std::vector< FmFilterData* > m_aChildren; public: TYPEINFO(); @@ -103,28 +103,34 @@ public: {} virtual ~FmParentData(); - ::std::vector<FmFilterData*>& GetChilds() {return m_aChilds;} + ::std::vector< FmFilterData* >& GetChildren() { return m_aChildren; } }; //======================================================================== // Item representing the forms and subforms class FmFormItem : public FmParentData { - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > m_xController; - sal_Int32 m_nCurrent; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xController; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterController > m_xFilterController; public: TYPEINFO(); - FmFormItem(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory):FmParentData(_rxFactory,NULL, ::rtl::OUString()){} - FmFormItem(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,FmParentData* _pParent, - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > & _xController, - const ::rtl::OUString& _rText):FmParentData(_rxFactory,_pParent, _rText) - ,m_xController(_xController) - ,m_nCurrent(0){} - - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > & GetController(){return m_xController;} - void SetCurrentPosition(sal_Int32 nCurrent){m_nCurrent = nCurrent;} - sal_Int32 GetCurrentPosition() const {return m_nCurrent;} + + FmFormItem( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,FmParentData* _pParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & _xController, + const ::rtl::OUString& _rText) + :FmParentData( _rxFactory, _pParent, _rText ) + ,m_xController( _xController ) + ,m_xFilterController( _xController, ::com::sun::star::uno::UNO_QUERY_THROW ) + { + } + + inline const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& + GetController() { return m_xController; } + + inline const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterController >& + GetFilterController() { return m_xFilterController; } + virtual Image GetImage( BmpColorMode _eMode = BMP_COLOR_NORMAL ) const; }; @@ -136,26 +142,28 @@ public: FmFilterItems(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory):FmParentData(_rxFactory,NULL, ::rtl::OUString()){} FmFilterItems(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,FmFormItem* pParent, const ::rtl::OUString& rText ):FmParentData(_rxFactory,pParent, rText){} - FmFilterItem* Find(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > & xText) const; + FmFilterItem* Find( const ::sal_Int32 _nFilterComponentIndex ) const; virtual Image GetImage( BmpColorMode _eMode = BMP_COLOR_NORMAL ) const; }; //======================================================================== class FmFilterItem : public FmFilterData { - ::rtl::OUString m_aFieldName; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > m_xText; + ::rtl::OUString m_aFieldName; + const sal_Int32 m_nComponentIndex; public: TYPEINFO(); - FmFilterItem(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory, - FmFilterItems* pParent, - const ::rtl::OUString& aFieldName, - const ::rtl::OUString& aCondition, - const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > & xText); + FmFilterItem( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory, + FmFilterItems* pParent, + const ::rtl::OUString& aFieldName, + const ::rtl::OUString& aCondition, + const sal_Int32 _nComponentIndex + ); const ::rtl::OUString& GetFieldName() const {return m_aFieldName;} - const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > & GetTextComponent() const {return m_xText;} + sal_Int32 GetComponentIndex() const { return m_nComponentIndex; } virtual Image GetImage( BmpColorMode _eMode = BMP_COLOR_NORMAL ) const; }; @@ -167,9 +175,9 @@ class FmFilterModel : public FmParentData { friend class FmFilterAdapter; - ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > m_xControllers; - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > m_xController; - ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xORB; + ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > m_xControllers; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xController; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xORB; FmFilterAdapter* m_pAdapter; FmFilterItems* m_pCurrentItems; @@ -178,7 +186,7 @@ public: FmFilterModel(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory); virtual ~FmFilterModel(); - void Update(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers, const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > & xCurrent); + void Update(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers, const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xCurrent); void Clear(); sal_Bool ValidateText(FmFilterItem* pItem, UniString& rText, UniString& rErrorMsg) const; void Append(FmFilterItems* pItems, FmFilterItem* pFilterItem); @@ -190,17 +198,17 @@ public: ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > getORB() const { return m_xORB; } const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & GetControllers() const {return m_xControllers;} - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > & GetCurrentController() const {return m_xController;} - void SetCurrentController(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > & xController); + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & GetCurrentController() const {return m_xController;} + void SetCurrentController(const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xController); void Remove(FmFilterData* pFilterItem); - void AppendFilterItems(FmFormItem* pItem); - void CheckIntegrity(FmParentData* pItem); + void AppendFilterItems( FmFormItem& _rItem ); + void EnsureEmptyFilterRows( FmParentData& _rItem ); protected: void Insert(const ::std::vector<FmFilterData*>::iterator& rPos, FmFilterData* pFilterItem); - void Remove(const ::std::vector<FmFilterData*>::iterator& rPos, FmFilterData* pFilterItem); - FmFormItem* Find(const ::std::vector<FmFilterData*>& rItems, const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > & xController) const; + void Remove( const ::std::vector<FmFilterData*>::iterator& rPos ); + FmFormItem* Find(const ::std::vector<FmFilterData*>& rItems, const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xController) const; FmFormItem* Find(const ::std::vector<FmFilterData*>& rItems, const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm) const; void Update(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers, FmParentData* pParent); }; @@ -267,7 +275,10 @@ public: FmFilterNavigator( Window* pParent ); virtual ~FmFilterNavigator(); - void UpdateContent(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers, const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > & xCurrent); + void UpdateContent( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers, + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xCurrent + ); const FmFilterModel* GetFilterModel() const {return m_pModel;} protected: diff --git a/svx/source/inc/fmPropBrw.hxx b/svx/source/inc/fmPropBrw.hxx index 285cb90320d2..fb970eb0a22f 100644 --- a/svx/source/inc/fmPropBrw.hxx +++ b/svx/source/inc/fmPropBrw.hxx @@ -30,6 +30,8 @@ #ifndef SVX_FMPROPBRW_HXX #define SVX_FMPROPBRW_HXX +#include "fmtools.hxx" + /** === begin UNO includes === **/ #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/awt/XControlContainer.hpp> @@ -37,10 +39,10 @@ #include <com/sun/star/inspection/XObjectInspectorModel.hpp> #include <com/sun/star/uno/XComponentContext.hpp> /** === end UNO includes === **/ + #include <sfx2/basedlgs.hxx> #include <sfx2/ctrlitem.hxx> #include <sfx2/childwin.hxx> -#include "fmtools.hxx" //======================================================================== class FmPropBrwMgr : public SfxChildWindow diff --git a/svx/source/inc/fmcontrolbordermanager.hxx b/svx/source/inc/fmcontrolbordermanager.hxx index c08907026585..a9e605873940 100644 --- a/svx/source/inc/fmcontrolbordermanager.hxx +++ b/svx/source/inc/fmcontrolbordermanager.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmcontrolbordermanager.hxx,v $ - * $Revision: 1.6 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -132,7 +129,7 @@ namespace svxform //==================================================================== /** manages the dynamic border color for form controls - Used by the <type>FmXFormController</type>, this class manages the dynamic changes in the + Used by the <type>FormController</type>, this class manages the dynamic changes in the border color of form controls. For this a set of events have to be forwarded to the manager instance, which then will switch the border color depending on the mouse and focus status of the controls. diff --git a/svx/source/inc/fmcontrollayout.hxx b/svx/source/inc/fmcontrollayout.hxx index 1110c274b9f8..fdaa5e17bc7e 100644 --- a/svx/source/inc/fmcontrollayout.hxx +++ b/svx/source/inc/fmcontrollayout.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmcontrollayout.hxx,v $ - * $Revision: 1.4 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/svx/source/inc/fmctrler.hxx b/svx/source/inc/fmctrler.hxx deleted file mode 100644 index 7a973e129280..000000000000 --- a/svx/source/inc/fmctrler.hxx +++ /dev/null @@ -1,617 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: fmctrler.hxx,v $ - * $Revision: 1.24 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef _SVX_FMCTRLER_HXX -#define _SVX_FMCTRLER_HXX - -#include "fmtools.hxx" -#include "formcontrolling.hxx" -#include "sqlparserclient.hxx" -#include "delayedevent.hxx" - -/** === begin UNO includes === **/ -#include <com/sun/star/awt/XControl.hpp> -#include <com/sun/star/awt/XControlContainer.hpp> -#include <com/sun/star/awt/XControlModel.hpp> -#include <com/sun/star/awt/XFocusListener.hpp> -#include <com/sun/star/awt/XItemListener.hpp> -#include <com/sun/star/awt/XMouseListener.hpp> -#include <com/sun/star/awt/XTabController.hpp> -#include <com/sun/star/awt/XTabControllerModel.hpp> -#include <com/sun/star/awt/XTextComponent.hpp> -#include <com/sun/star/awt/XTextListener.hpp> -#include <com/sun/star/beans/PropertyChangeEvent.hpp> -#include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/beans/XPropertyChangeListener.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/beans/XPropertySetInfo.hpp> -#include <com/sun/star/container/ContainerEvent.hpp> -#include <com/sun/star/container/XChild.hpp> -#include <com/sun/star/container/XContainer.hpp> -#include <com/sun/star/container/XContainerListener.hpp> -#include <com/sun/star/container/XEnumerationAccess.hpp> -#include <com/sun/star/container/XIndexContainer.hpp> -#include <com/sun/star/form/DatabaseDeleteEvent.hpp> -#include <com/sun/star/form/DatabaseParameterEvent.hpp> -#include <com/sun/star/form/ErrorEvent.hpp> -#include <com/sun/star/form/validation/XFormComponentValidityListener.hpp> -#include <com/sun/star/form/XConfirmDeleteBroadcaster.hpp> -#include <com/sun/star/form/XConfirmDeleteListener.hpp> -#include <com/sun/star/form/XDatabaseParameterBroadcaster2.hpp> -#include <com/sun/star/form/XDatabaseParameterListener.hpp> -#include <com/sun/star/form/XFormController.hpp> -#include <com/sun/star/form/XFormControllerListener.hpp> -#include <com/sun/star/form/XGridControlListener.hpp> -#include <com/sun/star/form/XLoadListener.hpp> -#include <com/sun/star/form/XResetListener.hpp> -#include <com/sun/star/frame/DispatchDescriptor.hpp> -#include <com/sun/star/frame/XDispatch.hpp> -#include <com/sun/star/frame/XDispatchProvider.hpp> -#include <com/sun/star/frame/XDispatchProviderInterception.hpp> -#include <com/sun/star/frame/XDispatchProviderInterceptor.hpp> -#include <com/sun/star/frame/XModel.hpp> -#include <com/sun/star/lang/XInitialization.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XUnoTunnel.hpp> -#include <com/sun/star/script/XEventAttacherManager.hpp> -#include <com/sun/star/sdb/XRowSetApproveBroadcaster.hpp> -#include <com/sun/star/sdb/XRowSetApproveListener.hpp> -#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> -#include <com/sun/star/sdb/XSQLErrorBroadcaster.hpp> -#include <com/sun/star/sdb/XSQLErrorListener.hpp> -#include <com/sun/star/sdbc/XRowSetListener.hpp> -#include <com/sun/star/task/XInteractionHandler.hpp> -#include <com/sun/star/util/XModeSelector.hpp> -#include <com/sun/star/util/XModifyBroadcaster.hpp> -#include <com/sun/star/util/XModifyListener.hpp> -/** === end UNO includes === **/ - -#include <comphelper/broadcasthelper.hxx> -#include <comphelper/proparrhlp.hxx> -#include <comphelper/stl_types.hxx> -#include <connectivity/sqlparse.hxx> -#include <cppuhelper/propshlp.hxx> -#include <tools/debug.hxx> -#include <vcl/timer.hxx> - -#if ! defined(INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_31) -#define INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_31 -#define COMPHELPER_IMPLBASE_INTERFACE_NUMBER 31 -#include <comphelper/implbase_var.hxx> -#endif - -struct FmXTextComponentLess : public ::std::binary_function< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >, ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent> , sal_Bool> -{ - sal_Bool operator() (const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >& x, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >& y) const - { - return reinterpret_cast<sal_Int64>(x.get()) < reinterpret_cast<sal_Int64>(y.get()); - } -}; - -typedef ::std::map< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >, ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >, FmXTextComponentLess> FmFilterControls; -typedef ::std::map< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >, ::rtl::OUString, FmXTextComponentLess> FmFilterRow; -typedef ::std::vector< FmFilterRow > FmFilterRows; -typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > > FmFormControllers; - -struct FmFieldInfo; -class FmFormView; -class Window; - -namespace svxform -{ - class ControlBorderManager; -} - -typedef ::comphelper::WeakComponentImplHelper31 < ::com::sun::star::form::XFormController - , ::com::sun::star::container::XChild - , ::com::sun::star::container::XIndexAccess - , ::com::sun::star::container::XEnumerationAccess - , ::com::sun::star::awt::XFocusListener - , ::com::sun::star::form::XLoadListener - , ::com::sun::star::beans::XPropertyChangeListener - , ::com::sun::star::awt::XTextListener - , ::com::sun::star::awt::XItemListener - , ::com::sun::star::container::XContainerListener - , ::com::sun::star::util::XModifyListener - , ::com::sun::star::util::XModifyBroadcaster - , ::com::sun::star::util::XModeSelector - , ::com::sun::star::form::XConfirmDeleteListener - , ::com::sun::star::form::XConfirmDeleteBroadcaster - , ::com::sun::star::sdb::XSQLErrorListener - , ::com::sun::star::sdb::XSQLErrorBroadcaster - , ::com::sun::star::sdbc::XRowSetListener - , ::com::sun::star::sdb::XRowSetApproveListener - , ::com::sun::star::sdb::XRowSetApproveBroadcaster - , ::com::sun::star::form::XDatabaseParameterListener - , ::com::sun::star::form::XDatabaseParameterBroadcaster - , ::com::sun::star::lang::XServiceInfo - , ::com::sun::star::form::XResetListener - , ::com::sun::star::lang::XUnoTunnel - , ::com::sun::star::frame::XDispatch - , ::com::sun::star::awt::XMouseListener - , ::com::sun::star::form::validation::XFormComponentValidityListener - , ::com::sun::star::task::XInteractionHandler - , ::com::sun::star::lang::XInitialization - , ::com::sun::star::form::XGridControlListener - > FmXFormController_BASE; - -//================================================================== -// FmXFormController -//================================================================== -class ColumnInfoCache; -class SAL_DLLPRIVATE FmXFormController :public ::comphelper::OBaseMutex - ,public FmXFormController_BASE - ,public ::cppu::OPropertySetHelper - ,public FmDispatchInterceptor - ,public ::comphelper::OAggregationArrayUsageHelper< FmXFormController > - ,public ::svxform::OSQLParserClient - ,public ::svx::IControllerFeatureInvalidation -{ - typedef ::std::map < sal_Int32, - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > - > DispatcherContainer; - - friend class FmXPageViewWinRec; - - ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation> m_xAggregate; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabController> m_xTabController; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> m_xActiveControl, m_xCurrentControl; - ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess> m_xModelAsIndex; - ::com::sun::star::uno::Reference< ::com::sun::star::script::XEventAttacherManager> m_xModelAsManager; - ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> m_xParent; - ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xORB; - // Composer used for checking filter conditions - ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer > m_xComposer; - ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > m_xInteractionHandler; - - ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> > m_aControls; - ::cppu::OInterfaceContainerHelper - m_aActivateListeners, - m_aModifyListeners, - m_aErrorListeners, - m_aDeleteListeners, - m_aRowSetApproveListeners, - m_aParameterListeners; - - FmFormControllers m_aChilds; - FmFilterControls m_aFilterControls; - FmFilterRows m_aFilters; - - Timer m_aTabActivationTimer; - Timer m_aFeatureInvalidationTimer; - - FmFormView* m_pView; - Window* m_pWindow; - ::svxform::ControlBorderManager* - m_pControlBorderManager; - - ::svx::ControllerFeatures m_aControllerFeatures; - DispatcherContainer m_aFeatureDispatchers; - ::std::set< sal_Int32 > m_aInvalidFeatures; // for asynchronous feature invalidation - - ::rtl::OUString m_aMode; - - ::svxform::DelayedEvent m_aLoadEvent; - ::svxform::DelayedEvent m_aToggleEvent; - ::svxform::DelayedEvent m_aActivationEvent; - ::svxform::DelayedEvent m_aDeactivationEvent; - - ::std::auto_ptr< ColumnInfoCache > - m_pColumnInfoCache; - - sal_Int32 m_nCurrentFilterPosition; // current level for filtering (or-criteria) - - sal_Bool m_bCurrentRecordModified : 1; - sal_Bool m_bCurrentRecordNew : 1; - sal_Bool m_bLocked : 1; - sal_Bool m_bDBConnection : 1; // Focuslistener nur fuer Datenbankformulare - sal_Bool m_bCycle : 1; - sal_Bool m_bCanInsert : 1; - sal_Bool m_bCanUpdate : 1; - sal_Bool m_bCommitLock : 1; // lock the committing of controls see focusGained - sal_Bool m_bModified : 1; // ist der Inhalt eines Controls modifiziert ? - sal_Bool m_bControlsSorted : 1; - sal_Bool m_bFiltering : 1; - sal_Bool m_bAttachEvents : 1; - sal_Bool m_bDetachEvents : 1; - sal_Bool m_bAttemptedHandlerCreation : 1; - - // as we want to intercept dispatches of _all_ controls we're responsible for, and an object implementing - // the ::com::sun::star::frame::XDispatchProviderInterceptor interface can intercept only _one_ objects dispatches, we need a helper class - DECLARE_STL_VECTOR(FmXDispatchInterceptorImpl*, Interceptors); - Interceptors m_aControlDispatchInterceptors; - -public: - inline const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& - getInteractionHandler() const - { - const_cast< FmXFormController* >( this )->ensureInteractionHandler(); - return m_xInteractionHandler; - } - -public: - FmXFormController(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & _rxORB, - FmFormView* _pView = NULL, Window* _pWindow = NULL ); - ~FmXFormController(); - -// XInterface - virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& type) throw ( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL acquire() throw (); - virtual void SAL_CALL release() throw (); - -// XTypeProvider - virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); - -// XUnoTunnel - virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException); - static ::com::sun::star::uno::Sequence< sal_Int8 > getUnoTunnelImplementationId(); - SVX_DLLPUBLIC static FmXFormController* getImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxComponent ); - -// XDispatch - virtual void SAL_CALL dispatch( const ::com::sun::star::util::URL& _rURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rArgs ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL addStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL removeStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException); - -// ::com::sun::star::container::XChild - virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> SAL_CALL getParent(void) throw( ::com::sun::star::uno::RuntimeException ) {return m_xParent;} - virtual void SAL_CALL setParent(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& Parent) throw( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ) - {m_xParent = Parent;} - -// ::com::sun::star::lang::XEventListener - virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException ); - -// OComponentHelper - virtual void SAL_CALL disposing(); - -// OPropertySetHelper - virtual sal_Bool SAL_CALL convertFastPropertyValue( ::com::sun::star::uno::Any & rConvertedValue, ::com::sun::star::uno::Any & rOldValue, - sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) - throw( ::com::sun::star::lang::IllegalArgumentException ); - - virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw( ::com::sun::star::uno::Exception ); - virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const; - - virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException ); - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); - - using OPropertySetHelper::getFastPropertyValue; - -// XElementAccess - virtual ::com::sun::star::uno::Type SAL_CALL getElementType(void) throw( ::com::sun::star::uno::RuntimeException ); - virtual sal_Bool SAL_CALL hasElements(void) throw( ::com::sun::star::uno::RuntimeException ); - -// ::com::sun::star::container::XEnumerationAccess - virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration> SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException ); - -// ::com::sun::star::container::XContainerListener - virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XLoadListener - virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XModeSelector - virtual void SAL_CALL setMode(const ::rtl::OUString& Mode) throw( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ); - virtual ::rtl::OUString SAL_CALL getMode(void) throw( ::com::sun::star::uno::RuntimeException ); - virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedModes(void) throw( ::com::sun::star::uno::RuntimeException ); - virtual sal_Bool SAL_CALL supportsMode(const ::rtl::OUString& Mode) throw( ::com::sun::star::uno::RuntimeException ); - -// ::com::sun::star::container::XIndexAccess - virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException ); - virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 Index) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException ); - -// XModifyBroadcaster - virtual void SAL_CALL addModifyListener(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener>& l) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL removeModifyListener(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener>& l) throw( ::com::sun::star::uno::RuntimeException ); - -// XFocusListener - virtual void SAL_CALL focusGained(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL focusLost(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException ); - -// XMouseListener - virtual void SAL_CALL mousePressed( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mouseReleased( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mouseEntered( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL mouseExited( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); - -// XFormComponentValidityListener - virtual void SAL_CALL componentValidityChanged( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException); - -// XInteractionHandler - virtual void SAL_CALL handle( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& Request ) throw (::com::sun::star::uno::RuntimeException); - -// XInitialization - virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); - -// XGridControlListener - virtual void SAL_CALL columnChanged( const ::com::sun::star::lang::EventObject& _event ) throw (::com::sun::star::uno::RuntimeException); - -// ::com::sun::star::beans::XPropertyChangeListener -> aenderung der stati - virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw( ::com::sun::star::uno::RuntimeException ); - -// XTextListener -> modify setzen - virtual void SAL_CALL textChanged(const ::com::sun::star::awt::TextEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XItemListener -> modify setzen - virtual void SAL_CALL itemStateChanged(const ::com::sun::star::awt::ItemEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XModifyListener -> modify setzen - virtual void SAL_CALL modified(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XFormController - virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> SAL_CALL getCurrentControl(void) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL addActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener>& l) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL removeActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener>& l) throw( ::com::sun::star::uno::RuntimeException ); - -// XTabController - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> > SAL_CALL getControls(void) throw( ::com::sun::star::uno::RuntimeException ); - - virtual void SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel>& Model) throw( ::com::sun::star::uno::RuntimeException ); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel> SAL_CALL getModel() throw( ::com::sun::star::uno::RuntimeException ); - - virtual void SAL_CALL setContainer(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer>& Container) throw( ::com::sun::star::uno::RuntimeException ); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer> SAL_CALL getContainer() throw( ::com::sun::star::uno::RuntimeException ); - - virtual void SAL_CALL autoTabOrder() throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL activateTabOrder() throw( ::com::sun::star::uno::RuntimeException ); - - virtual void SAL_CALL activateFirst() throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL activateLast() throw( ::com::sun::star::uno::RuntimeException ); - -// com::sun::star::sdbc::XRowSetListener - virtual void SAL_CALL cursorMoved(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL rowChanged(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL rowSetChanged(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); - -// XRowSetApproveListener - virtual sal_Bool SAL_CALL approveCursorMove(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); - virtual sal_Bool SAL_CALL approveRowChange(const ::com::sun::star::sdb::RowChangeEvent& event) throw( ::com::sun::star::uno::RuntimeException ); - virtual sal_Bool SAL_CALL approveRowSetChange(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); - -// XRowSetApproveBroadcaster - virtual void SAL_CALL addRowSetApproveListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener>& listener) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL removeRowSetApproveListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener>& listener) throw( ::com::sun::star::uno::RuntimeException ); - -// XSQLErrorBroadcaster - virtual void SAL_CALL errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XSQLErrorListener - virtual void SAL_CALL addSQLErrorListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener>& _rListener) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL removeSQLErrorListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener>& _rListener) throw( ::com::sun::star::uno::RuntimeException ); - -// XDatabaseParameterBroadcaster2 - virtual void SAL_CALL addDatabaseParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL removeDatabaseParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); - -// XDatabaseParameterBroadcaster - virtual void SAL_CALL addParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL removeParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); - -// XDatabaseParameterListener - virtual sal_Bool SAL_CALL approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XConfirmDeleteBroadcaster - virtual void SAL_CALL addConfirmDeleteListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL removeConfirmDeleteListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); - -// XConfirmDeleteListener - virtual sal_Bool SAL_CALL confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// XServiceInfo - virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw(::com::sun::star::uno::RuntimeException); - virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw(::com::sun::star::uno::RuntimeException); - -// XResetListener - virtual sal_Bool SAL_CALL approveReset(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); - -// method for registration - static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void); - - // comphelper::OPropertyArrayUsageHelper - virtual void fillProperties( - ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps, - ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rAggregateProps - ) const; - -// access to the controls for filtering - const FmFilterControls& getFilterControls() const {return m_aFilterControls;} - -// access to the current filter rows - const FmFilterRows& getFilterRows() const {return m_aFilters;} - FmFilterRows& getFilterRows() {return m_aFilters;} - - // just decr. the positions no notifications for the view - void decrementCurrentFilterPosition() - { - DBG_ASSERT(m_nCurrentFilterPosition, "Invalid Position"); - --m_nCurrentFilterPosition; - } - - SVX_DLLPUBLIC void setCurrentFilterPosition(sal_Int32 nPos); - sal_Int32 getCurrentFilterPosition() const {return m_nCurrentFilterPosition;} - -protected: - // FmDispatchInterceptor - virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch> - interceptedQueryDispatch(sal_uInt16 _nId,const ::com::sun::star::util::URL& aURL, - const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags) - throw( ::com::sun::star::uno::RuntimeException ); - - // IControllerFeatureInvalidation - virtual void invalidateFeatures( const ::std::vector< sal_Int32 >& _rFeatures ); - - virtual ::osl::Mutex* getInterceptorMutex() { return &m_aMutex; } - - /// update all our dispatchers - void updateAllDispatchers() const; - - /** disposes all dispatchers in m_aFeatureDispatchers, empties m_aFeatureDispatchers, - and disposes m_aControllerFeatures - */ - void disposeAllFeaturesAndDispatchers() SAL_THROW(()); - - void startFiltering(); - void stopFiltering(); - void setFilter(::std::vector<FmFieldInfo>&); - void startListening(); - void stopListening(); - - /** ensures that we have an interaction handler, if possible - - If an interaction handler was provided at creation time (<member>initialize</member>), this - one will be used. Else, an attempt is made to create an <type scope="com::sun::star::sdb">InteractionHandler</type> - is made. - - @return <TRUE/> - if and only if <member>m_xInteractionHandler</member> is valid when the method returns - */ - bool ensureInteractionHandler(); - - /** replaces one of our controls with another one - - Upon successful replacing, the old control will be disposed. Also, internal members pointing - to the current or active control will be adjusted. Yet more, if the replaced control was - the active control, the new control will be made active. - - @param _rxExistentControl - The control to replace. Must be one of the controls in our ControlContainer. - @param _rxNewControl - The control which should replace the existent control. - @return - <TRUE/> if and only if the control was successfully replaced - */ - bool replaceControl( - const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxExistentControl, - const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxNewControl - ); - - // we're listening at all bound controls for modifications - void startControlModifyListening(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); - void stopControlModifyListening(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); - - void setLocks(); - void setControlLock(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); - void addToEventAttacher(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); - void removeFromEventAttacher(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); - void toggleAutoFields(sal_Bool bAutoFields); - void unload() throw( ::com::sun::star::uno::RuntimeException ); - void removeBoundFieldListener(); - - void startFormListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ); - void stopFormListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ); - - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> findControl( ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> >& rCtrls, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel>& rxCtrlModel, sal_Bool _bRemove, sal_Bool _bOverWrite ) const; - - void insertControl(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); - void removeControl(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); - - /// called when a new control is to be handled by the controller - void implControlInserted( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& _rxControl, bool _bAddToEventAttacher ); - /// called when a control is not to be handled by the controller anymore - void implControlRemoved( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& _rxControl, bool _bRemoveFromEventAttacher ); - - /** sets m_xCurrentControl, plus does administrative tasks depending on it - */ - void implSetCurrentControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxControl ); - - /** invalidates the FormFeatures which depend on the current control - */ - void implInvalidateCurrentControlDependentFeatures(); - - bool impl_isDisposed_nofail() const { return FmXFormController_BASE::rBHelper.bDisposed; } - - void impl_onModify(); - - sal_Bool isLocked() const {return m_bLocked;} - sal_Bool determineLockState() const; - - Window* getDialogParentWindow(); - // returns m_pWindow or - if m_pWindow is NULL - the window of the currently set container - - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterceptor> createInterceptor(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _xInterception); - // create a new interceptor, register it on the given object - void deleteInterceptor(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _xInterception); - // if createInterceptor was called for the given object the according interceptor will be removed - // from the objects interceptor chain and released - - /** checks all form controls belonging to our form for validity - - If a form control supports the XValidatableFormComponent interface, this is used to determine - the validity of the control. If the interface is not supported, the control is supposed to be - valid. - - @param _rFirstInvalidityExplanation - if the method returns <FALSE/> (i.e. if there is an invalid control), this string contains - the explanation for the invalidity, as obtained from the validator. - - @param _rxFirstInvalidModel - if the method returns <FALSE/> (i.e. if there is an invalid control), this contains - the control model - - @return - <TRUE/> if and only if all controls belonging to our form are valid - */ - bool checkFormComponentValidity( - ::rtl::OUString& /* [out] */ _rFirstInvalidityExplanation, - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& /* [out] */ _rxFirstInvalidModel - ) SAL_THROW(()); - - /** locates the control which belongs to a given model - */ - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > - locateControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& _rxModel ) SAL_THROW(()); - - // set the text for all filters - void impl_setTextOnAllFilter_throw(); - - // in filter mode we do not listen for changes - sal_Bool isListeningForChanges() const {return m_bDBConnection && !m_bFiltering && !isLocked();} - void addChild(FmXFormController* pChild); - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> isInList(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer>& xPeer) const; - - DECL_LINK( OnActivateTabOrder, void* ); - DECL_LINK( OnInvalidateFeatures, void* ); - DECL_LINK( OnLoad, void* ); - DECL_LINK( OnToggleAutoFields, void* ); - DECL_LINK( OnActivated, void* ); - DECL_LINK( OnDeactivated, void* ); -}; - - -#endif // _SVX_FMCTRLER_HXX - diff --git a/svx/source/inc/fmexpl.hxx b/svx/source/inc/fmexpl.hxx index df60ba931739..a03940fd510b 100644 --- a/svx/source/inc/fmexpl.hxx +++ b/svx/source/inc/fmexpl.hxx @@ -39,12 +39,17 @@ #include <sfx2/dockwin.hxx> #include <sfx2/ctrlitem.hxx> #include <vcl/image.hxx> + +/** === begin UNO includes === **/ #include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/form/XForm.hpp> #include <com/sun/star/form/XFormComponent.hpp> #include <com/sun/star/beans/PropertyChangeEvent.hpp> #include <com/sun/star/container/XContainerListener.hpp> #include <com/sun/star/container/XContainer.hpp> +#include <com/sun/star/beans/XPropertyChangeListener.hpp> +#include <com/sun/star/container/XIndexContainer.hpp> +/** === end UNO includes === **/ #include <svtools/svtreebx.hxx> @@ -57,7 +62,6 @@ #include <svx/fmview.hxx> #include "fmexch.hxx" -#include "fmtools.hxx" class SdrObjListIter; class FmFormShell; diff --git a/svx/source/inc/fmservs.hxx b/svx/source/inc/fmservs.hxx index 201a5a351224..62d9654858a3 100644 --- a/svx/source/inc/fmservs.hxx +++ b/svx/source/inc/fmservs.hxx @@ -57,7 +57,7 @@ #define FM_COMPONENT_IMAGECONTROL rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "stardiv.one.form.component.ImageControl" ) ) #define FM_CONTROL_GRID rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "stardiv.one.form.control.Grid" ) ) #define FM_CONTROL_GRIDCONTROL rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "stardiv.one.form.control.GridControl" ) ) -#define FM_FORM_CONTROLLER rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.FormController" ) ) +#define FM_FORM_CONTROLLER rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.runtime.FormController" ) ) #define SRV_SDB_CONNECTION rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.Connection" ) ) #define SRV_SDB_INTERACTION_HANDLER rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.InteractionHandler" ) ) #define FM_SUN_COMPONENT_FORM rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.component.Form" ) ) diff --git a/svx/source/inc/fmshimp.hxx b/svx/source/inc/fmshimp.hxx index 85644ea5daba..434f13a177d0 100644 --- a/svx/source/inc/fmshimp.hxx +++ b/svx/source/inc/fmshimp.hxx @@ -40,7 +40,7 @@ #include <com/sun/star/awt/XControlContainer.hpp> #include <com/sun/star/util/XModifyListener.hpp> #include <com/sun/star/form/XForm.hpp> -#include <com/sun/star/form/XFormController.hpp> +#include <com/sun/star/form/runtime/XFormController.hpp> #include <com/sun/star/form/XFormComponent.hpp> #include <com/sun/star/form/NavigationBarMode.hpp> #include <com/sun/star/frame/XFrame.hpp> @@ -243,9 +243,9 @@ class SAL_DLLPRIVATE FmXFormShell :public FmXFormShell_BASE // aktuelle Form, Controller // nur im alive mode verfuegbar - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController> m_xActiveController; - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController> m_xNavigationController; - ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm> m_xActiveForm; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xActiveController; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xNavigationController; + ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > m_xActiveForm; // Aktueller container einer Page // nur im designmode verfuegbar @@ -266,11 +266,9 @@ class SAL_DLLPRIVATE FmXFormShell :public FmXFormShell_BASE // the frame we live in ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame> m_xAttachedFrame; // Administration of external form views (see the SID_FM_VIEW_AS_GRID-slot) - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController> m_xExternalViewController; // the controller for the external form view - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController> m_xExtViewTriggerController; // the nav controller at the time the external display was triggered - ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet> m_xExternalDisplayedForm; // the form which the external view is based on - - FmXDispatchInterceptorImpl* m_pExternalViewInterceptor; + ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > m_xExternalViewController; // the controller for the external form view + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xExtViewTriggerController; // the nav controller at the time the external display was triggered + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > m_xExternalDisplayedForm; // the form which the external view is based on mutable ::svxform::DocumentType m_eDocumentType; /// the type of document we're living in @@ -399,11 +397,11 @@ protected: public: // methode fuer nicht designmode (alive mode) - void setActiveController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController>& _xController, sal_Bool _bNoSaveOldContent = sal_False ); - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController>& getActiveController() const {return m_xActiveController;} - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController>& getActiveInternalController() const { return m_xActiveController == m_xExternalViewController ? m_xExtViewTriggerController : m_xActiveController; } + void setActiveController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController>& _xController, sal_Bool _bNoSaveOldContent = sal_False ); + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController>& getActiveController() const {return m_xActiveController;} + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController>& getActiveInternalController() const { return m_xActiveController == m_xExternalViewController ? m_xExtViewTriggerController : m_xActiveController; } const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm>& getActiveForm() const {return m_xActiveForm;} - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController>& getNavController() const {return m_xNavigationController;} + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController>& getNavController() const {return m_xNavigationController;} inline const ::svx::ControllerFeatures& getActiveControllerFeatures() const { return m_aActiveControllerFeatures; } @@ -568,13 +566,13 @@ private: public: enum CURSOR_ACTION { CA_MOVE_TO_LAST, CA_MOVE_ABSOLUTE }; - void DoAsyncCursorAction(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController>& _xController, CURSOR_ACTION _eWhat); + void DoAsyncCursorAction(const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController>& _xController, CURSOR_ACTION _eWhat); void DoAsyncCursorAction(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet>& _xForm, CURSOR_ACTION _eWhat); sal_Bool HasAnyPendingCursorAction() const; void CancelAnyPendingCursorAction(); - sal_Bool HasPendingCursorAction(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController>& _xController) const; + sal_Bool HasPendingCursorAction(const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController>& _xController) const; sal_Bool HasPendingCursorAction(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet>& _xForm) const; /** execute the given form slot diff --git a/svx/source/inc/fmsrcimp.hxx b/svx/source/inc/fmsrcimp.hxx index eb2475bc56e8..cfe38153c0ba 100644 --- a/svx/source/inc/fmsrcimp.hxx +++ b/svx/source/inc/fmsrcimp.hxx @@ -32,18 +32,27 @@ #define _FMSRCIMP_HXX #include "fmtools.hxx" -#include <vos/thread.hxx> -#include <osl/mutex.hxx> -#include <com/sun/star/awt/XTextComponent.hpp> +#include "svx/svxdllapi.h" + +/** === begin UNO includes === **/ #include <com/sun/star/awt/XCheckBox.hpp> #include <com/sun/star/awt/XListBox.hpp> +#include <com/sun/star/awt/XTextComponent.hpp> #include <com/sun/star/util/XNumberFormatsSupplier.hpp> #include <com/sun/star/util/XNumberFormatter.hpp> +/** === end UNO includes === **/ + #include <comphelper/stl_types.hxx> #include <cppuhelper/implbase1.hxx> +#include <osl/mutex.hxx> #include <unotools/charclass.hxx> #include <unotools/collatorwrapper.hxx> -#include "svx/svxdllapi.h" +#include <vos/thread.hxx> + +#ifndef _SVSTDARR_ULONGS +#define _SVSTDARR_ULONGS +#include <svtools/svstdarr.hxx> +#endif // =================================================================================================== // Hilfsstrukturen diff --git a/svx/source/inc/fmtextcontrolshell.hxx b/svx/source/inc/fmtextcontrolshell.hxx index 17ba06d5513b..a67520f89ed8 100644 --- a/svx/source/inc/fmtextcontrolshell.hxx +++ b/svx/source/inc/fmtextcontrolshell.hxx @@ -36,7 +36,7 @@ #include <com/sun/star/frame/XStatusListener.hpp> #include <com/sun/star/awt/XFocusListener.hpp> #include <com/sun/star/awt/XMouseListener.hpp> -#include <com/sun/star/form/XFormController.hpp> +#include <com/sun/star/form/runtime/XFormController.hpp> #include <com/sun/star/awt/XControl.hpp> #include <com/sun/star/util/XURLTransformer.hpp> /** === end UNO includes === **/ @@ -92,10 +92,10 @@ namespace svx ,public IContextRequestObserver { private: - ::com::sun::star::uno::Reference< ::com::sun::star::util::XURLTransformer > m_xURLTransformer; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > m_xActiveControl; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > m_xActiveTextComponent; - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > m_xActiveController; + ::com::sun::star::uno::Reference< ::com::sun::star::util::XURLTransformer > m_xURLTransformer; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > m_xActiveControl; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > m_xActiveTextComponent; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xActiveController; #ifndef DONT_REMEMBER_LAST_CONTROL // without this define, m_xActiveControl remembers the *last* active control, even // if it, in the meantime, already lost the focus @@ -144,10 +144,10 @@ namespace svx /** to be called when a form in our document has been activated */ - void formActivated( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController ); + void formActivated( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController ); /** to be called when a form in our document has been deactivated */ - void formDeactivated( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController ); + void formDeactivated( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController ); /** notifies the instance that the design mode has changed */ @@ -205,7 +205,7 @@ namespace svx @precond we don't have an active controller currently */ - void startControllerListening( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController ); + void startControllerListening( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController ); /** stops listening at the active controller @precond we have an active controller currently diff --git a/svx/source/inc/fmtools.hxx b/svx/source/inc/fmtools.hxx index 935e84c6448e..a456bed35bc6 100644 --- a/svx/source/inc/fmtools.hxx +++ b/svx/source/inc/fmtools.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmtools.hxx,v $ - * $Revision: 1.27 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -30,6 +27,9 @@ #ifndef _SVX_FMTOOLS_HXX #define _SVX_FMTOOLS_HXX +#include "fmprop.hrc" +#include "svx/svxdllapi.h" + #include <com/sun/star/sdb/SQLContext.hpp> #include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp> #include <com/sun/star/sdbcx/Privilege.hpp> @@ -48,7 +48,6 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/frame/XDispatchProviderInterception.hpp> #include <com/sun/star/frame/XDispatchProviderInterceptor.hpp> -#include <com/sun/star/frame/XInterceptorInfo.hpp> #include <com/sun/star/container/XIndexContainer.hpp> #include <com/sun/star/frame/XDispatch.hpp> #include <com/sun/star/frame/XStatusListener.hpp> @@ -66,38 +65,18 @@ #include <com/sun/star/awt/FontStrikeout.hpp> #include <com/sun/star/util/XNumberFormatsSupplier.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> -#include <vcl/wintypes.hxx> -#include <vos/mutex.hxx> - -#ifndef _SVSTDARR_ULONGS -#define _SVSTDARR_ULONGS -#include <svtools/svstdarr.hxx> -#endif -#include <sfx2/ctrlitem.hxx> -#include <tools/link.hxx> -#include <tools/date.hxx> -#include <tools/time.hxx> -#include <tools/datetime.hxx> - -#include "fmprop.hrc" #include <com/sun/star/sdbc/XConnection.hpp> #include <com/sun/star/io/XObjectInputStream.hpp> #include <com/sun/star/io/XObjectOutputStream.hpp> #include <com/sun/star/io/XPersistObject.hpp> #include <com/sun/star/util/XNumberFormatter.hpp> #include <com/sun/star/util/XNumberFormats.hpp> -#include <cppuhelper/interfacecontainer.h> -#include <cppuhelper/compbase2.hxx> -#include <cppuhelper/compbase3.hxx> + +#include <vcl/wintypes.hxx> #include <cppuhelper/weakref.hxx> #include <comphelper/uno3.hxx> #include <comphelper/stl_types.hxx> #include <cppuhelper/implbase1.hxx> -#include <cppuhelper/implbase2.hxx> -#include <cppuhelper/implbase3.hxx> -#include <cppuhelper/component.hxx> - -#include <svx/svxdllapi.h> #include <set> @@ -114,24 +93,7 @@ SVX_DLLPUBLIC void displayException(const ::com::sun::star::sdb::SQLContext&, Wi void displayException(const ::com::sun::star::sdb::SQLErrorEvent&, Window* _pParent = NULL); void displayException(const ::com::sun::star::uno::Any&, Window* _pParent = NULL); -#define DATA_MODE rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ) -#define FILTER_MODE rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterMode" ) ) - -// Kopieren von Persistenten Objecten -::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> cloneUsingProperties(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XPersistObject>& _xObj); - -sal_Int32 findPos(const ::rtl::OUString& aStr, const ::com::sun::star::uno::Sequence< ::rtl::OUString>& rList); - -// Suchen in einer Indexliste nach einem Element -sal_Bool searchElement(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess>& xCont, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& xElement); - sal_Int32 getElementPos(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess>& xCont, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& xElement); -String getFormComponentAccessPath(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& _xElement); -String getFormComponentAccessPath(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& _xElement, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& _rTopLevelElement); -::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> getElementFromAccessPath(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess>& _xParent, const String& _rRelativePath); - - -::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel> getXModel(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& xIface); SVX_DLLPUBLIC ::rtl::OUString getLabelName(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& xControlModel); @@ -236,10 +198,8 @@ protected: void setAdapter(FmXDisposeMultiplexer* pAdapter); }; -typedef ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener> FmXDisposeMultiplexer_x; //============================================================================== - class FmXDisposeMultiplexer :public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener> { ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent> m_xObject; @@ -258,119 +218,10 @@ public: // ================================================================== -//======================================================================== -//= dispatch interception helper classes -//======================================================================== - -//------------------------------------------------------------------------ -//- FmDispatchInterceptor -//------------------------------------------------------------------------ -class FmDispatchInterceptor -{ -public: - FmDispatchInterceptor() { } - - virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch> interceptedQueryDispatch(sal_uInt16 _nId, - const ::com::sun::star::util::URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags) throw( ::com::sun::star::uno::RuntimeException ) = 0; - - virtual ::osl::Mutex* getInterceptorMutex() = 0; -}; - -//------------------------------------------------------------------------ -//- FmXDispatchInterceptorImpl -//------------------------------------------------------------------------ -typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::frame::XDispatchProviderInterceptor - , ::com::sun::star::lang::XEventListener - , ::com::sun::star::frame::XInterceptorInfo - > FmXDispatchInterceptorImpl_BASE; - -class FmXDispatchInterceptorImpl : public FmXDispatchInterceptorImpl_BASE -{ - ::osl::Mutex m_aFallback; - - // the component which's dispatches we're intercepting - ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XDispatchProviderInterception> - m_xIntercepted; - sal_Bool m_bListening; - - // the real interceptor - FmDispatchInterceptor* m_pMaster; - - // chaining - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider> m_xSlaveDispatcher; - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider> m_xMasterDispatcher; - - // our id - sal_Int16 m_nId; - - ::com::sun::star::uno::Sequence< ::rtl::OUString > - m_aInterceptedURLSchemes; - - virtual ~FmXDispatchInterceptorImpl(); - -public: - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception> getIntercepted() const { return m_xIntercepted; } - -public: - FmXDispatchInterceptorImpl( - const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _rToIntercept, - FmDispatchInterceptor* _pMaster, - sal_Int16 _nId, - ::com::sun::star::uno::Sequence< ::rtl::OUString > _rInterceptedSchemes /// if not empty, this will be used for getInterceptedURLs - ); - - // StarOne - DECLARE_UNO3_DEFAULTS(FmXDispatchInterceptorImpl, FmXDispatchInterceptorImpl_BASE); - // virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& type) throw ( ::com::sun::star::uno::RuntimeException ); - virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); - // ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); - - - // ::com::sun::star::frame::XDispatchProvider - virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > SAL_CALL queryDispatch( const ::com::sun::star::util::URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags ) throw(::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > > SAL_CALL queryDispatches( const ::com::sun::star::uno::Sequence< ::com::sun::star::frame::DispatchDescriptor >& aDescripts ) throw(::com::sun::star::uno::RuntimeException); - - // ::com::sun::star::frame::XDispatchProviderInterceptor - virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL getSlaveDispatchProvider( ) throw(::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL setSlaveDispatchProvider( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider >& xNewDispatchProvider ) throw(::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL getMasterDispatchProvider( ) throw(::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL setMasterDispatchProvider( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider >& xNewSupplier ) throw(::com::sun::star::uno::RuntimeException); - - // ::com::sun::star::frame::XInterceptorInfo - virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getInterceptedURLs( ) throw(::com::sun::star::uno::RuntimeException); - - // ::com::sun::star::lang::XEventListener - virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); - - // OComponentHelper - virtual void SAL_CALL disposing(); - -protected: - void ImplDetach(); - - ::osl::Mutex& getAccessSafety() - { - if (m_pMaster && m_pMaster->getInterceptorMutex()) - return *m_pMaster->getInterceptorMutex(); - return m_aFallback; - } -}; - -//================================================================== -// ... -//================================================================== -::rtl::OUString getServiceNameByControlType(sal_Int16 nType); - // get a service name to create a model of the given type (OBJ_FM_...) sal_Int16 getControlTypeByObject(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XServiceInfo>& _rxObject); // get the object type (OBJ_FM_...) from the services the object supports -void TransferEventScripts(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel>& xModel, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl, - const ::com::sun::star::uno::Sequence< ::com::sun::star::script::ScriptEventDescriptor>& rTransferIfAvailable); - -sal_Int16 GridView2ModelPos(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess>& rColumns, sal_Int16 nViewPos); - //================================================================== -sal_Bool isLoadable(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& xLoad); sal_Bool isRowSetAlive(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& _rxRowSet); // checks if the ::com::sun::star::sdbcx::XColumnsSupplier provided by _rxRowSet supllies any columns diff --git a/svx/source/inc/fmvwimp.hxx b/svx/source/inc/fmvwimp.hxx index 12965c07ad3b..c51c935883ed 100644 --- a/svx/source/inc/fmvwimp.hxx +++ b/svx/source/inc/fmvwimp.hxx @@ -37,7 +37,8 @@ #include <com/sun/star/form/XForm.hpp> #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XEnumeration.hpp> -#include <com/sun/star/form/XFormController.hpp> +#include <com/sun/star/form/runtime/XFormController.hpp> +#include <com/sun/star/form/runtime/XFormControllerContext.hpp> #include <com/sun/star/container/XContainerListener.hpp> #include <com/sun/star/container/ContainerEvent.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> @@ -49,7 +50,7 @@ #include <comphelper/stl_types.hxx> #include <tools/link.hxx> #include <tools/string.hxx> -#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/implbase2.hxx> #include <cppuhelper/implbase3.hxx> #include <comphelper/uno3.hxx> #include <comphelper/componentcontext.hxx> @@ -73,7 +74,6 @@ FORWARD_DECLARE_INTERFACE(awt,XWindow) FORWARD_DECLARE_INTERFACE(beans,XPropertySet) FORWARD_DECLARE_INTERFACE(util,XNumberFormats) -class FmXFormController; class FmXFormView; namespace svx { @@ -84,41 +84,49 @@ namespace svx { //================================================================== // FmXPageViewWinRec //================================================================== -class FmXPageViewWinRec : public ::cppu::WeakImplHelper1< ::com::sun::star::container::XIndexAccess> +typedef ::cppu::WeakImplHelper2 < ::com::sun::star::container::XIndexAccess + , ::com::sun::star::form::runtime::XFormControllerContext + > FmXPageViewWinRec_Base; + +class FmXPageViewWinRec : public FmXPageViewWinRec_Base { friend class FmXFormView; - ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > > m_aControllerList; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > m_xControlContainer; - ::comphelper::ComponentContext m_aContext; + ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > > m_aControllerList; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > m_xControlContainer; + ::comphelper::ComponentContext m_aContext; FmXFormView* m_pViewImpl; Window* m_pWindow; +protected: + ~FmXPageViewWinRec(); + public: FmXPageViewWinRec( const ::comphelper::ComponentContext& _rContext, const SdrPageWindow&, FmXFormView* pView); //const SdrPageViewWinRec*, FmXFormView* pView); - ~FmXPageViewWinRec(); - -// UNO Anbindung -// ::com::sun::star::container::XElementAccess + // XElementAccess virtual ::com::sun::star::uno::Type SAL_CALL getElementType() throw(::com::sun::star::uno::RuntimeException); virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException); -// ::com::sun::star::container::XEnumerationAccess + // XEnumerationAccess virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration() throw(::com::sun::star::uno::RuntimeException); -// ::com::sun::star::container::XIndexAccess + // XIndexAccess virtual sal_Int32 SAL_CALL getCount() throw(::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 _Index) throw(::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); - const ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > >& GetList() {return m_aControllerList;} + // XFormControllerContext + virtual void SAL_CALL makeVisible( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _Control ) throw (::com::sun::star::uno::RuntimeException); + + const ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > >& GetList() {return m_aControllerList;} protected: - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > getController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm ) const; - void setController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm, - FmXFormController* pParent = NULL); + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > getController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm ) const; + void setController( + const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm, + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxParentController ); ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > getControlContainer() const { return m_xControlContainer; } void updateTabOrder( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm ); void dispose(); @@ -213,7 +221,7 @@ public: FmWinRecList::const_iterator findWindow( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer >& _rxCC ) const; const FmWinRecList& getWindowList() const {return m_aWinList;} - ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > getFormController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm, const OutputDevice& _rDevice ) const; // activation handling diff --git a/svx/source/inc/formcontroller.hxx b/svx/source/inc/formcontroller.hxx new file mode 100644 index 000000000000..4c4ba187187d --- /dev/null +++ b/svx/source/inc/formcontroller.hxx @@ -0,0 +1,592 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SVX_FMCTRLER_HXX +#define _SVX_FMCTRLER_HXX + +#include "delayedevent.hxx" +#include "formdispatchinterceptor.hxx" +#include "sqlparserclient.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/awt/XControl.hpp> +#include <com/sun/star/awt/XControlModel.hpp> +#include <com/sun/star/awt/XFocusListener.hpp> +#include <com/sun/star/awt/XItemListener.hpp> +#include <com/sun/star/awt/XMouseListener.hpp> +#include <com/sun/star/awt/XTabController.hpp> +#include <com/sun/star/awt/XTextComponent.hpp> +#include <com/sun/star/container/XContainerListener.hpp> +#include <com/sun/star/container/XEnumerationAccess.hpp> +#include <com/sun/star/container/XIndexContainer.hpp> +#include <com/sun/star/form/DatabaseDeleteEvent.hpp> +#include <com/sun/star/form/DatabaseParameterEvent.hpp> +#include <com/sun/star/form/ErrorEvent.hpp> +#include <com/sun/star/form/validation/XFormComponentValidityListener.hpp> +#include <com/sun/star/form/XConfirmDeleteBroadcaster.hpp> +#include <com/sun/star/form/XConfirmDeleteListener.hpp> +#include <com/sun/star/form/XDatabaseParameterBroadcaster2.hpp> +#include <com/sun/star/form/XDatabaseParameterListener.hpp> +#include <com/sun/star/form/runtime/XFormController.hpp> +#include <com/sun/star/form/runtime/XFilterController.hpp> +#include <com/sun/star/form/XFormControllerListener.hpp> +#include <com/sun/star/form/XGridControlListener.hpp> +#include <com/sun/star/form/XLoadListener.hpp> +#include <com/sun/star/form/XResetListener.hpp> +#include <com/sun/star/frame/DispatchDescriptor.hpp> +#include <com/sun/star/frame/XDispatch.hpp> +#include <com/sun/star/frame/XDispatchProvider.hpp> +#include <com/sun/star/frame/XDispatchProviderInterception.hpp> +#include <com/sun/star/frame/XDispatchProviderInterceptor.hpp> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/script/XEventAttacherManager.hpp> +#include <com/sun/star/sdb/XRowSetApproveBroadcaster.hpp> +#include <com/sun/star/sdb/XRowSetApproveListener.hpp> +#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> +#include <com/sun/star/sdb/XSQLErrorBroadcaster.hpp> +#include <com/sun/star/sdb/XSQLErrorListener.hpp> +#include <com/sun/star/sdbc/XRowSetListener.hpp> +#include <com/sun/star/task/XInteractionHandler.hpp> +#include <com/sun/star/util/XModeSelector.hpp> +#include <com/sun/star/util/XModifyBroadcaster.hpp> +#include <com/sun/star/util/XModifyListener.hpp> +/** === end UNO includes === **/ + +#include <comphelper/broadcasthelper.hxx> +#include <comphelper/componentcontext.hxx> +#include <comphelper/proparrhlp.hxx> +#include <comphelper/stl_types.hxx> +#include <connectivity/sqlparse.hxx> +#include <cppuhelper/propshlp.hxx> +#include <tools/debug.hxx> +#include <vcl/timer.hxx> + +#if ! defined(INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_22) +#define INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_22 +#define COMPHELPER_IMPLBASE_INTERFACE_NUMBER 22 +#include <comphelper/implbase_var.hxx> +#endif + +struct FmXTextComponentLess : public ::std::binary_function< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >, ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent> , sal_Bool> +{ + sal_Bool operator() (const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >& x, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >& y) const + { + return reinterpret_cast<sal_Int64>(x.get()) < reinterpret_cast<sal_Int64>(y.get()); + } +}; + +typedef ::std::map< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent >, ::rtl::OUString, FmXTextComponentLess> FmFilterRow; +typedef ::std::vector< FmFilterRow > FmFilterRows; +typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > > FmFormControllers; + +class FmFormView; +class Window; + +namespace svxform +{ + typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent > > FilterComponents; + class ControlBorderManager; + struct FmFieldInfo; + + typedef ::comphelper::WeakComponentImplHelper22 < ::com::sun::star::form::runtime::XFormController + , ::com::sun::star::form::runtime::XFilterController + , ::com::sun::star::awt::XFocusListener + , ::com::sun::star::form::XLoadListener + , ::com::sun::star::beans::XPropertyChangeListener + , ::com::sun::star::awt::XTextListener + , ::com::sun::star::awt::XItemListener + , ::com::sun::star::container::XContainerListener + , ::com::sun::star::util::XModifyListener + , ::com::sun::star::form::XConfirmDeleteListener + , ::com::sun::star::sdb::XSQLErrorListener + , ::com::sun::star::sdbc::XRowSetListener + , ::com::sun::star::sdb::XRowSetApproveListener + , ::com::sun::star::form::XDatabaseParameterListener + , ::com::sun::star::lang::XServiceInfo + , ::com::sun::star::form::XResetListener + , ::com::sun::star::frame::XDispatch + , ::com::sun::star::awt::XMouseListener + , ::com::sun::star::form::validation::XFormComponentValidityListener + , ::com::sun::star::task::XInteractionHandler + , ::com::sun::star::form::XGridControlListener + , ::com::sun::star::form::runtime::XFeatureInvalidation + > FormController_BASE; + + //================================================================== + // FormController + //================================================================== + class ColumnInfoCache; + class SAL_DLLPRIVATE FormController :public ::comphelper::OBaseMutex + ,public FormController_BASE + ,public ::cppu::OPropertySetHelper + ,public DispatchInterceptor + ,public ::comphelper::OAggregationArrayUsageHelper< FormController > + ,public ::svxform::OSQLParserClient + { + typedef ::std::map < sal_Int16, + ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > + > DispatcherContainer; + + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation> m_xAggregate; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabController> m_xTabController; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> m_xActiveControl, m_xCurrentControl; + ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess> m_xModelAsIndex; + ::com::sun::star::uno::Reference< ::com::sun::star::script::XEventAttacherManager> m_xModelAsManager; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> m_xParent; + ::comphelper::ComponentContext m_aContext; + // Composer used for checking filter conditions + ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer > m_xComposer; + ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > m_xInteractionHandler; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext > m_xContext; + + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> > m_aControls; + ::cppu::OInterfaceContainerHelper + m_aActivateListeners, + m_aModifyListeners, + m_aErrorListeners, + m_aDeleteListeners, + m_aRowSetApproveListeners, + m_aParameterListeners, + m_aFilterListeners; + + FmFormControllers m_aChilds; + FilterComponents m_aFilterComponents; + FmFilterRows m_aFilterRows; + + Timer m_aTabActivationTimer; + Timer m_aFeatureInvalidationTimer; + + ::svxform::ControlBorderManager* + m_pControlBorderManager; + + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > + m_xFormOperations; + DispatcherContainer m_aFeatureDispatchers; + ::std::set< sal_Int16 > m_aInvalidFeatures; // for asynchronous feature invalidation + + ::rtl::OUString m_aMode; + + ::svxform::DelayedEvent m_aLoadEvent; + ::svxform::DelayedEvent m_aToggleEvent; + ::svxform::DelayedEvent m_aActivationEvent; + ::svxform::DelayedEvent m_aDeactivationEvent; + + ::std::auto_ptr< ColumnInfoCache > + m_pColumnInfoCache; + + sal_Int32 m_nCurrentFilterPosition; // current level for filtering (or-criteria) + + sal_Bool m_bCurrentRecordModified : 1; + sal_Bool m_bCurrentRecordNew : 1; + sal_Bool m_bLocked : 1; + sal_Bool m_bDBConnection : 1; // Focuslistener nur fuer Datenbankformulare + sal_Bool m_bCycle : 1; + sal_Bool m_bCanInsert : 1; + sal_Bool m_bCanUpdate : 1; + sal_Bool m_bCommitLock : 1; // lock the committing of controls see focusGained + sal_Bool m_bModified : 1; // ist der Inhalt eines Controls modifiziert ? + sal_Bool m_bControlsSorted : 1; + sal_Bool m_bFiltering : 1; + sal_Bool m_bAttachEvents : 1; + sal_Bool m_bDetachEvents : 1; + sal_Bool m_bAttemptedHandlerCreation : 1; + + // as we want to intercept dispatches of _all_ controls we're responsible for, and an object implementing + // the ::com::sun::star::frame::XDispatchProviderInterceptor interface can intercept only _one_ objects dispatches, we need a helper class + DECLARE_STL_VECTOR(DispatchInterceptionMultiplexer*, Interceptors); + Interceptors m_aControlDispatchInterceptors; + + public: + FormController( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & _rxORB ); + + protected: + ~FormController(); + + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& type) throw ( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL acquire() throw (); + virtual void SAL_CALL release() throw (); + + // XTypeProvider + virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + + // XDispatch + virtual void SAL_CALL dispatch( const ::com::sun::star::util::URL& _rURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rArgs ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& _rxListener, const ::com::sun::star::util::URL& _rURL ) throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::container::XChild + virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> SAL_CALL getParent(void) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL setParent(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& Parent) throw( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ); + + // ::com::sun::star::lang::XEventListener + virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException ); + + // OComponentHelper + virtual void SAL_CALL disposing(); + + // OPropertySetHelper + virtual sal_Bool SAL_CALL convertFastPropertyValue( ::com::sun::star::uno::Any & rConvertedValue, ::com::sun::star::uno::Any & rOldValue, + sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) + throw( ::com::sun::star::lang::IllegalArgumentException ); + + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw( ::com::sun::star::uno::Exception ); + virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const; + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException ); + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + + using OPropertySetHelper::getFastPropertyValue; + + // XFilterController + virtual ::sal_Int32 SAL_CALL getFilterComponents() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getDisjunctiveTerms() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addFilterControllerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterControllerListener >& _Listener ) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeFilterControllerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterControllerListener >& _Listener ) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL setPredicateExpression( ::sal_Int32 _Component, ::sal_Int32 _Term, const ::rtl::OUString& _PredicateExpression ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > SAL_CALL getFilterComponent( ::sal_Int32 _Component ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL getPredicateExpressions() throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeDisjunctiveTerm( ::sal_Int32 _Term ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL appendEmptyDisjunctiveTerm() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getActiveTerm() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setActiveTerm( ::sal_Int32 _ActiveTerm ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + + // XElementAccess + virtual ::com::sun::star::uno::Type SAL_CALL getElementType(void) throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Bool SAL_CALL hasElements(void) throw( ::com::sun::star::uno::RuntimeException ); + + // ::com::sun::star::container::XEnumerationAccess + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration> SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException ); + + // ::com::sun::star::container::XContainerListener + virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XLoadListener + virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XModeSelector + virtual void SAL_CALL setMode(const ::rtl::OUString& Mode) throw( ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getMode(void) throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedModes(void) throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Bool SAL_CALL supportsMode(const ::rtl::OUString& Mode) throw( ::com::sun::star::uno::RuntimeException ); + + // ::com::sun::star::container::XIndexAccess + virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 Index) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException ); + + // XModifyBroadcaster + virtual void SAL_CALL addModifyListener(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener>& l) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeModifyListener(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener>& l) throw( ::com::sun::star::uno::RuntimeException ); + + // XFocusListener + virtual void SAL_CALL focusGained(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL focusLost(const ::com::sun::star::awt::FocusEvent& e) throw( ::com::sun::star::uno::RuntimeException ); + + // XMouseListener + virtual void SAL_CALL mousePressed( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mouseReleased( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mouseEntered( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL mouseExited( const ::com::sun::star::awt::MouseEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); + + // XFormComponentValidityListener + virtual void SAL_CALL componentValidityChanged( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException); + + // XInteractionHandler + virtual void SAL_CALL handle( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& Request ) throw (::com::sun::star::uno::RuntimeException); + + // XGridControlListener + virtual void SAL_CALL columnChanged( const ::com::sun::star::lang::EventObject& _event ) throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::beans::XPropertyChangeListener -> aenderung der stati + virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw( ::com::sun::star::uno::RuntimeException ); + + // XTextListener -> modify setzen + virtual void SAL_CALL textChanged(const ::com::sun::star::awt::TextEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XItemListener -> modify setzen + virtual void SAL_CALL itemStateChanged(const ::com::sun::star::awt::ItemEvent& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XModifyListener -> modify setzen + virtual void SAL_CALL modified(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XFormController + virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > SAL_CALL getFormOperations() throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> SAL_CALL getCurrentControl(void) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL addActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener>& l) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener>& l) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL addChildController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _ChildController ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext > SAL_CALL getContext() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setContext( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext >& _context ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > SAL_CALL getInteractionHandler() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setInteractionHandler( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _interactionHandler ) throw (::com::sun::star::uno::RuntimeException); + + // XTabController + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> > SAL_CALL getControls(void) throw( ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel>& Model) throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel> SAL_CALL getModel() throw( ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL setContainer(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer>& Container) throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer> SAL_CALL getContainer() throw( ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL autoTabOrder() throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL activateTabOrder() throw( ::com::sun::star::uno::RuntimeException ); + + virtual void SAL_CALL activateFirst() throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL activateLast() throw( ::com::sun::star::uno::RuntimeException ); + + // com::sun::star::sdbc::XRowSetListener + virtual void SAL_CALL cursorMoved(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL rowChanged(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL rowSetChanged(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); + + // XRowSetApproveListener + virtual sal_Bool SAL_CALL approveCursorMove(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Bool SAL_CALL approveRowChange(const ::com::sun::star::sdb::RowChangeEvent& event) throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Bool SAL_CALL approveRowSetChange(const ::com::sun::star::lang::EventObject& event) throw( ::com::sun::star::uno::RuntimeException ); + + // XRowSetApproveBroadcaster + virtual void SAL_CALL addRowSetApproveListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener>& listener) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeRowSetApproveListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener>& listener) throw( ::com::sun::star::uno::RuntimeException ); + + // XSQLErrorBroadcaster + virtual void SAL_CALL errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XSQLErrorListener + virtual void SAL_CALL addSQLErrorListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener>& _rListener) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeSQLErrorListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener>& _rListener) throw( ::com::sun::star::uno::RuntimeException ); + + // XDatabaseParameterBroadcaster2 + virtual void SAL_CALL addDatabaseParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeDatabaseParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); + + // XDatabaseParameterBroadcaster + virtual void SAL_CALL addParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeParameterListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); + + // XDatabaseParameterListener + virtual sal_Bool SAL_CALL approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XConfirmDeleteBroadcaster + virtual void SAL_CALL addConfirmDeleteListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeConfirmDeleteListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener>& aListener) throw( ::com::sun::star::uno::RuntimeException ); + + // XConfirmDeleteListener + virtual sal_Bool SAL_CALL confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XServiceInfo + virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw(::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw(::com::sun::star::uno::RuntimeException); + + // XResetListener + virtual sal_Bool SAL_CALL approveReset(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException ); + + // XFeatureInvalidation + virtual void SAL_CALL invalidateFeatures( const ::com::sun::star::uno::Sequence< ::sal_Int16 >& Features ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL invalidateAllFeatures( ) throw (::com::sun::star::uno::RuntimeException); + +// method for registration + static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void); + + // comphelper::OPropertyArrayUsageHelper + virtual void fillProperties( + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps, + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rAggregateProps + ) const; + + protected: + // DispatchInterceptor + virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch> + interceptedQueryDispatch( + const ::com::sun::star::util::URL& aURL, + const ::rtl::OUString& aTargetFrameName, + sal_Int32 nSearchFlags + ) throw( ::com::sun::star::uno::RuntimeException ); + + virtual ::osl::Mutex* getInterceptorMutex() { return &m_aMutex; } + + /// update all our dispatchers + void updateAllDispatchers() const; + + /** disposes all dispatchers in m_aFeatureDispatchers, and empties m_aFeatureDispatchers + */ + void disposeAllFeaturesAndDispatchers() SAL_THROW(()); + + void startFiltering(); + void stopFiltering(); + void setFilter(::std::vector<FmFieldInfo>&); + void startListening(); + void stopListening(); + + /** ensures that we have an interaction handler, if possible + + If an interaction handler was provided at creation time (<member>initialize</member>), this + one will be used. Else, an attempt is made to create an <type scope="com::sun::star::sdb">InteractionHandler</type> + is made. + + @return <TRUE/> + if and only if <member>m_xInteractionHandler</member> is valid when the method returns + */ + bool ensureInteractionHandler(); + + /** replaces one of our controls with another one + + Upon successful replacing, the old control will be disposed. Also, internal members pointing + to the current or active control will be adjusted. Yet more, if the replaced control was + the active control, the new control will be made active. + + @param _rxExistentControl + The control to replace. Must be one of the controls in our ControlContainer. + @param _rxNewControl + The control which should replace the existent control. + @return + <TRUE/> if and only if the control was successfully replaced + */ + bool replaceControl( + const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxExistentControl, + const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxNewControl + ); + + // we're listening at all bound controls for modifications + void startControlModifyListening(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); + void stopControlModifyListening(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); + + void setLocks(); + void setControlLock(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); + void addToEventAttacher(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); + void removeFromEventAttacher(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); + void toggleAutoFields(sal_Bool bAutoFields); + void unload() throw( ::com::sun::star::uno::RuntimeException ); + void removeBoundFieldListener(); + + void startFormListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ); + void stopFormListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxForm, sal_Bool _bPropertiesOnly ); + + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> findControl( ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> >& rCtrls, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel>& rxCtrlModel, sal_Bool _bRemove, sal_Bool _bOverWrite ) const; + + void insertControl(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); + void removeControl(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& xControl); + + /// called when a new control is to be handled by the controller + void implControlInserted( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& _rxControl, bool _bAddToEventAttacher ); + /// called when a control is not to be handled by the controller anymore + void implControlRemoved( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& _rxControl, bool _bRemoveFromEventAttacher ); + + /** sets m_xCurrentControl, plus does administrative tasks depending on it + */ + void implSetCurrentControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxControl ); + + /** invalidates the FormFeatures which depend on the current control + */ + void implInvalidateCurrentControlDependentFeatures(); + + bool impl_isDisposed_nofail() const { return FormController_BASE::rBHelper.bDisposed; } + void impl_checkDisposed_throw() const; + + void impl_onModify(); + + /** adds the given filter row to m_aFilterRows, setting m_nCurrentFilterPosition to 0 if the newly added + row is the first one. + + @precond + our mutex is locked + */ + void impl_addFilterRow( const FmFilterRow& _row ); + + /** adds an empty filter row to m_aFilterRows, and notifies our listeners + */ + void impl_appendEmptyFilterRow( ::osl::ClearableMutexGuard& _rClearBeforeNotify ); + + sal_Bool isLocked() const {return m_bLocked;} + sal_Bool determineLockState() const; + + Window* getDialogParentWindow(); + // returns the window which should be used as parent window for dialogs + + ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterceptor> createInterceptor(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _xInterception); + // create a new interceptor, register it on the given object + void deleteInterceptor(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _xInterception); + // if createInterceptor was called for the given object the according interceptor will be removed + // from the objects interceptor chain and released + + /** checks all form controls belonging to our form for validity + + If a form control supports the XValidatableFormComponent interface, this is used to determine + the validity of the control. If the interface is not supported, the control is supposed to be + valid. + + @param _rFirstInvalidityExplanation + if the method returns <FALSE/> (i.e. if there is an invalid control), this string contains + the explanation for the invalidity, as obtained from the validator. + + @param _rxFirstInvalidModel + if the method returns <FALSE/> (i.e. if there is an invalid control), this contains + the control model + + @return + <TRUE/> if and only if all controls belonging to our form are valid + */ + bool checkFormComponentValidity( + ::rtl::OUString& /* [out] */ _rFirstInvalidityExplanation, + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& /* [out] */ _rxFirstInvalidModel + ) SAL_THROW(()); + + /** locates the control which belongs to a given model + */ + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > + locateControl( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& _rxModel ) SAL_THROW(()); + + // set the text for all filters + void impl_setTextOnAllFilter_throw(); + + // in filter mode we do not listen for changes + sal_Bool isListeningForChanges() const {return m_bDBConnection && !m_bFiltering && !isLocked();} + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl> isInList(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer>& xPeer) const; + + DECL_LINK( OnActivateTabOrder, void* ); + DECL_LINK( OnInvalidateFeatures, void* ); + DECL_LINK( OnLoad, void* ); + DECL_LINK( OnToggleAutoFields, void* ); + DECL_LINK( OnActivated, void* ); + DECL_LINK( OnDeactivated, void* ); + }; + +} // namespace svxform + +#endif // _SVX_FMCTRLER_HXX + diff --git a/svx/source/inc/formcontrolling.hxx b/svx/source/inc/formcontrolling.hxx index d082bd889804..f818ced85189 100644 --- a/svx/source/inc/formcontrolling.hxx +++ b/svx/source/inc/formcontrolling.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: formcontrolling.hxx,v $ - * $Revision: 1.7 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -31,7 +28,7 @@ #ifndef SVX_FORMCONTROLLING_HXX #define SVX_FORMCONTROLLING_HXX -#include <com/sun/star/form/XFormController.hpp> +#include <com/sun/star/form/runtime/XFormController.hpp> #include <com/sun/star/form/XForm.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/form/runtime/FeatureState.hpp> @@ -117,7 +114,7 @@ namespace svx IControllerFeatureInvalidation* _pInvalidationCallback ); - /** constructs the instance from a <type scope="com::sun::star::form">XFormController<type> instance + /** constructs the instance from a <type scope="com::sun::star::form::runtime">XFormController<type> instance @param _rxORB a multi service factory for creating various needed components @@ -131,7 +128,7 @@ namespace svx */ ControllerFeatures( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB, - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController, + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController, IControllerFeatureInvalidation* _pInvalidationCallback ); @@ -163,7 +160,7 @@ namespace svx /** assign to a controller */ void assign( - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController ); /** assign to a controller @@ -206,7 +203,7 @@ namespace svx ::com::sun::star::uno::Any m_aOperationError; public: - /** constructs the helper from a <type scope="com::sun::star::form">XFormController<type> instance + /** constructs the helper from a <type scope="com::sun::star::form::runtime">XFormController<type> instance @param _rContext the context the component lives in @@ -218,7 +215,7 @@ namespace svx */ FormControllerHelper( const ::comphelper::ComponentContext& _rContext, - const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController, + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController, IControllerFeatureInvalidation* _pInvalidationCallback ); diff --git a/svx/source/inc/formdispatchinterceptor.hxx b/svx/source/inc/formdispatchinterceptor.hxx new file mode 100644 index 000000000000..5bcfc1726ad0 --- /dev/null +++ b/svx/source/inc/formdispatchinterceptor.hxx @@ -0,0 +1,118 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* <http://www.openoffice.org/license.html> +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVX_FORMDISPATCHINTERCEPTOR_HXX +#define SVX_FORMDISPATCHINTERCEPTOR_HXX + +/** === begin UNO includes === **/ +#include <com/sun/star/frame/XDispatchProviderInterceptor.hpp> +#include <com/sun/star/frame/XDispatchProviderInterception.hpp> +/** === end UNO includes === **/ + +#include <cppuhelper/compbase2.hxx> +#include <comphelper/uno3.hxx> + +//........................................................................ +namespace svxform +{ +//........................................................................ + + //==================================================================== + //= DispatchInterceptor + //==================================================================== + class DispatchInterceptor + { + public: + DispatchInterceptor() { } + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch> interceptedQueryDispatch( + const ::com::sun::star::util::URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags) throw( ::com::sun::star::uno::RuntimeException ) = 0; + + virtual ::osl::Mutex* getInterceptorMutex() = 0; + }; + + //==================================================================== + //= + //==================================================================== + typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::frame::XDispatchProviderInterceptor + , ::com::sun::star::lang::XEventListener + > DispatchInterceptionMultiplexer_BASE; + + class DispatchInterceptionMultiplexer : public DispatchInterceptionMultiplexer_BASE + { + ::osl::Mutex m_aFallback; + ::osl::Mutex* m_pMutex; + + // the component which's dispatches we're intercepting + ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XDispatchProviderInterception > + m_xIntercepted; + sal_Bool m_bListening; + + // the real interceptor + DispatchInterceptor* m_pMaster; + + // chaining + ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider> m_xSlaveDispatcher; + ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider> m_xMasterDispatcher; + + virtual ~DispatchInterceptionMultiplexer(); + + public: + ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception> getIntercepted() const { return m_xIntercepted; } + + public: + DispatchInterceptionMultiplexer( + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _rToIntercept, + DispatchInterceptor* _pMaster + ); + + // UNO + DECLARE_UNO3_DEFAULTS(DispatchInterceptionMultiplexer, DispatchInterceptionMultiplexer_BASE); + + // ::com::sun::star::frame::XDispatchProvider + virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > SAL_CALL queryDispatch( const ::com::sun::star::util::URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags ) throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > > SAL_CALL queryDispatches( const ::com::sun::star::uno::Sequence< ::com::sun::star::frame::DispatchDescriptor >& aDescripts ) throw(::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::frame::XDispatchProviderInterceptor + virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL getSlaveDispatchProvider( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setSlaveDispatchProvider( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider >& xNewDispatchProvider ) throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL getMasterDispatchProvider( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setMasterDispatchProvider( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider >& xNewSupplier ) throw(::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::lang::XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); + + // OComponentHelper + virtual void SAL_CALL disposing(); + + protected: + void ImplDetach(); + }; + +//........................................................................ +} // namespace svxform +//........................................................................ + +#endif // SVX_FORMDISPATCHINTERCEPTOR_HXX diff --git a/svx/source/inc/fmdispatch.hxx b/svx/source/inc/formfeaturedispatcher.hxx index 90480afc4609..32316d52b922 100644 --- a/svx/source/inc/fmdispatch.hxx +++ b/svx/source/inc/formfeaturedispatcher.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fmdispatch.hxx,v $ - * $Revision: 1.4 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -31,19 +28,20 @@ #ifndef SVX_FMDISPATCH_HXX #define SVX_FMDISPATCH_HXX -#include <cppuhelper/implbase1.hxx> -#include <cppuhelper/interfacecontainer.hxx> +/** === begin UNO includes === **/ #include <com/sun/star/frame/XDispatch.hpp> #include <com/sun/star/lang/DisposedException.hpp> +#include <com/sun/star/form/runtime/XFormOperations.hpp> +/** === end UNO includes === **/ +#include <cppuhelper/implbase1.hxx> +#include <cppuhelper/interfacecontainer.hxx> //........................................................................ namespace svx { //........................................................................ - class FormControllerHelper; - //==================================================================== //= OSingleFeatureDispatcher //==================================================================== @@ -55,10 +53,11 @@ namespace svx private: ::osl::Mutex& m_rMutex; ::cppu::OInterfaceContainerHelper m_aStatusListeners; - const FormControllerHelper& m_rController; + ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > + m_xFormOperations; const ::com::sun::star::util::URL m_aFeatureURL; ::com::sun::star::uno::Any m_aLastKnownState; - const sal_Int32 m_nFeatureId; + const sal_Int16 m_nFormFeature; sal_Bool m_bLastKnownEnabled; sal_Bool m_bDisposed; @@ -80,9 +79,9 @@ namespace svx */ OSingleFeatureDispatcher( const ::com::sun::star::util::URL& _rFeatureURL, - sal_Int32 _nFeatureId, - const FormControllerHelper& _rController, - ::osl::Mutex& _rMutex + const sal_Int16 _nFormFeature, + const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations >& _rxFormOperations, + ::osl::Mutex& _rMutex ); /** disposes the dispatcher instance diff --git a/svx/source/inc/gridcell.hxx b/svx/source/inc/gridcell.hxx index cb747e3a894c..b3792b76422c 100644 --- a/svx/source/inc/gridcell.hxx +++ b/svx/source/inc/gridcell.hxx @@ -35,7 +35,6 @@ #include "sqlparserclient.hxx" #include "typeconversionclient.hxx" -#include "fmtools.hxx" /** === begin UNO includes === **/ #include <com/sun/star/sdb/XColumn.hpp> @@ -51,6 +50,7 @@ #include <com/sun/star/beans/XFastPropertySet.hpp> #include <com/sun/star/lang/XUnoTunnel.hpp> #include <com/sun/star/form/XChangeBroadcaster.hpp> +#include <com/sun/star/awt/XWindow.hpp> /** === end UNO includes === **/ #include <comphelper/propmultiplex.hxx> diff --git a/svx/source/inc/tabwin.hxx b/svx/source/inc/tabwin.hxx index be46c05a58d5..02f58a507511 100644 --- a/svx/source/inc/tabwin.hxx +++ b/svx/source/inc/tabwin.hxx @@ -37,9 +37,6 @@ #include <sfx2/ctrlitem.hxx> #include <com/sun/star/form/XForm.hpp> -//#ifndef _SVX_FMTOOLS_HXX -//#include "fmtools.hxx" -//#endif #include <comphelper/propmultiplex.hxx> #include <svtools/transfer.hxx> #include "svx/dbtoolsclient.hxx" diff --git a/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx b/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx index bbfe3eaf65ab..3a446d96ef59 100644 --- a/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx +++ b/svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx @@ -257,8 +257,8 @@ namespace sdr { namespace contact { // no check whether we're valid, this is the responsibility of the caller // Argh. Why does XView have a setZoom only, but not a getZoom? - Window* pWindow = VCLUnoHelper::GetWindow( m_xControlWindow ); - OSL_ENSURE( pWindow, "ControlHolder::setZoom: no implementation access!" ); + Window* pWindow = VCLUnoHelper::GetWindow( m_xControl->getPeer() ); + OSL_ENSURE( pWindow, "ControlHolder::getZoom: no implementation access!" ); ::basegfx::B2DVector aZoom( 1, 1 ); if ( pWindow ) @@ -606,14 +606,6 @@ namespace sdr { namespace contact { */ bool isControlVisible() const { return impl_isControlVisible_nofail(); } - /** determines whether the instance belongs to a given OutputDevice - @precond - The instance knows the device it belongs to, or can determine it. - If this is not the case, you will notice an assertion, and the method will - return false. - */ - bool belongsToDevice( const OutputDevice* _pDevice ) const; - /// creates an XControl for the given device and SdrUnoObj static bool createControlForDevice( @@ -1056,10 +1048,10 @@ namespace sdr { namespace contact { namespace { - static void lcl_resetFlag( bool& rbFlag )
- {
- rbFlag = false;
- }
+ static void lcl_resetFlag( bool& rbFlag ) + { + rbFlag = false; + } } //-------------------------------------------------------------------- @@ -1082,8 +1074,8 @@ namespace sdr { namespace contact { } m_bCreatingControl = true; - ::comphelper::ScopeGuard aGuard( ::boost::bind( lcl_resetFlag, ::boost::ref( m_bCreatingControl ) ) );
-
+ ::comphelper::ScopeGuard aGuard( ::boost::bind( lcl_resetFlag, ::boost::ref( m_bCreatingControl ) ) ); + if ( m_aControl.is() ) { if ( m_pOutputDeviceForWindow == &_rDevice ) @@ -1486,31 +1478,33 @@ namespace sdr { namespace contact { VOCGuard aGuard( *this ); DBG_ASSERT( Event.Source == m_xContainer, "ViewObjectContactOfUnoControl_Impl::elementReplaced: where did this come from?" ); - if ( m_aControl == Event.ReplacedElement ) - { - Reference< XControl > xNewControl( Event.Element, UNO_QUERY ); - DBG_ASSERT( xNewControl.is(), "ViewObjectContactOfUnoControl_Impl::elementReplaced: invalid new control!" ); - if ( !xNewControl.is() ) - return; + if ( ! ( m_aControl == Event.ReplacedElement ) ) + return; - ENSURE_OR_THROW( m_pOutputDeviceForWindow, "calling this without /me having an output device should be impossible." ); + Reference< XControl > xNewControl( Event.Element, UNO_QUERY ); + DBG_ASSERT( xNewControl.is(), "ViewObjectContactOfUnoControl_Impl::elementReplaced: invalid new control!" ); + if ( !xNewControl.is() ) + return; - DBG_ASSERT( xNewControl->getModel() == m_aControl.getModel(), "ViewObjectContactOfUnoControl_Impl::elementReplaced: another model at the new control?" ); - // another model should - in the drawing layer - also imply another SdrUnoObj, which - // should also result in new ViewContact, and thus in new ViewObjectContacts + ENSURE_OR_THROW( m_pOutputDeviceForWindow, "calling this without /me having an output device should be impossible." ); - impl_switchControlListening_nothrow( false ); + DBG_ASSERT( xNewControl->getModel() == m_aControl.getModel(), "ViewObjectContactOfUnoControl_Impl::elementReplaced: another model at the new control?" ); + // another model should - in the drawing layer - also imply another SdrUnoObj, which + // should also result in new ViewContact, and thus in new ViewObjectContacts - ControlHolder aNewControl( xNewControl ); - aNewControl.setZoom( m_aControl.getZoom() ); - aNewControl.setPosSize( m_aControl.getPosSize() ); - aNewControl.setDesignMode( impl_isControlDesignMode_nothrow() ); + impl_switchControlListening_nothrow( false ); - m_aControl = xNewControl; - m_bControlIsVisible = m_aControl.isVisible(); + ControlHolder aNewControl( xNewControl ); + aNewControl.setZoom( m_aControl.getZoom() ); + aNewControl.setPosSize( m_aControl.getPosSize() ); + aNewControl.setDesignMode( impl_isControlDesignMode_nothrow() ); - impl_switchControlListening_nothrow( true ); - } + m_aControl = xNewControl; + m_bControlIsVisible = m_aControl.isVisible(); + + impl_switchControlListening_nothrow( true ); + + m_pAntiImpl->onControlChangedOrModified( ViewObjectContactOfUnoControl::ImplAccess() ); } //-------------------------------------------------------------------- @@ -1737,8 +1731,8 @@ namespace sdr { namespace contact { // our control already died. // TODO: Is it worth re-creating the control? Finally, this is a pathological situation, it means some instance // disposed the control though it doesn't own it. So, /me thinks we should not bother here. - return drawinglayer::primitive2d::Primitive2DSequence();
-
+ return drawinglayer::primitive2d::Primitive2DSequence(); + ::drawinglayer::primitive2d::Primitive2DReference xPrimitive( new LazyControlCreationPrimitive2D( m_pImpl ) ); return ::drawinglayer::primitive2d::Primitive2DSequence( &xPrimitive, 1 ); } @@ -1746,14 +1740,7 @@ namespace sdr { namespace contact { //-------------------------------------------------------------------- void ViewObjectContactOfUnoControl::propertyChange() { - // graphical invalidate at all views - ActionChanged(); - - // #i93318# flush Primitive2DSequence to force recreation with updated XControlModel - // since e.g. background color has changed and existing decompositions are possibly no - // longer valid. Unfortunately this is not detected from ControlPrimitive2D::operator== - // since it only has a uno reference to the XControlModel - flushPrimitive2DSequence(); + impl_onControlChangedOrModified(); } //-------------------------------------------------------------------- @@ -1781,6 +1768,19 @@ namespace sdr { namespace contact { } } + //-------------------------------------------------------------------- + void ViewObjectContactOfUnoControl::impl_onControlChangedOrModified() + { + // graphical invalidate at all views + ActionChanged(); + + // #i93318# flush Primitive2DSequence to force recreation with updated XControlModel + // since e.g. background color has changed and existing decompositions are possibly no + // longer valid. Unfortunately this is not detected from ControlPrimitive2D::operator== + // since it only has a uno reference to the XControlModel + flushPrimitive2DSequence(); + } + //==================================================================== //= UnoControlPrintOrPreviewContact //==================================================================== |