1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SVX_FORMCONTROLLING_HXX
25 #define SVX_FORMCONTROLLING_HXX
26 
27 #include <com/sun/star/form/runtime/XFormController.hpp>
28 #include <com/sun/star/form/XForm.hpp>
29 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
30 #include <com/sun/star/form/runtime/FeatureState.hpp>
31 #include <com/sun/star/form/runtime/XFormOperations.hpp>
32 #include <com/sun/star/sdb/XSQLErrorListener.hpp>
33 
34 #include <cppuhelper/implbase2.hxx>
35 #include <comphelper/componentcontext.hxx>
36 
37 #include <vector>
38 
39 //........................................................................
40 namespace svx
41 {
42 //........................................................................
43 
44     //====================================================================
45     //= FeatureSlotTranslation
46     //====================================================================
47     class FeatureSlotTranslation
48     {
49     public:
50         /// retrieves the feature id for a given feature URL
51         static  sal_Int32       getControllerFeatureSlotIdForURL( const ::rtl::OUString& _rMainURL );
52 
53         /// retrieves the feature URL for a given feature id
54         static ::rtl::OUString  getControllerFeatureURLForSlotId( sal_Int32 _nSlotId );
55 
56         /// determines whether the given URL is a controller feature URL
57         static sal_Bool         isFeatureURL( const ::rtl::OUString& _rMainURL );
58 
59         /// retrieves the css.form.runtime.FormFeature ID for a given slot ID
60         static  sal_Int16       getFormFeatureForSlotId( sal_Int32 _nSlotId );
61 
62         /// retrieves the slot id for a given css.form.runtime.FormFeature ID
63         static  sal_Int32       getSlotIdForFormFeature( sal_Int16 _nFormFeature );
64     };
65 
66     //====================================================================
67     //= IControllerFeatureInvalidation
68     //====================================================================
69     class IControllerFeatureInvalidation
70     {
71     public:
72         /** invalidates the given features
73 
74             Invalidation means that any user interface representation (such as toolbox buttons), or
75             any dispatches associated with the features in question are potentially out-of-date, and
76             need to be updated
77 
78             @param _rFeatures
79                 Ids of the features to be invalidated.
80         */
81         virtual void invalidateFeatures( const ::std::vector< sal_Int32 >& _rFeatures ) = 0;
82     };
83 
84     //====================================================================
85     //= ControllerFeatures
86     //====================================================================
87     class FormControllerHelper;
88     /** easier access to an FormControllerHelper instance
89     */
90     class ControllerFeatures
91     {
92     protected:
93         ::comphelper::ComponentContext  m_aContext;
94         IControllerFeatureInvalidation* m_pInvalidationCallback;    // necessary as long as m_pImpl is not yet constructed
95         FormControllerHelper*           m_pImpl;
96 
97     public:
98         /** standard ctor
99 
100             The instance is not functional until <method>assign</method> is used.
101 
102             @param _rxORB
103                 a multi service factory for creating various needed components
104 
105             @param _pInvalidationCallback
106                 the callback for invalidating feature states
107         */
108         ControllerFeatures(
109             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
110             IControllerFeatureInvalidation* _pInvalidationCallback
111         );
112 
113         /** constructs the instance from a <type scope="com::sun::star::form::runtime">XFormController<type> instance
114 
115             @param _rxORB
116                 a multi service factory for creating various needed components
117 
118             @param _rxController
119                 The form controller which the helper should be responsible for. Must not
120                 be <NULL/>, and must have a valid model (form).
121 
122             @param _pInvalidationCallback
123                 the callback for invalidating feature states
124         */
125         ControllerFeatures(
126             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
127             const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController,
128             IControllerFeatureInvalidation* _pInvalidationCallback
129         );
130 
131         /** constructs the helper form a <type scope="com::sun::star::form">XForm<type> instance
132 
133             Any functionality which depends on a controller will not be available.
134 
135             @param _rxORB
136                 a multi service factory for creating various needed components
137 
138             @param _rxForm
139                 The form which the helper should be responsible for. Must not be <NULL/>.
140 
141             @param _pInvalidationCallback
142                 the callback for invalidating feature states
143         */
144         ControllerFeatures(
145             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
146             const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm,
147             IControllerFeatureInvalidation* _pInvalidationCallback
148         );
149 
150         /// dtor
151         ~ControllerFeatures();
152 
153         /// checks whether the instance is properly assigned to a form and/or controller
isAssigned() const154         inline bool isAssigned( ) const { return m_pImpl != NULL; }
155 
156         /** assign to a controller
157         */
158         void assign(
159             const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController
160         );
161 
162         /** assign to a controller
163         */
164         void assign(
165             const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm
166         );
167 
168         /// clears the instance so that it cannot be used afterwards
169         void dispose();
170 
171         // access to the instance which implements the functionality. Not to be used when not assigned
operator ->() const172         inline const FormControllerHelper* operator->() const { return m_pImpl; }
operator ->()173         inline       FormControllerHelper* operator->()       { return m_pImpl; }
operator *() const174         inline const FormControllerHelper& operator*() const  { return *m_pImpl; }
operator *()175         inline       FormControllerHelper& operator*()        { return *m_pImpl; }
176     };
177 
178     //====================================================================
179     //= FormControllerHelper
180     //====================================================================
181     typedef ::cppu::WeakImplHelper2 <   ::com::sun::star::form::runtime::XFeatureInvalidation
182                                     ,   ::com::sun::star::sdb::XSQLErrorListener
183                                     >   FormControllerHelper_Base;
184     /** is a helper class which manages form controller functionality (such as moveNext etc.).
185 
186         <p>The class helps implementing form controller functionality, by providing
187         methods to determine the state of, and execute, various common form features.<br/>
188         A <em>feature</em> is for instance moving the form associated with the controller
189         to a certain position, or reloading the form, and so on.</p>
190     */
191     class FormControllerHelper : public FormControllerHelper_Base
192     {
193     protected:
194         ::comphelper::ComponentContext  m_aContext;
195         IControllerFeatureInvalidation* m_pInvalidationCallback;
196         ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations >
197                                         m_xFormOperations;
198 
199         ::com::sun::star::uno::Any      m_aOperationError;
200 
201     public:
202         /** constructs the helper from a <type scope="com::sun::star::form::runtime">XFormController<type> instance
203 
204             @param _rContext
205                 the context the component lives in
206             @param _rxController
207                 The form controller which the helper should be responsible for. Must not
208                 be <NULL/>, and must have a valid model (form).
209             @param _pInvalidationCallback
210                 the callback for invalidating feature states
211         */
212         FormControllerHelper(
213             const ::comphelper::ComponentContext& _rContext,
214             const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _rxController,
215             IControllerFeatureInvalidation* _pInvalidationCallback
216         );
217 
218         /** constructs the helper form a <type scope="com::sun::star::form">XForm<type> instance
219 
220             Any functionality which depends on a controller will not be available.
221 
222             @param _rContext
223                 the context the component lives in
224             @param _rxForm
225                 The form which the helper should be responsible for. Must not be <NULL/>.
226             @param _pInvalidationCallback
227                 the callback for invalidating feature states
228         */
229         FormControllerHelper(
230             const ::comphelper::ComponentContext& _rContext,
231             const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm,
232             IControllerFeatureInvalidation* _pInvalidationCallback
233         );
234 
235         // forwards to the XFormOperations implementation
236         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >
237                     getCursor() const;
238         void        getState(
239                         sal_Int32 _nSlotId,
240                         ::com::sun::star::form::runtime::FeatureState& _out_rState
241                     ) const;
242         sal_Bool    isEnabled( sal_Int32 _nSlotId ) const;
243         void        execute( sal_Int32 _nSlotId ) const;
244         void        execute( sal_Int32 _nSlotId, const ::rtl::OUString& _rParamName, const ::com::sun::star::uno::Any& _rParamValue ) const;
245         sal_Bool    commitCurrentRecord() const;
246         sal_Bool    commitCurrentControl( ) const;
247         sal_Bool    isInsertionRow() const;
248         sal_Bool    isModifiedRow() const;
249 
250         bool        moveLeft( ) const;
251         bool        moveRight( ) const;
252 
253         bool        canDoFormFilter() const;
254 
255         /** disposes this instance.
256 
257             After this method has been called, the instance is not functional anymore
258         */
259         void        dispose();
260 
261         const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations >&
getFormOperations() const262                     getFormOperations() const { return m_xFormOperations; }
263     protected:
264         /// dtor
265         ~FormControllerHelper();
266 
267         // XFeatureInvalidation
268         virtual void SAL_CALL invalidateFeatures( const ::com::sun::star::uno::Sequence< ::sal_Int16 >& Features ) throw (::com::sun::star::uno::RuntimeException);
269         virtual void SAL_CALL invalidateAllFeatures() throw (::com::sun::star::uno::RuntimeException);
270 
271         // XSQLErrorListener
272         virtual void SAL_CALL errorOccured( const ::com::sun::star::sdb::SQLErrorEvent& _Event ) throw (::com::sun::star::uno::RuntimeException);
273 
274         // XEventListener
275         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
276 
277     private:
278         enum FormOperation { EXECUTE, EXECUTE_ARGS, COMMIT_CONTROL, COMMIT_RECORD };
279 
280         bool    impl_operateForm_nothrow(
281                     const FormOperation _eWhat,
282                     const sal_Int16 _nFeature,  /* ignore for COMMIT_* */
283                     const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& _rArguments /* ignore except for EXECUTE_ARGS */
284                 ) const;
impl_operateForm_nothrow(const FormOperation _eWhat) const285         bool    impl_operateForm_nothrow( const FormOperation _eWhat ) const
286         {
287             return impl_operateForm_nothrow( _eWhat, 0, ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >() );
288         }
impl_operateForm_nothrow(const sal_Int16 _nFeature) const289         bool    impl_operateForm_nothrow( const sal_Int16 _nFeature ) const
290         {
291             return impl_operateForm_nothrow( EXECUTE, _nFeature, ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >() );
292         }
293 
294     private:
295         FormControllerHelper();                                         // never implemented
296         FormControllerHelper( const FormControllerHelper& );            // never implemented
297         FormControllerHelper& operator=( const FormControllerHelper& ); // never implemented
298     };
299 
300 //........................................................................
301 }   // namespace svx
302 //........................................................................
303 
304 #endif // SVX_FORMCONTROLLING_HXX
305