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 #include "precompiled_reportdesign.hxx"
24 #include "xmlFixedContent.hxx"
25 #include "xmlfilter.hxx"
26 #include <xmloff/xmltoken.hxx>
27 #include <xmloff/xmlnmspe.hxx>
28 #include <xmloff/nmspmap.hxx>
29 #include "xmlEnums.hxx"
30 #include "xmlReportElement.hxx"
31 #include <tools/debug.hxx>
32 #include <com/sun/star/report/XShape.hpp>
33 #include "xmlCell.hxx"
34 #include "xmlstrings.hrc"
35 #include <com/sun/star/report/XShape.hpp>
36 #include <com/sun/star/report/XFormattedField.hpp>
37 #include <com/sun/star/report/XFixedText.hpp>
38 #include <com/sun/star/text/ControlCharacter.hpp>
39 #include "xmlTable.hxx"
40 #include <xmloff/XMLCharContext.hxx>
41 
42 namespace rptxml
43 {
44 	using namespace ::com::sun::star;
45 
46 class OXMLCharContent : public XMLCharContext
47 {
48     OXMLFixedContent* m_pFixedContent;
49     OXMLCharContent(const OXMLCharContent&);
50     void operator =(const OXMLCharContent&);
51 public:
52 	OXMLCharContent(
53 			SvXMLImport& rImport,
54             OXMLFixedContent* _pFixedContent,
55 			sal_uInt16 nPrfx,
56 			const ::rtl::OUString& rLName,
57             const uno::Reference< xml::sax::XAttributeList > & xAttrList,
58 			sal_Unicode c,
59 			sal_Bool bCount );
60 	OXMLCharContent(
61 			SvXMLImport& rImport,
62             OXMLFixedContent* _pFixedContent,
63 			sal_uInt16 nPrfx,
64             const ::rtl::OUString& rLName,
65             const uno::Reference< xml::sax::XAttributeList > & xAttrList,
66 			sal_Int16 nControl );
67 
68     virtual void InsertControlCharacter(sal_Int16   _nControl);
69     virtual void InsertString(const ::rtl::OUString& _sString);
70 };
OXMLCharContent(SvXMLImport & rImport,OXMLFixedContent * _pFixedContent,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,sal_Unicode c,sal_Bool bCount)71 OXMLCharContent::OXMLCharContent(
72 		SvXMLImport& rImport,
73         OXMLFixedContent* _pFixedContent,
74 		sal_uInt16 nPrfx,
75 		const ::rtl::OUString& rLName,
76         const uno::Reference< xml::sax::XAttributeList > & xAttrList,
77 		sal_Unicode c,
78 		sal_Bool bCount )
79     : XMLCharContext(rImport,nPrfx,rLName,xAttrList,c,bCount)
80     ,m_pFixedContent(_pFixedContent)
81 {
82 }
83 // -----------------------------------------------------------------------------
OXMLCharContent(SvXMLImport & rImport,OXMLFixedContent * _pFixedContent,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,sal_Int16 nControl)84 OXMLCharContent::OXMLCharContent(
85 		SvXMLImport& rImport,
86         OXMLFixedContent* _pFixedContent,
87 		sal_uInt16 nPrfx,
88         const ::rtl::OUString& rLName,
89         const uno::Reference< xml::sax::XAttributeList > & xAttrList,
90 		sal_Int16 nControl )
91     : XMLCharContext(rImport,nPrfx,rLName,xAttrList,nControl)
92     ,m_pFixedContent(_pFixedContent)
93 {
94 }
95 // -----------------------------------------------------------------------------
InsertControlCharacter(sal_Int16 _nControl)96 void OXMLCharContent::InsertControlCharacter(sal_Int16   _nControl)
97 {
98     switch( _nControl )
99     {
100         case ControlCharacter::LINE_BREAK:
101             m_pFixedContent->Characters(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\n")));
102             break;
103         default:
104             OSL_ENSURE(0,"Not supported control character");
105             break;
106     }
107 }
108 // -----------------------------------------------------------------------------
InsertString(const::rtl::OUString & _sString)109 void OXMLCharContent::InsertString(const ::rtl::OUString& _sString)
110 {
111     m_pFixedContent->Characters(_sString);
112 }
113 // -----------------------------------------------------------------------------
114 
DBG_NAME(rpt_OXMLFixedContent)115 DBG_NAME( rpt_OXMLFixedContent )
116 
117 OXMLFixedContent::OXMLFixedContent( ORptFilter& rImport,
118 				sal_uInt16 nPrfx, const ::rtl::OUString& rLName
119 				,OXMLCell& _rCell
120                 ,OXMLTable* _pContainer
121                 ,OXMLFixedContent* _pInP) :
122 	OXMLReportElementBase( rImport, nPrfx, rLName,NULL,_pContainer)
123 ,m_rCell(_rCell)
124 ,m_pInP(_pInP)
125 ,m_bFormattedField(false)
126 {
127     DBG_CTOR( rpt_OXMLFixedContent,NULL);
128 }
129 // -----------------------------------------------------------------------------
130 
~OXMLFixedContent()131 OXMLFixedContent::~OXMLFixedContent()
132 {
133 
134     DBG_DTOR( rpt_OXMLFixedContent,NULL);
135 }
136 // -----------------------------------------------------------------------------
137 // -----------------------------------------------------------------------------
_CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const Reference<XAttributeList> & xAttrList)138 SvXMLImportContext* OXMLFixedContent::_CreateChildContext(
139 		sal_uInt16 nPrefix,
140 		const ::rtl::OUString& rLocalName,
141 		const Reference< XAttributeList > & xAttrList )
142 {
143 	SvXMLImportContext *pContext = OXMLReportElementBase::_CreateChildContext(nPrefix,rLocalName,xAttrList);
144     if ( pContext )
145         return pContext;
146 
147     static const ::rtl::OUString s_sStringConcat(RTL_CONSTASCII_USTRINGPARAM(" & "));
148 	const SvXMLTokenMap&	rTokenMap	= m_rImport.GetCellElemTokenMap();
149     Reference<XMultiServiceFactory> xFactor = m_rImport.getServiceFactory();
150 
151     m_rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
152 	const sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
153     switch( nToken )
154 	{
155         case XML_TOK_P:
156             pContext = new OXMLFixedContent(m_rImport,nPrefix, rLocalName,m_rCell,m_pContainer,this);
157             break;
158         case XML_TOK_TEXT_TAB_STOP:
159 		    pContext = new OXMLCharContent( m_rImport, this,nPrefix,
160 											    rLocalName, xAttrList,
161 											    0x0009, sal_False );
162 		    break;
163 
164 	    case XML_TOK_TEXT_LINE_BREAK:
165 		    pContext = new OXMLCharContent( m_rImport, this,nPrefix,
166 											    rLocalName, xAttrList,
167 											    ControlCharacter::LINE_BREAK );
168 		    break;
169 
170 	    case XML_TOK_TEXT_S:
171 		    pContext = new OXMLCharContent( m_rImport, this,nPrefix,
172 											    rLocalName, xAttrList,
173 											    0x0020, sal_True );
174 		    break;
175         case XML_TOK_PAGE_NUMBER:
176             m_sPageText += s_sStringConcat + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" PageNumber()"));
177             m_bFormattedField = true;
178             break;
179         case XML_TOK_PAGE_COUNT:
180             m_sPageText += s_sStringConcat + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" PageCount()"));
181             m_bFormattedField = true;
182             break;
183         default:
184             ;
185     }
186     return pContext;
187 }
188 // -----------------------------------------------------------------------------
EndElement()189 void OXMLFixedContent::EndElement()
190 {
191     if ( m_pInP )
192     {
193         const Reference<XMultiServiceFactory> xFactor(m_rImport.GetModel(),uno::UNO_QUERY);
194         if ( m_bFormattedField )
195         {
196             uno::Reference< uno::XInterface> xInt = xFactor->createInstance(SERVICE_FORMATTEDFIELD);
197             Reference< report::XFormattedField > xControl(xInt,uno::UNO_QUERY);
198             xControl->setDataField(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:")) + m_sPageText);
199  		    OSL_ENSURE(xControl.is(),"Could not create FormattedField!");
200             m_pInP->m_xComponent = xControl.get();
201             m_xComponent = xControl.get();
202         }
203         else
204         {
205             Reference< XFixedText > xControl(xFactor->createInstance(SERVICE_FIXEDTEXT),uno::UNO_QUERY);
206  			OSL_ENSURE(xControl.is(),"Could not create FixedContent!");
207             m_pInP->m_xComponent = xControl.get();
208             m_xComponent = xControl.get();
209             xControl->setLabel(m_sLabel);
210         }
211 
212         m_pContainer->addCell(m_xComponent);
213         m_rCell.setComponent(m_xComponent);
214 
215         OXMLReportElementBase::EndElement();
216     }
217 }
218 // -----------------------------------------------------------------------------
Characters(const::rtl::OUString & rChars)219 void OXMLFixedContent::Characters( const ::rtl::OUString& rChars )
220 {
221 	m_sLabel += rChars;
222     if ( rChars.getLength() )
223     {
224         static const ::rtl::OUString s_Quote(RTL_CONSTASCII_USTRINGPARAM("\""));
225         if ( m_sPageText.getLength() )
226         {
227             static const ::rtl::OUString s_sStringConcat(RTL_CONSTASCII_USTRINGPARAM(" & "));
228             m_sPageText += s_sStringConcat;
229         }
230 
231         m_sPageText += s_Quote + rChars + s_Quote;
232     }
233 }
234 
235 //----------------------------------------------------------------------------
236 } // namespace rptxml
237 // -----------------------------------------------------------------------------
238