xref: /AOO41X/main/svx/source/form/filtnav.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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