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