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 _XMLOFF_FORMS_LAYERIMPORT_HXX_
25 #define _XMLOFF_FORMS_LAYERIMPORT_HXX_
26 
27 #include <com/sun/star/xml/sax/XAttributeList.hpp>
28 #include <com/sun/star/form/XFormsSupplier2.hpp>
29 #include <vos/ref.hxx>
30 #include "formattributes.hxx"
31 #include "callbacks.hxx"
32 #include "eventimport.hxx"
33 #include <tools/ref.hxx>
34 
35 class SvXMLImport;
36 class SvXMLImportContext;
37 class XMLPropertyHandlerFactory;
38 class SvXMLImportPropertyMapper;
39 class XMLPropStyleContext;
40 
41 SV_DECL_REF( SvXMLStylesContext )
42 	// unfortunately, we can't put this into our namespace, as the macro expands to (amongst others) a forward
43 	// declaration of the class name, which then would be in the namespace, too
44 
45 //.........................................................................
46 namespace xmloff
47 {
48 //.........................................................................
49 
50 	class OAttribute2Property;
51 
52 	//=====================================================================
53 	//= ControlReference
54 	//=====================================================================
55 	/// a structure containing a property set (the referred control) and a string (the list of referring controls)
56 /*	struct ControlReference
57 	{
58 		::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
59 					xReferredControl;
60 		::rtl::OUString
61 					sReferringControls;
62 
63 		ControlReference(
64 				const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxReferredControl,
65 				const ::rtl::OUString& _rReferringControls)
66 			:xReferredControl(_rxReferredControl)
67 			,sReferringControls(_rReferringControls)
68 		{
69 		}
70 	};
71 */
72 
73 	//=====================================================================
74 	//= OFormLayerXMLImport_Impl
75 	//=====================================================================
76 	class OFormLayerXMLImport_Impl
77 				: public ODefaultEventAttacherManager
78 	{
79 		friend class OFormLayerXMLImport;
80 
81 	protected:
82 		SvXMLImport&						m_rImporter;
83 		OAttribute2Property					m_aAttributeMetaData;
84 
85         /// the supplier for the forms of the currently imported page
86         ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormsSupplier2 >
87                                             m_xCurrentPageFormsSupp;
88 		SvXMLStylesContext*					m_pAutoStyles;
89 
90 	protected:
91 		DECLARE_STL_USTRINGACCESS_MAP( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >, MapString2PropertySet );
92 		DECLARE_STL_MAP( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >, MapString2PropertySet, ODrawPageCompare, MapDrawPage2Map);
93 
94 		MapDrawPage2Map			m_aControlIds;			// ids of the controls on all known page
95 		MapDrawPage2MapIterator	m_aCurrentPageIds;		// ifs of the controls on the current page
96 
97         typedef ::std::pair< ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >, ::rtl::OUString >
98                                 ModelStringPair;
99         ::std::vector< ModelStringPair >
100                                 m_aControlReferences;	// control reference descriptions for current page
101         ::std::vector< ModelStringPair >
102                                 m_aCellValueBindings;   // information about controls bound to spreadsheet cells
103         ::std::vector< ModelStringPair >
104                                 m_aCellRangeListSources;// information about controls bound to spreadsheet cell range list sources
105 
106         ::std::vector< ModelStringPair >
107                                 m_aXFormsValueBindings; // collect xforms:bind attributes to be resolved
108 
109         ::std::vector< ModelStringPair >
110                                 m_aXFormsListBindings; // collect forms:xforms-list-source attributes to be resolved
111 
112         ::std::vector< ModelStringPair >
113                                 m_aXFormsSubmissions;   // collect xforms:submission attributes to be resolved
114 
115 	public:
116 		// IControlIdMap
117 		void	registerControlId(
118 			const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControl,
119 			const ::rtl::OUString& _rId);
120 		void	registerControlReferences(
121 			const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControl,
122 			const ::rtl::OUString& _rReferringControls);
123 
124 		// OFormLayerXMLImport_Impl
getAttributeMap()125         inline OAttribute2Property&		    getAttributeMap()   { return m_aAttributeMetaData; }
getGlobalContext()126         inline SvXMLImport&				    getGlobalContext()  { return m_rImporter; }
127 		const SvXMLStyleContext*			getStyleElement(const ::rtl::OUString& _rStyleName) const;
128 		void						        enterEventContext();
129 		void						        leaveEventContext();
130 		void                                applyControlNumberStyle(
131 			const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControlModel,
132 			const ::rtl::OUString& _rControlNumerStyleName
133 		);
134         void                        registerCellValueBinding(
135             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControlModel,
136             const ::rtl::OUString& _rCellAddress
137         );
138 
139         void                        registerCellRangeListSource(
140             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControlModel,
141             const ::rtl::OUString& _rCellRangeAddress
142         );
143 
144         void                        registerXFormsValueBinding(
145             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControlModel,
146             const ::rtl::OUString& _rBindingID
147         );
148 
149         void                        registerXFormsListBinding(
150             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControlModel,
151             const ::rtl::OUString& _rBindingID
152         );
153 
154         void                        registerXFormsSubmission(
155             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControlModel,
156             const ::rtl::OUString& _rSubmissionID
157         );
158 
159 	protected:
160 		OFormLayerXMLImport_Impl(SvXMLImport& _rImporter);
161 		virtual ~OFormLayerXMLImport_Impl();
162 
163 		/** start importing the forms of the given page
164 		*/
165 		void startPage(
166 			const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& _rxDrawPage);
167 
168 		/** end importing the forms of the current page
169 		*/
170 		void endPage();
171 
172 		/** creates an import context for the office:forms element
173 		*/
174 		SvXMLImportContext* createOfficeFormsContext(
175 			SvXMLImport& _rImport,
176 			sal_uInt16 _nPrefix,
177 			const rtl::OUString& _rLocalName);
178 
179 		/** create an <type>SvXMLImportContext</type> instance which is able to import the &lt;form:form&gt;
180 			element.
181 		*/
182 		SvXMLImportContext* createContext(
183 			const sal_uInt16 _nPrefix,
184 			const rtl::OUString& _rLocalName,
185 			const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttribs);
186 
187 		/** get the control with the given id
188 		*/
189 		::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
190 				lookupControlId(const ::rtl::OUString& _rControlId);
191 
192 		/** seek to the given page
193 		*/
194 		void seekPage(
195 			const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& _rxDrawPage);
196 
197 		/** announces the auto-style context to the form importer
198 		*/
199 		void setAutoStyleContext(SvXMLStylesContext* _pNewContext);
200 
201         /** to be called when the document has been completely imported
202 
203             <p>For some documents (currently: only some spreadsheet documents) it's necessary
204             do to a post processing, since not all information from the file can be processed
205             if the document is not completed, yet.</p>
206         */
207         void documentDone( );
208 	};
209 
210 //.........................................................................
211 }	// namespace xmloff
212 //.........................................................................
213 
214 #endif // _XMLOFF_FORMS_LAYERIMPORT_HXX_
215 
216