1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <com/sun/star/text/XTextContent.hpp>
21 #include <com/sun/star/text/TextContentAnchorType.hpp>
23 #include <sax/tools/converter.hxx>
25 #include <xmloff/xmlimp.hxx>
26 #include <xmloff/txtimp.hxx>
27 #include <xmloff/xmluconv.hxx>
28 #include <xmloff/namespacemap.hxx>
29 #include "XMLAnchorTypePropHdl.hxx"
30 #include <com/sun/star/beans/XPropertySet.hpp>
31 #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
32 #include <com/sun/star/drawing/XShapes.hpp>
33 #include <com/sun/star/frame/XModel.hpp>
34 #include <xmloff/XMLTextShapeImportHelper.hxx>
37 using namespace ::com::sun::star::uno
;
38 using namespace ::com::sun::star::drawing
;
39 using namespace ::com::sun::star::beans
;
40 using namespace ::com::sun::star::text
;
41 using namespace ::com::sun::star::container
;
42 using namespace ::com::sun::star::xml::sax
;
44 constexpr OUStringLiteral
gsAnchorType(u
"AnchorType");
45 constexpr OUStringLiteral
gsAnchorPageNo(u
"AnchorPageNo");
46 constexpr OUStringLiteral
gsVertOrientPosition(u
"VertOrientPosition");
48 XMLTextShapeImportHelper::XMLTextShapeImportHelper(
50 XMLShapeImportHelper( rImp
, rImp
.GetModel(),
51 XMLTextImportHelper::CreateShapeExtPropMapper(rImp
) ),
54 Reference
< XDrawPageSupplier
> xDPS( rImp
.GetModel(), UNO_QUERY
);
57 Reference
< XShapes
> xShapes
= xDPS
->getDrawPage();
58 pushGroupForPostProcessing( xShapes
);
63 XMLTextShapeImportHelper::~XMLTextShapeImportHelper()
65 popGroupAndPostProcess();
68 void XMLTextShapeImportHelper::addShape(
69 Reference
< XShape
>& rShape
,
70 const Reference
< XAttributeList
>& xAttrList
,
71 Reference
< XShapes
>& rShapes
)
75 // It's a group shape or 3DScene , so we have to call the base class method.
76 XMLShapeImportHelper::addShape( rShape
, xAttrList
, rShapes
);
80 TextContentAnchorType eAnchorType
= TextContentAnchorType_AT_PARAGRAPH
;
84 rtl::Reference
< XMLTextImportHelper
> xTxtImport
=
85 rImport
.GetTextImport();
86 const SvXMLTokenMap
& rTokenMap
=
87 xTxtImport
->GetTextFrameAttrTokenMap();
89 sal_Int16 nAttrCount
= xAttrList
.is() ? xAttrList
->getLength() : 0;
90 for( sal_Int16 i
=0; i
< nAttrCount
; i
++ )
92 const OUString
& rAttrName
= xAttrList
->getNameByIndex( i
);
93 const OUString
& rValue
= xAttrList
->getValueByIndex( i
);
97 rImport
.GetNamespaceMap().GetKeyByAttrName( rAttrName
,
99 switch( rTokenMap
.Get( nPrefix
, aLocalName
) )
101 case XML_TOK_TEXT_FRAME_ANCHOR_TYPE
:
103 TextContentAnchorType eNew
;
104 // OD 2004-06-01 #i26791# - allow all anchor types
105 if ( XMLAnchorTypePropHdl::convert( rValue
, eNew
) )
111 case XML_TOK_TEXT_FRAME_ANCHOR_PAGE_NUMBER
:
114 if (::sax::Converter::convertNumber(nTmp
, rValue
, 1, SHRT_MAX
))
115 nPage
= static_cast<sal_Int16
>(nTmp
);
118 case XML_TOK_TEXT_FRAME_Y
:
119 rImport
.GetMM100UnitConverter().convertMeasureToCore( nY
, rValue
);
124 Reference
< XPropertySet
> xPropSet( rShape
, UNO_QUERY
);
127 xPropSet
->setPropertyValue( gsAnchorType
, Any(eAnchorType
) );
129 Reference
< XTextContent
> xTxtCntnt( rShape
, UNO_QUERY
);
130 xTxtImport
->InsertTextContent( xTxtCntnt
);
132 // page number (must be set after the frame is inserted, because it
133 // will be overwritten then inserting the frame.
134 switch( eAnchorType
)
136 case TextContentAnchorType_AT_PAGE
:
137 // only set positive page numbers
140 xPropSet
->setPropertyValue( gsAnchorPageNo
, Any(nPage
) );
143 case TextContentAnchorType_AS_CHARACTER
:
144 xPropSet
->setPropertyValue( gsVertOrientPosition
, Any(nY
) );
151 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */