xref: /AOO41X/main/xmloff/source/style/xmltabi.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <com/sun/star/style/TabAlign.hpp>
27 #include <rtl/ustrbuf.hxx>
28 #include <xmloff/xmltkmap.hxx>
29 #include <xmloff/nmspmap.hxx>
30 #include "xmloff/xmlnmspe.hxx"
31 #include <xmloff/xmlimp.hxx>
32 #include <com/sun/star/style/TabStop.hpp>
33 #include <xmloff/xmltoken.hxx>
34 #include "xmloff/i18nmap.hxx"
35 #include <xmloff/xmluconv.hxx>
36 
37 #include "xmltabi.hxx"
38 
39 #define _SVSTDARR_USHORTS
40 #include <svl/svstdarr.hxx>
41 
42 using ::rtl::OUString;
43 using ::rtl::OUStringBuffer;
44 
45 using namespace ::com::sun::star;
46 using namespace ::xmloff::token;
47 
48 // ---
49 
50 enum SvXMLTokenMapAttrs
51 {
52     XML_TOK_TABSTOP_POSITION,
53     XML_TOK_TABSTOP_TYPE,
54     XML_TOK_TABSTOP_CHAR,
55     XML_TOK_TABSTOP_LEADER_STYLE,
56     XML_TOK_TABSTOP_LEADER_TEXT,
57     XML_TOK_TABSTOP_END=XML_TOK_UNKNOWN
58 };
59 
60 static __FAR_DATA SvXMLTokenMapEntry aTabsAttributesAttrTokenMap[] =
61 {
62     { XML_NAMESPACE_STYLE, XML_POSITION,     XML_TOK_TABSTOP_POSITION },
63     { XML_NAMESPACE_STYLE, XML_TYPE,         XML_TOK_TABSTOP_TYPE },
64     { XML_NAMESPACE_STYLE, XML_CHAR,         XML_TOK_TABSTOP_CHAR },
65     { XML_NAMESPACE_STYLE, XML_LEADER_TEXT,  XML_TOK_TABSTOP_LEADER_TEXT },
66     { XML_NAMESPACE_STYLE, XML_LEADER_STYLE,  XML_TOK_TABSTOP_LEADER_STYLE },
67     XML_TOKEN_MAP_END
68 };
69 
70 // ---
71 
72 class SvxXMLTabStopContext_Impl : public SvXMLImportContext
73 {
74 private:
75     style::TabStop  aTabStop;
76 
77 public:
78     TYPEINFO();
79 
80     SvxXMLTabStopContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
81                                const OUString& rLName,
82                                const uno::Reference< xml::sax::XAttributeList > & xAttrList );
83 
84     virtual ~SvxXMLTabStopContext_Impl();
85 
86     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
87                                    const OUString& rLocalName,
88                                    const uno::Reference< xml::sax::XAttributeList > & xAttrList );
89 
getTabStop() const90     const style::TabStop& getTabStop() const { return aTabStop; }
91 };
92 
93 TYPEINIT1( SvxXMLTabStopContext_Impl, SvXMLImportContext );
94 
SvxXMLTabStopContext_Impl(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)95 SvxXMLTabStopContext_Impl::SvxXMLTabStopContext_Impl(
96                                SvXMLImport& rImport, sal_uInt16 nPrfx,
97                                const OUString& rLName,
98                                const uno::Reference< xml::sax::XAttributeList > & xAttrList )
99 : SvXMLImportContext( rImport, nPrfx, rLName )
100 {
101     aTabStop.Position = 0;
102     aTabStop.Alignment = style::TabAlign_LEFT;
103     aTabStop.DecimalChar = sal_Unicode( ',' );
104     aTabStop.FillChar = sal_Unicode( ' ' );
105     sal_Unicode cTextFillChar = 0;
106 
107     SvXMLTokenMap aTokenMap( aTabsAttributesAttrTokenMap );
108 
109     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
110     for( sal_Int16 i=0; i < nAttrCount; i++ )
111     {
112         const OUString& rAttrName = xAttrList->getNameByIndex( i );
113         OUString aLocalName;
114         sal_uInt16 nPrefix =
115             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
116                                                             &aLocalName );
117         const OUString& rValue = xAttrList->getValueByIndex( i );
118 
119         sal_Int32 nVal;
120         switch( aTokenMap.Get( nPrefix, aLocalName ) )
121         {
122         case XML_TOK_TABSTOP_POSITION:
123             if( GetImport().GetMM100UnitConverter().convertMeasure( nVal,
124                                                                     rValue ) )
125                 aTabStop.Position = nVal;
126             break;
127         case XML_TOK_TABSTOP_TYPE:
128             if( IsXMLToken( rValue, XML_LEFT ) )
129             {
130                 aTabStop.Alignment = style::TabAlign_LEFT;
131             }
132             else if( IsXMLToken( rValue, XML_RIGHT ) )
133             {
134                 aTabStop.Alignment = style::TabAlign_RIGHT;
135             }
136             else if( IsXMLToken( rValue, XML_CENTER ) )
137             {
138                 aTabStop.Alignment = style::TabAlign_CENTER;
139             }
140             else if( IsXMLToken( rValue, XML_CHAR ) )
141             {
142                 aTabStop.Alignment = style::TabAlign_DECIMAL;
143             }
144             else if( IsXMLToken( rValue, XML_DEFAULT ) )
145             {
146                 aTabStop.Alignment = style::TabAlign_DEFAULT;
147             }
148             break;
149         case XML_TOK_TABSTOP_CHAR:
150             if( 0 != rValue.getLength() )
151                 aTabStop.DecimalChar = rValue[0];
152             break;
153         case XML_TOK_TABSTOP_LEADER_STYLE:
154             if( IsXMLToken( rValue, XML_NONE ) )
155                 aTabStop.FillChar = ' ';
156             else if( IsXMLToken( rValue, XML_DOTTED ) )
157                 aTabStop.FillChar = '.';
158             else
159                 aTabStop.FillChar = '_';
160             break;
161         case XML_TOK_TABSTOP_LEADER_TEXT:
162             if( 0 != rValue.getLength() )
163                 cTextFillChar = rValue[0];
164             break;
165         }
166     }
167 
168     if( cTextFillChar != 0 && aTabStop.FillChar != ' ' )
169         aTabStop.FillChar = cTextFillChar;
170 }
171 
~SvxXMLTabStopContext_Impl()172 SvxXMLTabStopContext_Impl::~SvxXMLTabStopContext_Impl()
173 {
174 }
175 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> &)176 SvXMLImportContext *SvxXMLTabStopContext_Impl::CreateChildContext(
177                                    sal_uInt16 nPrefix,
178                                    const OUString& rLocalName,
179                                    const uno::Reference< xml::sax::XAttributeList > & )
180 {
181     return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
182 }
183 
184 
185 
186 
187 typedef SvxXMLTabStopContext_Impl *SvxXMLTabStopContext_Impl_ImplPtr;
188 SV_DECL_PTRARR( SvxXMLTabStopArray_Impl, SvxXMLTabStopContext_Impl_ImplPtr, 20, 5 )
189 
190 
191 // ---
192 
193 TYPEINIT1( SvxXMLTabStopImportContext, XMLElementPropertyContext );
194 
SvxXMLTabStopImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const XMLPropertyState & rProp,::std::vector<XMLPropertyState> & rProps)195 SvxXMLTabStopImportContext::SvxXMLTabStopImportContext(
196                                 SvXMLImport& rImport, sal_uInt16 nPrfx,
197                                 const OUString& rLName,
198                                 const XMLPropertyState& rProp,
199                                 ::std::vector< XMLPropertyState > &rProps )
200 : XMLElementPropertyContext( rImport, nPrfx, rLName, rProp, rProps ),
201   mpTabStops( NULL )
202 {
203 }
204 
~SvxXMLTabStopImportContext()205 SvxXMLTabStopImportContext::~SvxXMLTabStopImportContext()
206 {
207     if( mpTabStops )
208     {
209         sal_uInt16 nCount = mpTabStops->Count();
210         while( nCount )
211         {
212             nCount--;
213             SvxXMLTabStopContext_Impl *pTabStop = (*mpTabStops)[nCount];
214             mpTabStops->Remove( nCount, 1 );
215             pTabStop->ReleaseRef();
216         }
217     }
218 
219     delete mpTabStops;
220 }
221 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)222 SvXMLImportContext *SvxXMLTabStopImportContext::CreateChildContext(
223                                    sal_uInt16 nPrefix,
224                                    const OUString& rLocalName,
225                                    const uno::Reference< xml::sax::XAttributeList > & xAttrList )
226 {
227     SvXMLImportContext *pContext = 0;
228 
229     if( XML_NAMESPACE_STYLE == nPrefix && IsXMLToken( rLocalName, XML_TAB_STOP ) )
230     {
231         // create new tabstop import context
232         SvxXMLTabStopContext_Impl *pTabStopContext =
233             new SvxXMLTabStopContext_Impl( GetImport(), nPrefix, rLocalName,
234                                            xAttrList );
235 
236         // add new tabstop to array of tabstops
237         if( !mpTabStops )
238             mpTabStops = new SvxXMLTabStopArray_Impl;
239 
240         mpTabStops->Insert( pTabStopContext, mpTabStops->Count() );
241         pTabStopContext->AddRef();
242 
243         pContext = pTabStopContext;
244     }
245     else
246     {
247         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
248     }
249 
250     return pContext;
251 }
252 
EndElement()253 void SvxXMLTabStopImportContext::EndElement( )
254 {
255     sal_uInt16 nCount = mpTabStops ? mpTabStops->Count() : 0;
256     uno::Sequence< style::TabStop> aSeq( nCount );
257 
258     if( mpTabStops )
259     {
260         sal_uInt16 nNewCount = 0;
261 
262         style::TabStop* pTabStops = aSeq.getArray();
263         for( sal_uInt16 i=0; i < nCount; i++ )
264         {
265             SvxXMLTabStopContext_Impl *pTabStopContext = (*mpTabStops)[i];
266             const style::TabStop& rTabStop = pTabStopContext->getTabStop();
267             sal_Bool bDflt = style::TabAlign_DEFAULT == rTabStop.Alignment;
268             if( !bDflt || 0==i )
269             {
270                 *pTabStops++ = pTabStopContext->getTabStop();
271                 nNewCount++;
272             }
273             if( bDflt && 0==i )
274                 break;
275         }
276 
277         if( nCount != nNewCount )
278             aSeq.realloc( nNewCount );
279     }
280     aProp.maValue <<= aSeq;
281 
282     SetInsert( sal_True );
283     XMLElementPropertyContext::EndElement();
284 
285 }
286 
287 
288 
289 
290