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_rptxml.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