1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_svx.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include "filtnav.hxx" 33*cdf0e10cSrcweir #include "fmexch.hxx" 34*cdf0e10cSrcweir #include "fmhelp.hrc" 35*cdf0e10cSrcweir #include "fmitems.hxx" 36*cdf0e10cSrcweir #include "fmprop.hrc" 37*cdf0e10cSrcweir #include "svx/fmresids.hrc" 38*cdf0e10cSrcweir #include "gridcell.hxx" 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir /** === begin UNO includes === **/ 41*cdf0e10cSrcweir #include <com/sun/star/form/runtime/XFormController.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatter.hpp> 44*cdf0e10cSrcweir /** === end UNO includes === **/ 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 47*cdf0e10cSrcweir #include <svx/fmtools.hxx> 48*cdf0e10cSrcweir #include <comphelper/property.hxx> 49*cdf0e10cSrcweir #include <comphelper/sequence.hxx> 50*cdf0e10cSrcweir #include <comphelper/uno3.hxx> 51*cdf0e10cSrcweir #include <connectivity/dbtools.hxx> 52*cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 53*cdf0e10cSrcweir #include <fmservs.hxx> 54*cdf0e10cSrcweir #include <fmshimp.hxx> 55*cdf0e10cSrcweir #include <rtl/logfile.hxx> 56*cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 57*cdf0e10cSrcweir #include <sfx2/objitem.hxx> 58*cdf0e10cSrcweir #include <sfx2/objsh.hxx> 59*cdf0e10cSrcweir #include <sfx2/request.hxx> 60*cdf0e10cSrcweir #include <svx/dialmgr.hxx> 61*cdf0e10cSrcweir #include <svx/fmshell.hxx> 62*cdf0e10cSrcweir #include <svx/svxids.hrc> 63*cdf0e10cSrcweir #include <tools/shl.hxx> 64*cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir #include <functional> 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir #define SYNC_DELAY 200 69*cdf0e10cSrcweir #define DROP_ACTION_TIMER_INITIAL_TICKS 10 70*cdf0e10cSrcweir // solange dauert es, bis das Scrollen anspringt 71*cdf0e10cSrcweir #define DROP_ACTION_TIMER_SCROLL_TICKS 3 72*cdf0e10cSrcweir // in diesen Intervallen wird jeweils eine Zeile gescrollt 73*cdf0e10cSrcweir #define DROP_ACTION_TIMER_TICK_BASE 10 74*cdf0e10cSrcweir // das ist die Basis, mit der beide Angaben multipliziert werden (in ms) 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir using namespace ::svxform; 77*cdf0e10cSrcweir using namespace ::connectivity::simple; 78*cdf0e10cSrcweir using namespace ::connectivity; 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir //........................................................................ 82*cdf0e10cSrcweir namespace svxform 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir //........................................................................ 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir /** === begin UNO using === **/ 87*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 88*cdf0e10cSrcweir using ::com::sun::star::lang::XMultiServiceFactory; 89*cdf0e10cSrcweir using ::com::sun::star::awt::TextEvent; 90*cdf0e10cSrcweir using ::com::sun::star::container::XIndexAccess; 91*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY; 92*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet; 93*cdf0e10cSrcweir using ::com::sun::star::form::runtime::XFormController; 94*cdf0e10cSrcweir using ::com::sun::star::form::runtime::XFilterController; 95*cdf0e10cSrcweir using ::com::sun::star::form::runtime::XFilterControllerListener; 96*cdf0e10cSrcweir using ::com::sun::star::form::runtime::FilterEvent; 97*cdf0e10cSrcweir using ::com::sun::star::lang::EventObject; 98*cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException; 99*cdf0e10cSrcweir using ::com::sun::star::form::XForm; 100*cdf0e10cSrcweir using ::com::sun::star::container::XChild; 101*cdf0e10cSrcweir using ::com::sun::star::awt::XControl; 102*cdf0e10cSrcweir using ::com::sun::star::sdbc::XConnection; 103*cdf0e10cSrcweir using ::com::sun::star::util::XNumberFormatsSupplier; 104*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet; 105*cdf0e10cSrcweir using ::com::sun::star::util::XNumberFormatter; 106*cdf0e10cSrcweir using ::com::sun::star::sdbc::XRowSet; 107*cdf0e10cSrcweir using ::com::sun::star::lang::Locale; 108*cdf0e10cSrcweir using ::com::sun::star::sdb::SQLContext; 109*cdf0e10cSrcweir using ::com::sun::star::uno::XInterface; 110*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW; 111*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_SET_THROW; 112*cdf0e10cSrcweir using ::com::sun::star::uno::Exception; 113*cdf0e10cSrcweir using ::com::sun::star::awt::XTextComponent; 114*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 115*cdf0e10cSrcweir /** === end UNO using === **/ 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir //======================================================================== 118*cdf0e10cSrcweir OFilterItemExchange::OFilterItemExchange() 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir //------------------------------------------------------------------------ 123*cdf0e10cSrcweir void OFilterItemExchange::AddSupportedFormats() 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir AddFormat(getFormatId()); 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir //------------------------------------------------------------------------ 129*cdf0e10cSrcweir sal_uInt32 OFilterItemExchange::getFormatId() 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir static sal_uInt32 s_nFormat = (sal_uInt32)-1; 132*cdf0e10cSrcweir if ((sal_uInt32)-1 == s_nFormat) 133*cdf0e10cSrcweir { 134*cdf0e10cSrcweir s_nFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"form.FilterControlExchange\"")); 135*cdf0e10cSrcweir DBG_ASSERT((sal_uInt32)-1 != s_nFormat, "OFilterExchangeHelper::getFormatId: bad exchange id!"); 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir return s_nFormat; 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir //------------------------------------------------------------------------ 141*cdf0e10cSrcweir OLocalExchange* OFilterExchangeHelper::createExchange() const 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir return new OFilterItemExchange; 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir //======================================================================== 147*cdf0e10cSrcweir TYPEINIT0(FmFilterData); 148*cdf0e10cSrcweir Image FmFilterData::GetImage( BmpColorMode /*_eMode*/ ) const 149*cdf0e10cSrcweir { 150*cdf0e10cSrcweir return Image(); 151*cdf0e10cSrcweir } 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir //======================================================================== 154*cdf0e10cSrcweir TYPEINIT1(FmParentData, FmFilterData); 155*cdf0e10cSrcweir //------------------------------------------------------------------------ 156*cdf0e10cSrcweir FmParentData::~FmParentData() 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir for (::std::vector<FmFilterData*>::const_iterator i = m_aChildren.begin(); 159*cdf0e10cSrcweir i != m_aChildren.end(); i++) 160*cdf0e10cSrcweir delete (*i); 161*cdf0e10cSrcweir } 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir //======================================================================== 164*cdf0e10cSrcweir TYPEINIT1(FmFormItem, FmParentData); 165*cdf0e10cSrcweir //------------------------------------------------------------------------ 166*cdf0e10cSrcweir Image FmFormItem::GetImage( BmpColorMode _eMode ) const 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir static Image aImage; 169*cdf0e10cSrcweir static Image aImage_HC; 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir if (!aImage) 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir ImageList aNavigatorImages( SVX_RES( RID_SVXIMGLIST_FMEXPL ) ); 174*cdf0e10cSrcweir ImageList aNavigatorImages_HC( SVX_RES( RID_SVXIMGLIST_FMEXPL_HC ) ); 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir aImage = aNavigatorImages.GetImage( RID_SVXIMG_FORM ); 177*cdf0e10cSrcweir aImage_HC = aNavigatorImages_HC.GetImage( RID_SVXIMG_FORM ); 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir return ( BMP_COLOR_HIGHCONTRAST == _eMode ) ? aImage_HC : aImage; 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir //======================================================================== 183*cdf0e10cSrcweir TYPEINIT1(FmFilterItems, FmParentData); 184*cdf0e10cSrcweir //------------------------------------------------------------------------ 185*cdf0e10cSrcweir FmFilterItem* FmFilterItems::Find( const ::sal_Int32 _nFilterComponentIndex ) const 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir for ( ::std::vector< FmFilterData* >::const_iterator i = m_aChildren.begin(); 188*cdf0e10cSrcweir i != m_aChildren.end(); 189*cdf0e10cSrcweir ++i 190*cdf0e10cSrcweir ) 191*cdf0e10cSrcweir { 192*cdf0e10cSrcweir FmFilterItem* pCondition = PTR_CAST( FmFilterItem, *i ); 193*cdf0e10cSrcweir DBG_ASSERT( pCondition, "FmFilterItems::Find: Wrong element in container!" ); 194*cdf0e10cSrcweir if ( _nFilterComponentIndex == pCondition->GetComponentIndex() ) 195*cdf0e10cSrcweir return pCondition; 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir return NULL; 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir //------------------------------------------------------------------------ 201*cdf0e10cSrcweir Image FmFilterItems::GetImage( BmpColorMode _eMode ) const 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir static Image aImage; 204*cdf0e10cSrcweir static Image aImage_HC; 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir if (!aImage) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir ImageList aNavigatorImages( SVX_RES( RID_SVXIMGLIST_FMEXPL ) ); 209*cdf0e10cSrcweir ImageList aNavigatorImages_HC( SVX_RES( RID_SVXIMGLIST_FMEXPL_HC ) ); 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir aImage = aNavigatorImages.GetImage( RID_SVXIMG_FILTER ); 212*cdf0e10cSrcweir aImage_HC = aNavigatorImages_HC.GetImage( RID_SVXIMG_FILTER ); 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir return ( BMP_COLOR_HIGHCONTRAST == _eMode ) ? aImage_HC : aImage; 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir //======================================================================== 218*cdf0e10cSrcweir TYPEINIT1(FmFilterItem, FmFilterData); 219*cdf0e10cSrcweir //------------------------------------------------------------------------ 220*cdf0e10cSrcweir FmFilterItem::FmFilterItem( const Reference< XMultiServiceFactory >& _rxFactory, 221*cdf0e10cSrcweir FmFilterItems* pParent, 222*cdf0e10cSrcweir const ::rtl::OUString& aFieldName, 223*cdf0e10cSrcweir const ::rtl::OUString& aText, 224*cdf0e10cSrcweir const sal_Int32 _nComponentIndex ) 225*cdf0e10cSrcweir :FmFilterData(_rxFactory,pParent, aText) 226*cdf0e10cSrcweir ,m_aFieldName(aFieldName) 227*cdf0e10cSrcweir ,m_nComponentIndex( _nComponentIndex ) 228*cdf0e10cSrcweir { 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir //------------------------------------------------------------------------ 232*cdf0e10cSrcweir Image FmFilterItem::GetImage( BmpColorMode _eMode ) const 233*cdf0e10cSrcweir { 234*cdf0e10cSrcweir static Image aImage; 235*cdf0e10cSrcweir static Image aImage_HC; 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir if (!aImage) 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir ImageList aNavigatorImages( SVX_RES( RID_SVXIMGLIST_FMEXPL ) ); 240*cdf0e10cSrcweir ImageList aNavigatorImages_HC( SVX_RES( RID_SVXIMGLIST_FMEXPL_HC ) ); 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir aImage = aNavigatorImages.GetImage( RID_SVXIMG_FIELD ); 243*cdf0e10cSrcweir aImage_HC = aNavigatorImages_HC.GetImage( RID_SVXIMG_FIELD ); 244*cdf0e10cSrcweir } 245*cdf0e10cSrcweir return ( BMP_COLOR_HIGHCONTRAST == _eMode ) ? aImage_HC : aImage; 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir //======================================================================== 249*cdf0e10cSrcweir // Hints for communicatition between model and view 250*cdf0e10cSrcweir //======================================================================== 251*cdf0e10cSrcweir class FmFilterHint : public SfxHint 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir FmFilterData* m_pData; 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir public: 256*cdf0e10cSrcweir TYPEINFO(); 257*cdf0e10cSrcweir FmFilterHint(FmFilterData* pData):m_pData(pData){} 258*cdf0e10cSrcweir FmFilterData* GetData() const { return m_pData; } 259*cdf0e10cSrcweir }; 260*cdf0e10cSrcweir TYPEINIT1( FmFilterHint, SfxHint ); 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir //======================================================================== 263*cdf0e10cSrcweir class FmFilterInsertedHint : public FmFilterHint 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir sal_Int32 m_nPos; // Position relative to the parent of the data 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir public: 268*cdf0e10cSrcweir TYPEINFO(); 269*cdf0e10cSrcweir FmFilterInsertedHint(FmFilterData* pData, sal_Int32 nRelPos) 270*cdf0e10cSrcweir :FmFilterHint(pData) 271*cdf0e10cSrcweir ,m_nPos(nRelPos){} 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir sal_Int32 GetPos() const { return m_nPos; } 274*cdf0e10cSrcweir }; 275*cdf0e10cSrcweir TYPEINIT1( FmFilterInsertedHint, FmFilterHint ); 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir //======================================================================== 278*cdf0e10cSrcweir class FmFilterRemovedHint : public FmFilterHint 279*cdf0e10cSrcweir { 280*cdf0e10cSrcweir public: 281*cdf0e10cSrcweir TYPEINFO(); 282*cdf0e10cSrcweir FmFilterRemovedHint(FmFilterData* pData) 283*cdf0e10cSrcweir :FmFilterHint(pData){} 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir }; 286*cdf0e10cSrcweir TYPEINIT1( FmFilterRemovedHint, FmFilterHint ); 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir //======================================================================== 289*cdf0e10cSrcweir class FmFilterTextChangedHint : public FmFilterHint 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir public: 292*cdf0e10cSrcweir TYPEINFO(); 293*cdf0e10cSrcweir FmFilterTextChangedHint(FmFilterData* pData) 294*cdf0e10cSrcweir :FmFilterHint(pData){} 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir }; 297*cdf0e10cSrcweir TYPEINIT1( FmFilterTextChangedHint, FmFilterHint ); 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir //======================================================================== 300*cdf0e10cSrcweir class FilterClearingHint : public SfxHint 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir public: 303*cdf0e10cSrcweir TYPEINFO(); 304*cdf0e10cSrcweir FilterClearingHint(){} 305*cdf0e10cSrcweir }; 306*cdf0e10cSrcweir TYPEINIT1( FilterClearingHint, SfxHint ); 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir //======================================================================== 309*cdf0e10cSrcweir class FmFilterCurrentChangedHint : public SfxHint 310*cdf0e10cSrcweir { 311*cdf0e10cSrcweir public: 312*cdf0e10cSrcweir TYPEINFO(); 313*cdf0e10cSrcweir FmFilterCurrentChangedHint(){} 314*cdf0e10cSrcweir }; 315*cdf0e10cSrcweir TYPEINIT1( FmFilterCurrentChangedHint, SfxHint ); 316*cdf0e10cSrcweir 317*cdf0e10cSrcweir //======================================================================== 318*cdf0e10cSrcweir // class FmFilterAdapter, Listener an den FilterControls 319*cdf0e10cSrcweir //======================================================================== 320*cdf0e10cSrcweir class FmFilterAdapter : public ::cppu::WeakImplHelper1< XFilterControllerListener > 321*cdf0e10cSrcweir { 322*cdf0e10cSrcweir FmFilterModel* m_pModel; 323*cdf0e10cSrcweir Reference< XIndexAccess > m_xControllers; 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir public: 326*cdf0e10cSrcweir FmFilterAdapter(FmFilterModel* pModel, const Reference< XIndexAccess >& xControllers); 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir // XEventListener 329*cdf0e10cSrcweir virtual void SAL_CALL disposing(const EventObject& Source) throw( RuntimeException ); 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir // XFilterControllerListener 332*cdf0e10cSrcweir virtual void SAL_CALL predicateExpressionChanged( const FilterEvent& _Event ) throw (RuntimeException); 333*cdf0e10cSrcweir virtual void SAL_CALL disjunctiveTermRemoved( const FilterEvent& _Event ) throw (RuntimeException); 334*cdf0e10cSrcweir virtual void SAL_CALL disjunctiveTermAdded( const FilterEvent& _Event ) throw (RuntimeException); 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir // helpers 337*cdf0e10cSrcweir void dispose() throw( RuntimeException ); 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir void AddOrRemoveListener( const Reference< XIndexAccess >& _rxControllers, const bool _bAdd ); 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir void setText(sal_Int32 nPos, 342*cdf0e10cSrcweir const FmFilterItem* pFilterItem, 343*cdf0e10cSrcweir const ::rtl::OUString& rText); 344*cdf0e10cSrcweir }; 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir //------------------------------------------------------------------------ 347*cdf0e10cSrcweir FmFilterAdapter::FmFilterAdapter(FmFilterModel* pModel, const Reference< XIndexAccess >& xControllers) 348*cdf0e10cSrcweir :m_pModel( pModel ) 349*cdf0e10cSrcweir ,m_xControllers( xControllers ) 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir AddOrRemoveListener( m_xControllers, true ); 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir //------------------------------------------------------------------------ 355*cdf0e10cSrcweir void FmFilterAdapter::dispose() throw( RuntimeException ) 356*cdf0e10cSrcweir { 357*cdf0e10cSrcweir AddOrRemoveListener( m_xControllers, false ); 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir //------------------------------------------------------------------------ 361*cdf0e10cSrcweir void FmFilterAdapter::AddOrRemoveListener( const Reference< XIndexAccess >& _rxControllers, const bool _bAdd ) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir for (sal_Int32 i = 0, nLen = _rxControllers->getCount(); i < nLen; ++i) 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir Reference< XIndexAccess > xElement( _rxControllers->getByIndex(i), UNO_QUERY ); 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir // step down 368*cdf0e10cSrcweir AddOrRemoveListener( xElement, _bAdd ); 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir // handle this particular controller 371*cdf0e10cSrcweir Reference< XFilterController > xController( xElement, UNO_QUERY ); 372*cdf0e10cSrcweir OSL_ENSURE( xController.is(), "FmFilterAdapter::InsertElements: no XFilterController, cannot sync data!" ); 373*cdf0e10cSrcweir if ( xController.is() ) 374*cdf0e10cSrcweir { 375*cdf0e10cSrcweir if ( _bAdd ) 376*cdf0e10cSrcweir xController->addFilterControllerListener( this ); 377*cdf0e10cSrcweir else 378*cdf0e10cSrcweir xController->removeFilterControllerListener( this ); 379*cdf0e10cSrcweir } 380*cdf0e10cSrcweir } 381*cdf0e10cSrcweir } 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir //------------------------------------------------------------------------ 384*cdf0e10cSrcweir void FmFilterAdapter::setText(sal_Int32 nRowPos, 385*cdf0e10cSrcweir const FmFilterItem* pFilterItem, 386*cdf0e10cSrcweir const ::rtl::OUString& rText) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir FmFormItem* pFormItem = PTR_CAST( FmFormItem, pFilterItem->GetParent()->GetParent() ); 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir try 391*cdf0e10cSrcweir { 392*cdf0e10cSrcweir Reference< XFilterController > xController( pFormItem->GetController(), UNO_QUERY_THROW ); 393*cdf0e10cSrcweir xController->setPredicateExpression( pFilterItem->GetComponentIndex(), nRowPos, rText ); 394*cdf0e10cSrcweir } 395*cdf0e10cSrcweir catch( const Exception& ) 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir } 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir 402*cdf0e10cSrcweir // XEventListener 403*cdf0e10cSrcweir //------------------------------------------------------------------------ 404*cdf0e10cSrcweir void SAL_CALL FmFilterAdapter::disposing(const EventObject& /*e*/) throw( RuntimeException ) 405*cdf0e10cSrcweir { 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir //------------------------------------------------------------------------ 409*cdf0e10cSrcweir namespace 410*cdf0e10cSrcweir { 411*cdf0e10cSrcweir ::rtl::OUString lcl_getLabelName_nothrow( const Reference< XControl >& _rxControl ) 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir ::rtl::OUString sLabelName; 414*cdf0e10cSrcweir try 415*cdf0e10cSrcweir { 416*cdf0e10cSrcweir Reference< XControl > xControl( _rxControl, UNO_SET_THROW ); 417*cdf0e10cSrcweir Reference< XPropertySet > xModel( xControl->getModel(), UNO_QUERY_THROW ); 418*cdf0e10cSrcweir sLabelName = getLabelName( xModel ); 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir catch( const Exception& ) 421*cdf0e10cSrcweir { 422*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 423*cdf0e10cSrcweir } 424*cdf0e10cSrcweir return sLabelName; 425*cdf0e10cSrcweir } 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir Reference< XPropertySet > lcl_getBoundField_nothrow( const Reference< XControl >& _rxControl ) 428*cdf0e10cSrcweir { 429*cdf0e10cSrcweir Reference< XPropertySet > xField; 430*cdf0e10cSrcweir try 431*cdf0e10cSrcweir { 432*cdf0e10cSrcweir Reference< XControl > xControl( _rxControl, UNO_SET_THROW ); 433*cdf0e10cSrcweir Reference< XPropertySet > xModelProps( xControl->getModel(), UNO_QUERY_THROW ); 434*cdf0e10cSrcweir xField.set( xModelProps->getPropertyValue( FM_PROP_BOUNDFIELD ), UNO_QUERY_THROW ); 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir catch( const Exception& ) 437*cdf0e10cSrcweir { 438*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 439*cdf0e10cSrcweir } 440*cdf0e10cSrcweir return xField; 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir 444*cdf0e10cSrcweir // XFilterControllerListener 445*cdf0e10cSrcweir //------------------------------------------------------------------------ 446*cdf0e10cSrcweir void FmFilterAdapter::predicateExpressionChanged( const FilterEvent& _Event ) throw( RuntimeException ) 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir ::vos::OGuard aGuard( Application::GetSolarMutex() ); 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir if ( !m_pModel ) 451*cdf0e10cSrcweir return; 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir // the controller which sent the event 454*cdf0e10cSrcweir Reference< XFormController > xController( _Event.Source, UNO_QUERY_THROW ); 455*cdf0e10cSrcweir Reference< XFilterController > xFilterController( _Event.Source, UNO_QUERY_THROW ); 456*cdf0e10cSrcweir Reference< XForm > xForm( xController->getModel(), UNO_QUERY_THROW ); 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir FmFormItem* pFormItem = m_pModel->Find( m_pModel->m_aChildren, xForm ); 459*cdf0e10cSrcweir OSL_ENSURE( pFormItem, "FmFilterAdapter::predicateExpressionChanged: don't know this form!" ); 460*cdf0e10cSrcweir if ( !pFormItem ) 461*cdf0e10cSrcweir return; 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir const sal_Int32 nActiveTerm( xFilterController->getActiveTerm() ); 464*cdf0e10cSrcweir 465*cdf0e10cSrcweir FmFilterItems* pFilter = PTR_CAST( FmFilterItems, pFormItem->GetChildren()[ nActiveTerm ] ); 466*cdf0e10cSrcweir FmFilterItem* pFilterItem = pFilter->Find( _Event.FilterComponent ); 467*cdf0e10cSrcweir if ( pFilterItem ) 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir if ( _Event.PredicateExpression.getLength()) 470*cdf0e10cSrcweir { 471*cdf0e10cSrcweir pFilterItem->SetText( _Event.PredicateExpression ); 472*cdf0e10cSrcweir // UI benachrichtigen 473*cdf0e10cSrcweir FmFilterTextChangedHint aChangeHint(pFilterItem); 474*cdf0e10cSrcweir m_pModel->Broadcast( aChangeHint ); 475*cdf0e10cSrcweir } 476*cdf0e10cSrcweir else 477*cdf0e10cSrcweir { 478*cdf0e10cSrcweir // no text anymore so remove the condition 479*cdf0e10cSrcweir m_pModel->Remove(pFilterItem); 480*cdf0e10cSrcweir } 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir else 483*cdf0e10cSrcweir { 484*cdf0e10cSrcweir // searching the component by field name 485*cdf0e10cSrcweir ::rtl::OUString aFieldName( lcl_getLabelName_nothrow( xFilterController->getFilterComponent( _Event.FilterComponent ) ) ); 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir pFilterItem = new FmFilterItem( m_pModel->getORB(), pFilter, aFieldName, _Event.PredicateExpression, _Event.FilterComponent ); 488*cdf0e10cSrcweir m_pModel->Insert(pFilter->GetChildren().end(), pFilterItem); 489*cdf0e10cSrcweir } 490*cdf0e10cSrcweir 491*cdf0e10cSrcweir // ensure there's one empty term in the filter, just in case the active term was previously empty 492*cdf0e10cSrcweir m_pModel->EnsureEmptyFilterRows( *pFormItem ); 493*cdf0e10cSrcweir } 494*cdf0e10cSrcweir 495*cdf0e10cSrcweir //------------------------------------------------------------------------ 496*cdf0e10cSrcweir void SAL_CALL FmFilterAdapter::disjunctiveTermRemoved( const FilterEvent& _Event ) throw (RuntimeException) 497*cdf0e10cSrcweir { 498*cdf0e10cSrcweir ::vos::OGuard aGuard( Application::GetSolarMutex() ); 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir Reference< XFormController > xController( _Event.Source, UNO_QUERY_THROW ); 501*cdf0e10cSrcweir Reference< XFilterController > xFilterController( _Event.Source, UNO_QUERY_THROW ); 502*cdf0e10cSrcweir Reference< XForm > xForm( xController->getModel(), UNO_QUERY_THROW ); 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir FmFormItem* pFormItem = m_pModel->Find( m_pModel->m_aChildren, xForm ); 505*cdf0e10cSrcweir OSL_ENSURE( pFormItem, "FmFilterAdapter::disjunctiveTermRemoved: don't know this form!" ); 506*cdf0e10cSrcweir if ( !pFormItem ) 507*cdf0e10cSrcweir return; 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir ::std::vector< FmFilterData* >& rTermItems = pFormItem->GetChildren(); 510*cdf0e10cSrcweir const bool bValidIndex = ( _Event.DisjunctiveTerm >= 0 ) && ( (size_t)_Event.DisjunctiveTerm < rTermItems.size() ); 511*cdf0e10cSrcweir OSL_ENSURE( bValidIndex, "FmFilterAdapter::disjunctiveTermRemoved: invalid term index!" ); 512*cdf0e10cSrcweir if ( !bValidIndex ) 513*cdf0e10cSrcweir return; 514*cdf0e10cSrcweir 515*cdf0e10cSrcweir // if the first term was removed, then the to-be first term needs its text updated 516*cdf0e10cSrcweir if ( _Event.DisjunctiveTerm == 0 ) 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir rTermItems[1]->SetText( String( SVX_RES( RID_STR_FILTER_FILTER_FOR ) ) ); 519*cdf0e10cSrcweir FmFilterTextChangedHint aChangeHint( rTermItems[1] ); 520*cdf0e10cSrcweir m_pModel->Broadcast( aChangeHint ); 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir 523*cdf0e10cSrcweir // finally remove the entry from the model 524*cdf0e10cSrcweir m_pModel->Remove( rTermItems.begin() + _Event.DisjunctiveTerm ); 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir // ensure there's one empty term in the filter, just in case the currently removed one was the last empty one 527*cdf0e10cSrcweir m_pModel->EnsureEmptyFilterRows( *pFormItem ); 528*cdf0e10cSrcweir } 529*cdf0e10cSrcweir 530*cdf0e10cSrcweir //------------------------------------------------------------------------ 531*cdf0e10cSrcweir void SAL_CALL FmFilterAdapter::disjunctiveTermAdded( const FilterEvent& _Event ) throw (RuntimeException) 532*cdf0e10cSrcweir { 533*cdf0e10cSrcweir ::vos::OGuard aGuard( Application::GetSolarMutex() ); 534*cdf0e10cSrcweir 535*cdf0e10cSrcweir Reference< XFormController > xController( _Event.Source, UNO_QUERY_THROW ); 536*cdf0e10cSrcweir Reference< XFilterController > xFilterController( _Event.Source, UNO_QUERY_THROW ); 537*cdf0e10cSrcweir Reference< XForm > xForm( xController->getModel(), UNO_QUERY_THROW ); 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir FmFormItem* pFormItem = m_pModel->Find( m_pModel->m_aChildren, xForm ); 540*cdf0e10cSrcweir OSL_ENSURE( pFormItem, "FmFilterAdapter::disjunctiveTermAdded: don't know this form!" ); 541*cdf0e10cSrcweir if ( !pFormItem ) 542*cdf0e10cSrcweir return; 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir const sal_Int32 nInsertPos = _Event.DisjunctiveTerm; 545*cdf0e10cSrcweir bool bValidIndex = ( nInsertPos >= 0 ) && ( (size_t)nInsertPos <= pFormItem->GetChildren().size() ); 546*cdf0e10cSrcweir if ( !bValidIndex ) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir OSL_ENSURE( false, "FmFilterAdapter::disjunctiveTermAdded: invalid index!" ); 549*cdf0e10cSrcweir return; 550*cdf0e10cSrcweir } 551*cdf0e10cSrcweir 552*cdf0e10cSrcweir const ::std::vector< FmFilterData* >::iterator insertPos = pFormItem->GetChildren().begin() + nInsertPos; 553*cdf0e10cSrcweir 554*cdf0e10cSrcweir FmFilterItems* pFilterItems = new FmFilterItems( m_pModel->getORB(), pFormItem, String( SVX_RES( RID_STR_FILTER_FILTER_OR ) ) ); 555*cdf0e10cSrcweir m_pModel->Insert( insertPos, pFilterItems ); 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir //======================================================================== 559*cdf0e10cSrcweir // class FmFilterModel 560*cdf0e10cSrcweir //======================================================================== 561*cdf0e10cSrcweir TYPEINIT1(FmFilterModel, FmParentData); 562*cdf0e10cSrcweir //------------------------------------------------------------------------ 563*cdf0e10cSrcweir FmFilterModel::FmFilterModel(const Reference< XMultiServiceFactory >& _rxFactory) 564*cdf0e10cSrcweir :FmParentData(_rxFactory,NULL, ::rtl::OUString()) 565*cdf0e10cSrcweir ,OSQLParserClient(_rxFactory) 566*cdf0e10cSrcweir ,m_xORB(_rxFactory) 567*cdf0e10cSrcweir ,m_pAdapter(NULL) 568*cdf0e10cSrcweir ,m_pCurrentItems(NULL) 569*cdf0e10cSrcweir { 570*cdf0e10cSrcweir } 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir //------------------------------------------------------------------------ 573*cdf0e10cSrcweir FmFilterModel::~FmFilterModel() 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir Clear(); 576*cdf0e10cSrcweir } 577*cdf0e10cSrcweir 578*cdf0e10cSrcweir //------------------------------------------------------------------------ 579*cdf0e10cSrcweir void FmFilterModel::Clear() 580*cdf0e10cSrcweir { 581*cdf0e10cSrcweir // notify 582*cdf0e10cSrcweir FilterClearingHint aClearedHint; 583*cdf0e10cSrcweir Broadcast( aClearedHint ); 584*cdf0e10cSrcweir 585*cdf0e10cSrcweir // loose endings 586*cdf0e10cSrcweir if (m_pAdapter) 587*cdf0e10cSrcweir { 588*cdf0e10cSrcweir m_pAdapter->dispose(); 589*cdf0e10cSrcweir m_pAdapter->release(); 590*cdf0e10cSrcweir m_pAdapter= NULL; 591*cdf0e10cSrcweir } 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir m_pCurrentItems = NULL; 594*cdf0e10cSrcweir m_xController = NULL; 595*cdf0e10cSrcweir m_xControllers = NULL; 596*cdf0e10cSrcweir 597*cdf0e10cSrcweir for (::std::vector<FmFilterData*>::const_iterator i = m_aChildren.begin(); 598*cdf0e10cSrcweir i != m_aChildren.end(); i++) 599*cdf0e10cSrcweir delete (*i); 600*cdf0e10cSrcweir 601*cdf0e10cSrcweir m_aChildren.clear(); 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir //------------------------------------------------------------------------ 605*cdf0e10cSrcweir void FmFilterModel::Update(const Reference< XIndexAccess > & xControllers, const Reference< XFormController > & xCurrent) 606*cdf0e10cSrcweir { 607*cdf0e10cSrcweir if ( xCurrent == m_xController ) 608*cdf0e10cSrcweir return; 609*cdf0e10cSrcweir 610*cdf0e10cSrcweir if (!xControllers.is()) 611*cdf0e10cSrcweir { 612*cdf0e10cSrcweir Clear(); 613*cdf0e10cSrcweir return; 614*cdf0e10cSrcweir } 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir // there is only a new current controller 617*cdf0e10cSrcweir if ( m_xControllers != xControllers ) 618*cdf0e10cSrcweir { 619*cdf0e10cSrcweir Clear(); 620*cdf0e10cSrcweir 621*cdf0e10cSrcweir m_xControllers = xControllers; 622*cdf0e10cSrcweir Update(m_xControllers, this); 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir DBG_ASSERT(xCurrent.is(), "FmFilterModel::Update(...) no current controller"); 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir // Listening for TextChanges 627*cdf0e10cSrcweir m_pAdapter = new FmFilterAdapter(this, xControllers); 628*cdf0e10cSrcweir m_pAdapter->acquire(); 629*cdf0e10cSrcweir 630*cdf0e10cSrcweir SetCurrentController(xCurrent); 631*cdf0e10cSrcweir EnsureEmptyFilterRows( *this ); 632*cdf0e10cSrcweir } 633*cdf0e10cSrcweir else 634*cdf0e10cSrcweir SetCurrentController(xCurrent); 635*cdf0e10cSrcweir } 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir //------------------------------------------------------------------------ 638*cdf0e10cSrcweir void FmFilterModel::Update(const Reference< XIndexAccess > & xControllers, FmParentData* pParent) 639*cdf0e10cSrcweir { 640*cdf0e10cSrcweir try 641*cdf0e10cSrcweir { 642*cdf0e10cSrcweir sal_Int32 nCount = xControllers->getCount(); 643*cdf0e10cSrcweir for ( sal_Int32 i = 0; i < nCount; ++i ) 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir Reference< XFormController > xController( xControllers->getByIndex(i), UNO_QUERY_THROW ); 646*cdf0e10cSrcweir 647*cdf0e10cSrcweir Reference< XPropertySet > xFormProperties( xController->getModel(), UNO_QUERY_THROW ); 648*cdf0e10cSrcweir ::rtl::OUString aName; 649*cdf0e10cSrcweir OSL_VERIFY( xFormProperties->getPropertyValue( FM_PROP_NAME ) >>= aName ); 650*cdf0e10cSrcweir 651*cdf0e10cSrcweir // Insert a new item for the form 652*cdf0e10cSrcweir FmFormItem* pFormItem = new FmFormItem( m_xORB, pParent, xController, aName ); 653*cdf0e10cSrcweir Insert( pParent->GetChildren().end(), pFormItem ); 654*cdf0e10cSrcweir 655*cdf0e10cSrcweir Reference< XFilterController > xFilterController( pFormItem->GetFilterController(), UNO_SET_THROW ); 656*cdf0e10cSrcweir 657*cdf0e10cSrcweir // insert the existing filters for the form 658*cdf0e10cSrcweir String aTitle( SVX_RES( RID_STR_FILTER_FILTER_FOR ) ); 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir Sequence< Sequence< ::rtl::OUString > > aExpressions = xFilterController->getPredicateExpressions(); 661*cdf0e10cSrcweir for ( const Sequence< ::rtl::OUString >* pConjunctionTerm = aExpressions.getConstArray(); 662*cdf0e10cSrcweir pConjunctionTerm != aExpressions.getConstArray() + aExpressions.getLength(); 663*cdf0e10cSrcweir ++pConjunctionTerm 664*cdf0e10cSrcweir ) 665*cdf0e10cSrcweir { 666*cdf0e10cSrcweir // we always display one row, even if there's no term to be displayed 667*cdf0e10cSrcweir FmFilterItems* pFilterItems = new FmFilterItems( m_xORB, pFormItem, aTitle ); 668*cdf0e10cSrcweir Insert( pFormItem->GetChildren().end(), pFilterItems ); 669*cdf0e10cSrcweir 670*cdf0e10cSrcweir const Sequence< ::rtl::OUString >& rDisjunction( *pConjunctionTerm ); 671*cdf0e10cSrcweir for ( const ::rtl::OUString* pDisjunctiveTerm = rDisjunction.getConstArray(); 672*cdf0e10cSrcweir pDisjunctiveTerm != rDisjunction.getConstArray() + rDisjunction.getLength(); 673*cdf0e10cSrcweir ++pDisjunctiveTerm 674*cdf0e10cSrcweir ) 675*cdf0e10cSrcweir { 676*cdf0e10cSrcweir if ( pDisjunctiveTerm->getLength() == 0 ) 677*cdf0e10cSrcweir // no condition for this particular component in this particular conjunction term 678*cdf0e10cSrcweir continue; 679*cdf0e10cSrcweir 680*cdf0e10cSrcweir const sal_Int32 nComponentIndex = pDisjunctiveTerm - rDisjunction.getConstArray(); 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir // determine the display name of the control 683*cdf0e10cSrcweir const Reference< XControl > xFilterControl( xFilterController->getFilterComponent( nComponentIndex ) ); 684*cdf0e10cSrcweir const ::rtl::OUString sDisplayName( lcl_getLabelName_nothrow( xFilterControl ) ); 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir // insert a new entry 687*cdf0e10cSrcweir FmFilterItem* pANDCondition = new FmFilterItem( m_xORB, pFilterItems, sDisplayName, *pDisjunctiveTerm, nComponentIndex ); 688*cdf0e10cSrcweir Insert( pFilterItems->GetChildren().end(), pANDCondition ); 689*cdf0e10cSrcweir } 690*cdf0e10cSrcweir 691*cdf0e10cSrcweir // title for the next conditions 692*cdf0e10cSrcweir aTitle = SVX_RES( RID_STR_FILTER_FILTER_OR ); 693*cdf0e10cSrcweir } 694*cdf0e10cSrcweir 695*cdf0e10cSrcweir // now add dependent controllers 696*cdf0e10cSrcweir Reference< XIndexAccess > xControllerAsIndex( xController, UNO_QUERY ); 697*cdf0e10cSrcweir Update( xControllerAsIndex, pFormItem ); 698*cdf0e10cSrcweir } 699*cdf0e10cSrcweir } 700*cdf0e10cSrcweir catch( const Exception& ) 701*cdf0e10cSrcweir { 702*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 703*cdf0e10cSrcweir } 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir 706*cdf0e10cSrcweir //------------------------------------------------------------------------ 707*cdf0e10cSrcweir FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, const Reference< XFormController > & xController) const 708*cdf0e10cSrcweir { 709*cdf0e10cSrcweir for (::std::vector<FmFilterData*>::const_iterator i = rItems.begin(); 710*cdf0e10cSrcweir i != rItems.end(); i++) 711*cdf0e10cSrcweir { 712*cdf0e10cSrcweir FmFormItem* pForm = PTR_CAST(FmFormItem,*i); 713*cdf0e10cSrcweir if (pForm) 714*cdf0e10cSrcweir { 715*cdf0e10cSrcweir if ( xController == pForm->GetController() ) 716*cdf0e10cSrcweir return pForm; 717*cdf0e10cSrcweir else 718*cdf0e10cSrcweir { 719*cdf0e10cSrcweir pForm = Find(pForm->GetChildren(), xController); 720*cdf0e10cSrcweir if (pForm) 721*cdf0e10cSrcweir return pForm; 722*cdf0e10cSrcweir } 723*cdf0e10cSrcweir } 724*cdf0e10cSrcweir } 725*cdf0e10cSrcweir return NULL; 726*cdf0e10cSrcweir } 727*cdf0e10cSrcweir 728*cdf0e10cSrcweir //------------------------------------------------------------------------ 729*cdf0e10cSrcweir FmFormItem* FmFilterModel::Find(const ::std::vector<FmFilterData*>& rItems, const Reference< XForm >& xForm) const 730*cdf0e10cSrcweir { 731*cdf0e10cSrcweir for (::std::vector<FmFilterData*>::const_iterator i = rItems.begin(); 732*cdf0e10cSrcweir i != rItems.end(); i++) 733*cdf0e10cSrcweir { 734*cdf0e10cSrcweir FmFormItem* pForm = PTR_CAST(FmFormItem,*i); 735*cdf0e10cSrcweir if (pForm) 736*cdf0e10cSrcweir { 737*cdf0e10cSrcweir if (xForm == pForm->GetController()->getModel()) 738*cdf0e10cSrcweir return pForm; 739*cdf0e10cSrcweir else 740*cdf0e10cSrcweir { 741*cdf0e10cSrcweir pForm = Find(pForm->GetChildren(), xForm); 742*cdf0e10cSrcweir if (pForm) 743*cdf0e10cSrcweir return pForm; 744*cdf0e10cSrcweir } 745*cdf0e10cSrcweir } 746*cdf0e10cSrcweir } 747*cdf0e10cSrcweir return NULL; 748*cdf0e10cSrcweir } 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir //------------------------------------------------------------------------ 751*cdf0e10cSrcweir void FmFilterModel::SetCurrentController(const Reference< XFormController > & xCurrent) 752*cdf0e10cSrcweir { 753*cdf0e10cSrcweir if ( xCurrent == m_xController ) 754*cdf0e10cSrcweir return; 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir m_xController = xCurrent; 757*cdf0e10cSrcweir 758*cdf0e10cSrcweir FmFormItem* pItem = Find( m_aChildren, xCurrent ); 759*cdf0e10cSrcweir if ( !pItem ) 760*cdf0e10cSrcweir return; 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir try 763*cdf0e10cSrcweir { 764*cdf0e10cSrcweir Reference< XFilterController > xFilterController( m_xController, UNO_QUERY_THROW ); 765*cdf0e10cSrcweir const sal_Int32 nActiveTerm( xFilterController->getActiveTerm() ); 766*cdf0e10cSrcweir if ( pItem->GetChildren().size() > (size_t)nActiveTerm ) 767*cdf0e10cSrcweir { 768*cdf0e10cSrcweir SetCurrentItems( static_cast< FmFilterItems* >( pItem->GetChildren()[ nActiveTerm ] ) ); 769*cdf0e10cSrcweir } 770*cdf0e10cSrcweir } 771*cdf0e10cSrcweir catch( const Exception& ) 772*cdf0e10cSrcweir { 773*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 774*cdf0e10cSrcweir } 775*cdf0e10cSrcweir } 776*cdf0e10cSrcweir 777*cdf0e10cSrcweir //------------------------------------------------------------------------ 778*cdf0e10cSrcweir void FmFilterModel::AppendFilterItems( FmFormItem& _rFormItem ) 779*cdf0e10cSrcweir { 780*cdf0e10cSrcweir // insert the condition behind the last filter items 781*cdf0e10cSrcweir ::std::vector<FmFilterData*>::reverse_iterator iter; 782*cdf0e10cSrcweir for ( iter = _rFormItem.GetChildren().rbegin(); 783*cdf0e10cSrcweir iter != _rFormItem.GetChildren().rend(); 784*cdf0e10cSrcweir ++iter 785*cdf0e10cSrcweir ) 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir if ((*iter)->ISA(FmFilterItems)) 788*cdf0e10cSrcweir break; 789*cdf0e10cSrcweir } 790*cdf0e10cSrcweir 791*cdf0e10cSrcweir sal_Int32 nInsertPos = iter.base() - _rFormItem.GetChildren().begin(); 792*cdf0e10cSrcweir // delegate this to the FilterController, it will notify us, which will let us update our model 793*cdf0e10cSrcweir try 794*cdf0e10cSrcweir { 795*cdf0e10cSrcweir Reference< XFilterController > xFilterController( _rFormItem.GetFilterController(), UNO_SET_THROW ); 796*cdf0e10cSrcweir if ( nInsertPos >= xFilterController->getDisjunctiveTerms() ) 797*cdf0e10cSrcweir xFilterController->appendEmptyDisjunctiveTerm(); 798*cdf0e10cSrcweir } 799*cdf0e10cSrcweir catch( const Exception& ) 800*cdf0e10cSrcweir { 801*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 802*cdf0e10cSrcweir } 803*cdf0e10cSrcweir } 804*cdf0e10cSrcweir 805*cdf0e10cSrcweir //------------------------------------------------------------------------ 806*cdf0e10cSrcweir void FmFilterModel::Insert(const ::std::vector<FmFilterData*>::iterator& rPos, FmFilterData* pData) 807*cdf0e10cSrcweir { 808*cdf0e10cSrcweir ::std::vector<FmFilterData*>& rItems = pData->GetParent()->GetChildren(); 809*cdf0e10cSrcweir sal_Int32 nPos = rPos == rItems.end() ? LIST_APPEND : rPos - rItems.begin(); 810*cdf0e10cSrcweir rItems.insert(rPos, pData); 811*cdf0e10cSrcweir 812*cdf0e10cSrcweir // UI benachrichtigen 813*cdf0e10cSrcweir FmFilterInsertedHint aInsertedHint(pData, nPos); 814*cdf0e10cSrcweir Broadcast( aInsertedHint ); 815*cdf0e10cSrcweir } 816*cdf0e10cSrcweir 817*cdf0e10cSrcweir //------------------------------------------------------------------------ 818*cdf0e10cSrcweir void FmFilterModel::Remove(FmFilterData* pData) 819*cdf0e10cSrcweir { 820*cdf0e10cSrcweir FmParentData* pParent = pData->GetParent(); 821*cdf0e10cSrcweir ::std::vector<FmFilterData*>& rItems = pParent->GetChildren(); 822*cdf0e10cSrcweir 823*cdf0e10cSrcweir // erase the item from the model 824*cdf0e10cSrcweir ::std::vector<FmFilterData*>::iterator i = ::std::find(rItems.begin(), rItems.end(), pData); 825*cdf0e10cSrcweir DBG_ASSERT(i != rItems.end(), "FmFilterModel::Remove(): unknown Item"); 826*cdf0e10cSrcweir // position within the parent 827*cdf0e10cSrcweir sal_Int32 nPos = i - rItems.begin(); 828*cdf0e10cSrcweir if (pData->ISA(FmFilterItems)) 829*cdf0e10cSrcweir { 830*cdf0e10cSrcweir FmFormItem* pFormItem = (FmFormItem*)pParent; 831*cdf0e10cSrcweir 832*cdf0e10cSrcweir try 833*cdf0e10cSrcweir { 834*cdf0e10cSrcweir Reference< XFilterController > xFilterController( pFormItem->GetFilterController(), UNO_SET_THROW ); 835*cdf0e10cSrcweir 836*cdf0e10cSrcweir bool bEmptyLastTerm = ( ( nPos == 0 ) && xFilterController->getDisjunctiveTerms() == 1 ); 837*cdf0e10cSrcweir if ( bEmptyLastTerm ) 838*cdf0e10cSrcweir { 839*cdf0e10cSrcweir // remove all children (by setting an empty predicate expression) 840*cdf0e10cSrcweir ::std::vector< FmFilterData* >& rChildren = ((FmFilterItems*)pData)->GetChildren(); 841*cdf0e10cSrcweir while ( !rChildren.empty() ) 842*cdf0e10cSrcweir { 843*cdf0e10cSrcweir ::std::vector< FmFilterData* >::iterator removePos = rChildren.end() - 1; 844*cdf0e10cSrcweir FmFilterItem* pFilterItem = PTR_CAST( FmFilterItem, *removePos ); 845*cdf0e10cSrcweir m_pAdapter->setText( nPos, pFilterItem, ::rtl::OUString() ); 846*cdf0e10cSrcweir Remove( removePos ); 847*cdf0e10cSrcweir } 848*cdf0e10cSrcweir } 849*cdf0e10cSrcweir else 850*cdf0e10cSrcweir { 851*cdf0e10cSrcweir xFilterController->removeDisjunctiveTerm( nPos ); 852*cdf0e10cSrcweir } 853*cdf0e10cSrcweir } 854*cdf0e10cSrcweir catch( const Exception& ) 855*cdf0e10cSrcweir { 856*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 857*cdf0e10cSrcweir } 858*cdf0e10cSrcweir } 859*cdf0e10cSrcweir else // FormItems can not be deleted 860*cdf0e10cSrcweir { 861*cdf0e10cSrcweir FmFilterItem* pFilterItem = PTR_CAST(FmFilterItem, pData); 862*cdf0e10cSrcweir 863*cdf0e10cSrcweir // if its the last condition remove the parent 864*cdf0e10cSrcweir if (rItems.size() == 1) 865*cdf0e10cSrcweir Remove(pFilterItem->GetParent()); 866*cdf0e10cSrcweir else 867*cdf0e10cSrcweir { 868*cdf0e10cSrcweir // find the position of the father within his father 869*cdf0e10cSrcweir ::std::vector<FmFilterData*>& rParentParentItems = pData->GetParent()->GetParent()->GetChildren(); 870*cdf0e10cSrcweir ::std::vector<FmFilterData*>::iterator j = ::std::find(rParentParentItems.begin(), rParentParentItems.end(), pFilterItem->GetParent()); 871*cdf0e10cSrcweir DBG_ASSERT(j != rParentParentItems.end(), "FmFilterModel::Remove(): unknown Item"); 872*cdf0e10cSrcweir sal_Int32 nParentPos = j - rParentParentItems.begin(); 873*cdf0e10cSrcweir 874*cdf0e10cSrcweir // EmptyText removes the filter 875*cdf0e10cSrcweir m_pAdapter->setText(nParentPos, pFilterItem, ::rtl::OUString()); 876*cdf0e10cSrcweir Remove( i ); 877*cdf0e10cSrcweir } 878*cdf0e10cSrcweir } 879*cdf0e10cSrcweir } 880*cdf0e10cSrcweir 881*cdf0e10cSrcweir //------------------------------------------------------------------------ 882*cdf0e10cSrcweir void FmFilterModel::Remove( const ::std::vector<FmFilterData*>::iterator& rPos ) 883*cdf0e10cSrcweir { 884*cdf0e10cSrcweir // remove from parent's child list 885*cdf0e10cSrcweir FmFilterData* pData = *rPos; 886*cdf0e10cSrcweir pData->GetParent()->GetChildren().erase( rPos ); 887*cdf0e10cSrcweir 888*cdf0e10cSrcweir // notify the view, this will remove the actual SvLBoxEntry 889*cdf0e10cSrcweir FmFilterRemovedHint aRemoveHint( pData ); 890*cdf0e10cSrcweir Broadcast( aRemoveHint ); 891*cdf0e10cSrcweir 892*cdf0e10cSrcweir delete pData; 893*cdf0e10cSrcweir } 894*cdf0e10cSrcweir 895*cdf0e10cSrcweir //------------------------------------------------------------------------ 896*cdf0e10cSrcweir sal_Bool FmFilterModel::ValidateText(FmFilterItem* pItem, UniString& rText, UniString& rErrorMsg) const 897*cdf0e10cSrcweir { 898*cdf0e10cSrcweir FmFormItem* pFormItem = PTR_CAST( FmFormItem, pItem->GetParent()->GetParent() ); 899*cdf0e10cSrcweir try 900*cdf0e10cSrcweir { 901*cdf0e10cSrcweir Reference< XFormController > xFormController( pFormItem->GetController() ); 902*cdf0e10cSrcweir // obtain the connection of the form belonging to the controller 903*cdf0e10cSrcweir OStaticDataAccessTools aStaticTools; 904*cdf0e10cSrcweir Reference< XRowSet > xRowSet( xFormController->getModel(), UNO_QUERY_THROW ); 905*cdf0e10cSrcweir Reference< XConnection > xConnection( aStaticTools.getRowSetConnection( xRowSet ) ); 906*cdf0e10cSrcweir 907*cdf0e10cSrcweir // obtain a number formatter for this connection 908*cdf0e10cSrcweir // TODO: shouldn't this be cached? 909*cdf0e10cSrcweir Reference< XNumberFormatsSupplier > xFormatSupplier = aStaticTools.getNumberFormats( xConnection, sal_True ); 910*cdf0e10cSrcweir Reference< XNumberFormatter > xFormatter( m_xORB->createInstance( FM_NUMBER_FORMATTER ), UNO_QUERY ); 911*cdf0e10cSrcweir xFormatter->attachNumberFormatsSupplier( xFormatSupplier ); 912*cdf0e10cSrcweir 913*cdf0e10cSrcweir // get the field (database column) which the item is responsible for 914*cdf0e10cSrcweir Reference< XFilterController > xFilterController( xFormController, UNO_QUERY_THROW ); 915*cdf0e10cSrcweir Reference< XPropertySet > xField( lcl_getBoundField_nothrow( xFilterController->getFilterComponent( pItem->GetComponentIndex() ) ), UNO_SET_THROW ); 916*cdf0e10cSrcweir 917*cdf0e10cSrcweir // parse the given text as filter predicate 918*cdf0e10cSrcweir ::rtl::OUString aErr, aTxt( rText ); 919*cdf0e10cSrcweir ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree( aErr, aTxt, xFormatter, xField ); 920*cdf0e10cSrcweir rErrorMsg = aErr; 921*cdf0e10cSrcweir rText = aTxt; 922*cdf0e10cSrcweir if ( xParseNode.is() ) 923*cdf0e10cSrcweir { 924*cdf0e10cSrcweir ::rtl::OUString aPreparedText; 925*cdf0e10cSrcweir Locale aAppLocale = Application::GetSettings().GetUILocale(); 926*cdf0e10cSrcweir xParseNode->parseNodeToPredicateStr( 927*cdf0e10cSrcweir aPreparedText, xConnection, xFormatter, xField, aAppLocale, '.', getParseContext() ); 928*cdf0e10cSrcweir rText = aPreparedText; 929*cdf0e10cSrcweir return sal_True; 930*cdf0e10cSrcweir } 931*cdf0e10cSrcweir } 932*cdf0e10cSrcweir catch( const Exception& ) 933*cdf0e10cSrcweir { 934*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir 937*cdf0e10cSrcweir return sal_False; 938*cdf0e10cSrcweir } 939*cdf0e10cSrcweir 940*cdf0e10cSrcweir //------------------------------------------------------------------------ 941*cdf0e10cSrcweir void FmFilterModel::Append(FmFilterItems* pItems, FmFilterItem* pFilterItem) 942*cdf0e10cSrcweir { 943*cdf0e10cSrcweir Insert(pItems->GetChildren().end(), pFilterItem); 944*cdf0e10cSrcweir } 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir //------------------------------------------------------------------------ 947*cdf0e10cSrcweir void FmFilterModel::SetTextForItem(FmFilterItem* pItem, const ::rtl::OUString& rText) 948*cdf0e10cSrcweir { 949*cdf0e10cSrcweir ::std::vector<FmFilterData*>& rItems = pItem->GetParent()->GetParent()->GetChildren(); 950*cdf0e10cSrcweir ::std::vector<FmFilterData*>::iterator i = ::std::find(rItems.begin(), rItems.end(), pItem->GetParent()); 951*cdf0e10cSrcweir sal_Int32 nParentPos = i - rItems.begin(); 952*cdf0e10cSrcweir 953*cdf0e10cSrcweir m_pAdapter->setText(nParentPos, pItem, rText); 954*cdf0e10cSrcweir 955*cdf0e10cSrcweir if (!rText) 956*cdf0e10cSrcweir Remove(pItem); 957*cdf0e10cSrcweir else 958*cdf0e10cSrcweir { 959*cdf0e10cSrcweir // Change the text 960*cdf0e10cSrcweir pItem->SetText(rText); 961*cdf0e10cSrcweir FmFilterTextChangedHint aChangeHint(pItem); 962*cdf0e10cSrcweir Broadcast( aChangeHint ); 963*cdf0e10cSrcweir } 964*cdf0e10cSrcweir } 965*cdf0e10cSrcweir 966*cdf0e10cSrcweir //------------------------------------------------------------------------ 967*cdf0e10cSrcweir void FmFilterModel::SetCurrentItems(FmFilterItems* pCurrent) 968*cdf0e10cSrcweir { 969*cdf0e10cSrcweir if (m_pCurrentItems == pCurrent) 970*cdf0e10cSrcweir return; 971*cdf0e10cSrcweir 972*cdf0e10cSrcweir // search for the condition 973*cdf0e10cSrcweir if (pCurrent) 974*cdf0e10cSrcweir { 975*cdf0e10cSrcweir FmFormItem* pFormItem = (FmFormItem*)pCurrent->GetParent(); 976*cdf0e10cSrcweir ::std::vector<FmFilterData*>& rItems = pFormItem->GetChildren(); 977*cdf0e10cSrcweir ::std::vector<FmFilterData*>::const_iterator i = ::std::find(rItems.begin(), rItems.end(), pCurrent); 978*cdf0e10cSrcweir 979*cdf0e10cSrcweir if (i != rItems.end()) 980*cdf0e10cSrcweir { 981*cdf0e10cSrcweir // determine the filter position 982*cdf0e10cSrcweir sal_Int32 nPos = i - rItems.begin(); 983*cdf0e10cSrcweir try 984*cdf0e10cSrcweir { 985*cdf0e10cSrcweir Reference< XFilterController > xFilterController( pFormItem->GetFilterController(), UNO_SET_THROW ); 986*cdf0e10cSrcweir xFilterController->setActiveTerm( nPos ); 987*cdf0e10cSrcweir } 988*cdf0e10cSrcweir catch( const Exception& ) 989*cdf0e10cSrcweir { 990*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 991*cdf0e10cSrcweir } 992*cdf0e10cSrcweir 993*cdf0e10cSrcweir if ( m_xController != pFormItem->GetController() ) 994*cdf0e10cSrcweir // calls SetCurrentItems again 995*cdf0e10cSrcweir SetCurrentController( pFormItem->GetController() ); 996*cdf0e10cSrcweir else 997*cdf0e10cSrcweir m_pCurrentItems = pCurrent; 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir else 1000*cdf0e10cSrcweir m_pCurrentItems = NULL; 1001*cdf0e10cSrcweir } 1002*cdf0e10cSrcweir else 1003*cdf0e10cSrcweir m_pCurrentItems = NULL; 1004*cdf0e10cSrcweir 1005*cdf0e10cSrcweir 1006*cdf0e10cSrcweir // UI benachrichtigen 1007*cdf0e10cSrcweir FmFilterCurrentChangedHint aHint; 1008*cdf0e10cSrcweir Broadcast( aHint ); 1009*cdf0e10cSrcweir } 1010*cdf0e10cSrcweir 1011*cdf0e10cSrcweir //------------------------------------------------------------------------ 1012*cdf0e10cSrcweir void FmFilterModel::EnsureEmptyFilterRows( FmParentData& _rItem ) 1013*cdf0e10cSrcweir { 1014*cdf0e10cSrcweir // checks whether for each form there's one free level for input 1015*cdf0e10cSrcweir ::std::vector< FmFilterData* >& rChildren = _rItem.GetChildren(); 1016*cdf0e10cSrcweir sal_Bool bAppendLevel = _rItem.ISA( FmFormItem ); 1017*cdf0e10cSrcweir 1018*cdf0e10cSrcweir for ( ::std::vector<FmFilterData*>::iterator i = rChildren.begin(); 1019*cdf0e10cSrcweir i != rChildren.end(); 1020*cdf0e10cSrcweir ++i 1021*cdf0e10cSrcweir ) 1022*cdf0e10cSrcweir { 1023*cdf0e10cSrcweir FmFilterItems* pItems = PTR_CAST(FmFilterItems, *i); 1024*cdf0e10cSrcweir if ( pItems && pItems->GetChildren().empty() ) 1025*cdf0e10cSrcweir { 1026*cdf0e10cSrcweir bAppendLevel = sal_False; 1027*cdf0e10cSrcweir break; 1028*cdf0e10cSrcweir } 1029*cdf0e10cSrcweir 1030*cdf0e10cSrcweir FmFormItem* pFormItem = PTR_CAST(FmFormItem, *i); 1031*cdf0e10cSrcweir if (pFormItem) 1032*cdf0e10cSrcweir { 1033*cdf0e10cSrcweir EnsureEmptyFilterRows( *pFormItem ); 1034*cdf0e10cSrcweir continue; 1035*cdf0e10cSrcweir } 1036*cdf0e10cSrcweir } 1037*cdf0e10cSrcweir 1038*cdf0e10cSrcweir if ( bAppendLevel ) 1039*cdf0e10cSrcweir { 1040*cdf0e10cSrcweir FmFormItem* pFormItem = PTR_CAST( FmFormItem, &_rItem ); 1041*cdf0e10cSrcweir OSL_ENSURE( pFormItem, "FmFilterModel::EnsureEmptyFilterRows: no FmFormItem, but a FmFilterItems child?" ); 1042*cdf0e10cSrcweir if ( pFormItem ) 1043*cdf0e10cSrcweir AppendFilterItems( *pFormItem ); 1044*cdf0e10cSrcweir } 1045*cdf0e10cSrcweir } 1046*cdf0e10cSrcweir 1047*cdf0e10cSrcweir //======================================================================== 1048*cdf0e10cSrcweir // class FmFilterItemsString 1049*cdf0e10cSrcweir //======================================================================== 1050*cdf0e10cSrcweir class FmFilterItemsString : public SvLBoxString 1051*cdf0e10cSrcweir { 1052*cdf0e10cSrcweir public: 1053*cdf0e10cSrcweir FmFilterItemsString( SvLBoxEntry* pEntry, sal_uInt16 nFlags, const XubString& rStr ) 1054*cdf0e10cSrcweir :SvLBoxString(pEntry,nFlags,rStr){} 1055*cdf0e10cSrcweir 1056*cdf0e10cSrcweir virtual void Paint(const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, SvLBoxEntry* pEntry); 1057*cdf0e10cSrcweir virtual void InitViewData( SvLBox* pView,SvLBoxEntry* pEntry, SvViewDataItem* pViewData); 1058*cdf0e10cSrcweir }; 1059*cdf0e10cSrcweir 1060*cdf0e10cSrcweir const int nxDBmp = 12; 1061*cdf0e10cSrcweir //------------------------------------------------------------------------ 1062*cdf0e10cSrcweir void FmFilterItemsString::Paint(const Point& rPos, SvLBox& rDev, sal_uInt16 /*nFlags*/, SvLBoxEntry* pEntry ) 1063*cdf0e10cSrcweir { 1064*cdf0e10cSrcweir FmFilterItems* pRow = (FmFilterItems*)pEntry->GetUserData(); 1065*cdf0e10cSrcweir FmFormItem* pForm = (FmFormItem*)pRow->GetParent(); 1066*cdf0e10cSrcweir 1067*cdf0e10cSrcweir // current filter is significant painted 1068*cdf0e10cSrcweir const bool bIsCurrentFilter = pForm->GetChildren()[ pForm->GetFilterController()->getActiveTerm() ] == pRow; 1069*cdf0e10cSrcweir if ( bIsCurrentFilter ) 1070*cdf0e10cSrcweir { 1071*cdf0e10cSrcweir rDev.Push( PUSH_LINECOLOR ); 1072*cdf0e10cSrcweir 1073*cdf0e10cSrcweir rDev.SetLineColor( rDev.GetTextColor() ); 1074*cdf0e10cSrcweir 1075*cdf0e10cSrcweir Rectangle aRect( rPos, GetSize( &rDev, pEntry ) ); 1076*cdf0e10cSrcweir Point aFirst( rPos.X(), aRect.Bottom() - 6 ); 1077*cdf0e10cSrcweir Point aSecond(aFirst .X() + 2, aFirst.Y() + 3 ); 1078*cdf0e10cSrcweir 1079*cdf0e10cSrcweir rDev.DrawLine( aFirst, aSecond ); 1080*cdf0e10cSrcweir 1081*cdf0e10cSrcweir aFirst = aSecond; 1082*cdf0e10cSrcweir aFirst.X() += 1; 1083*cdf0e10cSrcweir aSecond.X() += 6; 1084*cdf0e10cSrcweir aSecond.Y() -= 5; 1085*cdf0e10cSrcweir 1086*cdf0e10cSrcweir rDev.DrawLine( aFirst, aSecond ); 1087*cdf0e10cSrcweir 1088*cdf0e10cSrcweir rDev.Pop(); 1089*cdf0e10cSrcweir } 1090*cdf0e10cSrcweir 1091*cdf0e10cSrcweir rDev.DrawText( Point(rPos.X() + nxDBmp, rPos.Y()), GetText() ); 1092*cdf0e10cSrcweir } 1093*cdf0e10cSrcweir 1094*cdf0e10cSrcweir //------------------------------------------------------------------------ 1095*cdf0e10cSrcweir void FmFilterItemsString::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry, SvViewDataItem* pViewData) 1096*cdf0e10cSrcweir { 1097*cdf0e10cSrcweir if( !pViewData ) 1098*cdf0e10cSrcweir pViewData = pView->GetViewDataItem( pEntry, this ); 1099*cdf0e10cSrcweir 1100*cdf0e10cSrcweir Size aSize(pView->GetTextWidth(GetText()), pView->GetTextHeight()); 1101*cdf0e10cSrcweir aSize.Width() += nxDBmp; 1102*cdf0e10cSrcweir pViewData->aSize = aSize; 1103*cdf0e10cSrcweir } 1104*cdf0e10cSrcweir 1105*cdf0e10cSrcweir //======================================================================== 1106*cdf0e10cSrcweir // class FmFilterString 1107*cdf0e10cSrcweir //======================================================================== 1108*cdf0e10cSrcweir class FmFilterString : public SvLBoxString 1109*cdf0e10cSrcweir { 1110*cdf0e10cSrcweir UniString m_aName; 1111*cdf0e10cSrcweir 1112*cdf0e10cSrcweir public: 1113*cdf0e10cSrcweir FmFilterString( SvLBoxEntry* pEntry, sal_uInt16 nFlags, const XubString& rStr, const UniString& aName) 1114*cdf0e10cSrcweir :SvLBoxString(pEntry,nFlags,rStr) 1115*cdf0e10cSrcweir ,m_aName(aName) 1116*cdf0e10cSrcweir { 1117*cdf0e10cSrcweir m_aName.AppendAscii(": "); 1118*cdf0e10cSrcweir } 1119*cdf0e10cSrcweir 1120*cdf0e10cSrcweir virtual void Paint(const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, SvLBoxEntry* pEntry); 1121*cdf0e10cSrcweir virtual void InitViewData( SvLBox* pView,SvLBoxEntry* pEntry, SvViewDataItem* pViewData); 1122*cdf0e10cSrcweir }; 1123*cdf0e10cSrcweir 1124*cdf0e10cSrcweir const int nxD = 4; 1125*cdf0e10cSrcweir 1126*cdf0e10cSrcweir //------------------------------------------------------------------------ 1127*cdf0e10cSrcweir void FmFilterString::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry, SvViewDataItem* pViewData) 1128*cdf0e10cSrcweir { 1129*cdf0e10cSrcweir if( !pViewData ) 1130*cdf0e10cSrcweir pViewData = pView->GetViewDataItem( pEntry, this ); 1131*cdf0e10cSrcweir 1132*cdf0e10cSrcweir Font aOldFont( pView->GetFont()); 1133*cdf0e10cSrcweir Font aFont( aOldFont ); 1134*cdf0e10cSrcweir aFont.SetWeight(WEIGHT_BOLD); 1135*cdf0e10cSrcweir pView->SetFont( aFont ); 1136*cdf0e10cSrcweir 1137*cdf0e10cSrcweir Size aSize(pView->GetTextWidth(m_aName), pView->GetTextHeight()); 1138*cdf0e10cSrcweir pView->SetFont( aOldFont ); 1139*cdf0e10cSrcweir aSize.Width() += pView->GetTextWidth(GetText()) + nxD; 1140*cdf0e10cSrcweir pViewData->aSize = aSize; 1141*cdf0e10cSrcweir } 1142*cdf0e10cSrcweir 1143*cdf0e10cSrcweir //------------------------------------------------------------------------ 1144*cdf0e10cSrcweir void FmFilterString::Paint(const Point& rPos, SvLBox& rDev, sal_uInt16 /*nFlags*/, SvLBoxEntry* /*pEntry*/ ) 1145*cdf0e10cSrcweir { 1146*cdf0e10cSrcweir Font aOldFont( rDev.GetFont()); 1147*cdf0e10cSrcweir Font aFont( aOldFont ); 1148*cdf0e10cSrcweir aFont.SetWeight(WEIGHT_BOLD); 1149*cdf0e10cSrcweir rDev.SetFont( aFont ); 1150*cdf0e10cSrcweir 1151*cdf0e10cSrcweir Point aPos(rPos); 1152*cdf0e10cSrcweir rDev.DrawText( aPos, m_aName ); 1153*cdf0e10cSrcweir 1154*cdf0e10cSrcweir // position for the second text 1155*cdf0e10cSrcweir aPos.X() += rDev.GetTextWidth(m_aName) + nxD; 1156*cdf0e10cSrcweir rDev.SetFont( aOldFont ); 1157*cdf0e10cSrcweir rDev.DrawText( aPos, GetText() ); 1158*cdf0e10cSrcweir } 1159*cdf0e10cSrcweir 1160*cdf0e10cSrcweir //======================================================================== 1161*cdf0e10cSrcweir // class FmFilterNavigator 1162*cdf0e10cSrcweir //======================================================================== 1163*cdf0e10cSrcweir FmFilterNavigator::FmFilterNavigator( Window* pParent ) 1164*cdf0e10cSrcweir :SvTreeListBox( pParent, WB_HASBUTTONS|WB_HASLINES|WB_BORDER|WB_HASBUTTONSATROOT ) 1165*cdf0e10cSrcweir ,m_pModel( NULL ) 1166*cdf0e10cSrcweir ,m_pEditingCurrently( NULL ) 1167*cdf0e10cSrcweir ,m_aControlExchange( this ) 1168*cdf0e10cSrcweir ,m_aTimerCounter( 0 ) 1169*cdf0e10cSrcweir ,m_aDropActionType( DA_SCROLLUP ) 1170*cdf0e10cSrcweir { 1171*cdf0e10cSrcweir SetHelpId( HID_FILTER_NAVIGATOR ); 1172*cdf0e10cSrcweir 1173*cdf0e10cSrcweir { 1174*cdf0e10cSrcweir { 1175*cdf0e10cSrcweir ImageList aNavigatorImages( SVX_RES( RID_SVXIMGLIST_FMEXPL ) ); 1176*cdf0e10cSrcweir SetNodeBitmaps( 1177*cdf0e10cSrcweir aNavigatorImages.GetImage( RID_SVXIMG_COLLAPSEDNODE ), 1178*cdf0e10cSrcweir aNavigatorImages.GetImage( RID_SVXIMG_EXPANDEDNODE ), 1179*cdf0e10cSrcweir BMP_COLOR_NORMAL 1180*cdf0e10cSrcweir ); 1181*cdf0e10cSrcweir } 1182*cdf0e10cSrcweir { 1183*cdf0e10cSrcweir ImageList aNavigatorImages( SVX_RES( RID_SVXIMGLIST_FMEXPL_HC ) ); 1184*cdf0e10cSrcweir SetNodeBitmaps( 1185*cdf0e10cSrcweir aNavigatorImages.GetImage( RID_SVXIMG_COLLAPSEDNODE ), 1186*cdf0e10cSrcweir aNavigatorImages.GetImage( RID_SVXIMG_EXPANDEDNODE ), 1187*cdf0e10cSrcweir BMP_COLOR_HIGHCONTRAST 1188*cdf0e10cSrcweir ); 1189*cdf0e10cSrcweir } 1190*cdf0e10cSrcweir } 1191*cdf0e10cSrcweir 1192*cdf0e10cSrcweir m_pModel = new FmFilterModel(comphelper::getProcessServiceFactory()); 1193*cdf0e10cSrcweir StartListening( *m_pModel ); 1194*cdf0e10cSrcweir 1195*cdf0e10cSrcweir EnableInplaceEditing( sal_True ); 1196*cdf0e10cSrcweir SetSelectionMode(MULTIPLE_SELECTION); 1197*cdf0e10cSrcweir 1198*cdf0e10cSrcweir SetDragDropMode(0xFFFF); 1199*cdf0e10cSrcweir 1200*cdf0e10cSrcweir m_aDropActionTimer.SetTimeoutHdl(LINK(this, FmFilterNavigator, OnDropActionTimer)); 1201*cdf0e10cSrcweir } 1202*cdf0e10cSrcweir 1203*cdf0e10cSrcweir //------------------------------------------------------------------------ 1204*cdf0e10cSrcweir FmFilterNavigator::~FmFilterNavigator() 1205*cdf0e10cSrcweir { 1206*cdf0e10cSrcweir EndListening( *m_pModel ); 1207*cdf0e10cSrcweir delete m_pModel; 1208*cdf0e10cSrcweir } 1209*cdf0e10cSrcweir 1210*cdf0e10cSrcweir //------------------------------------------------------------------------ 1211*cdf0e10cSrcweir void FmFilterNavigator::Clear() 1212*cdf0e10cSrcweir { 1213*cdf0e10cSrcweir m_pModel->Clear(); 1214*cdf0e10cSrcweir } 1215*cdf0e10cSrcweir 1216*cdf0e10cSrcweir //------------------------------------------------------------------------ 1217*cdf0e10cSrcweir void FmFilterNavigator::UpdateContent(const Reference< XIndexAccess > & xControllers, const Reference< XFormController > & xCurrent) 1218*cdf0e10cSrcweir { 1219*cdf0e10cSrcweir if (xCurrent == m_pModel->GetCurrentController()) 1220*cdf0e10cSrcweir return; 1221*cdf0e10cSrcweir 1222*cdf0e10cSrcweir m_pModel->Update(xControllers, xCurrent); 1223*cdf0e10cSrcweir 1224*cdf0e10cSrcweir // expand the filters for the current controller 1225*cdf0e10cSrcweir SvLBoxEntry* pEntry = FindEntry(m_pModel->GetCurrentForm()); 1226*cdf0e10cSrcweir if (pEntry && !IsExpanded(pEntry)) 1227*cdf0e10cSrcweir { 1228*cdf0e10cSrcweir SelectAll(sal_False); 1229*cdf0e10cSrcweir 1230*cdf0e10cSrcweir if (!IsExpanded(pEntry)) 1231*cdf0e10cSrcweir Expand(pEntry); 1232*cdf0e10cSrcweir 1233*cdf0e10cSrcweir pEntry = FindEntry(m_pModel->GetCurrentItems()); 1234*cdf0e10cSrcweir if (pEntry) 1235*cdf0e10cSrcweir { 1236*cdf0e10cSrcweir if (!IsExpanded(pEntry)) 1237*cdf0e10cSrcweir Expand(pEntry); 1238*cdf0e10cSrcweir Select(pEntry, sal_True); 1239*cdf0e10cSrcweir } 1240*cdf0e10cSrcweir } 1241*cdf0e10cSrcweir } 1242*cdf0e10cSrcweir 1243*cdf0e10cSrcweir //------------------------------------------------------------------------ 1244*cdf0e10cSrcweir sal_Bool FmFilterNavigator::EditingEntry( SvLBoxEntry* pEntry, Selection& rSelection ) 1245*cdf0e10cSrcweir { 1246*cdf0e10cSrcweir m_pEditingCurrently = pEntry; 1247*cdf0e10cSrcweir if (!SvTreeListBox::EditingEntry( pEntry, rSelection )) 1248*cdf0e10cSrcweir return sal_False; 1249*cdf0e10cSrcweir 1250*cdf0e10cSrcweir return pEntry && ((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItem); 1251*cdf0e10cSrcweir } 1252*cdf0e10cSrcweir 1253*cdf0e10cSrcweir //------------------------------------------------------------------------ 1254*cdf0e10cSrcweir sal_Bool FmFilterNavigator::EditedEntry( SvLBoxEntry* pEntry, const XubString& rNewText ) 1255*cdf0e10cSrcweir { 1256*cdf0e10cSrcweir DBG_ASSERT(pEntry == m_pEditingCurrently, "FmFilterNavigator::EditedEntry: suspicious entry!"); 1257*cdf0e10cSrcweir m_pEditingCurrently = NULL; 1258*cdf0e10cSrcweir 1259*cdf0e10cSrcweir if (EditingCanceled()) 1260*cdf0e10cSrcweir return sal_True; 1261*cdf0e10cSrcweir 1262*cdf0e10cSrcweir DBG_ASSERT(((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItem), 1263*cdf0e10cSrcweir "FmFilterNavigator::EditedEntry() wrong entry"); 1264*cdf0e10cSrcweir 1265*cdf0e10cSrcweir UniString aText(rNewText); 1266*cdf0e10cSrcweir aText.EraseTrailingChars(); 1267*cdf0e10cSrcweir aText.EraseLeadingChars(); 1268*cdf0e10cSrcweir if (aText.Len() == 0) 1269*cdf0e10cSrcweir { 1270*cdf0e10cSrcweir // deleting the entry asynchron 1271*cdf0e10cSrcweir sal_uLong nEvent; 1272*cdf0e10cSrcweir PostUserEvent(nEvent, LINK(this, FmFilterNavigator, OnRemove), pEntry); 1273*cdf0e10cSrcweir } 1274*cdf0e10cSrcweir else 1275*cdf0e10cSrcweir { 1276*cdf0e10cSrcweir UniString aErrorMsg; 1277*cdf0e10cSrcweir 1278*cdf0e10cSrcweir if (m_pModel->ValidateText((FmFilterItem*)pEntry->GetUserData(), aText, aErrorMsg)) 1279*cdf0e10cSrcweir { 1280*cdf0e10cSrcweir GrabFocus(); 1281*cdf0e10cSrcweir // this will set the text at the FmFilterItem, as well as update any filter controls 1282*cdf0e10cSrcweir // which are connected to this particular entry 1283*cdf0e10cSrcweir m_pModel->SetTextForItem( static_cast< FmFilterItem* >( pEntry->GetUserData() ), aText ); 1284*cdf0e10cSrcweir 1285*cdf0e10cSrcweir SetCursor( pEntry, sal_True ); 1286*cdf0e10cSrcweir SetEntryText( pEntry, aText ); 1287*cdf0e10cSrcweir } 1288*cdf0e10cSrcweir else 1289*cdf0e10cSrcweir { 1290*cdf0e10cSrcweir // display the error and return sal_False 1291*cdf0e10cSrcweir SQLContext aError; 1292*cdf0e10cSrcweir aError.Message = String(SVX_RES(RID_STR_SYNTAXERROR)); 1293*cdf0e10cSrcweir aError.Details = aErrorMsg; 1294*cdf0e10cSrcweir displayException(aError, this); 1295*cdf0e10cSrcweir 1296*cdf0e10cSrcweir return sal_False; 1297*cdf0e10cSrcweir } 1298*cdf0e10cSrcweir } 1299*cdf0e10cSrcweir return sal_True; 1300*cdf0e10cSrcweir } 1301*cdf0e10cSrcweir 1302*cdf0e10cSrcweir //------------------------------------------------------------------------ 1303*cdf0e10cSrcweir IMPL_LINK( FmFilterNavigator, OnRemove, SvLBoxEntry*, pEntry ) 1304*cdf0e10cSrcweir { 1305*cdf0e10cSrcweir // now remove the entry 1306*cdf0e10cSrcweir m_pModel->Remove((FmFilterData*) pEntry->GetUserData()); 1307*cdf0e10cSrcweir return 0L; 1308*cdf0e10cSrcweir } 1309*cdf0e10cSrcweir 1310*cdf0e10cSrcweir //------------------------------------------------------------------------ 1311*cdf0e10cSrcweir IMPL_LINK( FmFilterNavigator, OnDropActionTimer, void*, EMPTYARG ) 1312*cdf0e10cSrcweir { 1313*cdf0e10cSrcweir if (--m_aTimerCounter > 0) 1314*cdf0e10cSrcweir return 0L; 1315*cdf0e10cSrcweir 1316*cdf0e10cSrcweir switch (m_aDropActionType) 1317*cdf0e10cSrcweir { 1318*cdf0e10cSrcweir case DA_SCROLLUP : 1319*cdf0e10cSrcweir ScrollOutputArea(1); 1320*cdf0e10cSrcweir m_aTimerCounter = DROP_ACTION_TIMER_SCROLL_TICKS; 1321*cdf0e10cSrcweir break; 1322*cdf0e10cSrcweir case DA_SCROLLDOWN : 1323*cdf0e10cSrcweir ScrollOutputArea(-1); 1324*cdf0e10cSrcweir m_aTimerCounter = DROP_ACTION_TIMER_SCROLL_TICKS; 1325*cdf0e10cSrcweir break; 1326*cdf0e10cSrcweir case DA_EXPANDNODE: 1327*cdf0e10cSrcweir { 1328*cdf0e10cSrcweir SvLBoxEntry* pToExpand = GetEntry(m_aTimerTriggered); 1329*cdf0e10cSrcweir if (pToExpand && (GetChildCount(pToExpand) > 0) && !IsExpanded(pToExpand)) 1330*cdf0e10cSrcweir // tja, eigentlich muesste ich noch testen, ob die Node nicht schon expandiert ist, aber ich 1331*cdf0e10cSrcweir // habe dazu weder in den Basisklassen noch im Model eine Methode gefunden ... 1332*cdf0e10cSrcweir // aber ich denke, die BK sollte es auch so vertragen 1333*cdf0e10cSrcweir Expand(pToExpand); 1334*cdf0e10cSrcweir 1335*cdf0e10cSrcweir // nach dem Expand habe ich im Gegensatz zum Scrollen natuerlich nix mehr zu tun 1336*cdf0e10cSrcweir m_aDropActionTimer.Stop(); 1337*cdf0e10cSrcweir } 1338*cdf0e10cSrcweir break; 1339*cdf0e10cSrcweir } 1340*cdf0e10cSrcweir return 0L; 1341*cdf0e10cSrcweir } 1342*cdf0e10cSrcweir 1343*cdf0e10cSrcweir 1344*cdf0e10cSrcweir //------------------------------------------------------------------------ 1345*cdf0e10cSrcweir sal_Int8 FmFilterNavigator::AcceptDrop( const AcceptDropEvent& rEvt ) 1346*cdf0e10cSrcweir { 1347*cdf0e10cSrcweir Point aDropPos = rEvt.maPosPixel; 1348*cdf0e10cSrcweir 1349*cdf0e10cSrcweir // kuemmern wir uns erst mal um moeglich DropActions (Scrollen und Aufklappen) 1350*cdf0e10cSrcweir if (rEvt.mbLeaving) 1351*cdf0e10cSrcweir { 1352*cdf0e10cSrcweir if (m_aDropActionTimer.IsActive()) 1353*cdf0e10cSrcweir m_aDropActionTimer.Stop(); 1354*cdf0e10cSrcweir } 1355*cdf0e10cSrcweir else 1356*cdf0e10cSrcweir { 1357*cdf0e10cSrcweir sal_Bool bNeedTrigger = sal_False; 1358*cdf0e10cSrcweir // auf dem ersten Eintrag ? 1359*cdf0e10cSrcweir if ((aDropPos.Y() >= 0) && (aDropPos.Y() < GetEntryHeight())) 1360*cdf0e10cSrcweir { 1361*cdf0e10cSrcweir m_aDropActionType = DA_SCROLLUP; 1362*cdf0e10cSrcweir bNeedTrigger = sal_True; 1363*cdf0e10cSrcweir } 1364*cdf0e10cSrcweir else 1365*cdf0e10cSrcweir { 1366*cdf0e10cSrcweir // auf dem letzten (bzw. in dem Bereich, den ein Eintrag einnehmen wuerde, wenn er unten genau buendig 1367*cdf0e10cSrcweir // abschliessen wuerde) ? 1368*cdf0e10cSrcweir if ((aDropPos.Y() < GetSizePixel().Height()) && (aDropPos.Y() >= GetSizePixel().Height() - GetEntryHeight())) 1369*cdf0e10cSrcweir { 1370*cdf0e10cSrcweir m_aDropActionType = DA_SCROLLDOWN; 1371*cdf0e10cSrcweir bNeedTrigger = sal_True; 1372*cdf0e10cSrcweir } 1373*cdf0e10cSrcweir else 1374*cdf0e10cSrcweir { // is it an entry whith children, and not yet expanded? 1375*cdf0e10cSrcweir SvLBoxEntry* pDropppedOn = GetEntry(aDropPos); 1376*cdf0e10cSrcweir if (pDropppedOn && (GetChildCount(pDropppedOn) > 0) && !IsExpanded(pDropppedOn)) 1377*cdf0e10cSrcweir { 1378*cdf0e10cSrcweir // -> aufklappen 1379*cdf0e10cSrcweir m_aDropActionType = DA_EXPANDNODE; 1380*cdf0e10cSrcweir bNeedTrigger = sal_True; 1381*cdf0e10cSrcweir } 1382*cdf0e10cSrcweir } 1383*cdf0e10cSrcweir } 1384*cdf0e10cSrcweir if (bNeedTrigger && (m_aTimerTriggered != aDropPos)) 1385*cdf0e10cSrcweir { 1386*cdf0e10cSrcweir // neu anfangen zu zaehlen 1387*cdf0e10cSrcweir m_aTimerCounter = DROP_ACTION_TIMER_INITIAL_TICKS; 1388*cdf0e10cSrcweir // die Pos merken, da ich auch QueryDrops bekomme, wenn sich die Maus gar nicht bewegt hat 1389*cdf0e10cSrcweir m_aTimerTriggered = aDropPos; 1390*cdf0e10cSrcweir // und den Timer los 1391*cdf0e10cSrcweir if (!m_aDropActionTimer.IsActive()) // gibt es den Timer schon ? 1392*cdf0e10cSrcweir { 1393*cdf0e10cSrcweir m_aDropActionTimer.SetTimeout(DROP_ACTION_TIMER_TICK_BASE); 1394*cdf0e10cSrcweir m_aDropActionTimer.Start(); 1395*cdf0e10cSrcweir } 1396*cdf0e10cSrcweir } 1397*cdf0e10cSrcweir else if (!bNeedTrigger) 1398*cdf0e10cSrcweir m_aDropActionTimer.Stop(); 1399*cdf0e10cSrcweir } 1400*cdf0e10cSrcweir 1401*cdf0e10cSrcweir 1402*cdf0e10cSrcweir // Hat das Object das richtige Format? 1403*cdf0e10cSrcweir if (!m_aControlExchange.isDragSource()) 1404*cdf0e10cSrcweir return DND_ACTION_NONE; 1405*cdf0e10cSrcweir 1406*cdf0e10cSrcweir if (!m_aControlExchange->hasFormat(GetDataFlavorExVector())) 1407*cdf0e10cSrcweir return DND_ACTION_NONE; 1408*cdf0e10cSrcweir 1409*cdf0e10cSrcweir // do we conain the formitem? 1410*cdf0e10cSrcweir if (!FindEntry(m_aControlExchange->getFormItem())) 1411*cdf0e10cSrcweir return DND_ACTION_NONE; 1412*cdf0e10cSrcweir 1413*cdf0e10cSrcweir SvLBoxEntry* pDropTarget = GetEntry(aDropPos); 1414*cdf0e10cSrcweir if (!pDropTarget) 1415*cdf0e10cSrcweir return DND_ACTION_NONE; 1416*cdf0e10cSrcweir 1417*cdf0e10cSrcweir FmFilterData* pData = (FmFilterData*)pDropTarget->GetUserData(); 1418*cdf0e10cSrcweir FmFormItem* pForm = NULL; 1419*cdf0e10cSrcweir if (pData->ISA(FmFilterItem)) 1420*cdf0e10cSrcweir { 1421*cdf0e10cSrcweir pForm = PTR_CAST(FmFormItem,pData->GetParent()->GetParent()); 1422*cdf0e10cSrcweir if (pForm != m_aControlExchange->getFormItem()) 1423*cdf0e10cSrcweir return DND_ACTION_NONE; 1424*cdf0e10cSrcweir } 1425*cdf0e10cSrcweir else if (pData->ISA(FmFilterItems)) 1426*cdf0e10cSrcweir { 1427*cdf0e10cSrcweir pForm = PTR_CAST(FmFormItem,pData->GetParent()); 1428*cdf0e10cSrcweir if (pForm != m_aControlExchange->getFormItem()) 1429*cdf0e10cSrcweir return DND_ACTION_NONE; 1430*cdf0e10cSrcweir } 1431*cdf0e10cSrcweir else 1432*cdf0e10cSrcweir return DND_ACTION_NONE; 1433*cdf0e10cSrcweir 1434*cdf0e10cSrcweir return rEvt.mnAction; 1435*cdf0e10cSrcweir } 1436*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1437*cdf0e10cSrcweir namespace 1438*cdf0e10cSrcweir { 1439*cdf0e10cSrcweir FmFilterItems* getTargetItems(SvLBoxEntry* _pTarget) 1440*cdf0e10cSrcweir { 1441*cdf0e10cSrcweir FmFilterData* pData = static_cast<FmFilterData*>(_pTarget->GetUserData()); 1442*cdf0e10cSrcweir FmFilterItems* pTargetItems = pData->ISA(FmFilterItems) 1443*cdf0e10cSrcweir ? 1444*cdf0e10cSrcweir PTR_CAST(FmFilterItems,pData) 1445*cdf0e10cSrcweir : 1446*cdf0e10cSrcweir PTR_CAST(FmFilterItems,pData->GetParent()); 1447*cdf0e10cSrcweir return pTargetItems; 1448*cdf0e10cSrcweir } 1449*cdf0e10cSrcweir } 1450*cdf0e10cSrcweir //------------------------------------------------------------------------ 1451*cdf0e10cSrcweir sal_Int8 FmFilterNavigator::ExecuteDrop( const ExecuteDropEvent& rEvt ) 1452*cdf0e10cSrcweir { 1453*cdf0e10cSrcweir // ware schlecht, wenn nach dem Droppen noch gescrollt wird ... 1454*cdf0e10cSrcweir if (m_aDropActionTimer.IsActive()) 1455*cdf0e10cSrcweir m_aDropActionTimer.Stop(); 1456*cdf0e10cSrcweir 1457*cdf0e10cSrcweir // Format-Ueberpruefung 1458*cdf0e10cSrcweir if (!m_aControlExchange.isDragSource()) 1459*cdf0e10cSrcweir return DND_ACTION_NONE; 1460*cdf0e10cSrcweir 1461*cdf0e10cSrcweir // das Ziel des Drop sowie einige Daten darueber 1462*cdf0e10cSrcweir Point aDropPos = rEvt.maPosPixel; 1463*cdf0e10cSrcweir SvLBoxEntry* pDropTarget = GetEntry( aDropPos ); 1464*cdf0e10cSrcweir if (!pDropTarget) 1465*cdf0e10cSrcweir return DND_ACTION_NONE; 1466*cdf0e10cSrcweir 1467*cdf0e10cSrcweir // search the container where to add the items 1468*cdf0e10cSrcweir FmFilterItems* pTargetItems = getTargetItems(pDropTarget); 1469*cdf0e10cSrcweir SelectAll(sal_False); 1470*cdf0e10cSrcweir SvLBoxEntry* pEntry = FindEntry(pTargetItems); 1471*cdf0e10cSrcweir Select(pEntry, sal_True); 1472*cdf0e10cSrcweir SetCurEntry(pEntry); 1473*cdf0e10cSrcweir 1474*cdf0e10cSrcweir insertFilterItem(m_aControlExchange->getDraggedEntries(),pTargetItems,DND_ACTION_COPY == rEvt.mnAction); 1475*cdf0e10cSrcweir 1476*cdf0e10cSrcweir return sal_True; 1477*cdf0e10cSrcweir } 1478*cdf0e10cSrcweir 1479*cdf0e10cSrcweir //------------------------------------------------------------------------ 1480*cdf0e10cSrcweir void FmFilterNavigator::InitEntry(SvLBoxEntry* pEntry, 1481*cdf0e10cSrcweir const XubString& rStr, 1482*cdf0e10cSrcweir const Image& rImg1, 1483*cdf0e10cSrcweir const Image& rImg2, 1484*cdf0e10cSrcweir SvLBoxButtonKind eButtonKind) 1485*cdf0e10cSrcweir { 1486*cdf0e10cSrcweir SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind ); 1487*cdf0e10cSrcweir SvLBoxString* pString = NULL; 1488*cdf0e10cSrcweir 1489*cdf0e10cSrcweir if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItem)) 1490*cdf0e10cSrcweir pString = new FmFilterString(pEntry, 0, rStr, ((FmFilterItem*)pEntry->GetUserData())->GetFieldName()); 1491*cdf0e10cSrcweir else if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItems)) 1492*cdf0e10cSrcweir pString = new FmFilterItemsString(pEntry, 0, rStr ); 1493*cdf0e10cSrcweir 1494*cdf0e10cSrcweir if (pString) 1495*cdf0e10cSrcweir pEntry->ReplaceItem( pString, 1 ); 1496*cdf0e10cSrcweir } 1497*cdf0e10cSrcweir 1498*cdf0e10cSrcweir //------------------------------------------------------------------------ 1499*cdf0e10cSrcweir sal_Bool FmFilterNavigator::Select( SvLBoxEntry* pEntry, sal_Bool bSelect ) 1500*cdf0e10cSrcweir { 1501*cdf0e10cSrcweir if (bSelect == IsSelected(pEntry)) // das passiert manchmal, ich glaube, die Basisklasse geht zu sehr auf Nummer sicher ;) 1502*cdf0e10cSrcweir return sal_True; 1503*cdf0e10cSrcweir 1504*cdf0e10cSrcweir if (SvTreeListBox::Select(pEntry, bSelect)) 1505*cdf0e10cSrcweir { 1506*cdf0e10cSrcweir if (bSelect) 1507*cdf0e10cSrcweir { 1508*cdf0e10cSrcweir FmFormItem* pFormItem = NULL; 1509*cdf0e10cSrcweir if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItem)) 1510*cdf0e10cSrcweir pFormItem = (FmFormItem*)((FmFilterItem*)pEntry->GetUserData())->GetParent()->GetParent(); 1511*cdf0e10cSrcweir else if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItems)) 1512*cdf0e10cSrcweir pFormItem = (FmFormItem*)((FmFilterItem*)pEntry->GetUserData())->GetParent()->GetParent(); 1513*cdf0e10cSrcweir else if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFormItem)) 1514*cdf0e10cSrcweir pFormItem = (FmFormItem*)pEntry->GetUserData(); 1515*cdf0e10cSrcweir 1516*cdf0e10cSrcweir if (pFormItem) 1517*cdf0e10cSrcweir { 1518*cdf0e10cSrcweir // will the controller be exchanged? 1519*cdf0e10cSrcweir if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItem)) 1520*cdf0e10cSrcweir m_pModel->SetCurrentItems((FmFilterItems*)((FmFilterItem*)pEntry->GetUserData())->GetParent()); 1521*cdf0e10cSrcweir else if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFilterItems)) 1522*cdf0e10cSrcweir m_pModel->SetCurrentItems((FmFilterItems*)pEntry->GetUserData()); 1523*cdf0e10cSrcweir else if (((FmFilterData*)pEntry->GetUserData())->ISA(FmFormItem)) 1524*cdf0e10cSrcweir m_pModel->SetCurrentController(((FmFormItem*)pEntry->GetUserData())->GetController()); 1525*cdf0e10cSrcweir } 1526*cdf0e10cSrcweir } 1527*cdf0e10cSrcweir return sal_True; 1528*cdf0e10cSrcweir } 1529*cdf0e10cSrcweir else 1530*cdf0e10cSrcweir return sal_False; 1531*cdf0e10cSrcweir } 1532*cdf0e10cSrcweir 1533*cdf0e10cSrcweir //------------------------------------------------------------------------ 1534*cdf0e10cSrcweir void FmFilterNavigator::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) 1535*cdf0e10cSrcweir { 1536*cdf0e10cSrcweir if (rHint.ISA(FmFilterInsertedHint)) 1537*cdf0e10cSrcweir { 1538*cdf0e10cSrcweir FmFilterInsertedHint* pHint = (FmFilterInsertedHint*)&rHint; 1539*cdf0e10cSrcweir Insert(pHint->GetData(), pHint->GetPos()); 1540*cdf0e10cSrcweir } 1541*cdf0e10cSrcweir else if( rHint.ISA(FilterClearingHint) ) 1542*cdf0e10cSrcweir { 1543*cdf0e10cSrcweir SvTreeListBox::Clear(); 1544*cdf0e10cSrcweir } 1545*cdf0e10cSrcweir else if( rHint.ISA(FmFilterRemovedHint) ) 1546*cdf0e10cSrcweir { 1547*cdf0e10cSrcweir FmFilterRemovedHint* pHint = (FmFilterRemovedHint*)&rHint; 1548*cdf0e10cSrcweir Remove(pHint->GetData()); 1549*cdf0e10cSrcweir } 1550*cdf0e10cSrcweir else if( rHint.ISA(FmFilterTextChangedHint) ) 1551*cdf0e10cSrcweir { 1552*cdf0e10cSrcweir FmFilterTextChangedHint* pHint = (FmFilterTextChangedHint*)&rHint; 1553*cdf0e10cSrcweir SvLBoxEntry* pEntry = FindEntry(pHint->GetData()); 1554*cdf0e10cSrcweir if (pEntry) 1555*cdf0e10cSrcweir SetEntryText( pEntry, pHint->GetData()->GetText()); 1556*cdf0e10cSrcweir } 1557*cdf0e10cSrcweir else if( rHint.ISA(FmFilterCurrentChangedHint) ) 1558*cdf0e10cSrcweir { 1559*cdf0e10cSrcweir // invalidate the entries 1560*cdf0e10cSrcweir for (SvLBoxEntry* pEntry = First(); pEntry != NULL; 1561*cdf0e10cSrcweir pEntry = Next(pEntry)) 1562*cdf0e10cSrcweir GetModel()->InvalidateEntry( pEntry ); 1563*cdf0e10cSrcweir } 1564*cdf0e10cSrcweir } 1565*cdf0e10cSrcweir 1566*cdf0e10cSrcweir //------------------------------------------------------------------------ 1567*cdf0e10cSrcweir SvLBoxEntry* FmFilterNavigator::FindEntry(const FmFilterData* pItem) const 1568*cdf0e10cSrcweir { 1569*cdf0e10cSrcweir SvLBoxEntry* pEntry = NULL; 1570*cdf0e10cSrcweir if (pItem) 1571*cdf0e10cSrcweir { 1572*cdf0e10cSrcweir for (pEntry = First(); pEntry != NULL; pEntry = Next( pEntry )) 1573*cdf0e10cSrcweir { 1574*cdf0e10cSrcweir FmFilterData* pEntryItem = (FmFilterData*)pEntry->GetUserData(); 1575*cdf0e10cSrcweir if (pEntryItem == pItem) 1576*cdf0e10cSrcweir break; 1577*cdf0e10cSrcweir } 1578*cdf0e10cSrcweir } 1579*cdf0e10cSrcweir return pEntry; 1580*cdf0e10cSrcweir } 1581*cdf0e10cSrcweir 1582*cdf0e10cSrcweir //------------------------------------------------------------------------ 1583*cdf0e10cSrcweir void FmFilterNavigator::Insert(FmFilterData* pItem, sal_Int32 nPos) 1584*cdf0e10cSrcweir { 1585*cdf0e10cSrcweir const FmParentData* pParent = pItem->GetParent() ? pItem->GetParent() : GetFilterModel(); 1586*cdf0e10cSrcweir 1587*cdf0e10cSrcweir // insert the item 1588*cdf0e10cSrcweir SvLBoxEntry* pParentEntry = FindEntry( pParent ); 1589*cdf0e10cSrcweir SvLBoxEntry* pNewEntry = InsertEntry(pItem->GetText(), pItem->GetImage(), pItem->GetImage(), pParentEntry, sal_False, nPos, pItem ); 1590*cdf0e10cSrcweir if ( pNewEntry ) 1591*cdf0e10cSrcweir { 1592*cdf0e10cSrcweir SetExpandedEntryBmp( pNewEntry, pItem->GetImage( BMP_COLOR_HIGHCONTRAST ), BMP_COLOR_HIGHCONTRAST ); 1593*cdf0e10cSrcweir SetCollapsedEntryBmp( pNewEntry, pItem->GetImage( BMP_COLOR_HIGHCONTRAST ), BMP_COLOR_HIGHCONTRAST ); 1594*cdf0e10cSrcweir } 1595*cdf0e10cSrcweir if ( pParentEntry ) 1596*cdf0e10cSrcweir Expand( pParentEntry ); 1597*cdf0e10cSrcweir } 1598*cdf0e10cSrcweir 1599*cdf0e10cSrcweir //------------------------------------------------------------------------ 1600*cdf0e10cSrcweir void FmFilterNavigator::Remove(FmFilterData* pItem) 1601*cdf0e10cSrcweir { 1602*cdf0e10cSrcweir // der Entry zu den Daten 1603*cdf0e10cSrcweir SvLBoxEntry* pEntry = FindEntry(pItem); 1604*cdf0e10cSrcweir 1605*cdf0e10cSrcweir if (pEntry == m_pEditingCurrently) 1606*cdf0e10cSrcweir // cancel editing 1607*cdf0e10cSrcweir EndEditing(sal_True); 1608*cdf0e10cSrcweir 1609*cdf0e10cSrcweir if (pEntry) 1610*cdf0e10cSrcweir GetModel()->Remove( pEntry ); 1611*cdf0e10cSrcweir } 1612*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1613*cdf0e10cSrcweir FmFormItem* FmFilterNavigator::getSelectedFilterItems(::std::vector<FmFilterItem*>& _rItemList) 1614*cdf0e10cSrcweir { 1615*cdf0e10cSrcweir // be sure that the data is only used within only one form! 1616*cdf0e10cSrcweir FmFormItem* pFirstItem = NULL; 1617*cdf0e10cSrcweir 1618*cdf0e10cSrcweir sal_Bool bHandled = sal_True; 1619*cdf0e10cSrcweir sal_Bool bFoundSomething = sal_False; 1620*cdf0e10cSrcweir for (SvLBoxEntry* pEntry = FirstSelected(); 1621*cdf0e10cSrcweir bHandled && pEntry != NULL; 1622*cdf0e10cSrcweir pEntry = NextSelected(pEntry)) 1623*cdf0e10cSrcweir { 1624*cdf0e10cSrcweir FmFilterItem* pFilter = PTR_CAST(FmFilterItem, (FmFilterData*)pEntry->GetUserData()); 1625*cdf0e10cSrcweir if (pFilter) 1626*cdf0e10cSrcweir { 1627*cdf0e10cSrcweir FmFormItem* pForm = PTR_CAST(FmFormItem,pFilter->GetParent()->GetParent()); 1628*cdf0e10cSrcweir if (!pForm) 1629*cdf0e10cSrcweir bHandled = sal_False; 1630*cdf0e10cSrcweir else if (!pFirstItem) 1631*cdf0e10cSrcweir pFirstItem = pForm; 1632*cdf0e10cSrcweir else if (pFirstItem != pForm) 1633*cdf0e10cSrcweir bHandled = sal_False; 1634*cdf0e10cSrcweir 1635*cdf0e10cSrcweir if (bHandled) 1636*cdf0e10cSrcweir { 1637*cdf0e10cSrcweir _rItemList.push_back(pFilter); 1638*cdf0e10cSrcweir bFoundSomething = sal_True; 1639*cdf0e10cSrcweir } 1640*cdf0e10cSrcweir } 1641*cdf0e10cSrcweir } 1642*cdf0e10cSrcweir if ( !bHandled || !bFoundSomething ) 1643*cdf0e10cSrcweir pFirstItem = NULL; 1644*cdf0e10cSrcweir return pFirstItem; 1645*cdf0e10cSrcweir } 1646*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1647*cdf0e10cSrcweir void FmFilterNavigator::insertFilterItem(const ::std::vector<FmFilterItem*>& _rFilterList,FmFilterItems* _pTargetItems,sal_Bool _bCopy) 1648*cdf0e10cSrcweir { 1649*cdf0e10cSrcweir ::std::vector<FmFilterItem*>::const_iterator aEnd = _rFilterList.end(); 1650*cdf0e10cSrcweir for ( ::std::vector< FmFilterItem* >::const_iterator i = _rFilterList.begin(); 1651*cdf0e10cSrcweir i != aEnd; 1652*cdf0e10cSrcweir ++i 1653*cdf0e10cSrcweir ) 1654*cdf0e10cSrcweir { 1655*cdf0e10cSrcweir FmFilterItem* pLookupItem( *i ); 1656*cdf0e10cSrcweir if ( pLookupItem->GetParent() == _pTargetItems ) 1657*cdf0e10cSrcweir continue; 1658*cdf0e10cSrcweir 1659*cdf0e10cSrcweir FmFilterItem* pFilterItem = _pTargetItems->Find( pLookupItem->GetComponentIndex() ); 1660*cdf0e10cSrcweir String aText = pLookupItem->GetText(); 1661*cdf0e10cSrcweir if ( !pFilterItem ) 1662*cdf0e10cSrcweir { 1663*cdf0e10cSrcweir pFilterItem = new FmFilterItem( m_pModel->getORB(), _pTargetItems, pLookupItem->GetFieldName(), aText, pLookupItem->GetComponentIndex() ); 1664*cdf0e10cSrcweir m_pModel->Append( _pTargetItems, pFilterItem ); 1665*cdf0e10cSrcweir } 1666*cdf0e10cSrcweir 1667*cdf0e10cSrcweir if ( !_bCopy ) 1668*cdf0e10cSrcweir m_pModel->Remove( pLookupItem ); 1669*cdf0e10cSrcweir 1670*cdf0e10cSrcweir // now set the text for the new dragged item 1671*cdf0e10cSrcweir m_pModel->SetTextForItem( pFilterItem, aText ); 1672*cdf0e10cSrcweir } 1673*cdf0e10cSrcweir 1674*cdf0e10cSrcweir m_pModel->EnsureEmptyFilterRows( *_pTargetItems->GetParent() ); 1675*cdf0e10cSrcweir } 1676*cdf0e10cSrcweir 1677*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1678*cdf0e10cSrcweir void FmFilterNavigator::StartDrag( sal_Int8 /*_nAction*/, const Point& /*_rPosPixel*/ ) 1679*cdf0e10cSrcweir { 1680*cdf0e10cSrcweir EndSelection(); 1681*cdf0e10cSrcweir 1682*cdf0e10cSrcweir // be sure that the data is only used within a only one form! 1683*cdf0e10cSrcweir m_aControlExchange.prepareDrag(); 1684*cdf0e10cSrcweir 1685*cdf0e10cSrcweir ::std::vector<FmFilterItem*> aItemList; 1686*cdf0e10cSrcweir if ( FmFormItem* pFirstItem = getSelectedFilterItems(aItemList) ) 1687*cdf0e10cSrcweir { 1688*cdf0e10cSrcweir m_aControlExchange->setDraggedEntries(aItemList); 1689*cdf0e10cSrcweir m_aControlExchange->setFormItem(pFirstItem); 1690*cdf0e10cSrcweir m_aControlExchange.startDrag( DND_ACTION_COPYMOVE ); 1691*cdf0e10cSrcweir } 1692*cdf0e10cSrcweir } 1693*cdf0e10cSrcweir 1694*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1695*cdf0e10cSrcweir void FmFilterNavigator::Command( const CommandEvent& rEvt ) 1696*cdf0e10cSrcweir { 1697*cdf0e10cSrcweir sal_Bool bHandled = sal_False; 1698*cdf0e10cSrcweir switch (rEvt.GetCommand()) 1699*cdf0e10cSrcweir { 1700*cdf0e10cSrcweir case COMMAND_CONTEXTMENU: 1701*cdf0e10cSrcweir { 1702*cdf0e10cSrcweir // die Stelle, an der geklickt wurde 1703*cdf0e10cSrcweir Point aWhere; 1704*cdf0e10cSrcweir SvLBoxEntry* pClicked = NULL; 1705*cdf0e10cSrcweir if (rEvt.IsMouseEvent()) 1706*cdf0e10cSrcweir { 1707*cdf0e10cSrcweir aWhere = rEvt.GetMousePosPixel(); 1708*cdf0e10cSrcweir pClicked = GetEntry(aWhere); 1709*cdf0e10cSrcweir if (pClicked == NULL) 1710*cdf0e10cSrcweir break; 1711*cdf0e10cSrcweir 1712*cdf0e10cSrcweir if (!IsSelected(pClicked)) 1713*cdf0e10cSrcweir { 1714*cdf0e10cSrcweir SelectAll(sal_False); 1715*cdf0e10cSrcweir Select(pClicked, sal_True); 1716*cdf0e10cSrcweir SetCurEntry(pClicked); 1717*cdf0e10cSrcweir } 1718*cdf0e10cSrcweir } 1719*cdf0e10cSrcweir else 1720*cdf0e10cSrcweir { 1721*cdf0e10cSrcweir pClicked = GetCurEntry(); 1722*cdf0e10cSrcweir if (!pClicked) 1723*cdf0e10cSrcweir break; 1724*cdf0e10cSrcweir aWhere = GetEntryPosition( pClicked ); 1725*cdf0e10cSrcweir } 1726*cdf0e10cSrcweir 1727*cdf0e10cSrcweir ::std::vector<FmFilterData*> aSelectList; 1728*cdf0e10cSrcweir for (SvLBoxEntry* pEntry = FirstSelected(); 1729*cdf0e10cSrcweir pEntry != NULL; 1730*cdf0e10cSrcweir pEntry = NextSelected(pEntry)) 1731*cdf0e10cSrcweir { 1732*cdf0e10cSrcweir // don't delete forms 1733*cdf0e10cSrcweir FmFormItem* pForm = PTR_CAST(FmFormItem, (FmFilterData*)pEntry->GetUserData()); 1734*cdf0e10cSrcweir if (!pForm) 1735*cdf0e10cSrcweir aSelectList.push_back((FmFilterData*)pEntry->GetUserData()); 1736*cdf0e10cSrcweir } 1737*cdf0e10cSrcweir if (aSelectList.size() == 1) 1738*cdf0e10cSrcweir { 1739*cdf0e10cSrcweir // don't delete the only empty row of a form 1740*cdf0e10cSrcweir FmFilterItems* pFilterItems = PTR_CAST(FmFilterItems, aSelectList[0]); 1741*cdf0e10cSrcweir if (pFilterItems && pFilterItems->GetChildren().empty() 1742*cdf0e10cSrcweir && pFilterItems->GetParent()->GetChildren().size() == 1) 1743*cdf0e10cSrcweir aSelectList.clear(); 1744*cdf0e10cSrcweir } 1745*cdf0e10cSrcweir 1746*cdf0e10cSrcweir PopupMenu aContextMenu(SVX_RES(RID_FM_FILTER_MENU)); 1747*cdf0e10cSrcweir 1748*cdf0e10cSrcweir // every condition could be deleted except the first one if its the only one 1749*cdf0e10cSrcweir aContextMenu.EnableItem( SID_FM_DELETE, !aSelectList.empty() ); 1750*cdf0e10cSrcweir 1751*cdf0e10cSrcweir // 1752*cdf0e10cSrcweir sal_Bool bEdit = PTR_CAST(FmFilterItem, (FmFilterData*)pClicked->GetUserData()) != NULL && 1753*cdf0e10cSrcweir IsSelected(pClicked) && GetSelectionCount() == 1; 1754*cdf0e10cSrcweir 1755*cdf0e10cSrcweir aContextMenu.EnableItem( SID_FM_FILTER_EDIT, 1756*cdf0e10cSrcweir bEdit ); 1757*cdf0e10cSrcweir aContextMenu.EnableItem( SID_FM_FILTER_IS_NULL, 1758*cdf0e10cSrcweir bEdit ); 1759*cdf0e10cSrcweir aContextMenu.EnableItem( SID_FM_FILTER_IS_NOT_NULL, 1760*cdf0e10cSrcweir bEdit ); 1761*cdf0e10cSrcweir 1762*cdf0e10cSrcweir aContextMenu.RemoveDisabledEntries(sal_True, sal_True); 1763*cdf0e10cSrcweir sal_uInt16 nSlotId = aContextMenu.Execute( this, aWhere ); 1764*cdf0e10cSrcweir switch( nSlotId ) 1765*cdf0e10cSrcweir { 1766*cdf0e10cSrcweir case SID_FM_FILTER_EDIT: 1767*cdf0e10cSrcweir { 1768*cdf0e10cSrcweir EditEntry( pClicked ); 1769*cdf0e10cSrcweir } break; 1770*cdf0e10cSrcweir case SID_FM_FILTER_IS_NULL: 1771*cdf0e10cSrcweir case SID_FM_FILTER_IS_NOT_NULL: 1772*cdf0e10cSrcweir { 1773*cdf0e10cSrcweir UniString aErrorMsg; 1774*cdf0e10cSrcweir UniString aText; 1775*cdf0e10cSrcweir if (nSlotId == SID_FM_FILTER_IS_NULL) 1776*cdf0e10cSrcweir aText.AssignAscii("IS NULL"); 1777*cdf0e10cSrcweir else 1778*cdf0e10cSrcweir aText.AssignAscii("IS NOT NULL"); 1779*cdf0e10cSrcweir 1780*cdf0e10cSrcweir m_pModel->ValidateText((FmFilterItem*)pClicked->GetUserData(), 1781*cdf0e10cSrcweir aText, aErrorMsg); 1782*cdf0e10cSrcweir m_pModel->SetTextForItem((FmFilterItem*)pClicked->GetUserData(), aText); 1783*cdf0e10cSrcweir } break; 1784*cdf0e10cSrcweir case SID_FM_DELETE: 1785*cdf0e10cSrcweir { 1786*cdf0e10cSrcweir DeleteSelection(); 1787*cdf0e10cSrcweir } break; 1788*cdf0e10cSrcweir } 1789*cdf0e10cSrcweir bHandled = sal_True; 1790*cdf0e10cSrcweir } break; 1791*cdf0e10cSrcweir } 1792*cdf0e10cSrcweir 1793*cdf0e10cSrcweir if (!bHandled) 1794*cdf0e10cSrcweir SvTreeListBox::Command( rEvt ); 1795*cdf0e10cSrcweir } 1796*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1797*cdf0e10cSrcweir SvLBoxEntry* FmFilterNavigator::getNextEntry(SvLBoxEntry* _pStartWith) 1798*cdf0e10cSrcweir { 1799*cdf0e10cSrcweir SvLBoxEntry* pEntry = _pStartWith ? _pStartWith : LastSelected(); 1800*cdf0e10cSrcweir pEntry = Next(pEntry); 1801*cdf0e10cSrcweir // we need the next filter entry 1802*cdf0e10cSrcweir while( pEntry && GetChildCount( pEntry ) == 0 && pEntry != Last() ) 1803*cdf0e10cSrcweir pEntry = Next(pEntry); 1804*cdf0e10cSrcweir return pEntry; 1805*cdf0e10cSrcweir } 1806*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1807*cdf0e10cSrcweir SvLBoxEntry* FmFilterNavigator::getPrevEntry(SvLBoxEntry* _pStartWith) 1808*cdf0e10cSrcweir { 1809*cdf0e10cSrcweir SvLBoxEntry* pEntry = _pStartWith ? _pStartWith : FirstSelected(); 1810*cdf0e10cSrcweir pEntry = Prev(pEntry); 1811*cdf0e10cSrcweir // check if the previous entry is a filter, if so get the next prev 1812*cdf0e10cSrcweir if ( pEntry && GetChildCount( pEntry ) != 0 ) 1813*cdf0e10cSrcweir { 1814*cdf0e10cSrcweir pEntry = Prev(pEntry); 1815*cdf0e10cSrcweir // if the entry is still no leaf return 1816*cdf0e10cSrcweir if ( pEntry && GetChildCount( pEntry ) != 0 ) 1817*cdf0e10cSrcweir pEntry = NULL; 1818*cdf0e10cSrcweir } 1819*cdf0e10cSrcweir return pEntry; 1820*cdf0e10cSrcweir } 1821*cdf0e10cSrcweir //------------------------------------------------------------------------ 1822*cdf0e10cSrcweir void FmFilterNavigator::KeyInput(const KeyEvent& rKEvt) 1823*cdf0e10cSrcweir { 1824*cdf0e10cSrcweir const KeyCode& rKeyCode = rKEvt.GetKeyCode(); 1825*cdf0e10cSrcweir 1826*cdf0e10cSrcweir switch ( rKeyCode.GetCode() ) 1827*cdf0e10cSrcweir { 1828*cdf0e10cSrcweir case KEY_UP: 1829*cdf0e10cSrcweir case KEY_DOWN: 1830*cdf0e10cSrcweir { 1831*cdf0e10cSrcweir if ( !rKeyCode.IsMod1() || !rKeyCode.IsMod2() || rKeyCode.IsShift() ) 1832*cdf0e10cSrcweir break; 1833*cdf0e10cSrcweir 1834*cdf0e10cSrcweir ::std::vector<FmFilterItem*> aItemList; 1835*cdf0e10cSrcweir if ( !getSelectedFilterItems( aItemList ) ) 1836*cdf0e10cSrcweir break; 1837*cdf0e10cSrcweir 1838*cdf0e10cSrcweir ::std::mem_fun1_t<SvLBoxEntry*,FmFilterNavigator,SvLBoxEntry*> getter = ::std::mem_fun(&FmFilterNavigator::getNextEntry); 1839*cdf0e10cSrcweir if ( rKeyCode.GetCode() == KEY_UP ) 1840*cdf0e10cSrcweir getter = ::std::mem_fun(&FmFilterNavigator::getPrevEntry); 1841*cdf0e10cSrcweir 1842*cdf0e10cSrcweir SvLBoxEntry* pTarget = getter( this, NULL ); 1843*cdf0e10cSrcweir if ( !pTarget ) 1844*cdf0e10cSrcweir break; 1845*cdf0e10cSrcweir 1846*cdf0e10cSrcweir FmFilterItems* pTargetItems = getTargetItems( pTarget ); 1847*cdf0e10cSrcweir if ( !pTargetItems ) 1848*cdf0e10cSrcweir break; 1849*cdf0e10cSrcweir 1850*cdf0e10cSrcweir ::std::vector<FmFilterItem*>::const_iterator aEnd = aItemList.end(); 1851*cdf0e10cSrcweir sal_Bool bNextTargetItem = sal_True; 1852*cdf0e10cSrcweir while ( bNextTargetItem ) 1853*cdf0e10cSrcweir { 1854*cdf0e10cSrcweir ::std::vector<FmFilterItem*>::const_iterator i = aItemList.begin(); 1855*cdf0e10cSrcweir for (; i != aEnd; ++i) 1856*cdf0e10cSrcweir { 1857*cdf0e10cSrcweir if ( (*i)->GetParent() == pTargetItems ) 1858*cdf0e10cSrcweir { 1859*cdf0e10cSrcweir pTarget = getter(this,pTarget); 1860*cdf0e10cSrcweir if ( !pTarget ) 1861*cdf0e10cSrcweir return; 1862*cdf0e10cSrcweir pTargetItems = getTargetItems( pTarget ); 1863*cdf0e10cSrcweir break; 1864*cdf0e10cSrcweir } 1865*cdf0e10cSrcweir else 1866*cdf0e10cSrcweir { 1867*cdf0e10cSrcweir FmFilterItem* pFilterItem = pTargetItems->Find( (*i)->GetComponentIndex() ); 1868*cdf0e10cSrcweir // we found the text component so jump above 1869*cdf0e10cSrcweir if ( pFilterItem ) 1870*cdf0e10cSrcweir { 1871*cdf0e10cSrcweir pTarget = getter( this, pTarget ); 1872*cdf0e10cSrcweir if ( !pTarget ) 1873*cdf0e10cSrcweir return; 1874*cdf0e10cSrcweir 1875*cdf0e10cSrcweir pTargetItems = getTargetItems( pTarget ); 1876*cdf0e10cSrcweir break; 1877*cdf0e10cSrcweir } 1878*cdf0e10cSrcweir } 1879*cdf0e10cSrcweir } 1880*cdf0e10cSrcweir bNextTargetItem = i != aEnd && pTargetItems; 1881*cdf0e10cSrcweir } 1882*cdf0e10cSrcweir 1883*cdf0e10cSrcweir if ( pTargetItems ) 1884*cdf0e10cSrcweir { 1885*cdf0e10cSrcweir insertFilterItem( aItemList, pTargetItems ); 1886*cdf0e10cSrcweir return; 1887*cdf0e10cSrcweir } 1888*cdf0e10cSrcweir } 1889*cdf0e10cSrcweir break; 1890*cdf0e10cSrcweir 1891*cdf0e10cSrcweir case KEY_DELETE: 1892*cdf0e10cSrcweir { 1893*cdf0e10cSrcweir if ( rKeyCode.GetModifier() ) 1894*cdf0e10cSrcweir break; 1895*cdf0e10cSrcweir 1896*cdf0e10cSrcweir if ( !IsSelected( First() ) || GetEntryCount() > 1 ) 1897*cdf0e10cSrcweir DeleteSelection(); 1898*cdf0e10cSrcweir return; 1899*cdf0e10cSrcweir } 1900*cdf0e10cSrcweir } 1901*cdf0e10cSrcweir 1902*cdf0e10cSrcweir SvTreeListBox::KeyInput(rKEvt); 1903*cdf0e10cSrcweir } 1904*cdf0e10cSrcweir 1905*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1906*cdf0e10cSrcweir void FmFilterNavigator::DeleteSelection() 1907*cdf0e10cSrcweir { 1908*cdf0e10cSrcweir // to avoid the deletion of an entry twice (e.g. deletion of a parent and afterward 1909*cdf0e10cSrcweir // the deletion of it's child, i have to shrink the selecton list 1910*cdf0e10cSrcweir ::std::vector<SvLBoxEntry*> aEntryList; 1911*cdf0e10cSrcweir for (SvLBoxEntry* pEntry = FirstSelected(); 1912*cdf0e10cSrcweir pEntry != NULL; 1913*cdf0e10cSrcweir pEntry = NextSelected(pEntry)) 1914*cdf0e10cSrcweir { 1915*cdf0e10cSrcweir FmFilterItem* pFilterItem = PTR_CAST(FmFilterItem, (FmFilterData*)pEntry->GetUserData()); 1916*cdf0e10cSrcweir if (pFilterItem && IsSelected(GetParent(pEntry))) 1917*cdf0e10cSrcweir continue; 1918*cdf0e10cSrcweir 1919*cdf0e10cSrcweir FmFormItem* pForm = PTR_CAST(FmFormItem, (FmFilterData*)pEntry->GetUserData()); 1920*cdf0e10cSrcweir if (!pForm) 1921*cdf0e10cSrcweir aEntryList.push_back(pEntry); 1922*cdf0e10cSrcweir } 1923*cdf0e10cSrcweir 1924*cdf0e10cSrcweir // Remove the selection 1925*cdf0e10cSrcweir SelectAll(sal_False); 1926*cdf0e10cSrcweir 1927*cdf0e10cSrcweir for (::std::vector<SvLBoxEntry*>::reverse_iterator i = aEntryList.rbegin(); 1928*cdf0e10cSrcweir // link problems with operator == 1929*cdf0e10cSrcweir i.base() != aEntryList.rend().base(); i++) 1930*cdf0e10cSrcweir { 1931*cdf0e10cSrcweir m_pModel->Remove((FmFilterData*)(*i)->GetUserData()); 1932*cdf0e10cSrcweir } 1933*cdf0e10cSrcweir } 1934*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1935*cdf0e10cSrcweir 1936*cdf0e10cSrcweir //======================================================================== 1937*cdf0e10cSrcweir // class FmFilterNavigatorWin 1938*cdf0e10cSrcweir //======================================================================== 1939*cdf0e10cSrcweir FmFilterNavigatorWin::FmFilterNavigatorWin( SfxBindings* _pBindings, SfxChildWindow* _pMgr, 1940*cdf0e10cSrcweir Window* _pParent ) 1941*cdf0e10cSrcweir :SfxDockingWindow( _pBindings, _pMgr, _pParent, WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_ROLLABLE|WB_3DLOOK|WB_DOCKABLE) ) 1942*cdf0e10cSrcweir ,SfxControllerItem( SID_FM_FILTER_NAVIGATOR_CONTROL, *_pBindings ) 1943*cdf0e10cSrcweir { 1944*cdf0e10cSrcweir SetHelpId( HID_FILTER_NAVIGATOR_WIN ); 1945*cdf0e10cSrcweir 1946*cdf0e10cSrcweir m_pNavigator = new FmFilterNavigator( this ); 1947*cdf0e10cSrcweir m_pNavigator->Show(); 1948*cdf0e10cSrcweir SetText( SVX_RES(RID_STR_FILTER_NAVIGATOR) ); 1949*cdf0e10cSrcweir SfxDockingWindow::SetFloatingSize( Size(200,200) ); 1950*cdf0e10cSrcweir } 1951*cdf0e10cSrcweir 1952*cdf0e10cSrcweir //------------------------------------------------------------------------ 1953*cdf0e10cSrcweir FmFilterNavigatorWin::~FmFilterNavigatorWin() 1954*cdf0e10cSrcweir { 1955*cdf0e10cSrcweir delete m_pNavigator; 1956*cdf0e10cSrcweir } 1957*cdf0e10cSrcweir 1958*cdf0e10cSrcweir //----------------------------------------------------------------------- 1959*cdf0e10cSrcweir void FmFilterNavigatorWin::UpdateContent(FmFormShell* pFormShell) 1960*cdf0e10cSrcweir { 1961*cdf0e10cSrcweir if (!pFormShell) 1962*cdf0e10cSrcweir m_pNavigator->UpdateContent( NULL, NULL ); 1963*cdf0e10cSrcweir else 1964*cdf0e10cSrcweir { 1965*cdf0e10cSrcweir Reference< XFormController > xController(pFormShell->GetImpl()->getActiveInternalController()); 1966*cdf0e10cSrcweir Reference< XIndexAccess > xContainer; 1967*cdf0e10cSrcweir if (xController.is()) 1968*cdf0e10cSrcweir { 1969*cdf0e10cSrcweir Reference< XChild > xChild(xController, UNO_QUERY); 1970*cdf0e10cSrcweir for (Reference< XInterface > xParent(xChild->getParent()); 1971*cdf0e10cSrcweir xParent.is(); 1972*cdf0e10cSrcweir xParent = xChild.is() ? xChild->getParent() : Reference< XInterface > ()) 1973*cdf0e10cSrcweir { 1974*cdf0e10cSrcweir xContainer = Reference< XIndexAccess > (xParent, UNO_QUERY); 1975*cdf0e10cSrcweir xChild = Reference< XChild > (xParent, UNO_QUERY); 1976*cdf0e10cSrcweir } 1977*cdf0e10cSrcweir } 1978*cdf0e10cSrcweir m_pNavigator->UpdateContent(xContainer, xController); 1979*cdf0e10cSrcweir } 1980*cdf0e10cSrcweir } 1981*cdf0e10cSrcweir 1982*cdf0e10cSrcweir //----------------------------------------------------------------------- 1983*cdf0e10cSrcweir void FmFilterNavigatorWin::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) 1984*cdf0e10cSrcweir { 1985*cdf0e10cSrcweir if( !pState || SID_FM_FILTER_NAVIGATOR_CONTROL != nSID ) 1986*cdf0e10cSrcweir return; 1987*cdf0e10cSrcweir 1988*cdf0e10cSrcweir if( eState >= SFX_ITEM_AVAILABLE ) 1989*cdf0e10cSrcweir { 1990*cdf0e10cSrcweir FmFormShell* pShell = PTR_CAST( FmFormShell,((SfxObjectItem*)pState)->GetShell() ); 1991*cdf0e10cSrcweir UpdateContent( pShell ); 1992*cdf0e10cSrcweir } 1993*cdf0e10cSrcweir else 1994*cdf0e10cSrcweir UpdateContent( NULL ); 1995*cdf0e10cSrcweir } 1996*cdf0e10cSrcweir 1997*cdf0e10cSrcweir //----------------------------------------------------------------------- 1998*cdf0e10cSrcweir sal_Bool FmFilterNavigatorWin::Close() 1999*cdf0e10cSrcweir { 2000*cdf0e10cSrcweir if ( m_pNavigator && m_pNavigator->IsEditingActive() ) 2001*cdf0e10cSrcweir m_pNavigator->EndEditing(); 2002*cdf0e10cSrcweir 2003*cdf0e10cSrcweir if ( m_pNavigator && m_pNavigator->IsEditingActive() ) 2004*cdf0e10cSrcweir // the EndEditing was vetoed (perhaps of an syntax error or such) 2005*cdf0e10cSrcweir return sal_False; 2006*cdf0e10cSrcweir 2007*cdf0e10cSrcweir UpdateContent( NULL ); 2008*cdf0e10cSrcweir return SfxDockingWindow::Close(); 2009*cdf0e10cSrcweir } 2010*cdf0e10cSrcweir 2011*cdf0e10cSrcweir //----------------------------------------------------------------------- 2012*cdf0e10cSrcweir void FmFilterNavigatorWin::FillInfo( SfxChildWinInfo& rInfo ) const 2013*cdf0e10cSrcweir { 2014*cdf0e10cSrcweir SfxDockingWindow::FillInfo( rInfo ); 2015*cdf0e10cSrcweir rInfo.bVisible = sal_False; 2016*cdf0e10cSrcweir } 2017*cdf0e10cSrcweir 2018*cdf0e10cSrcweir //----------------------------------------------------------------------- 2019*cdf0e10cSrcweir Size FmFilterNavigatorWin::CalcDockingSize( SfxChildAlignment eAlign ) 2020*cdf0e10cSrcweir { 2021*cdf0e10cSrcweir if ( ( eAlign == SFX_ALIGN_TOP ) || ( eAlign == SFX_ALIGN_BOTTOM ) ) 2022*cdf0e10cSrcweir return Size(); 2023*cdf0e10cSrcweir 2024*cdf0e10cSrcweir return SfxDockingWindow::CalcDockingSize( eAlign ); 2025*cdf0e10cSrcweir } 2026*cdf0e10cSrcweir 2027*cdf0e10cSrcweir //----------------------------------------------------------------------- 2028*cdf0e10cSrcweir SfxChildAlignment FmFilterNavigatorWin::CheckAlignment( SfxChildAlignment eActAlign, SfxChildAlignment eAlign ) 2029*cdf0e10cSrcweir { 2030*cdf0e10cSrcweir switch (eAlign) 2031*cdf0e10cSrcweir { 2032*cdf0e10cSrcweir case SFX_ALIGN_LEFT: 2033*cdf0e10cSrcweir case SFX_ALIGN_RIGHT: 2034*cdf0e10cSrcweir case SFX_ALIGN_NOALIGNMENT: 2035*cdf0e10cSrcweir return (eAlign); 2036*cdf0e10cSrcweir default: 2037*cdf0e10cSrcweir break; 2038*cdf0e10cSrcweir } 2039*cdf0e10cSrcweir 2040*cdf0e10cSrcweir return (eActAlign); 2041*cdf0e10cSrcweir } 2042*cdf0e10cSrcweir 2043*cdf0e10cSrcweir //------------------------------------------------------------------------ 2044*cdf0e10cSrcweir void FmFilterNavigatorWin::Resize() 2045*cdf0e10cSrcweir { 2046*cdf0e10cSrcweir SfxDockingWindow::Resize(); 2047*cdf0e10cSrcweir 2048*cdf0e10cSrcweir Size aLogOutputSize = PixelToLogic( GetOutputSizePixel(), MAP_APPFONT ); 2049*cdf0e10cSrcweir Size aLogExplSize = aLogOutputSize; 2050*cdf0e10cSrcweir aLogExplSize.Width() -= 6; 2051*cdf0e10cSrcweir aLogExplSize.Height() -= 6; 2052*cdf0e10cSrcweir 2053*cdf0e10cSrcweir Point aExplPos = LogicToPixel( Point(3,3), MAP_APPFONT ); 2054*cdf0e10cSrcweir Size aExplSize = LogicToPixel( aLogExplSize, MAP_APPFONT ); 2055*cdf0e10cSrcweir 2056*cdf0e10cSrcweir m_pNavigator->SetPosSizePixel( aExplPos, aExplSize ); 2057*cdf0e10cSrcweir } 2058*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2059*cdf0e10cSrcweir void FmFilterNavigatorWin::GetFocus() 2060*cdf0e10cSrcweir { 2061*cdf0e10cSrcweir // oj #97405# 2062*cdf0e10cSrcweir if ( m_pNavigator ) 2063*cdf0e10cSrcweir m_pNavigator->GrabFocus(); 2064*cdf0e10cSrcweir } 2065*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2066*cdf0e10cSrcweir 2067*cdf0e10cSrcweir 2068*cdf0e10cSrcweir //======================================================================== 2069*cdf0e10cSrcweir // class FmFilterNavigatorWinMgr 2070*cdf0e10cSrcweir //======================================================================== 2071*cdf0e10cSrcweir SFX_IMPL_DOCKINGWINDOW( FmFilterNavigatorWinMgr, SID_FM_FILTER_NAVIGATOR ) 2072*cdf0e10cSrcweir 2073*cdf0e10cSrcweir //----------------------------------------------------------------------- 2074*cdf0e10cSrcweir FmFilterNavigatorWinMgr::FmFilterNavigatorWinMgr( Window *_pParent, sal_uInt16 _nId, 2075*cdf0e10cSrcweir SfxBindings *_pBindings, SfxChildWinInfo* _pInfo ) 2076*cdf0e10cSrcweir :SfxChildWindow( _pParent, _nId ) 2077*cdf0e10cSrcweir { 2078*cdf0e10cSrcweir pWindow = new FmFilterNavigatorWin( _pBindings, this, _pParent ); 2079*cdf0e10cSrcweir eChildAlignment = SFX_ALIGN_NOALIGNMENT; 2080*cdf0e10cSrcweir ((SfxDockingWindow*)pWindow)->Initialize( _pInfo ); 2081*cdf0e10cSrcweir } 2082*cdf0e10cSrcweir 2083*cdf0e10cSrcweir //........................................................................ 2084*cdf0e10cSrcweir } // namespace svxform 2085*cdf0e10cSrcweir //........................................................................ 2086