xref: /trunk/main/svx/source/inc/fmvwimp.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _SVX_FMVWIMP_HXX
28 #define _SVX_FMVWIMP_HXX
29 
30 #include "svx/svdmark.hxx"
31 #include "fmdocumentclassification.hxx"
32 
33 /** === begin UNO includes === **/
34 #include <com/sun/star/form/XForm.hpp>
35 #include <com/sun/star/container/XIndexAccess.hpp>
36 #include <com/sun/star/container/XEnumeration.hpp>
37 #include <com/sun/star/form/runtime/XFormController.hpp>
38 #include <com/sun/star/form/runtime/XFormControllerContext.hpp>
39 #include <com/sun/star/container/XContainerListener.hpp>
40 #include <com/sun/star/container/ContainerEvent.hpp>
41 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
42 #include <com/sun/star/awt/XFocusListener.hpp>
43 #include <com/sun/star/sdb/SQLErrorEvent.hpp>
44 #include <com/sun/star/sdbc/XDataSource.hpp>
45 /** === end UNO includes === **/
46 
47 #include <comphelper/stl_types.hxx>
48 #include <tools/link.hxx>
49 #include <tools/string.hxx>
50 #include <cppuhelper/implbase2.hxx>
51 #include <cppuhelper/implbase3.hxx>
52 #include <comphelper/uno3.hxx>
53 #include <comphelper/componentcontext.hxx>
54 #include <rtl/ref.hxx>
55 
56 //class SdrPageViewWinRec;
57 class SdrPageWindow;
58 
59 class SdrPageView;
60 class SdrObject;
61 class FmFormObj;
62 class FmFormModel;
63 class FmFormView;
64 class FmFormShell;
65 class Window;
66 class OutputDevice;
67 class SdrUnoObj;
68 class SdrView;
69 
70 FORWARD_DECLARE_INTERFACE(awt,XControl)
71 FORWARD_DECLARE_INTERFACE(awt,XWindow)
72 FORWARD_DECLARE_INTERFACE(beans,XPropertySet)
73 FORWARD_DECLARE_INTERFACE(util,XNumberFormats)
74 
75 class FmXFormView;
76 
77 namespace svx {
78     class ODataAccessDescriptor;
79     struct OXFormsDescriptor;
80 }
81 
82 //==================================================================
83 // FormViewPageWindowAdapter
84 //==================================================================
85 typedef ::cppu::WeakImplHelper2 <   ::com::sun::star::container::XIndexAccess
86                                 ,   ::com::sun::star::form::runtime::XFormControllerContext
87                                 >   FormViewPageWindowAdapter_Base;
88 
89 class FormViewPageWindowAdapter : public FormViewPageWindowAdapter_Base
90 {
91     friend class FmXFormView;
92 
93     ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > >   m_aControllerList;
94     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer >                            m_xControlContainer;
95     ::comphelper::ComponentContext                                                                          m_aContext;
96     FmXFormView*                m_pViewImpl;
97     Window*                     m_pWindow;
98 
99 protected:
100     ~FormViewPageWindowAdapter();
101 
102 public:
103     FormViewPageWindowAdapter(  const ::comphelper::ComponentContext& _rContext,
104         const SdrPageWindow&, FmXFormView* pView);
105         //const SdrPageViewWinRec*, FmXFormView* pView);
106 
107     // XElementAccess
108     virtual ::com::sun::star::uno::Type SAL_CALL getElementType() throw(::com::sun::star::uno::RuntimeException);
109     virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException);
110 
111     // XEnumerationAccess
112     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration() throw(::com::sun::star::uno::RuntimeException);
113 
114     // XIndexAccess
115     virtual sal_Int32 SAL_CALL getCount() throw(::com::sun::star::uno::RuntimeException);
116     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 _Index) throw(::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
117 
118     // XFormControllerContext
119     virtual void SAL_CALL makeVisible( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _Control ) throw (::com::sun::star::uno::RuntimeException);
120 
121     const ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > >& GetList() {return m_aControllerList;}
122 
123 protected:
124     ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >  getController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm ) const;
125     void setController(
126             const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm,
127             const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxParentController );
128     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer >  getControlContainer() const { return m_xControlContainer; }
129     void updateTabOrder( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm );
130     void dispose();
131     Window* getWindow() const {return m_pWindow;}
132 };
133 
134 typedef ::rtl::Reference< FormViewPageWindowAdapter >   PFormViewPageWindowAdapter;
135 typedef ::std::vector< PFormViewPageWindowAdapter >     PageWindowAdapterList;
136 typedef ::std::set  <   ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >
137                     ,   ::comphelper::OInterfaceCompare< ::com::sun::star::form::XForm >
138                     >   SetOfForms;
139 typedef ::std::map  <   ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer >
140                     ,   SetOfForms
141                     ,   ::comphelper::OInterfaceCompare< ::com::sun::star::awt::XControlContainer >
142                     >   MapControlContainerToSetOfForms;
143 class SdrModel;
144 //==================================================================
145 // FmXFormView
146 //==================================================================
147 class FmXFormView : public ::cppu::WeakImplHelper3<
148                             ::com::sun::star::form::XFormControllerListener,
149                             ::com::sun::star::awt::XFocusListener,
150                             ::com::sun::star::container::XContainerListener>
151 {
152     friend class FmFormView;
153     friend class FmFormShell;
154     friend class FmXFormShell;
155     friend class FormViewPageWindowAdapter;
156     class ObjectRemoveListener;
157     friend class ObjectRemoveListener;
158 
159     ::comphelper::ComponentContext                                                      m_aContext;
160     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow>                   m_xWindow;
161     ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >           m_xLastCreatedControlModel;
162 
163     FmFormObj*      m_pMarkedGrid;
164     FmFormView*     m_pView;
165     sal_uIntPtr     m_nActivationEvent;
166     sal_uIntPtr     m_nErrorMessageEvent;   // event for an asynchronous error message. See also m_aAsyncError
167     sal_uIntPtr     m_nAutoFocusEvent;      // event for asynchronously setting the focus to a control
168     sal_uIntPtr     m_nControlWizardEvent;  // event for asynchronously setting the focus to a control
169 
170     ::com::sun::star::sdb::SQLErrorEvent
171                     m_aAsyncError;          // error event which is to be displayed asyn. See m_nErrorMessageEvent.
172 
173     PageWindowAdapterList
174                     m_aPageWindowAdapters;  // to be filled in alive mode only
175     MapControlContainerToSetOfForms
176                     m_aNeedTabOrderUpdate;
177 
178     // Liste der markierten Object, dient zur Restauration beim Umschalten von Alive in DesignMode
179     SdrMarkList             m_aMark;
180     ObjectRemoveListener*   m_pWatchStoredList;
181 
182     bool            m_bFirstActivation;
183     bool            m_isTabOrderUpdateSuspended;
184 
185     FmFormShell* GetFormShell() const;
186 
187     void removeGridWindowListening();
188 
189 protected:
190     FmXFormView( const ::comphelper::ComponentContext& _rContext, FmFormView* _pView );
191     ~FmXFormView();
192 
193     void    saveMarkList( sal_Bool _bSmartUnmark = sal_True );
194     void    restoreMarkList( SdrMarkList& _rRestoredMarkList );
195     void    stopMarkListWatching();
196     void    startMarkListWatching();
197 
198     void    notifyViewDying( );
199         // notifies this impl class that the anti-impl instance (m_pView) is going to die
200 
201 public:
202     // UNO Anbindung
203 
204 // ::com::sun::star::lang::XEventListener
205     virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw(::com::sun::star::uno::RuntimeException);
206 
207 // ::com::sun::star::container::XContainerListener
208     virtual void SAL_CALL elementInserted(const  ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException);
209     virtual void SAL_CALL elementReplaced(const  ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException);
210     virtual void SAL_CALL elementRemoved(const  ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException);
211 
212 // ::com::sun::star::form::XFormControllerListener
213     virtual void SAL_CALL formActivated(const ::com::sun::star::lang::EventObject& rEvent) throw(::com::sun::star::uno::RuntimeException);
214     virtual void SAL_CALL formDeactivated(const ::com::sun::star::lang::EventObject& rEvent) throw(::com::sun::star::uno::RuntimeException);
215 
216     // XFocusListener
217     virtual void SAL_CALL focusGained( const ::com::sun::star::awt::FocusEvent& e ) throw (::com::sun::star::uno::RuntimeException);
218     virtual void SAL_CALL focusLost( const ::com::sun::star::awt::FocusEvent& e ) throw (::com::sun::star::uno::RuntimeException);
219 
220     FmFormView* getView() const {return m_pView;}
221     PFormViewPageWindowAdapter  findWindow( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer >& _rxCC ) const;
222 
223     ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >
224             getFormController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm, const OutputDevice& _rDevice ) const;
225 
226     // activation handling
227     inline  bool        hasEverBeenActivated( ) const { return !m_bFirstActivation; }
228     inline  void        setHasBeenActivated( ) { m_bFirstActivation = false; }
229 
230             void        onFirstViewActivation( const FmFormModel* _pDocModel );
231 
232     /** suspends the calls to activateTabOrder, which normally happen whenever for any ControlContainer of the view,
233         new controls are inserted. Cannot be nested, i.e. you need to call resumeTabOrderUpdate before calling
234         suspendTabOrderUpdate, again.
235     */
236     void    suspendTabOrderUpdate();
237 
238     /** resumes calls to activateTabOrder, and also does all pending calls which were collected since the last
239         suspendTabOrderUpdate call.
240     */
241     void    resumeTabOrderUpdate();
242 
243     void    onCreatedFormObject( FmFormObj& _rFormObject );
244 
245     static bool
246             isFocusable(
247                 const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& i_rControl
248             );
249 
250 private:
251     //void addWindow(const SdrPageViewWinRec*);
252     void addWindow(const SdrPageWindow&);
253     void removeWindow( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer >& _rxCC );
254     void Activate(sal_Bool bSync = sal_False);
255     void Deactivate(sal_Bool bDeactivateController = sal_True);
256 
257     SdrObject*  implCreateFieldControl( const ::svx::ODataAccessDescriptor& _rColumnDescriptor );
258     SdrObject*  implCreateXFormsControl( const ::svx::OXFormsDescriptor &_rDesc );
259 
260     static bool createControlLabelPair(
261         const ::comphelper::ComponentContext& _rContext,
262         OutputDevice& _rOutDev,
263         sal_Int32 _nXOffsetMM,
264         sal_Int32 _nYOffsetMM,
265         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxField,
266         const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormats >& _rxNumberFormats,
267         sal_uInt16 _nControlObjectID,
268         const ::rtl::OUString& _rFieldPostfix,
269         sal_uInt32 _nInventor,
270         sal_uInt16 _nLabelObjectID,
271         SdrPage* _pLabelPage,
272         SdrPage* _pControlPage,
273         SdrModel* _pModel,
274         SdrUnoObj*& _rpLabel,
275         SdrUnoObj*& _rpControl
276     );
277 
278     bool    createControlLabelPair(
279         OutputDevice& _rOutDev,
280         sal_Int32 _nXOffsetMM,
281         sal_Int32 _nYOffsetMM,
282         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxField,
283         const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormats >& _rxNumberFormats,
284         sal_uInt16 _nControlObjectID,
285         const ::rtl::OUString& _rFieldPostfix,
286         SdrUnoObj*& _rpLabel,
287         SdrUnoObj*& _rpControl,
288         const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource >& _rxDataSource = NULL,
289         const ::rtl::OUString& _rDataSourceName = ::rtl::OUString(),
290         const ::rtl::OUString& _rCommand= ::rtl::OUString(),
291         const sal_Int32 _nCommandType = -1
292     );
293 
294     void ObjectRemovedInAliveMode(const SdrObject* pObject);
295 
296     // asynchronously displays an error message. See also OnDelayedErrorMessage.
297     void    displayAsyncErrorMessage( const ::com::sun::star::sdb::SQLErrorEvent& _rEvent );
298 
299     // cancels all pending async events
300     void cancelEvents();
301 
302     /// the the auto focus to the first (in terms of the tab order) control
303     void AutoFocus( sal_Bool _bSync = sal_False );
304     DECL_LINK( OnActivate, void* );
305     DECL_LINK( OnAutoFocus, void* );
306     DECL_LINK( OnDelayedErrorMessage, void* );
307     DECL_LINK( OnStartControlWizard, void* );
308 
309 private:
310     ::svxform::DocumentType impl_getDocumentType() const;
311 };
312 
313 
314 
315 #endif // _SVX_FMVWIMP_HXX
316 
317