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_sw.hxx"
26
27 #include <rtl/ustring.hxx>
28
29 #include <rsc/rscsfx.hxx>
30
31 #include <xmloff/i18nmap.hxx>
32 #include <xmloff/xmluconv.hxx>
33 #include <xmloff/families.hxx>
34 #include <xmloff/xmlnmspe.hxx>
35 #include <xmloff/xmltoken.hxx>
36
37 #include <editeng/boxitem.hxx>
38 #include <editeng/fontitem.hxx>
39 #include <editeng/tstpitem.hxx>
40 #include <editeng/boxitem.hxx>
41 #include <editeng/brshitem.hxx>
42 #include <editeng/langitem.hxx>
43 #include <editeng/memberids.hrc>
44
45 #include <svx/unomid.hxx>
46
47 #include <hintids.hxx>
48 #include <paratr.hxx>
49 #include <doc.hxx>
50 #include <unomid.h>
51 #include "xmlbrshi.hxx"
52 #include "xmlimp.hxx"
53 #include "xmlitmap.hxx"
54 #include "xmlimpit.hxx"
55 #include "xmlitem.hxx"
56
57 using ::rtl::OUString;
58 using namespace ::com::sun::star;
59 using namespace ::com::sun::star::uno;
60
61 extern SvXMLItemMapEntry aXMLTableItemMap[];
62 extern SvXMLItemMapEntry aXMLTableColItemMap[];
63 extern SvXMLItemMapEntry aXMLTableRowItemMap[];
64 extern SvXMLItemMapEntry aXMLTableCellItemMap[];
65
66 class SwXMLImportTableItemMapper_Impl: public SvXMLImportItemMapper
67 {
68
69 public:
70
71 SwXMLImportTableItemMapper_Impl( SvXMLItemMapEntriesRef rMapEntries );
72 virtual ~SwXMLImportTableItemMapper_Impl();
73
74 virtual sal_Bool handleSpecialItem( const SvXMLItemMapEntry& rEntry,
75 SfxPoolItem& rItem,
76 SfxItemSet& rSet,
77 const OUString& rValue,
78 const SvXMLUnitConverter& rUnitConverter,
79 const SvXMLNamespaceMap& rNamespaceMap );
80
81 virtual sal_Bool
82 handleNoItem(SvXMLItemMapEntry const& rEntry,
83 SfxItemSet & rSet,
84 ::rtl::OUString const& rValue,
85 SvXMLUnitConverter const& rUnitConverter,
86 SvXMLNamespaceMap const& rNamespaceMap);
87
88 virtual void finished(SfxItemSet & rSet,
89 SvXMLUnitConverter const& rUnitConverter) const;
90
91 virtual void setMapEntries( SvXMLItemMapEntriesRef rMapEntries );
92
93 private:
94 void Reset();
95
96 ::rtl::OUString m_FoMarginValue;
97 enum { LEFT = 0, RIGHT = 1, TOP = 2, BOTTOM = 3 };
98 bool m_bHaveMargin[4];
99 };
100
SwXMLImportTableItemMapper_Impl(SvXMLItemMapEntriesRef rMapEntries)101 SwXMLImportTableItemMapper_Impl::SwXMLImportTableItemMapper_Impl(
102 SvXMLItemMapEntriesRef rMapEntries ) :
103 SvXMLImportItemMapper( rMapEntries, RES_UNKNOWNATR_CONTAINER)
104 {
105 Reset();
106 }
107
~SwXMLImportTableItemMapper_Impl()108 SwXMLImportTableItemMapper_Impl::~SwXMLImportTableItemMapper_Impl()
109 {
110 }
111
Reset()112 void SwXMLImportTableItemMapper_Impl::Reset()
113 {
114 m_FoMarginValue = ::rtl::OUString();
115 for (int i = 0; i < 3; ++i)
116 {
117 m_bHaveMargin[i] = false;
118 }
119 }
120
setMapEntries(SvXMLItemMapEntriesRef rMapEntries)121 void SwXMLImportTableItemMapper_Impl::setMapEntries(
122 SvXMLItemMapEntriesRef rMapEntries )
123 {
124 Reset();
125 SvXMLImportItemMapper::setMapEntries(rMapEntries);
126 }
127
handleSpecialItem(const SvXMLItemMapEntry & rEntry,SfxPoolItem & rItem,SfxItemSet & rItemSet,const OUString & rValue,const SvXMLUnitConverter & rUnitConv,const SvXMLNamespaceMap &)128 sal_Bool SwXMLImportTableItemMapper_Impl::handleSpecialItem(
129 const SvXMLItemMapEntry& rEntry,
130 SfxPoolItem& rItem,
131 SfxItemSet& rItemSet,
132 const OUString& rValue,
133 const SvXMLUnitConverter& rUnitConv,
134 const SvXMLNamespaceMap& )
135 {
136 sal_Bool bRet = sal_False;
137 sal_uInt16 nMemberId = static_cast< sal_Int16 >(rEntry.nMemberId & MID_SW_FLAG_MASK);
138 switch( rItem.Which() )
139 {
140 case RES_LR_SPACE:
141 switch (nMemberId)
142 {
143 case MID_L_MARGIN:
144 m_bHaveMargin[LEFT] = true;
145 break;
146 case MID_R_MARGIN:
147 m_bHaveMargin[RIGHT] = true;
148 break;
149 }
150 bRet = SvXMLImportItemMapper::PutXMLValue(
151 rItem, rValue, nMemberId, rUnitConv);
152 break;
153 case RES_UL_SPACE:
154 switch (nMemberId)
155 {
156 case MID_UP_MARGIN:
157 m_bHaveMargin[TOP] = true;
158 break;
159 case MID_LO_MARGIN:
160 m_bHaveMargin[BOTTOM] = true;
161 break;
162 }
163 bRet = SvXMLImportItemMapper::PutXMLValue(
164 rItem, rValue, nMemberId, rUnitConv);
165 break;
166 case RES_FRM_SIZE:
167 switch( nMemberId )
168 {
169 case MID_FRMSIZE_COL_WIDTH:
170 // If the item is existing already, a relative value has been set
171 // already that must be preserved.
172 if( SFX_ITEM_SET != rItemSet.GetItemState( RES_FRM_SIZE,
173 sal_False ) )
174 bRet = SvXMLImportItemMapper::PutXMLValue(
175 rItem, rValue, nMemberId, rUnitConv );
176 break;
177 }
178 }
179
180 return bRet;
181 }
182
183
handleNoItem(SvXMLItemMapEntry const & rEntry,SfxItemSet & rSet,::rtl::OUString const & rValue,SvXMLUnitConverter const & rUnitConverter,SvXMLNamespaceMap const & rNamespaceMap)184 sal_Bool SwXMLImportTableItemMapper_Impl::handleNoItem(
185 SvXMLItemMapEntry const& rEntry,
186 SfxItemSet & rSet,
187 ::rtl::OUString const& rValue,
188 SvXMLUnitConverter const& rUnitConverter,
189 SvXMLNamespaceMap const& rNamespaceMap)
190 {
191 if ((XML_NAMESPACE_FO == rEntry.nNameSpace) &&
192 (xmloff::token::XML_MARGIN == rEntry.eLocalName))
193 {
194 m_FoMarginValue = rValue;
195 return true;
196 }
197 else
198 {
199 return SvXMLImportItemMapper::handleNoItem(
200 rEntry, rSet, rValue, rUnitConverter, rNamespaceMap);
201 }
202 }
203
finished(SfxItemSet & rSet,SvXMLUnitConverter const & rUnitConverter) const204 void SwXMLImportTableItemMapper_Impl::finished(
205 SfxItemSet & rSet, SvXMLUnitConverter const& rUnitConverter) const
206 {
207 if (m_FoMarginValue.getLength())
208 {
209 sal_uInt16 const Ids[4][2] = {
210 { RES_LR_SPACE, MID_L_MARGIN },
211 { RES_LR_SPACE, MID_R_MARGIN },
212 { RES_UL_SPACE, MID_UP_MARGIN },
213 { RES_UL_SPACE, MID_LO_MARGIN },
214 };
215 for (int i = 0; i < 4; ++i)
216 {
217 if (m_bHaveMargin[i])
218 {
219 continue; // already read fo:margin-top etc.
220 }
221 // first get item from itemset
222 SfxPoolItem const* pItem = 0;
223 SfxItemState eState =
224 rSet.GetItemState(Ids[i][0], sal_True, &pItem);
225
226 // if not set, try the pool
227 if ((SFX_ITEM_SET != eState) && (SFX_WHICH_MAX > Ids[i][0]))
228 {
229 pItem = &rSet.GetPool()->GetDefaultItem(Ids[i][0]);
230 }
231
232 // do we have an item?
233 if (eState >= SFX_ITEM_DEFAULT && pItem)
234 {
235 SfxPoolItem *const pNewItem = pItem->Clone();
236 bool const bPut = PutXMLValue(
237 *pNewItem, m_FoMarginValue, Ids[i][1], rUnitConverter);
238 if (bPut)
239 {
240 rSet.Put(*pNewItem);
241 }
242 }
243 else
244 {
245 OSL_ENSURE(false, "could not get item");
246 }
247 }
248 }
249 }
250
251 // ---------------------------------------------------------------------
252
253 class SwXMLItemSetContext_Impl : public SvXMLItemSetContext
254 {
255 SvXMLImportContextRef xBackground;
256
257 using SvXMLItemSetContext::CreateChildContext;
258
259 public:
260 SwXMLItemSetContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
261 const OUString& rLName,
262 const Reference< xml::sax::XAttributeList > & xAttrList,
263 SfxItemSet& rItemSet,
264 SvXMLImportItemMapper & rIMapper,
265 const SvXMLUnitConverter& rUnitConv );
266 virtual ~SwXMLItemSetContext_Impl();
267
268 virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
269 const ::rtl::OUString& rLocalName,
270 const ::uno::Reference< xml::sax::XAttributeList > & xAttrList,
271 SfxItemSet& rItemSet,
272 const SvXMLItemMapEntry& rEntry,
273 const SvXMLUnitConverter& rUnitConv );
274 };
275
SwXMLItemSetContext_Impl(SwXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<xml::sax::XAttributeList> & xAttrList,SfxItemSet & _rItemSet,SvXMLImportItemMapper & _rIMapper,const SvXMLUnitConverter & _rUnitConv)276 SwXMLItemSetContext_Impl::SwXMLItemSetContext_Impl(
277 SwXMLImport& rImport, sal_uInt16 nPrfx,
278 const OUString& rLName,
279 const Reference< xml::sax::XAttributeList > & xAttrList,
280 SfxItemSet& _rItemSet,
281 SvXMLImportItemMapper & _rIMapper,
282 const SvXMLUnitConverter& _rUnitConv ) :
283 SvXMLItemSetContext( rImport, nPrfx, rLName, xAttrList,
284 _rItemSet, _rIMapper, _rUnitConv )
285 {
286 }
287
~SwXMLItemSetContext_Impl()288 SwXMLItemSetContext_Impl::~SwXMLItemSetContext_Impl()
289 {
290 if( xBackground.Is() )
291 {
292 const SvxBrushItem& rItem =
293 ((SwXMLBrushItemImportContext*)&xBackground)->GetItem();
294 rItemSet.Put( rItem );
295 }
296 }
297
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList,SfxItemSet & _rItemSet,const SvXMLItemMapEntry & rEntry,const SvXMLUnitConverter & _rUnitConv)298 SvXMLImportContext *SwXMLItemSetContext_Impl::CreateChildContext(
299 sal_uInt16 nPrefix,
300 const OUString& rLocalName,
301 const Reference< xml::sax::XAttributeList > & xAttrList,
302 SfxItemSet& _rItemSet,
303 const SvXMLItemMapEntry& rEntry,
304 const SvXMLUnitConverter& _rUnitConv )
305 {
306 SvXMLImportContext *pContext = 0;
307
308 switch( rEntry.nWhichId )
309 {
310 case RES_BACKGROUND:
311 {
312 const SfxPoolItem *pItem;
313 if( SFX_ITEM_SET == _rItemSet.GetItemState( RES_BACKGROUND,
314 sal_False, &pItem ) )
315 {
316 pContext = new SwXMLBrushItemImportContext(
317 GetImport(), nPrefix, rLocalName, xAttrList,
318 _rUnitConv, *(const SvxBrushItem *)pItem );
319 }
320 else
321 {
322 pContext = new SwXMLBrushItemImportContext(
323 GetImport(), nPrefix, rLocalName, xAttrList,
324 _rUnitConv, RES_BACKGROUND );
325 }
326 xBackground = pContext;
327 }
328 break;
329 }
330
331 if( !pContext )
332 pContext = SvXMLItemSetContext::CreateChildContext( nPrefix, rLocalName,
333 xAttrList, _rItemSet,
334 rEntry, _rUnitConv );
335
336 return pContext;
337 }
338
339 // ---------------------------------------------------------------------
340
_InitItemImport()341 void SwXMLImport::_InitItemImport()
342 {
343 // #110680#
344 pTwipUnitConv = new SvXMLUnitConverter( MAP_TWIP, MAP_TWIP, getServiceFactory() );
345
346 xTableItemMap = new SvXMLItemMapEntries( aXMLTableItemMap );
347 xTableColItemMap = new SvXMLItemMapEntries( aXMLTableColItemMap );
348 xTableRowItemMap = new SvXMLItemMapEntries( aXMLTableRowItemMap );
349 xTableCellItemMap = new SvXMLItemMapEntries( aXMLTableCellItemMap );
350
351 pTableItemMapper = new SwXMLImportTableItemMapper_Impl( xTableItemMap );
352 }
353
_FinitItemImport()354 void SwXMLImport::_FinitItemImport()
355 {
356 delete pTableItemMapper;
357 delete pTwipUnitConv;
358 }
359
CreateTableItemImportContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList,sal_uInt16 nFamily,SfxItemSet & rItemSet)360 SvXMLImportContext *SwXMLImport::CreateTableItemImportContext(
361 sal_uInt16 nPrefix,
362 const OUString& rLocalName,
363 const Reference< xml::sax::XAttributeList > & xAttrList,
364 sal_uInt16 nFamily,
365 SfxItemSet& rItemSet )
366 {
367 SvXMLItemMapEntriesRef xItemMap;
368
369 switch( nFamily )
370 {
371 case XML_STYLE_FAMILY_TABLE_TABLE:
372 xItemMap = xTableItemMap;
373 break;
374 case XML_STYLE_FAMILY_TABLE_COLUMN:
375 xItemMap = xTableColItemMap;
376 break;
377 case XML_STYLE_FAMILY_TABLE_ROW:
378 xItemMap = xTableRowItemMap;
379 break;
380 case XML_STYLE_FAMILY_TABLE_CELL:
381 xItemMap = xTableCellItemMap;
382 break;
383 }
384
385 pTableItemMapper->setMapEntries( xItemMap );
386
387 return new SwXMLItemSetContext_Impl( *this, nPrefix, rLocalName,
388 xAttrList, rItemSet,
389 GetTableItemMapper(),
390 GetTwipUnitConverter() );
391 }
392