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
28 #include <comphelper/storagehelper.hxx>
29 #include <comphelper/processfactory.hxx>
30 #include <com/sun/star/embed/EmbedStates.hpp>
31 #include <com/sun/star/embed/XEmbedObjectCreator.hpp>
32 #include <com/sun/star/embed/XLinkCreator.hpp>
33 #include <com/sun/star/embed/XEmbeddedObject.hpp>
34 #include <com/sun/star/embed/XVisualObject.hpp>
35 #include <com/sun/star/embed/Aspects.hpp>
36 #include <com/sun/star/task/XInteractionHandler.hpp>
37 #include <rtl/ustrbuf.hxx>
38 #include <sot/clsids.hxx>
39 #include <com/sun/star/lang/XUnoTunnel.hpp>
40 #include <xmloff/prstylei.hxx>
41 #include <xmloff/maptype.hxx>
42 #include <xmloff/xmlprmap.hxx>
43 #include <xmloff/txtprmap.hxx>
44 #include <xmloff/i18nmap.hxx>
45 #include "unocrsr.hxx"
46 #include "TextCursorHelper.hxx"
47 #include "unoframe.hxx"
48 #include "doc.hxx"
49 #include "unocoll.hxx"
50 #include <fmtfsize.hxx>
51 #include <fmtanchr.hxx>
52 #include <fmtcntnt.hxx>
53 #include "xmlimp.hxx"
54 #include "xmltbli.hxx"
55 #include "xmltexti.hxx"
56 #include "XMLRedlineImportHelper.hxx"
57 #include <xmloff/XMLFilterServiceNames.h>
58 #include <SwAppletImpl.hxx>
59 #include <ndole.hxx>
60 #include <docsh.hxx>
61 #include <sfx2/docfile.hxx>
62 #include <switerator.hxx>
63
64 // for locking SolarMutex: svapp + mutex
65 #include <vcl/svapp.hxx>
66 #include <vos/mutex.hxx>
67
68 #include <toolkit/helper/vclunohelper.hxx>
69 #include <svtools/embedhlp.hxx>
70 #include <svl/urihelper.hxx>
71
72
73 using ::rtl::OUString;
74 using ::rtl::OUStringBuffer;
75 using namespace ::com::sun::star;
76 using namespace ::com::sun::star::uno;
77 using namespace ::com::sun::star::lang;
78 using namespace ::com::sun::star::text;
79 using namespace ::com::sun::star::frame;
80 using namespace ::com::sun::star::beans;
81 using namespace xml::sax;
82
83
84 struct XMLServiceMapEntry_Impl
85 {
86 const sal_Char *sFilterService;
87 sal_Int32 nFilterServiceLen;
88
89 sal_uInt32 n1;
90 sal_uInt16 n2, n3;
91 sal_uInt8 n4, n5, n6, n7, n8, n9, n10, n11;
92 };
93
94 #define SERVICE_MAP_ENTRY( app, s ) \
95 { XML_IMPORT_FILTER_##app, sizeof(XML_IMPORT_FILTER_##app)-1, \
96 SO3_##s##_CLASSID }
97
98 const XMLServiceMapEntry_Impl aServiceMap[] =
99 {
100 SERVICE_MAP_ENTRY( WRITER, SW ),
101 SERVICE_MAP_ENTRY( CALC, SC ),
102 SERVICE_MAP_ENTRY( DRAW, SDRAW ),
103 SERVICE_MAP_ENTRY( IMPRESS, SIMPRESS ),
104 SERVICE_MAP_ENTRY( CHART, SCH ),
105 SERVICE_MAP_ENTRY( MATH, SM ),
106 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
107 };
lcl_putHeightAndWidth(SfxItemSet & rItemSet,sal_Int32 nHeight,sal_Int32 nWidth,long * pTwipHeight=0,long * pTwipWidth=0)108 static void lcl_putHeightAndWidth ( SfxItemSet &rItemSet,
109 sal_Int32 nHeight, sal_Int32 nWidth,
110 long *pTwipHeight=0, long *pTwipWidth=0 )
111 {
112 if( nWidth > 0 && nHeight > 0 )
113 {
114 nWidth = MM100_TO_TWIP( nWidth );
115 if( nWidth < MINFLY )
116 nWidth = MINFLY;
117 nHeight = MM100_TO_TWIP( nHeight );
118 if( nHeight < MINFLY )
119 nHeight = MINFLY;
120 rItemSet.Put( SwFmtFrmSize( ATT_FIX_SIZE, nWidth, nHeight ) );
121 }
122
123 SwFmtAnchor aAnchor( FLY_AT_CHAR );
124 rItemSet.Put( aAnchor );
125
126 if( pTwipWidth )
127 *pTwipWidth = nWidth;
128 if( pTwipHeight )
129 *pTwipHeight = nHeight;
130 }
131
lcl_setObjectVisualArea(const uno::Reference<embed::XEmbeddedObject> & xObj,sal_Int64 nAspect,const Size & aVisSize,const MapUnit & aUnit)132 static void lcl_setObjectVisualArea( const uno::Reference< embed::XEmbeddedObject >& xObj,
133 sal_Int64 nAspect,
134 const Size& aVisSize,
135 const MapUnit& aUnit )
136 {
137 if( xObj.is() && nAspect != embed::Aspects::MSOLE_ICON )
138 {
139 // convert the visual area to the objects units
140 MapUnit aObjUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
141 Size aObjVisSize = OutputDevice::LogicToLogic( aVisSize, aUnit, aObjUnit );
142 awt::Size aSz;
143 aSz.Width = aObjVisSize.Width();
144 aSz.Height = aObjVisSize.Height();
145
146 try
147 {
148 xObj->setVisualAreaSize( nAspect, aSz );
149 }
150 catch( uno::Exception& )
151 {
152 OSL_ASSERT( "Couldn't set visual area of the object!\n" );
153 }
154 }
155 }
156
SwXMLTextImportHelper(const uno::Reference<XModel> & rModel,SvXMLImport & rImport,const uno::Reference<XPropertySet> & rInfoSet,sal_Bool bInsertM,sal_Bool bStylesOnlyM,sal_Bool _bProgress,sal_Bool bBlockM,sal_Bool bOrganizerM,sal_Bool)157 SwXMLTextImportHelper::SwXMLTextImportHelper(
158 const uno::Reference < XModel>& rModel,
159 SvXMLImport& rImport,
160 const uno::Reference<XPropertySet> & rInfoSet,
161 sal_Bool bInsertM, sal_Bool bStylesOnlyM, sal_Bool _bProgress,
162 sal_Bool bBlockM, sal_Bool bOrganizerM,
163 sal_Bool /*bPreserveRedlineMode*/ ) :
164 XMLTextImportHelper( rModel, rImport, bInsertM, bStylesOnlyM, _bProgress,
165 bBlockM, bOrganizerM ),
166 pRedlineHelper( NULL )
167 {
168 uno::Reference<XPropertySet> xDocPropSet( rModel, UNO_QUERY );
169 pRedlineHelper = new XMLRedlineImportHelper(
170 bInsertM || bBlockM, xDocPropSet, rInfoSet );
171 }
172
~SwXMLTextImportHelper()173 SwXMLTextImportHelper::~SwXMLTextImportHelper()
174 {
175 // #90463# the redline helper destructor sets properties on the document
176 // and may through an exception while doing so... catch this
177 try
178 {
179 delete pRedlineHelper;
180 }
181 catch ( const RuntimeException& )
182 {
183 // ignore
184 }
185 }
186
CreateTableChildContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList)187 SvXMLImportContext *SwXMLTextImportHelper::CreateTableChildContext(
188 SvXMLImport& rImport,
189 sal_uInt16 nPrefix, const OUString& rLocalName,
190 const uno::Reference< XAttributeList > & xAttrList )
191 {
192 return new SwXMLTableContext(
193 (SwXMLImport&)rImport, nPrefix, rLocalName, xAttrList );
194 }
195
IsInHeaderFooter() const196 sal_Bool SwXMLTextImportHelper::IsInHeaderFooter() const
197 {
198 uno::Reference<XUnoTunnel> xCrsrTunnel(
199 ((SwXMLTextImportHelper *)this)->GetCursor(), UNO_QUERY );
200 ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" );
201 OTextCursorHelper *pTxtCrsr = reinterpret_cast< OTextCursorHelper * >(
202 sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() )));
203 ASSERT( pTxtCrsr, "SwXTextCursor missing" );
204 SwDoc *pDoc = pTxtCrsr->GetDoc();
205
206 return pDoc && pDoc->IsInHeaderFooter( pTxtCrsr->GetPaM()->GetPoint()->nNode );
207 }
208
lcl_GetOLENode(const SwFrmFmt * pFrmFmt)209 SwOLENode *lcl_GetOLENode( const SwFrmFmt *pFrmFmt )
210 {
211 SwOLENode *pOLENd = 0;
212 if( pFrmFmt )
213 {
214 const SwFmtCntnt& rCntnt = pFrmFmt->GetCntnt();
215 const SwNodeIndex *pNdIdx = rCntnt.GetCntntIdx();
216 pOLENd = pNdIdx->GetNodes()[pNdIdx->GetIndex() + 1]->GetOLENode();
217 }
218 ASSERT( pOLENd, "Where is the OLE node" );
219 return pOLENd;
220 }
221
createAndInsertOLEObject(SvXMLImport & rImport,const OUString & rHRef,const OUString & rStyleName,const OUString & rTblName,sal_Int32 nWidth,sal_Int32 nHeight)222 uno::Reference< XPropertySet > SwXMLTextImportHelper::createAndInsertOLEObject(
223 SvXMLImport& rImport,
224 const OUString& rHRef,
225 const OUString& rStyleName,
226 const OUString& rTblName,
227 sal_Int32 nWidth, sal_Int32 nHeight )
228 {
229 // this method will modify the document directly -> lock SolarMutex
230 vos::OGuard aGuard(Application::GetSolarMutex());
231
232 uno::Reference < XPropertySet > xPropSet;
233
234 sal_Int32 nPos = rHRef.indexOf( ':' );
235 if( -1 == nPos )
236 return xPropSet;
237
238 OUString aObjName( rHRef.copy( nPos+1) );
239
240 if( !aObjName.getLength() )
241 return xPropSet;
242
243 uno::Reference<XUnoTunnel> xCrsrTunnel( GetCursor(), UNO_QUERY );
244 ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" );
245 OTextCursorHelper *pTxtCrsr = reinterpret_cast< OTextCursorHelper * >(
246 sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() )));
247 ASSERT( pTxtCrsr, "SwXTextCursor missing" );
248 SwDoc *pDoc = SwImport::GetDocFromXMLImport( rImport );
249
250 SfxItemSet aItemSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN,
251 RES_FRMATR_END );
252 Size aTwipSize( 0, 0 );
253 Rectangle aVisArea( 0, 0, nWidth, nHeight );
254 lcl_putHeightAndWidth( aItemSet, nHeight, nWidth,
255 &aTwipSize.Height(), &aTwipSize.Width() );
256
257 SwFrmFmt *pFrmFmt = 0;
258 SwOLENode *pOLENd = 0;
259 if( rHRef.copy( 0, nPos ).equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("vnd.sun.star.ServiceName") ) )
260 {
261 sal_Bool bInsert = sal_False;
262 SvGlobalName aClassName;
263 const XMLServiceMapEntry_Impl *pEntry = aServiceMap;
264 while( pEntry->sFilterService )
265 {
266 if( aObjName.equalsAsciiL( pEntry->sFilterService,
267 pEntry->nFilterServiceLen ) )
268 {
269 aClassName = SvGlobalName( pEntry->n1, pEntry->n2,
270 pEntry->n3, pEntry->n4,
271 pEntry->n5, pEntry->n6,
272 pEntry->n7, pEntry->n8,
273 pEntry->n9, pEntry->n10,
274 pEntry->n11 );
275 bInsert = sal_True;
276 break;
277 }
278 pEntry++;
279 }
280
281 if( bInsert )
282 {
283 uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
284 try
285 {
286 // create object with desired ClassId
287 sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
288 ::rtl::OUString aName = ::rtl::OUString::createFromAscii( "DummyName" );
289 uno::Sequence < sal_Int8 > aClass( aClassName.GetByteSequence() );
290 uno::Reference < embed::XEmbedObjectCreator > xFactory( ::comphelper::getProcessServiceFactory()->createInstance(
291 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.EmbeddedObjectCreator")) ), uno::UNO_QUERY );
292 uno::Reference < embed::XEmbeddedObject > xObj =
293 uno::Reference < embed::XEmbeddedObject >( xFactory->createInstanceInitNew(
294 aClass, ::rtl::OUString(), xStorage, aName,
295 uno::Sequence < beans::PropertyValue >() ), uno::UNO_QUERY );
296 if ( xObj.is() )
297 {
298 //TODO/LATER: is it enough to only set the VisAreaSize?
299 lcl_setObjectVisualArea( xObj, nAspect, aTwipSize, MAP_TWIP );
300 }
301
302 pFrmFmt = pDoc->Insert( *pTxtCrsr->GetPaM(),
303 ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ),
304 &aItemSet,
305 NULL,
306 NULL );
307 pOLENd = lcl_GetOLENode( pFrmFmt );
308 if( pOLENd )
309 aObjName = pOLENd->GetOLEObj().GetCurrentPersistName();
310 }
311 catch ( uno::Exception& )
312 {
313 }
314 }
315 }
316 else
317 {
318 // check whether an object with this name already exists in the document
319 String aName;
320 SwIterator<SwCntntNode,SwFmtColl> aIter( *pDoc->GetDfltGrfFmtColl() );
321 for( SwCntntNode* pNd = aIter.First(); pNd; pNd = aIter.Next() )
322 {
323 SwOLENode* pExistingOLENd = pNd->GetOLENode();
324 if( pExistingOLENd )
325 {
326 ::rtl::OUString aExistingName = pExistingOLENd->GetOLEObj().GetCurrentPersistName();
327 if ( aExistingName.equals( aObjName ) )
328 {
329 OSL_ENSURE( sal_False, "The document contains duplicate object references, means it is partially broken, please let developers know how this document was generated!\n" );
330
331 ::rtl::OUString aTmpName = pDoc->GetPersist()->GetEmbeddedObjectContainer().CreateUniqueObjectName();
332 try
333 {
334 pDoc->GetPersist()->GetStorage()->copyElementTo( aObjName,
335 pDoc->GetPersist()->GetStorage(),
336 aTmpName );
337 aName = aTmpName;
338 }
339 catch ( uno::Exception& )
340 {
341 OSL_ENSURE( sal_False, "Couldn't create a copy of the object!\n" );
342 }
343
344 break;
345 }
346 }
347 }
348
349 if ( !aName.Len() )
350 aName = aObjName;
351
352 // the correct aspect will be set later
353 // TODO/LATER: Actually it should be set here
354 if( pTxtCrsr )
355 {
356 pFrmFmt = pDoc->InsertOLE( *pTxtCrsr->GetPaM(), aName, embed::Aspects::MSOLE_CONTENT, &aItemSet, NULL, NULL );
357 pOLENd = lcl_GetOLENode( pFrmFmt );
358 }
359 aObjName = aName;
360 }
361
362 if( !pFrmFmt )
363 return xPropSet;
364
365 if( IsInsertMode() )
366 {
367 if( !pOLENd )
368 pOLENd = lcl_GetOLENode( pFrmFmt );
369 if( pOLENd )
370 pOLENd->SetOLESizeInvalid( sal_True );
371 }
372
373 SwXFrame *pXFrame = SwXFrames::GetObject( *pFrmFmt, FLYCNTTYPE_OLE );
374 xPropSet = pXFrame;
375 if( pDoc->GetDrawModel() )
376 SwXFrame::GetOrCreateSdrObject(
377 static_cast<SwFlyFrmFmt*>( pXFrame->GetFrmFmt() ) ); // req for z-order
378 if( rTblName.getLength() )
379 {
380 const SwFmtCntnt& rCntnt = pFrmFmt->GetCntnt();
381 const SwNodeIndex *pNdIdx = rCntnt.GetCntntIdx();
382 SwOLENode *pOLENode = pNdIdx->GetNodes()[pNdIdx->GetIndex() + 1]->GetOLENode();
383 ASSERT( pOLENode, "Where is the OLE node" );
384
385 OUStringBuffer aBuffer( rTblName.getLength() );
386 sal_Bool bQuoted = sal_False;
387 sal_Bool bEscape = sal_False;
388 sal_Bool bError = sal_False;
389 for( sal_Int32 i=0; i < rTblName.getLength(); i++ )
390 {
391 sal_Bool bEndOfNameFound = sal_False;
392 sal_Unicode c = rTblName[i];
393 switch( c )
394 {
395 case '\'':
396 if( bEscape )
397 {
398 aBuffer.append( c );
399 bEscape = sal_False;
400 }
401 else if( bQuoted )
402 {
403 bEndOfNameFound = sal_True;
404 }
405 else if( 0 == i )
406 {
407 bQuoted = sal_True;
408 }
409 else
410 {
411 bError = sal_True;
412 }
413 break;
414 case '\\':
415 if( bEscape )
416 {
417 aBuffer.append( c );
418 bEscape = sal_False;
419 }
420 else
421 {
422 bEscape = sal_True;
423 }
424 break;
425 case ' ':
426 case '.':
427 if( !bQuoted )
428 {
429 bEndOfNameFound = sal_True;
430 }
431 else
432 {
433 aBuffer.append( c );
434 bEscape = sal_False;
435 }
436 break;
437 default:
438 {
439 aBuffer.append( c );
440 bEscape = sal_False;
441 }
442 break;
443 }
444 if( bError || bEndOfNameFound )
445 break;
446 }
447 if( !bError )
448 {
449 OUString sTblName( aBuffer.makeStringAndClear() );
450 pOLENode->SetChartTblName( GetRenameMap().Get( XML_TEXT_RENAME_TYPE_TABLE, sTblName ) );
451 }
452 }
453
454 sal_Int64 nDrawAspect = 0;
455 const XMLPropStyleContext *pStyle = 0;
456 sal_Bool bHasSizeProps = sal_False;
457 if( rStyleName.getLength() )
458 {
459 pStyle = FindAutoFrameStyle( rStyleName );
460 if( pStyle )
461 {
462 UniReference < SvXMLImportPropertyMapper > xImpPrMap =
463 pStyle->GetStyles()
464 ->GetImportPropertyMapper(pStyle->GetFamily());
465 ASSERT( xImpPrMap.is(), "Where is the import prop mapper?" );
466 if( xImpPrMap.is() )
467 {
468 UniReference<XMLPropertySetMapper> rPropMapper =
469 xImpPrMap->getPropertySetMapper();
470
471 sal_Int32 nCount = pStyle->GetProperties().size();
472 for( sal_Int32 i=0; i < nCount; i++ )
473 {
474 const XMLPropertyState& rProp = pStyle->GetProperties()[i];
475 sal_Int32 nIdx = rProp.mnIndex;
476 if( -1 == nIdx )
477 continue;
478
479 switch( rPropMapper->GetEntryContextId(nIdx) )
480 {
481 case CTF_OLE_VIS_AREA_LEFT:
482 {
483 sal_Int32 nVal = 0;
484 rProp.maValue >>= nVal;
485 aVisArea.setX( nVal );
486 }
487 break;
488 case CTF_OLE_VIS_AREA_TOP:
489 {
490 sal_Int32 nVal = 0;
491 rProp.maValue >>= nVal;
492 aVisArea.setY( nVal );
493 }
494 break;
495 case CTF_OLE_VIS_AREA_WIDTH:
496 {
497 sal_Int32 nVal = 0;
498 rProp.maValue >>= nVal;
499 aVisArea.setWidth( nVal );
500 bHasSizeProps = sal_True;
501 }
502 break;
503 case CTF_OLE_VIS_AREA_HEIGHT:
504 {
505 sal_Int32 nVal = 0;
506 rProp.maValue >>= nVal;
507 aVisArea.setHeight( nVal );
508 bHasSizeProps = sal_True;
509 }
510 break;
511 case CTF_OLE_DRAW_ASPECT:
512 {
513 rProp.maValue >>= nDrawAspect;
514
515 if ( !nDrawAspect )
516 nDrawAspect = embed::Aspects::MSOLE_CONTENT;
517
518 if ( pOLENd )
519 pOLENd->GetOLEObj().GetObject().SetViewAspect( nDrawAspect );
520 }
521 break;
522 }
523 }
524 }
525 }
526 }
527
528 if ( bHasSizeProps )
529 {
530 uno::Reference < embed::XEmbeddedObject > xObj =
531 pDoc->GetPersist()->GetEmbeddedObjectContainer().GetEmbeddedObject( aObjName );
532 if( xObj.is() )
533 lcl_setObjectVisualArea( xObj, ( nDrawAspect ? nDrawAspect : embed::Aspects::MSOLE_CONTENT ),
534 aVisArea.GetSize(), MAP_100TH_MM );
535 }
536
537 return xPropSet;
538 }
539
createAndInsertOOoLink(SvXMLImport & rImport,const OUString & rHRef,const OUString &,const OUString &,sal_Int32 nWidth,sal_Int32 nHeight)540 uno::Reference< XPropertySet > SwXMLTextImportHelper::createAndInsertOOoLink(
541 SvXMLImport& rImport,
542 const OUString& rHRef,
543 const OUString& /*rStyleName*/,
544 const OUString& /*rTblName*/,
545 sal_Int32 nWidth, sal_Int32 nHeight )
546 {
547 // this method will modify the document directly -> lock SolarMutex
548 vos::OGuard aGuard(Application::GetSolarMutex());
549
550 uno::Reference < XPropertySet > xPropSet;
551
552 uno::Reference<XUnoTunnel> xCrsrTunnel( GetCursor(), UNO_QUERY );
553 ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" );
554 OTextCursorHelper *pTxtCrsr = reinterpret_cast< OTextCursorHelper * >(
555 sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() )));
556 ASSERT( pTxtCrsr, "SwXTextCursor missing" );
557 SwDoc *pDoc = SwImport::GetDocFromXMLImport( rImport );
558
559 SfxItemSet aItemSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN,
560 RES_FRMATR_END );
561 Size aTwipSize( 0, 0 );
562 Rectangle aVisArea( 0, 0, nWidth, nHeight );
563 lcl_putHeightAndWidth( aItemSet, nHeight, nWidth,
564 &aTwipSize.Height(), &aTwipSize.Width() );
565
566 // We'll need a (valid) URL. If we don't have do not insert the link and return early.
567 // Copy URL into URL oject on the way.
568 INetURLObject aURLObj;
569 bool bValidURL = rHRef.getLength() != 0 &&
570 aURLObj.SetURL( URIHelper::SmartRel2Abs(
571 INetURLObject( GetXMLImport().GetBaseURL() ), rHRef ) );
572 if( !bValidURL )
573 return xPropSet;
574
575 uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
576 try
577 {
578 // create object with desired ClassId
579 ::rtl::OUString aName = ::rtl::OUString::createFromAscii( "DummyName" );
580 uno::Reference < embed::XLinkCreator > xFactory( ::comphelper::getProcessServiceFactory()->createInstance(
581 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.OOoEmbeddedObjectFactory")) ),
582 uno::UNO_QUERY_THROW );
583
584 uno::Sequence< beans::PropertyValue > aMediaDescriptor( 1 );
585 aMediaDescriptor[0].Name = ::rtl::OUString::createFromAscii( "URL" );
586 aMediaDescriptor[0].Value <<= ::rtl::OUString( aURLObj.GetMainURL( INetURLObject::NO_DECODE ) );
587 if ( pDoc && pDoc->GetDocShell() && pDoc->GetDocShell()->GetMedium() )
588 {
589 uno::Reference< task::XInteractionHandler > xInteraction =
590 pDoc->GetDocShell()->GetMedium()->GetInteractionHandler();
591 if ( xInteraction.is() )
592 {
593 aMediaDescriptor.realloc( 2 );
594 aMediaDescriptor[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ) );
595 aMediaDescriptor[1].Value <<= xInteraction;
596 }
597 }
598
599 uno::Reference < embed::XEmbeddedObject > xObj(
600 xFactory->createInstanceLink(
601 xStorage, aName, aMediaDescriptor, uno::Sequence< beans::PropertyValue >() ),
602 uno::UNO_QUERY_THROW );
603
604 {
605 SwFrmFmt *pFrmFmt = pDoc->Insert( *pTxtCrsr->GetPaM(),
606 ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ),
607 &aItemSet,
608 NULL,
609 NULL );
610
611 // TODO/LATER: in future may need a way to set replacement image url to the link ( may be even to the object ), needs oasis cws???
612
613 SwXFrame *pXFrame = SwXFrames::GetObject( *pFrmFmt, FLYCNTTYPE_OLE );
614 xPropSet = pXFrame;
615 if( pDoc->GetDrawModel() )
616 SwXFrame::GetOrCreateSdrObject(
617 static_cast<SwFlyFrmFmt*>( pXFrame->GetFrmFmt() ) ); // req for z-order
618 }
619 }
620 catch ( uno::Exception& )
621 {
622 }
623
624 // TODO/LATER: should the rStyleName and rTblName be handled as for usual embedded object?
625
626 return xPropSet;
627 }
628
createAndInsertApplet(const OUString & rName,const OUString & rCode,sal_Bool bMayScript,const OUString & rHRef,sal_Int32 nWidth,sal_Int32 nHeight)629 uno::Reference< XPropertySet > SwXMLTextImportHelper::createAndInsertApplet(
630 const OUString &rName,
631 const OUString &rCode,
632 sal_Bool bMayScript,
633 const OUString& rHRef,
634 sal_Int32 nWidth, sal_Int32 nHeight )
635 {
636 // this method will modify the document directly -> lock SolarMutex
637 vos::OGuard aGuard(Application::GetSolarMutex());
638
639 uno::Reference < XPropertySet > xPropSet;
640 uno::Reference<XUnoTunnel> xCrsrTunnel( GetCursor(), UNO_QUERY );
641 ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" );
642 OTextCursorHelper *pTxtCrsr = reinterpret_cast< OTextCursorHelper * >(
643 sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() )));
644 ASSERT( pTxtCrsr, "SwXTextCursor missing" );
645 SwDoc *pDoc = pTxtCrsr->GetDoc();
646
647 SfxItemSet aItemSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN,
648 RES_FRMATR_END );
649 lcl_putHeightAndWidth( aItemSet, nHeight, nWidth);
650
651 SwApplet_Impl aAppletImpl ( aItemSet );
652
653 String sCodeBase;
654 if( rHRef.getLength() )
655 sCodeBase = GetXMLImport().GetAbsoluteReference( rHRef );
656
657 aAppletImpl.CreateApplet ( rCode, rName, bMayScript, sCodeBase, GetXMLImport().GetDocumentBase() );
658
659 // set the size of the applet
660 lcl_setObjectVisualArea( aAppletImpl.GetApplet(),
661 embed::Aspects::MSOLE_CONTENT,
662 Size( nWidth, nHeight ),
663 MAP_100TH_MM );
664
665 SwFrmFmt *pFrmFmt = pDoc->Insert( *pTxtCrsr->GetPaM(),
666 ::svt::EmbeddedObjectRef( aAppletImpl.GetApplet(), embed::Aspects::MSOLE_CONTENT ),
667 &aAppletImpl.GetItemSet(),
668 NULL,
669 NULL);
670 SwXFrame *pXFrame = SwXFrames::GetObject( *pFrmFmt, FLYCNTTYPE_OLE );
671 xPropSet = pXFrame;
672 if( pDoc->GetDrawModel() )
673 SwXFrame::GetOrCreateSdrObject(
674 static_cast<SwFlyFrmFmt*>( pXFrame->GetFrmFmt() ) ); // req for z-order
675
676 return xPropSet;
677 }
678
createAndInsertPlugin(const OUString & rMimeType,const OUString & rHRef,sal_Int32 nWidth,sal_Int32 nHeight)679 uno::Reference< XPropertySet > SwXMLTextImportHelper::createAndInsertPlugin(
680 const OUString &rMimeType,
681 const OUString& rHRef,
682 sal_Int32 nWidth, sal_Int32 nHeight )
683 {
684 uno::Reference < XPropertySet > xPropSet;
685 uno::Reference<XUnoTunnel> xCrsrTunnel( GetCursor(), UNO_QUERY );
686 ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" );
687 OTextCursorHelper *pTxtCrsr = reinterpret_cast< OTextCursorHelper * >(
688 sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() )));
689 ASSERT( pTxtCrsr, "SwXTextCursor missing" );
690 SwDoc *pDoc = pTxtCrsr->GetDoc();
691
692 SfxItemSet aItemSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN,
693 RES_FRMATR_END );
694 lcl_putHeightAndWidth( aItemSet, nHeight, nWidth);
695
696 // We'll need a (valid) URL, or we need a MIME type. If we don't have
697 // either, do not insert plugin and return early. Copy URL into URL oject
698 // on the way.
699 INetURLObject aURLObj;
700
701 bool bValidURL = rHRef.getLength() != 0 &&
702 aURLObj.SetURL( URIHelper::SmartRel2Abs( INetURLObject( GetXMLImport().GetBaseURL() ), rHRef ) );
703 bool bValidMimeType = rMimeType.getLength() != 0;
704 if( !bValidURL && !bValidMimeType )
705 return xPropSet;
706
707 uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
708 try
709 {
710 // create object with desired ClassId
711 ::rtl::OUString aName = ::rtl::OUString::createFromAscii( "DummyName" );
712 uno::Sequence < sal_Int8 > aClass( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence() );
713 uno::Reference < embed::XEmbedObjectCreator > xFactory( ::comphelper::getProcessServiceFactory()->createInstance(
714 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.EmbeddedObjectCreator")) ), uno::UNO_QUERY );
715 uno::Reference < embed::XEmbeddedObject > xObj =
716 uno::Reference < embed::XEmbeddedObject >( xFactory->createInstanceInitNew(
717 aClass, ::rtl::OUString(), xStorage, aName,
718 uno::Sequence < beans::PropertyValue >() ), uno::UNO_QUERY );
719
720 // set size to the object
721 lcl_setObjectVisualArea( xObj,
722 embed::Aspects::MSOLE_CONTENT,
723 Size( nWidth, nHeight ),
724 MAP_100TH_MM );
725
726 if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
727 {
728 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
729 if ( xSet.is() )
730 {
731 if( bValidURL )
732 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginURL"),
733 makeAny( ::rtl::OUString( aURLObj.GetMainURL( INetURLObject::NO_DECODE ) ) ) );
734 if( bValidMimeType )
735 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginMimeType"),
736 makeAny( ::rtl::OUString( rMimeType ) ) );
737 }
738
739 SwFrmFmt *pFrmFmt = pDoc->Insert( *pTxtCrsr->GetPaM(),
740 ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ),
741 &aItemSet,
742 NULL,
743 NULL);
744 SwXFrame *pXFrame = SwXFrames::GetObject( *pFrmFmt, FLYCNTTYPE_OLE );
745 xPropSet = pXFrame;
746 if( pDoc->GetDrawModel() )
747 SwXFrame::GetOrCreateSdrObject(
748 static_cast<SwFlyFrmFmt*>( pXFrame->GetFrmFmt() ) ); // req for z-order
749 }
750 }
751 catch ( uno::Exception& )
752 {
753 }
754
755 return xPropSet;
756 }
createAndInsertFloatingFrame(const OUString & rName,const OUString & rHRef,const OUString & rStyleName,sal_Int32 nWidth,sal_Int32 nHeight)757 uno::Reference< XPropertySet > SwXMLTextImportHelper::createAndInsertFloatingFrame(
758 const OUString& rName,
759 const OUString& rHRef,
760 const OUString& rStyleName,
761 sal_Int32 nWidth, sal_Int32 nHeight )
762 {
763 // this method will modify the document directly -> lock SolarMutex
764 vos::OGuard aGuard(Application::GetSolarMutex());
765
766 uno::Reference < XPropertySet > xPropSet;
767 uno::Reference<XUnoTunnel> xCrsrTunnel( GetCursor(), UNO_QUERY );
768 ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" );
769 OTextCursorHelper *pTxtCrsr = reinterpret_cast< OTextCursorHelper * >(
770 sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() )));
771 ASSERT( pTxtCrsr, "SwXTextCursor missing" );
772 SwDoc *pDoc = pTxtCrsr->GetDoc();
773
774 SfxItemSet aItemSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN,
775 RES_FRMATR_END );
776 lcl_putHeightAndWidth( aItemSet, nHeight, nWidth);
777
778 ScrollingMode eScrollMode = ScrollingAuto;
779 sal_Bool bHasBorder = sal_False;
780 sal_Bool bIsBorderSet = sal_False;
781 Size aMargin( SIZE_NOT_SET, SIZE_NOT_SET );
782 const XMLPropStyleContext *pStyle = 0;
783 if( rStyleName.getLength() )
784 {
785 pStyle = FindAutoFrameStyle( rStyleName );
786 if( pStyle )
787 {
788 UniReference < SvXMLImportPropertyMapper > xImpPrMap =
789 pStyle->GetStyles()
790 ->GetImportPropertyMapper(pStyle->GetFamily());
791 ASSERT( xImpPrMap.is(), "Where is the import prop mapper?" );
792 if( xImpPrMap.is() )
793 {
794 UniReference<XMLPropertySetMapper> rPropMapper =
795 xImpPrMap->getPropertySetMapper();
796
797 sal_Int32 nCount = pStyle->GetProperties().size();
798 for( sal_Int32 i=0; i < nCount; i++ )
799 {
800 const XMLPropertyState& rProp = pStyle->GetProperties()[i];
801 sal_Int32 nIdx = rProp.mnIndex;
802 if( -1 == nIdx )
803 continue;
804
805 switch( rPropMapper->GetEntryContextId(nIdx) )
806 {
807 case CTF_FRAME_DISPLAY_SCROLLBAR:
808 {
809 sal_Bool bYes = *(sal_Bool *)rProp.maValue.getValue();
810 eScrollMode = bYes ? ScrollingYes : ScrollingNo;
811 }
812 break;
813 case CTF_FRAME_DISPLAY_BORDER:
814 {
815 bHasBorder = *(sal_Bool *)rProp.maValue.getValue();
816 bIsBorderSet = sal_True;
817 }
818 break;
819 case CTF_FRAME_MARGIN_HORI:
820 {
821 sal_Int32 nVal = SIZE_NOT_SET;
822 rProp.maValue >>= nVal;
823 aMargin.Width() = nVal;
824 }
825 break;
826 case CTF_FRAME_MARGIN_VERT:
827 {
828 sal_Int32 nVal = SIZE_NOT_SET;
829 rProp.maValue >>= nVal;
830 aMargin.Height() = nVal;
831 }
832 break;
833 }
834 }
835 }
836 }
837 }
838
839 uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
840 try
841 {
842 // create object with desired ClassId
843 ::rtl::OUString aName = ::rtl::OUString::createFromAscii( "DummyName" );
844 uno::Sequence < sal_Int8 > aClass( SvGlobalName( SO3_IFRAME_CLASSID ).GetByteSequence() );
845 uno::Reference < embed::XEmbedObjectCreator > xFactory( ::comphelper::getProcessServiceFactory()->createInstance(
846 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.EmbeddedObjectCreator")) ), uno::UNO_QUERY );
847 uno::Reference < embed::XEmbeddedObject > xObj =
848 uno::Reference < embed::XEmbeddedObject >( xFactory->createInstanceInitNew(
849 aClass, ::rtl::OUString(), xStorage, aName,
850 uno::Sequence < beans::PropertyValue >() ), uno::UNO_QUERY );
851
852 // set size to the object
853 lcl_setObjectVisualArea( xObj,
854 embed::Aspects::MSOLE_CONTENT,
855 Size( nWidth, nHeight ),
856 MAP_100TH_MM );
857
858 if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
859 {
860 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
861 if ( xSet.is() )
862 {
863 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameURL"),
864 makeAny( ::rtl::OUString( URIHelper::SmartRel2Abs(
865 INetURLObject( GetXMLImport().GetBaseURL() ), rHRef ) ) ) );
866
867 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameName"),
868 makeAny( ::rtl::OUString( rName ) ) );
869
870 if ( eScrollMode == ScrollingAuto )
871 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoScroll"),
872 makeAny( sal_True ) );
873 else
874 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsScrollingMode"),
875 makeAny( (sal_Bool) (eScrollMode == ScrollingYes) ) );
876
877 if ( bIsBorderSet )
878 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsBorder"),
879 makeAny( bHasBorder ) );
880 else
881 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoBorder"),
882 makeAny( sal_True ) );
883
884 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginWidth"),
885 makeAny( sal_Int32( aMargin.Width() ) ) );
886
887 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginHeight"),
888 makeAny( sal_Int32( aMargin.Height() ) ) );
889 }
890
891 SwFrmFmt *pFrmFmt = pDoc->Insert( *pTxtCrsr->GetPaM(),
892 ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ),
893 &aItemSet,
894 NULL,
895 NULL);
896 SwXFrame *pXFrame = SwXFrames::GetObject( *pFrmFmt, FLYCNTTYPE_OLE );
897 xPropSet = pXFrame;
898 if( pDoc->GetDrawModel() )
899 SwXFrame::GetOrCreateSdrObject(
900 static_cast<SwFlyFrmFmt*>( pXFrame->GetFrmFmt() ) ); // req for z-order
901 }
902 }
903 catch ( uno::Exception& )
904 {
905 }
906
907 return xPropSet;
908 }
909
endAppletOrPlugin(const uno::Reference<XPropertySet> & rPropSet,::std::map<const::rtl::OUString,::rtl::OUString,::comphelper::UStringLess> & rParamMap)910 void SwXMLTextImportHelper::endAppletOrPlugin(
911 const uno::Reference < XPropertySet > &rPropSet,
912 ::std::map < const ::rtl::OUString, ::rtl::OUString, ::comphelper::UStringLess > &rParamMap)
913 {
914 // this method will modify the document directly -> lock SolarMutex
915 vos::OGuard aGuard(Application::GetSolarMutex());
916
917 uno::Reference<XUnoTunnel> xCrsrTunnel( rPropSet, UNO_QUERY );
918 ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for embedded" );
919 SwXFrame *pFrame = reinterpret_cast< SwXFrame * >(
920 sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( SwXFrame::getUnoTunnelId() )));
921 ASSERT( pFrame, "SwXFrame missing" );
922 SwFrmFmt *pFrmFmt = pFrame->GetFrmFmt();
923 const SwFmtCntnt& rCntnt = pFrmFmt->GetCntnt();
924 const SwNodeIndex *pNdIdx = rCntnt.GetCntntIdx();
925 SwOLENode *pOLENd = pNdIdx->GetNodes()[pNdIdx->GetIndex() + 1]->GetNoTxtNode()->GetOLENode();
926 SwOLEObj& rOLEObj = pOLENd->GetOLEObj();
927
928 uno::Reference < embed::XEmbeddedObject > xEmbObj( rOLEObj.GetOleRef() );
929 if ( svt::EmbeddedObjectRef::TryRunningState( xEmbObj ) )
930 {
931 uno::Reference < beans::XPropertySet > xSet( xEmbObj->getComponent(), uno::UNO_QUERY );
932 if ( xSet.is() )
933 {
934 const sal_Int32 nCount = rParamMap.size();
935 uno::Sequence< beans::PropertyValue > aCommandSequence( nCount );
936
937 ::std::map < const ::rtl::OUString, ::rtl::OUString, ::comphelper::UStringLess > ::iterator aIter = rParamMap.begin();
938 ::std::map < const ::rtl::OUString, ::rtl::OUString, ::comphelper::UStringLess > ::iterator aEnd = rParamMap.end();
939 sal_Int32 nIndex=0;
940 while (aIter != aEnd )
941 {
942 aCommandSequence[nIndex].Name = (*aIter).first;
943 aCommandSequence[nIndex].Handle = -1;
944 aCommandSequence[nIndex].Value = makeAny( OUString((*aIter).second) );
945 aCommandSequence[nIndex].State = beans::PropertyState_DIRECT_VALUE;
946 aIter++, nIndex++;
947 }
948
949 // unfortunately the names of the properties are depending on the object
950 ::rtl::OUString aParaName = ::rtl::OUString::createFromAscii("AppletCommands");
951 try
952 {
953 xSet->setPropertyValue( aParaName, makeAny( aCommandSequence ) );
954 }
955 catch ( uno::Exception& )
956 {
957 aParaName = ::rtl::OUString::createFromAscii("PluginCommands");
958 try
959 {
960 xSet->setPropertyValue( aParaName, makeAny( aCommandSequence ) );
961 }
962 catch ( uno::Exception& )
963 {
964 }
965 }
966 }
967 }
968 }
969
CreateTextImport()970 XMLTextImportHelper* SwXMLImport::CreateTextImport()
971 {
972 return new SwXMLTextImportHelper( GetModel(), *this, getImportInfo(),
973 IsInsertMode(),
974 IsStylesOnlyMode(), bShowProgress,
975 IsBlockMode(), IsOrganizerMode(),
976 bPreserveRedlineMode );
977 }
978
979
980 // redlining helper methods
981 // (override to provide the real implementation)
982
RedlineAdd(const OUString & rType,const OUString & rId,const OUString & rAuthor,const OUString & rComment,const util::DateTime & rDateTime,sal_Bool bMergeLastPara)983 void SwXMLTextImportHelper::RedlineAdd(
984 const OUString& rType,
985 const OUString& rId,
986 const OUString& rAuthor,
987 const OUString& rComment,
988 const util::DateTime& rDateTime,
989 sal_Bool bMergeLastPara)
990 {
991 // create redline helper on demand
992 DBG_ASSERT(NULL != pRedlineHelper, "helper should have been created in constructor");
993 if (NULL != pRedlineHelper)
994 pRedlineHelper->Add(rType, rId, rAuthor, rComment, rDateTime,
995 bMergeLastPara);
996 }
997
RedlineCreateText(uno::Reference<XTextCursor> & rOldCursor,const OUString & rId)998 uno::Reference<XTextCursor> SwXMLTextImportHelper::RedlineCreateText(
999 uno::Reference<XTextCursor> & rOldCursor,
1000 const OUString& rId)
1001 {
1002 uno::Reference<XTextCursor> xRet;
1003
1004 if (NULL != pRedlineHelper)
1005 {
1006 xRet = pRedlineHelper->CreateRedlineTextSection(rOldCursor, rId);
1007 }
1008
1009 return xRet;
1010 }
1011
RedlineSetCursor(const OUString & rId,sal_Bool bStart,sal_Bool bIsOutsideOfParagraph)1012 void SwXMLTextImportHelper::RedlineSetCursor(
1013 const OUString& rId,
1014 sal_Bool bStart,
1015 sal_Bool bIsOutsideOfParagraph)
1016 {
1017 if (NULL != pRedlineHelper) {
1018 uno::Reference<XTextRange> xTextRange( GetCursor()->getStart() );
1019 pRedlineHelper->SetCursor(rId, bStart, xTextRange,
1020 bIsOutsideOfParagraph);
1021 }
1022 // else: ignore redline (wasn't added before, else we'd have a helper)
1023 }
1024
RedlineAdjustStartNodeCursor(sal_Bool bStart)1025 void SwXMLTextImportHelper::RedlineAdjustStartNodeCursor(
1026 sal_Bool bStart)
1027 {
1028 OUString rId = GetOpenRedlineId();
1029 if ((NULL != pRedlineHelper) && (rId.getLength() > 0))
1030 {
1031 uno::Reference<XTextRange> xTextRange( GetCursor()->getStart() );
1032 pRedlineHelper->AdjustStartNodeCursor(rId, bStart, xTextRange );
1033 ResetOpenRedlineId();
1034 }
1035 // else: ignore redline (wasn't added before, or no open redline ID
1036 }
1037
SetShowChanges(sal_Bool bShowChanges)1038 void SwXMLTextImportHelper::SetShowChanges( sal_Bool bShowChanges )
1039 {
1040 if ( NULL != pRedlineHelper )
1041 pRedlineHelper->SetShowChanges( bShowChanges );
1042 }
1043
SetRecordChanges(sal_Bool bRecordChanges)1044 void SwXMLTextImportHelper::SetRecordChanges( sal_Bool bRecordChanges )
1045 {
1046 if ( NULL != pRedlineHelper )
1047 pRedlineHelper->SetRecordChanges( bRecordChanges );
1048 }
1049
SetChangesProtectionKey(const Sequence<sal_Int8> & rKey)1050 void SwXMLTextImportHelper::SetChangesProtectionKey(
1051 const Sequence<sal_Int8> & rKey )
1052 {
1053 if ( NULL != pRedlineHelper )
1054 pRedlineHelper->SetProtectionKey( rKey );
1055 }
1056
1057
1058
1059