1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*63bba73cSAndrew Rist  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*63bba73cSAndrew Rist  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19*63bba73cSAndrew Rist  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir #include "XMLChangedRegionImportContext.hxx"
27cdf0e10cSrcweir #include "XMLChangeElementImportContext.hxx"
28cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h>
29cdf0e10cSrcweir #include <com/sun/star/util/DateTime.hpp>
30cdf0e10cSrcweir #include <com/sun/star/text/XTextCursor.hpp>
31cdf0e10cSrcweir #include <xmloff/xmlimp.hxx>
32cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
33cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
34cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
35cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir 
38cdf0e10cSrcweir using namespace ::xmloff::token;
39cdf0e10cSrcweir 
40cdf0e10cSrcweir using ::rtl::OUString;
41cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
42cdf0e10cSrcweir using ::com::sun::star::text::XTextCursor;
43cdf0e10cSrcweir using ::com::sun::star::util::DateTime;
44cdf0e10cSrcweir using ::com::sun::star::xml::sax::XAttributeList;
45cdf0e10cSrcweir 
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 
48cdf0e10cSrcweir TYPEINIT1(XMLChangedRegionImportContext, SvXMLImportContext);
49cdf0e10cSrcweir 
XMLChangedRegionImportContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName)50cdf0e10cSrcweir XMLChangedRegionImportContext::XMLChangedRegionImportContext(
51cdf0e10cSrcweir 	SvXMLImport& rImport,
52cdf0e10cSrcweir 	sal_uInt16 nPrefix,
53cdf0e10cSrcweir 	const OUString& rLocalName) :
54cdf0e10cSrcweir         SvXMLImportContext(rImport, nPrefix, rLocalName),
55cdf0e10cSrcweir         bMergeLastPara(sal_True)
56cdf0e10cSrcweir {
57cdf0e10cSrcweir }
58cdf0e10cSrcweir 
~XMLChangedRegionImportContext()59cdf0e10cSrcweir XMLChangedRegionImportContext::~XMLChangedRegionImportContext()
60cdf0e10cSrcweir {
61cdf0e10cSrcweir }
62cdf0e10cSrcweir 
StartElement(const Reference<XAttributeList> & xAttrList)63cdf0e10cSrcweir void XMLChangedRegionImportContext::StartElement(
64cdf0e10cSrcweir 	const Reference<XAttributeList> & xAttrList)
65cdf0e10cSrcweir {
66cdf0e10cSrcweir 	// process attributes: id
67cdf0e10cSrcweir     bool bHaveXmlId( false );
68cdf0e10cSrcweir 	sal_Int16 nLength = xAttrList->getLength();
69cdf0e10cSrcweir 	for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
70cdf0e10cSrcweir 	{
71cdf0e10cSrcweir 		OUString sLocalName;
72cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
73cdf0e10cSrcweir 			GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
74cdf0e10cSrcweir 							  &sLocalName );
75cdf0e10cSrcweir 
76cdf0e10cSrcweir         const OUString sValue = xAttrList->getValueByIndex(nAttr);
77cdf0e10cSrcweir         if (XML_NAMESPACE_XML == nPrefix)
78cdf0e10cSrcweir         {
79cdf0e10cSrcweir             if (IsXMLToken(sLocalName, XML_ID))
80cdf0e10cSrcweir             {
81cdf0e10cSrcweir                 sID = sValue;
82cdf0e10cSrcweir                 bHaveXmlId = true;
83cdf0e10cSrcweir             }
84cdf0e10cSrcweir         }
85cdf0e10cSrcweir         else if (XML_NAMESPACE_TEXT == nPrefix)
86cdf0e10cSrcweir         {
87cdf0e10cSrcweir             if (IsXMLToken(sLocalName, XML_ID))
88cdf0e10cSrcweir             {
89cdf0e10cSrcweir                 if (!bHaveXmlId) { sID = sValue; }
90cdf0e10cSrcweir             }
91cdf0e10cSrcweir             else if( IsXMLToken( sLocalName, XML_MERGE_LAST_PARAGRAPH ) )
92cdf0e10cSrcweir             {
93cdf0e10cSrcweir                 sal_Bool bTmp;
94cdf0e10cSrcweir                 if( SvXMLUnitConverter::convertBool(bTmp, sValue) )
95cdf0e10cSrcweir                 {
96cdf0e10cSrcweir                     bMergeLastPara = bTmp;
97cdf0e10cSrcweir                 }
98cdf0e10cSrcweir             }
99cdf0e10cSrcweir         }
100cdf0e10cSrcweir 	}
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)103cdf0e10cSrcweir SvXMLImportContext* XMLChangedRegionImportContext::CreateChildContext(
104cdf0e10cSrcweir 	sal_uInt16 nPrefix,
105cdf0e10cSrcweir 	const OUString& rLocalName,
106cdf0e10cSrcweir 	const Reference<XAttributeList> & xAttrList)
107cdf0e10cSrcweir {
108cdf0e10cSrcweir 	SvXMLImportContext* pContext = NULL;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 	if (XML_NAMESPACE_TEXT == nPrefix)
111cdf0e10cSrcweir 	{
112cdf0e10cSrcweir 		if ( IsXMLToken( rLocalName, XML_INSERTION ) ||
113cdf0e10cSrcweir              IsXMLToken( rLocalName, XML_DELETION ) ||
114cdf0e10cSrcweir              IsXMLToken( rLocalName, XML_FORMAT_CHANGE ) )
115cdf0e10cSrcweir 		{
116cdf0e10cSrcweir 			// create XMLChangeElementImportContext for all kinds of changes
117cdf0e10cSrcweir 			pContext = new XMLChangeElementImportContext(
118cdf0e10cSrcweir 			   GetImport(), nPrefix, rLocalName,
119cdf0e10cSrcweir 			   IsXMLToken( rLocalName, XML_DELETION ),
120cdf0e10cSrcweir 			   *this);
121cdf0e10cSrcweir 		}
122cdf0e10cSrcweir 		// else: it may be a text element, see below
123cdf0e10cSrcweir 	}
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 	if (NULL == pContext)
126cdf0e10cSrcweir 	{
127cdf0e10cSrcweir 		pContext = SvXMLImportContext::CreateChildContext(nPrefix, rLocalName,
128cdf0e10cSrcweir 														  xAttrList);
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 		// was it a text element? If not, use default!
131cdf0e10cSrcweir 		if (NULL == pContext)
132cdf0e10cSrcweir 		{
133cdf0e10cSrcweir 			pContext = SvXMLImportContext::CreateChildContext(
134cdf0e10cSrcweir 				nPrefix, rLocalName, xAttrList);
135cdf0e10cSrcweir 		}
136cdf0e10cSrcweir 	}
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 	return pContext;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
EndElement()141cdf0e10cSrcweir void XMLChangedRegionImportContext::EndElement()
142cdf0e10cSrcweir {
143cdf0e10cSrcweir 	// restore old XCursor (if necessary)
144cdf0e10cSrcweir 	if (xOldCursor.is())
145cdf0e10cSrcweir 	{
146cdf0e10cSrcweir 		// delete last paragraph
147cdf0e10cSrcweir 		// (one extra paragraph was inserted in the beginning)
148cdf0e10cSrcweir 		UniReference<XMLTextImportHelper> rHelper =
149cdf0e10cSrcweir 			GetImport().GetTextImport();
150cdf0e10cSrcweir 		rHelper->DeleteParagraph();
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 		GetImport().GetTextImport()->SetCursor(xOldCursor);
153cdf0e10cSrcweir 		xOldCursor = NULL;
154cdf0e10cSrcweir 	}
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
SetChangeInfo(const OUString & rType,const OUString & rAuthor,const OUString & rComment,const OUString & rDate)157cdf0e10cSrcweir void XMLChangedRegionImportContext::SetChangeInfo(
158cdf0e10cSrcweir 	const OUString& rType,
159cdf0e10cSrcweir 	const OUString& rAuthor,
160cdf0e10cSrcweir 	const OUString& rComment,
161cdf0e10cSrcweir 	const OUString& rDate)
162cdf0e10cSrcweir {
163cdf0e10cSrcweir 	DateTime aDateTime;
164cdf0e10cSrcweir 	if (SvXMLUnitConverter::convertDateTime(aDateTime, rDate))
165cdf0e10cSrcweir 	{
166cdf0e10cSrcweir 		GetImport().GetTextImport()->RedlineAdd(
167cdf0e10cSrcweir 			rType, sID, rAuthor, rComment, aDateTime, bMergeLastPara);
168cdf0e10cSrcweir 	}
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
UseRedlineText()171cdf0e10cSrcweir void XMLChangedRegionImportContext::UseRedlineText()
172cdf0e10cSrcweir {
173cdf0e10cSrcweir 	// if we haven't already installed the redline cursor, do it now
174cdf0e10cSrcweir 	if (! xOldCursor.is())
175cdf0e10cSrcweir 	{
176cdf0e10cSrcweir 		// get TextImportHelper and old Cursor
177cdf0e10cSrcweir 		UniReference<XMLTextImportHelper> rHelper(GetImport().GetTextImport());
178cdf0e10cSrcweir 		Reference<XTextCursor> xCursor( rHelper->GetCursor() );
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 		// create Redline and new Cursor
181cdf0e10cSrcweir 		Reference<XTextCursor> xNewCursor =
182cdf0e10cSrcweir 			rHelper->RedlineCreateText(xCursor, sID);
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 		if (xNewCursor.is())
185cdf0e10cSrcweir 		{
186cdf0e10cSrcweir 			// save old cursor and install new one
187cdf0e10cSrcweir 			xOldCursor = xCursor;
188cdf0e10cSrcweir 			rHelper->SetCursor( xNewCursor );
189cdf0e10cSrcweir 		}
190cdf0e10cSrcweir 		// else: leave as is
191cdf0e10cSrcweir 	}
192cdf0e10cSrcweir }
193