Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : : #ifndef _SVX_FILTNAV_HXX
29 : : #define _SVX_FILTNAV_HXX
30 : :
31 : : #include <com/sun/star/form/XForm.hpp>
32 : : #include <com/sun/star/form/runtime/XFormController.hpp>
33 : : #include <com/sun/star/form/runtime/XFilterController.hpp>
34 : : #include <svl/lstner.hxx>
35 : : #include <svl/brdcst.hxx>
36 : :
37 : : #include <vcl/window.hxx>
38 : : #include <sfx2/childwin.hxx>
39 : : #include <svl/poolitem.hxx>
40 : : #include <sfx2/bindings.hxx>
41 : : #include <sfx2/dockwin.hxx>
42 : : #include <sfx2/ctrlitem.hxx>
43 : : #include <vcl/image.hxx>
44 : : #include <svtools/svtreebx.hxx>
45 : :
46 : : #include <vcl/dialog.hxx>
47 : : #include <vcl/group.hxx>
48 : : #include <vcl/dockwin.hxx>
49 : : #include "svx/fmtools.hxx"
50 : : #include "fmexch.hxx"
51 : : #include "sqlparserclient.hxx"
52 : :
53 : : class FmFormShell;
54 : :
55 : : //........................................................................
56 : : namespace svxform
57 : : {
58 : : //........................................................................
59 : :
60 : : class FmFilterItem;
61 : : class FmFilterItems;
62 : : class FmParentData;
63 : : class FmFilterAdapter;
64 : :
65 : : //========================================================================
66 : : // data structure for the filter model
67 : : //========================================================================
68 : : class FmFilterData
69 : : {
70 : : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xORB;
71 : : FmParentData* m_pParent;
72 : : ::rtl::OUString m_aText;
73 : :
74 : : public:
75 : : TYPEINFO();
76 : 0 : FmFilterData(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,FmParentData* pParent = NULL, const ::rtl::OUString& rText = ::rtl::OUString())
77 : : :m_xORB( _rxFactory )
78 : : ,m_pParent( pParent )
79 : 0 : ,m_aText( rText )
80 : 0 : {}
81 [ # # ]: 0 : virtual ~FmFilterData(){}
82 : :
83 : 0 : void SetText( const ::rtl::OUString& rText ){ m_aText = rText; }
84 : 0 : ::rtl::OUString GetText() const { return m_aText; }
85 : 0 : FmParentData* GetParent() const {return m_pParent;}
86 : :
87 : : virtual Image GetImage() const;
88 : : };
89 : :
90 : : //========================================================================
91 : : class FmParentData : public FmFilterData
92 : : {
93 : : protected:
94 : : ::std::vector< FmFilterData* > m_aChildren;
95 : :
96 : : public:
97 : : TYPEINFO();
98 : 0 : FmParentData(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,FmParentData* pParent, const ::rtl::OUString& rText)
99 [ # # ]: 0 : : FmFilterData(_rxFactory,pParent, rText)
100 : 0 : {}
101 : : virtual ~FmParentData();
102 : :
103 : 0 : ::std::vector< FmFilterData* >& GetChildren() { return m_aChildren; }
104 : : };
105 : :
106 : : //========================================================================
107 : : // Item representing the forms and subforms
108 [ # # ]: 0 : class FmFormItem : public FmParentData
109 : : {
110 : : ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xController;
111 : : ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterController > m_xFilterController;
112 : :
113 : : public:
114 : : TYPEINFO();
115 : :
116 : 0 : FmFormItem( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,FmParentData* _pParent,
117 : : const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & _xController,
118 : : const ::rtl::OUString& _rText)
119 : : :FmParentData( _rxFactory, _pParent, _rText )
120 : : ,m_xController( _xController )
121 [ # # ]: 0 : ,m_xFilterController( _xController, ::com::sun::star::uno::UNO_QUERY_THROW )
122 : : {
123 : 0 : }
124 : :
125 : : inline const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >&
126 : 0 : GetController() { return m_xController; }
127 : :
128 : : inline const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFilterController >&
129 : 0 : GetFilterController() { return m_xFilterController; }
130 : :
131 : : virtual Image GetImage() const;
132 : : };
133 : :
134 : : //========================================================================
135 [ # # ]: 0 : class FmFilterItems : public FmParentData
136 : : {
137 : : public:
138 : : TYPEINFO();
139 : : FmFilterItems(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory):FmParentData(_rxFactory,NULL, ::rtl::OUString()){}
140 : 0 : FmFilterItems(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,FmFormItem* pParent, const ::rtl::OUString& rText ):FmParentData(_rxFactory,pParent, rText){}
141 : :
142 : : FmFilterItem* Find( const ::sal_Int32 _nFilterComponentIndex ) const;
143 : : virtual Image GetImage() const;
144 : : };
145 : :
146 : : //========================================================================
147 [ # # ]: 0 : class FmFilterItem : public FmFilterData
148 : : {
149 : : ::rtl::OUString m_aFieldName;
150 : : const sal_Int32 m_nComponentIndex;
151 : :
152 : : public:
153 : : TYPEINFO();
154 : : FmFilterItem(
155 : : const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,
156 : : FmFilterItems* pParent,
157 : : const ::rtl::OUString& aFieldName,
158 : : const ::rtl::OUString& aCondition,
159 : : const sal_Int32 _nComponentIndex
160 : : );
161 : :
162 : 0 : const ::rtl::OUString& GetFieldName() const {return m_aFieldName;}
163 : 0 : sal_Int32 GetComponentIndex() const { return m_nComponentIndex; }
164 : :
165 : : virtual Image GetImage() const;
166 : : };
167 : :
168 : : //========================================================================
169 : : class FmFilterModel : public FmParentData
170 : : ,public SfxBroadcaster
171 : : ,public ::svxform::OSQLParserClient
172 : : {
173 : : friend class FmFilterAdapter;
174 : :
175 : : ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > m_xControllers;
176 : : ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > m_xController;
177 : : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xORB;
178 : : FmFilterAdapter* m_pAdapter;
179 : : FmFilterItems* m_pCurrentItems;
180 : :
181 : : public:
182 : : TYPEINFO();
183 : : FmFilterModel(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory);
184 : : virtual ~FmFilterModel();
185 : :
186 : : void Update(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers, const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xCurrent);
187 : : void Clear();
188 : : sal_Bool ValidateText(FmFilterItem* pItem, UniString& rText, UniString& rErrorMsg) const;
189 : : void Append(FmFilterItems* pItems, FmFilterItem* pFilterItem);
190 : : void SetTextForItem(FmFilterItem* pItem, const ::rtl::OUString& rText);
191 : :
192 [ # # ]: 0 : FmFormItem* GetCurrentForm() const {return m_pCurrentItems ? (FmFormItem*)m_pCurrentItems->GetParent() : NULL;}
193 : 0 : FmFilterItems* GetCurrentItems() const {return m_pCurrentItems;}
194 : : void SetCurrentItems(FmFilterItems* pCurrent);
195 : 0 : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > getORB() const { return m_xORB; }
196 : :
197 : : const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & GetControllers() const {return m_xControllers;}
198 : 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & GetCurrentController() const {return m_xController;}
199 : : void SetCurrentController(const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xController);
200 : :
201 : : void Remove(FmFilterData* pFilterItem);
202 : : void AppendFilterItems( FmFormItem& _rItem );
203 : : void EnsureEmptyFilterRows( FmParentData& _rItem );
204 : :
205 : : protected:
206 : : void Insert(const ::std::vector<FmFilterData*>::iterator& rPos, FmFilterData* pFilterItem);
207 : : void Remove( const ::std::vector<FmFilterData*>::iterator& rPos );
208 : : FmFormItem* Find(const ::std::vector<FmFilterData*>& rItems, const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xController) const;
209 : : FmFormItem* Find(const ::std::vector<FmFilterData*>& rItems, const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm) const;
210 : : void Update(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers, FmParentData* pParent);
211 : : };
212 : :
213 : : //========================================================================
214 : : //========================================================================
215 [ # # ]: 0 : class OFilterItemExchange : public OLocalExchange
216 : : {
217 : : ::std::vector<FmFilterItem*> m_aDraggedEntries;
218 : : FmFormItem* m_pFormItem; // ensure that we drop on the same form
219 : :
220 : : public:
221 : : OFilterItemExchange();
222 : :
223 : : static sal_uInt32 getFormatId( );
224 : : inline static sal_Bool hasFormat( const DataFlavorExVector& _rFormats );
225 : :
226 : 0 : const ::std::vector<FmFilterItem*>& getDraggedEntries() const { return m_aDraggedEntries; }
227 : 0 : void setDraggedEntries(const ::std::vector<FmFilterItem*>& _rList) { m_aDraggedEntries = _rList; }
228 : 0 : FmFormItem* getFormItem() const { return m_pFormItem; }
229 : :
230 : 0 : void setFormItem( FmFormItem* _pItem ) { m_pFormItem = _pItem; }
231 : : void addSelectedItem( FmFilterItem* _pItem) { m_aDraggedEntries.push_back(_pItem); }
232 : :
233 : : protected:
234 : : virtual void AddSupportedFormats();
235 : : };
236 : :
237 : 0 : inline sal_Bool OFilterItemExchange::hasFormat( const DataFlavorExVector& _rFormats )
238 : : {
239 : 0 : return OLocalExchange::hasFormat( _rFormats, getFormatId() );
240 : : }
241 : :
242 : : //====================================================================
243 : : //= OFilterExchangeHelper
244 : : //====================================================================
245 [ # # ]: 0 : class OFilterExchangeHelper : public OLocalExchangeHelper
246 : : {
247 : : public:
248 : 0 : OFilterExchangeHelper(Window* _pDragSource) : OLocalExchangeHelper(_pDragSource) { }
249 : :
250 : 0 : OFilterItemExchange* operator->() const { return static_cast<OFilterItemExchange*>(m_pTransferable); }
251 : :
252 : : protected:
253 : : virtual OLocalExchange* createExchange() const;
254 : : };
255 : :
256 : : //========================================================================
257 : : class FmFilterNavigator : public SvTreeListBox, public SfxListener
258 : : {
259 : : enum DROP_ACTION{ DA_SCROLLUP, DA_SCROLLDOWN, DA_EXPANDNODE };
260 : :
261 : : FmFilterModel* m_pModel;
262 : : SvLBoxEntry* m_pEditingCurrently;
263 : : OFilterExchangeHelper m_aControlExchange;
264 : :
265 : :
266 : : AutoTimer m_aDropActionTimer;
267 : : unsigned short m_aTimerCounter;
268 : : Point m_aTimerTriggered; // die Position, an der der DropTimer angeschaltet wurde
269 : : DROP_ACTION m_aDropActionType;
270 : :
271 : : public:
272 : : FmFilterNavigator( Window* pParent );
273 : : virtual ~FmFilterNavigator();
274 : :
275 : : void UpdateContent(
276 : : const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > & xControllers,
277 : : const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > & xCurrent
278 : : );
279 : 0 : const FmFilterModel* GetFilterModel() const {return m_pModel;}
280 : :
281 : : protected:
282 : : using Control::Notify;
283 : :
284 : : virtual void KeyInput( const KeyEvent& rKEvt );
285 : : virtual void Command( const CommandEvent& rEvt );
286 : : virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
287 : : virtual void InitEntry(SvLBoxEntry* pEntry, const XubString& rStr, const Image& rImg1, const Image& rImg2, SvLBoxButtonKind eButtonKind);
288 : : virtual sal_Bool Select( SvLBoxEntry* pEntry, sal_Bool bSelect=sal_True );
289 : : virtual sal_Bool EditingEntry( SvLBoxEntry* pEntry, Selection& rSelection );
290 : : virtual sal_Bool EditedEntry( SvLBoxEntry* pEntry, const rtl::OUString& rNewText );
291 : :
292 : : virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt );
293 : : virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt );
294 : : virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel );
295 : :
296 : : void DeleteSelection();
297 : : SvLBoxEntry* FindEntry(const FmFilterData* pItem) const;
298 : : void Insert(FmFilterData* pItem, sal_uLong nPos);
299 : : void Remove(FmFilterData* pItem);
300 : :
301 : : DECL_LINK(OnRemove, SvLBoxEntry*);
302 : : DECL_LINK(OnEdited, SvLBoxEntry*);
303 : : DECL_LINK(OnDropActionTimer, void*);
304 : :
305 : : private:
306 : : /** returns the first form item and the selected FilterItems in the vector
307 : : @param _rItemList
308 : : Is filled inside. <OUT/>
309 : : @return
310 : : The first form item.
311 : : */
312 : : FmFormItem* getSelectedFilterItems(::std::vector<FmFilterItem*>& _rItemList);
313 : : /* inserts the filter items into the tree model and creates new FilterItems if needed.
314 : : @param _rFilterList
315 : : The items which should be inserted.
316 : : @param _pTargetItems
317 : : The target where to insert the items.
318 : : @param _bCopy
319 : : If <TRUE/> the items will not be removed from the model, otherwise they will.
320 : : */
321 : : void insertFilterItem(const ::std::vector<FmFilterItem*>& _rFilterList,FmFilterItems* _pTargetItems,sal_Bool _bCopy = sal_False);
322 : : SvLBoxEntry* getPrevEntry(SvLBoxEntry* _pStartWith = NULL);
323 : : SvLBoxEntry* getNextEntry(SvLBoxEntry* _pStartWith = NULL);
324 : :
325 : : using SvTreeListBox::Select;
326 : : using SvTreeListBox::ExecuteDrop;
327 : : using SvTreeListBox::Insert;
328 : : };
329 : :
330 : : //========================================================================
331 : : class FmFilterNavigatorWin : public SfxDockingWindow, public SfxControllerItem
332 : : {
333 : : private:
334 : : FmFilterNavigator* m_pNavigator;
335 : :
336 : : protected:
337 : : virtual void Resize();
338 : : virtual sal_Bool Close();
339 : : virtual Size CalcDockingSize( SfxChildAlignment );
340 : : virtual SfxChildAlignment CheckAlignment( SfxChildAlignment, SfxChildAlignment );
341 : :
342 : : public:
343 : : FmFilterNavigatorWin( SfxBindings *pBindings, SfxChildWindow *pMgr,
344 : : Window* pParent );
345 : : virtual ~FmFilterNavigatorWin();
346 : :
347 : : void UpdateContent( FmFormShell* pFormShell );
348 : : void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState );
349 : : void FillInfo( SfxChildWinInfo& rInfo ) const;
350 : :
351 : : using SfxDockingWindow::StateChanged;
352 : :
353 : : virtual void GetFocus();
354 : : };
355 : :
356 : : //========================================================================
357 [ # # ]: 0 : class FmFilterNavigatorWinMgr : public SfxChildWindow
358 : : {
359 : : public:
360 : : FmFilterNavigatorWinMgr( Window *pParent, sal_uInt16 nId, SfxBindings *pBindings,
361 : : SfxChildWinInfo *pInfo );
362 : : SFX_DECL_CHILDWINDOW( FmFilterNavigatorWinMgr );
363 : : };
364 : :
365 : : //........................................................................
366 : : } // namespace svxform
367 : : //........................................................................
368 : :
369 : : #endif // _SVX_FILTNAV_HXX
370 : :
371 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|