xref: /aoo42x/main/sfx2/source/doc/objcont.cxx (revision d119d52d)
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_sfx2.hxx"
26 
27 #include <com/sun/star/uno/Reference.hxx>
28 
29 #include <com/sun/star/document/XDocumentProperties.hpp>
30 #include <com/sun/star/document/UpdateDocMode.hpp>
31 #include <com/sun/star/frame/XLayoutManager.hpp>
32 #include <com/sun/star/embed/ElementModes.hpp>
33 #include <com/sun/star/document/XStandaloneDocumentInfo.hpp>
34 #include <com/sun/star/beans/XFastPropertySet.hpp>
35 #include <tools/cachestr.hxx>
36 #include <vcl/msgbox.hxx>
37 #include <svl/style.hxx>
38 #include <vcl/wrkwin.hxx>
39 
40 #include <svl/stritem.hxx>
41 #include <svl/intitem.hxx>
42 #include <svl/rectitem.hxx>
43 #include <svl/eitem.hxx>
44 #include <svl/urihelper.hxx>
45 #include <svl/ctloptions.hxx>
46 #include <comphelper/storagehelper.hxx>
47 #include <comphelper/processfactory.hxx>
48 #include <unotools/securityoptions.hxx>
49 #include <svtools/sfxecode.hxx>
50 #include <svtools/ehdl.hxx>
51 #include <tools/datetime.hxx>
52 #include <math.h>
53 
54 #include <unotools/saveopt.hxx>
55 #include <unotools/useroptions.hxx>
56 #include <unotools/localfilehelper.hxx>
57 #include <vcl/virdev.hxx>
58 #include <vcl/oldprintadaptor.hxx>
59 
60 #include <sfx2/app.hxx>
61 #include "sfx2/sfxresid.hxx"
62 #include "appdata.hxx"
63 #include <sfx2/dinfdlg.hxx>
64 #include "fltfnc.hxx"
65 #include <sfx2/docfac.hxx>
66 #include <sfx2/viewsh.hxx>
67 #include <sfx2/objsh.hxx>
68 #include "objshimp.hxx"
69 #include <sfx2/evntconf.hxx>
70 #include "sfx2/sfxhelp.hxx"
71 #include <sfx2/dispatch.hxx>
72 #include <sfx2/printer.hxx>
73 #include "sfx2/basmgr.hxx"
74 #include <sfx2/viewfrm.hxx>
75 #include <sfx2/doctempl.hxx>
76 #include "doc.hrc"
77 #include <sfx2/sfxbasemodel.hxx>
78 #include <sfx2/docfile.hxx>
79 #include <sfx2/request.hxx>
80 #include "openflag.hxx"
81 #include "querytemplate.hxx"
82 
83 using namespace ::com::sun::star;
84 using namespace ::com::sun::star::uno;
85 
86 //====================================================================
87 
88 //====================================================================
89 
90 static
91 bool operator> (const util::DateTime& i_rLeft, const util::DateTime& i_rRight)
92 {
93     if ( i_rLeft.Year != i_rRight.Year )
94         return i_rLeft.Year > i_rRight.Year;
95 
96     if ( i_rLeft.Month != i_rRight.Month )
97         return i_rLeft.Month > i_rRight.Month;
98 
99     if ( i_rLeft.Day != i_rRight.Day )
100         return i_rLeft.Day > i_rRight.Day;
101 
102     if ( i_rLeft.Hours != i_rRight.Hours )
103         return i_rLeft.Hours > i_rRight.Hours;
104 
105     if ( i_rLeft.Minutes != i_rRight.Minutes )
106         return i_rLeft.Minutes > i_rRight.Minutes;
107 
108     if ( i_rLeft.Seconds != i_rRight.Seconds )
109         return i_rLeft.Seconds > i_rRight.Seconds;
110 
111     if ( i_rLeft.HundredthSeconds != i_rRight.HundredthSeconds )
112         return i_rLeft.HundredthSeconds > i_rRight.HundredthSeconds;
113 
114     return sal_False;
115 }
116 
117 
118 ::boost::shared_ptr<GDIMetaFile>
119 SfxObjectShell::GetPreviewMetaFile( sal_Bool bFullContent ) const
120 {
121 	return CreatePreviewMetaFile_Impl( bFullContent, sal_False );
122 }
123 
124 
125 ::boost::shared_ptr<GDIMetaFile>
126 SfxObjectShell::CreatePreviewMetaFile_Impl( sal_Bool bFullContent, sal_Bool bHighContrast ) const
127 {
128 	// Nur wenn gerade nicht gedruckt wird, darf DoDraw aufgerufen
129 	// werden, sonst wird u.U. der Printer abgeschossen !
130 	SfxViewFrame *pFrame = SfxViewFrame::GetFirst( this );
131 	if ( pFrame && pFrame->GetViewShell() &&
132 		 pFrame->GetViewShell()->GetPrinter() &&
133 		 pFrame->GetViewShell()->GetPrinter()->IsPrinting() )
134 		 return ::boost::shared_ptr<GDIMetaFile>();
135 
136     ::boost::shared_ptr<GDIMetaFile> pFile(new GDIMetaFile);
137 
138 	VirtualDevice aDevice;
139 	aDevice.EnableOutput( sal_False );
140 
141 	// adjust the output device if HC-metafile is requested
142 	if ( bHighContrast )
143 		aDevice.SetDrawMode( aDevice.GetDrawMode() | DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
144 
145     MapMode aMode( ((SfxObjectShell*)this)->GetMapUnit() );
146     aDevice.SetMapMode( aMode );
147     pFile->SetPrefMapMode( aMode );
148 
149     Size aTmpSize;
150     sal_Int8 nAspect;
151     if ( bFullContent )
152     {
153         nAspect = ASPECT_CONTENT;
154         aTmpSize = GetVisArea( nAspect ).GetSize();
155     }
156     else
157     {
158         nAspect = ASPECT_THUMBNAIL;
159         aTmpSize = ((SfxObjectShell*)this)->GetFirstPageSize();
160     }
161 
162     pFile->SetPrefSize( aTmpSize );
163     DBG_ASSERT( aTmpSize.Height()*aTmpSize.Width(),
164                 "size of first page is 0, overload GetFirstPageSize or set vis-area!" );
165 
166     pFile->Record( &aDevice );
167 
168     LanguageType eLang;
169     SvtCTLOptions*  pCTLOptions = new SvtCTLOptions;
170     if ( SvtCTLOptions::NUMERALS_HINDI == pCTLOptions->GetCTLTextNumerals() )
171         eLang = LANGUAGE_ARABIC_SAUDI_ARABIA;
172     else if ( SvtCTLOptions::NUMERALS_ARABIC == pCTLOptions->GetCTLTextNumerals() )
173         eLang = LANGUAGE_ENGLISH;
174     else
175         eLang = (LanguageType) Application::GetSettings().GetLanguage();
176 
177     aDevice.SetDigitLanguage( eLang );
178 
179     ((SfxObjectShell*)this)->DoDraw( &aDevice, Point(0,0), aTmpSize, JobSetup(), nAspect );
180     pFile->Stop();
181 
182 	return pFile;
183 }
184 
185 //====================================================================
186 
187 void SfxObjectShell::UpdateDocInfoForSave()
188 {
189     uno::Reference<document::XDocumentProperties> xDocProps(getDocProperties());
190 
191 	// clear user data if recommend (see 'Tools - Options - Open/StarOffice - Security')
192 	if ( SvtSecurityOptions().IsOptionSet(
193             SvtSecurityOptions::E_DOCWARN_REMOVEPERSONALINFO ) )
194     {
195 		xDocProps->resetUserData( ::rtl::OUString() );
196     }
197 	else if ( IsModified() )
198 	{
199 		String aUserName = SvtUserOptions().GetFullName();
200 		if ( !IsUseUserData() )
201         {
202 			// remove all data pointing to the current user
203             if (xDocProps->getAuthor().equals(aUserName)) {
204                 xDocProps->setAuthor( ::rtl::OUString() );
205             }
206             xDocProps->setModifiedBy( ::rtl::OUString() );
207             if (xDocProps->getPrintedBy().equals(aUserName)) {
208                 xDocProps->setPrintedBy( ::rtl::OUString() );
209             }
210         }
211 		else
212 		{
213 			// update ModificationAuthor, revision and editing time
214             ::DateTime now;
215             xDocProps->setModificationDate( util::DateTime(
216                 now.Get100Sec(), now.GetSec(), now.GetMin(),
217                 now.GetHour(), now.GetDay(), now.GetMonth(),
218                 now.GetYear() ) );
219             xDocProps->setModifiedBy( aUserName );
220 			if ( !HasName() || pImp->bIsSaving )
221 				// QUESTION: not in case of "real" SaveAs as this is meant to create a new document
222 				UpdateTime_Impl( xDocProps );
223 		}
224 	}
225 }
226 
227 //--------------------------------------------------------------------
228 
229 static void
230 lcl_add(util::Duration & rDur, Time const& rTime)
231 {
232     // here we don't care about overflow: rDur is converted back to seconds
233     // anyway, and Time cannot store more than ~4000 hours
234     rDur.Hours   += rTime.GetHour();
235     rDur.Minutes += rTime.GetMin();
236     rDur.Seconds += rTime.GetSec();
237 }
238 
239 // Bearbeitungszeit aktualisieren
240 void SfxObjectShell::UpdateTime_Impl(
241     const uno::Reference<document::XDocumentProperties> & i_xDocProps)
242 {
243 	// Get old time from documentinfo
244     const sal_Int32 secs = i_xDocProps->getEditingDuration();
245     util::Duration editDuration(sal_False, 0, 0, 0,
246             secs/3600, (secs%3600)/60, secs%60, 0);
247 
248 	// Initialize some local member! Its neccessary for wollow operations!
249 	DateTime	aNow					;	// Date and time at current moment
250 	Time		n24Time		(24,0,0,0)	;	// Time-value for 24 hours - see follow calculation
251 	sal_uIntPtr		nDays		= 0			;	// Count of days between now and last editing
252 	Time		nAddTime	(0)			;	// Value to add on aOldTime
253 
254 	// Safe impossible cases!
255 	// User has changed time to the past between last editing and now ... its not possible!!!
256 	DBG_ASSERT( !(aNow.GetDate()<pImp->nTime.GetDate()), "Timestamp of last change is in the past ?!..." );
257 
258 	// Do the follow only, if user has NOT changed time to the past.
259 	// Else add a time of 0 to aOldTime ... !!!
260 	if (aNow.GetDate()>=pImp->nTime.GetDate())
261 	{
262 		// Get count of days last editing.
263 		nDays = aNow.GetSecFromDateTime(pImp->nTime.GetDate())/86400 ;
264 
265 		if (nDays==0)
266 		{
267 			// If no day between now and last editing - calculate time directly.
268             nAddTime    =   (const Time&)aNow - (const Time&)pImp->nTime ;
269 		}
270 		else
271 		// If time of working without save greater then 1 month (!) ....
272 		// we add 0 to aOldTime!
273 		if (nDays<=31)
274 		{
275 			// If 1 or up to 31 days between now and last editing - calculate time indirectly.
276 			// nAddTime = (24h - nTime) + (nDays * 24h) + aNow
277 			--nDays;
278  			nAddTime	 =	nDays*n24Time.GetTime()	;
279 			nAddTime	+=	n24Time-(const Time&)pImp->nTime		;
280 			nAddTime	+=	aNow					;
281 		}
282 
283         lcl_add(editDuration, nAddTime);
284 	}
285 
286 	pImp->nTime = aNow;
287     try {
288         const sal_Int32 newSecs( (editDuration.Hours*3600)
289             + (editDuration.Minutes*60) + editDuration.Seconds);
290         i_xDocProps->setEditingDuration(newSecs);
291         i_xDocProps->setEditingCycles(i_xDocProps->getEditingCycles() + 1);
292     }
293     catch (lang::IllegalArgumentException &)
294     {
295         // ignore overflow
296     }
297 }
298 
299 //--------------------------------------------------------------------
300 
301 SfxDocumentInfoDialog* SfxObjectShell::CreateDocumentInfoDialog
302 (
303 	Window*             pParent,
304 	const SfxItemSet&   rSet
305 )
306 {
307 	return new SfxDocumentInfoDialog(pParent, rSet);
308 }
309 
310 //--------------------------------------------------------------------
311 
312 SfxStyleSheetBasePool* SfxObjectShell::GetStyleSheetPool()
313 {
314 	return 0;
315 }
316 
317 void SfxObjectShell::SetOrganizerSearchMask(
318 	SfxStyleSheetBasePool* pStylePool) const
319 {
320 	pStylePool->SetSearchMask(
321         SFX_STYLE_FAMILY_ALL,
322 		SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED);
323 }
324 
325 //--------------------------------------------------------------------
326 
327 sal_uInt16 SfxObjectShell::GetContentCount(
328     sal_uInt16 nIdx1,
329     sal_uInt16 /*nIdx2*/)
330 {
331 	switch(nIdx1)
332 	{
333 		case INDEX_IGNORE:
334 			return DEF_CONTENT_COUNT;
335 		case CONTENT_STYLE:
336 		{
337 			SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
338 			if(!pStylePool)
339 				return 0;
340 			SetOrganizerSearchMask(pStylePool);
341 			return pStylePool->Count();
342 		}
343 		case CONTENT_MACRO:
344 			break;
345 /*
346 		case CONTENT_CONFIG:
347 			return ( GetConfigManager() ) ?
348 						GetConfigManager()->GetItemCount() : 0;
349 			break;
350  */
351 	}
352 	return 0;
353 }
354 
355 
356 //--------------------------------------------------------------------
357 //TODO/CLEANUP: remove this method (it's virtual)
358 void  SfxObjectShell::TriggerHelpPI(sal_uInt16 nIdx1, sal_uInt16 nIdx2, sal_uInt16)
359 {
360 	if(nIdx1==CONTENT_STYLE && nIdx2 != INDEX_IGNORE) //StyleSheets
361 	{
362 		SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
363 		SetOrganizerSearchMask(pStylePool);
364 	}
365 }
366 
367 sal_Bool   SfxObjectShell::CanHaveChilds(sal_uInt16 nIdx1,
368 									   sal_uInt16 nIdx2)
369 {
370 	switch(nIdx1) {
371 	case INDEX_IGNORE:
372 		return sal_True;
373 	case CONTENT_STYLE:
374 		return INDEX_IGNORE == nIdx2 || !GetStyleSheetPool()? sal_False: sal_True;
375 	case CONTENT_MACRO:
376 //!!    return INDEX_IGNORE == nIdx2? sal_False: sal_True;
377 		return sal_False;
378 /*
379 	case CONTENT_CONFIG:
380 		return INDEX_IGNORE == nIdx2 ? sal_False : sal_True;
381  */
382 	}
383 	return sal_False;
384 }
385 
386 //--------------------------------------------------------------------
387 
388 void SfxObjectShell::GetContent(String &rText,
389 								Bitmap &rClosedBitmap,
390 								Bitmap &rOpenedBitmap,
391 								sal_Bool &bCanDel,
392 								sal_uInt16 i,
393 								sal_uInt16 nIdx1,
394 								sal_uInt16 nIdx2 )
395 {
396 	DBG_ERRORFILE( "Non high contrast method called. Please update calling code!" );
397 	SfxObjectShell::GetContent( rText, rClosedBitmap, rOpenedBitmap, BMP_COLOR_NORMAL, bCanDel, i, nIdx1, nIdx2 );
398 }
399 
400 //--------------------------------------------------------------------
401 
402 void   SfxObjectShell::GetContent(String &rText,
403 								  Bitmap &rClosedBitmap,
404 								  Bitmap &rOpenedBitmap,
405 								  BmpColorMode eColorMode,
406 								  sal_Bool &bCanDel,
407 								  sal_uInt16 i,
408 								  sal_uInt16 nIdx1,
409 								  sal_uInt16 /*nIdx2*/ )
410 {
411 	bCanDel=sal_True;
412 
413 	switch(nIdx1)
414 	{
415 		case INDEX_IGNORE:
416 		{
417 			sal_uInt16 nTextResId = 0;
418 			sal_uInt16 nClosedBitmapResId = 0; // evtl. sp"ater mal unterschiedliche
419 			sal_uInt16 nOpenedBitmapResId = 0; // "     "       "   "
420 			switch(i)
421 			{
422 				case CONTENT_STYLE:
423 					nTextResId = STR_STYLES;
424 					if ( eColorMode == BMP_COLOR_NORMAL )
425 					{
426 						nClosedBitmapResId= BMP_STYLES_CLOSED;
427 						nOpenedBitmapResId= BMP_STYLES_OPENED;
428 					}
429 					else
430 					{
431 						nClosedBitmapResId= BMP_STYLES_CLOSED_HC;
432 						nOpenedBitmapResId= BMP_STYLES_OPENED_HC;
433 					}
434 					break;
435 				case CONTENT_MACRO:
436 					nTextResId = STR_MACROS;
437 					if ( eColorMode == BMP_COLOR_NORMAL )
438 					{
439 						nClosedBitmapResId= BMP_STYLES_CLOSED;
440 						nOpenedBitmapResId= BMP_STYLES_OPENED;
441 					}
442 					else
443 					{
444 						nClosedBitmapResId= BMP_STYLES_CLOSED_HC;
445 						nOpenedBitmapResId= BMP_STYLES_OPENED_HC;
446 					}
447 					break;
448 /*
449 				case CONTENT_CONFIG:
450 					nTextResId = STR_CONFIG;
451 					nClosedBitmapResId= BMP_STYLES_CLOSED;
452 					nOpenedBitmapResId= BMP_STYLES_OPENED;
453 					break;
454  */
455 			}
456 
457 			if ( nTextResId )
458 			{
459 				rText  = String(SfxResId(nTextResId));
460 				rClosedBitmap = Bitmap(SfxResId(nClosedBitmapResId));
461 				rOpenedBitmap = Bitmap(SfxResId(nOpenedBitmapResId));
462 			}
463 			break;
464 		}
465 
466 		case CONTENT_STYLE:
467 		{
468 			SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
469 			SetOrganizerSearchMask(pStylePool);
470 			SfxStyleSheetBase *pStyle = (*pStylePool)[i];
471 			rText = pStyle->GetName();
472 			bCanDel=((pStyle->GetMask() & SFXSTYLEBIT_USERDEF)
473 					 == SFXSTYLEBIT_USERDEF);
474 			rClosedBitmap = rOpenedBitmap =
475 				GetStyleFamilyBitmap(pStyle->GetFamily(), eColorMode );
476 		}
477 			break;
478 		case CONTENT_MACRO:
479 			break;
480 /*
481 		case CONTENT_CONFIG:
482 			if ( GetConfigManager() )
483 			{
484 				rText = GetConfigManager()->GetItem(i);
485 				bCanDel = GetConfigManager()->CanDelete(i);
486 			}
487 			else
488 				rText = String();
489 			rClosedBitmap = Bitmap(SfxResId(BMP_STYLES_CLOSED));
490 			rOpenedBitmap = Bitmap(SfxResId(BMP_STYLES_OPENED));
491 			break;
492 */
493 	}
494 }
495 
496 //--------------------------------------------------------------------
497 Bitmap SfxObjectShell::GetStyleFamilyBitmap( SfxStyleFamily eFamily )
498 {
499 	DBG_ERRORFILE( "Non high contrast method called. Please update calling code!" );
500 	return SfxObjectShell::GetStyleFamilyBitmap( eFamily, BMP_COLOR_NORMAL );
501 }
502 
503 //--------------------------------------------------------------------
504 
505 Bitmap SfxObjectShell::GetStyleFamilyBitmap(SfxStyleFamily eFamily, BmpColorMode eColorMode )
506 {
507 	sal_uInt16 nResId = 0;
508 	switch(eFamily)
509 	{
510 		case SFX_STYLE_FAMILY_CHAR:
511 			nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY1 : BMP_STYLES_FAMILY1_HC;
512 			break;
513 		case SFX_STYLE_FAMILY_PARA:
514 			nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY2 : BMP_STYLES_FAMILY2_HC;
515 			break;
516 		case SFX_STYLE_FAMILY_FRAME:
517 			nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY3 : BMP_STYLES_FAMILY3_HC;
518 			break;
519 		case SFX_STYLE_FAMILY_PAGE :
520 			nResId = ( eColorMode == BMP_COLOR_NORMAL ) ? BMP_STYLES_FAMILY4 : BMP_STYLES_FAMILY4_HC;
521 			break;
522 		case SFX_STYLE_FAMILY_PSEUDO:
523 		case SFX_STYLE_FAMILY_ALL:
524 			break;
525 	}
526 
527 	if ( nResId )
528 		return Bitmap(SfxResId(nResId));
529 	else
530 		return Bitmap();
531 }
532 
533 
534 //--------------------------------------------------------------------
535 
536 sal_Bool SfxObjectShell::Insert(SfxObjectShell &rSource,
537 							  sal_uInt16 nSourceIdx1,
538 							  sal_uInt16 nSourceIdx2,
539 							  sal_uInt16 /*nSourceIdx3*/,
540 							  sal_uInt16 &nIdx1,
541 							  sal_uInt16 &nIdx2,
542 							  sal_uInt16 &/*nIdx3*/,
543 							  sal_uInt16 &/*nDeleted*/)
544 {
545 	sal_Bool bRet = sal_False;
546 
547 	if (INDEX_IGNORE == nIdx1 && CONTENT_STYLE == nSourceIdx1)
548 		nIdx1 = CONTENT_STYLE;
549 
550 	if (CONTENT_STYLE == nSourceIdx1 && CONTENT_STYLE == nIdx1)
551 	{
552 		SfxStyleSheetBasePool* pHisPool  = rSource.GetStyleSheetPool();
553 		SfxStyleSheetBasePool* pMyPool   = GetStyleSheetPool();
554 		SetOrganizerSearchMask(pHisPool);
555 		SetOrganizerSearchMask(pMyPool);
556         SfxStyleSheetBase* pHisSheet = NULL;
557 
558         if ( pHisPool && pHisPool->Count() > nSourceIdx2 )
559             pHisSheet = (*pHisPool)[nSourceIdx2];
560 
561 		// Einfuegen ist nur dann noetig, wenn ein StyleSheet
562 		// zwischen unterschiedlichen(!) Pools bewegt wird
563 
564         if ( pHisSheet && pMyPool != pHisPool )
565 		{
566 			if (INDEX_IGNORE == nIdx2)
567 			{
568 				nIdx2 = pMyPool->Count();
569 			}
570 
571 			// wenn so eine Vorlage schon existiert: loeschen!
572 			String aOldName(pHisSheet->GetName());
573 			SfxStyleFamily eOldFamily = pHisSheet->GetFamily();
574 
575 			SfxStyleSheetBase* pExist = pMyPool->Find(aOldName, eOldFamily);
576 			// sal_uInt16 nOldHelpId = pExist->GetHelpId(??? VB ueberlegt sich was);
577 			sal_Bool bUsedOrUserDefined;
578 			if( pExist )
579 			{
580 				bUsedOrUserDefined =
581 					pExist->IsUsed() || pExist->IsUserDefined();
582 				if( ErrorHandler::HandleError(
583 					*new MessageInfo( ERRCODE_SFXMSG_STYLEREPLACE, aOldName ) )
584 					!= ERRCODE_BUTTON_OK )
585 					return sal_False;
586 				else
587 				{
588 					pMyPool->Replace( *pHisSheet, *pExist );
589 					SetModified( sal_True );
590 					nIdx2 = nIdx1 = INDEX_IGNORE;
591 					return sal_True;
592 				}
593 			}
594 
595 			SfxStyleSheetBase& rNewSheet = pMyPool->Make(
596 				aOldName, eOldFamily,
597 				pHisSheet->GetMask(), nIdx2);
598 
599 			// ItemSet der neuen Vorlage fuellen
600 			rNewSheet.GetItemSet().Set(pHisSheet->GetItemSet());
601 
602 			// wer bekommt den Neuen als Parent? wer benutzt den Neuen als Follow?
603 			SfxStyleSheetBase* pTestSheet = pMyPool->First();
604 			while (pTestSheet)
605 			{
606 				if (pTestSheet->GetFamily() == eOldFamily &&
607 					pTestSheet->HasParentSupport() &&
608 					pTestSheet->GetParent() == aOldName)
609 				{
610 					pTestSheet->SetParent(aOldName);
611 					// Verknuepfung neu aufbauen
612 				}
613 
614 				if (pTestSheet->GetFamily() == eOldFamily &&
615 					pTestSheet->HasFollowSupport() &&
616 					pTestSheet->GetFollow() == aOldName)
617 				{
618 					pTestSheet->SetFollow(aOldName);
619 					// Verknuepfung neu aufbauen
620 				}
621 
622 				pTestSheet = pMyPool->Next();
623 			}
624 			bUsedOrUserDefined =
625 				rNewSheet.IsUsed() || rNewSheet.IsUserDefined();
626 
627 
628 			// hat der Neue einen Parent? wenn ja, mit gleichem Namen bei uns suchen
629 			if (pHisSheet->HasParentSupport())
630 			{
631 				const String& rParentName = pHisSheet->GetParent();
632 				if (0 != rParentName.Len())
633 				{
634 					SfxStyleSheetBase* pParentOfNew =
635 						pMyPool->Find(rParentName, eOldFamily);
636 					if (pParentOfNew)
637 						rNewSheet.SetParent(rParentName);
638 				}
639 			}
640 
641 			// hat der Neue einen Follow? wenn ja, mit gleichem
642 			// Namen bei uns suchen
643 			if (pHisSheet->HasFollowSupport())
644 			{
645 				const String& rFollowName = pHisSheet->GetFollow();
646 				if (0 != rFollowName.Len())
647 				{
648 					SfxStyleSheetBase* pFollowOfNew =
649 						pMyPool->Find(rFollowName, eOldFamily);
650 					if (pFollowOfNew)
651 						rNewSheet.SetFollow(rFollowName);
652 				}
653 			}
654 
655 			SetModified( sal_True );
656 			if( !bUsedOrUserDefined ) nIdx2 = nIdx1 = INDEX_IGNORE;
657 
658 			bRet = sal_True;
659 		}
660 		else
661 			bRet = sal_False;
662 	}
663 /*
664 	else if (nSourceIdx1 == CONTENT_CONFIG)
665 	{
666 		nIdx1 = CONTENT_CONFIG;
667 
668 		SfxConfigManager *pCfgMgr = SFX_CFGMANAGER();
669 		if ( !GetConfigManager() )
670 		{
671 			SetConfigManager(new SfxConfigManager(0, pCfgMgr));
672 			SetTemplateConfig(sal_False);
673 			if (this == Current())
674 				GetConfigManager()->Activate(pCfgMgr);
675 		}
676 
677 		if (GetConfigManager()->CopyItem(
678 			nSourceIdx2, nIdx2, rSource.GetConfigManager()))
679 		{
680 			SetModified(sal_True);
681 			bRet = sal_True;
682             SFX_APP()->GetDispatcher_Impl()->Update_Impl(sal_True);
683 		}
684 	}
685 */
686 	return bRet;
687 }
688 
689 //--------------------------------------------------------------------
690 
691 sal_Bool SfxObjectShell::Remove
692 (
693 	sal_uInt16 nIdx1,
694 	sal_uInt16 nIdx2,
695 	sal_uInt16 /*nIdx3*/
696 )
697 {
698 	sal_Bool bRet = sal_False;
699 
700 	if (CONTENT_STYLE == nIdx1)
701 	{
702 		SfxStyleSheetBasePool* pMyPool  = GetStyleSheetPool();
703 
704 		SetOrganizerSearchMask(pMyPool);
705 
706 		SfxStyleSheetBase* pMySheet =  (*pMyPool)[nIdx2];
707 		String aName(pMySheet->GetName());
708 		String aEmpty;
709 		SfxStyleFamily  eFamily = pMySheet->GetFamily();
710 		pMyPool->Remove(pMySheet);
711 		bRet = sal_True;
712 
713 		SfxStyleSheetBase* pTestSheet = pMyPool->First();
714 		while (pTestSheet)
715 		{
716 			if (pTestSheet->GetFamily() == eFamily &&
717 				pTestSheet->HasParentSupport() &&
718 				pTestSheet->GetParent() == aName)
719 			{
720 				pTestSheet->SetParent(aEmpty); // Verknuepfung aufloesen
721 			}
722 
723 			if (pTestSheet->GetFamily() == eFamily &&
724 				pTestSheet->HasFollowSupport() &&
725 				pTestSheet->GetFollow() == aName)
726 			{
727 				pTestSheet->SetFollow(aEmpty); // Verknuepfung aufloesen
728 			}
729 
730 			pTestSheet = pMyPool->Next();
731 		}
732 
733 		SetModified( sal_True );
734 	}
735 
736 	return bRet;
737 }
738 
739 //--------------------------------------------------------------------
740 
741 sal_Bool SfxObjectShell::Print
742 (
743 	Printer&        rPrt,
744 	sal_uInt16          nIdx1,
745 	sal_uInt16          /*nIdx2*/,
746 	sal_uInt16          /*nIdx3*/,
747 	const String*   pObjectName
748 )
749 
750 /*  [Beschreibung]
751 */
752 
753 {
754 	switch(nIdx1)
755 	{
756 	  case CONTENT_STYLE:
757 		{
758 			SfxStyleSheetBasePool *pStylePool = GetStyleSheetPool();
759 			SetOrganizerSearchMask(pStylePool);
760 			SfxStyleSheetIterator* pIter = pStylePool->CreateIterator(
761 				pStylePool->GetSearchFamily(), pStylePool->GetSearchMask() );
762 			sal_uInt16 nStyles = pIter->Count();
763 			SfxStyleSheetBase *pStyle = pIter->First();
764 			if ( !pStyle )
765 				return sal_True;
766 
767             // pepare adaptor for old style StartPage/EndPage printing
768             boost::shared_ptr< Printer > pPrinter( new Printer( rPrt.GetJobSetup() ) );
769             vcl::OldStylePrintAdaptor* pAdaptor = new vcl::OldStylePrintAdaptor( pPrinter );
770             boost::shared_ptr< vcl::PrinterController > pController( pAdaptor );
771 
772             pAdaptor->StartPage();
773 
774             pPrinter->SetMapMode(MapMode(MAP_10TH_MM));
775 			Font aFont( DEFINE_CONST_UNICODE( "Arial" ), Size(0, 64));   // 18pt
776 			aFont.SetWeight(WEIGHT_BOLD);
777 			pPrinter->SetFont(aFont);
778 			const Size aPageSize(pPrinter->GetOutputSize());
779 			const sal_uInt16 nXIndent = 200;
780 			sal_uInt16 nYIndent = 200;
781 			Point aOutPos(nXIndent, nYIndent);
782 			String aHeader(SfxResId(STR_PRINT_STYLES_HEADER));
783 			if ( pObjectName )
784 				aHeader += *pObjectName;
785 			else
786 				aHeader += GetTitle();
787             long nTextHeight( pPrinter->GetTextHeight() );
788 			pPrinter->DrawText(aOutPos, aHeader);
789 			aOutPos.Y() += nTextHeight;
790 			aOutPos.Y() += nTextHeight/2;
791 			aFont.SetSize(Size(0, 35)); // 10pt
792 			nStyles = 1;
793 			while(pStyle)
794 			{
795 				// print template name
796 				String aStr(pStyle->GetName());
797 				aFont.SetWeight(WEIGHT_BOLD);
798 				pPrinter->SetFont(aFont);
799 				nTextHeight = pPrinter->GetTextHeight();
800 				// check for new page
801 				if ( aOutPos.Y() + nTextHeight*2 >
802                     aPageSize.Height() - (long) nYIndent )
803 				{
804 					pAdaptor->EndPage();
805 					pAdaptor->StartPage();
806 					aOutPos.Y() = nYIndent;
807 				}
808 				pPrinter->DrawText(aOutPos, aStr);
809 				aOutPos.Y() += nTextHeight;
810 
811 				// print template description
812 				aFont.SetWeight(WEIGHT_NORMAL);
813 				pPrinter->SetFont(aFont);
814 				aStr = pStyle->GetDescription();
815 				const char cDelim = ' ';
816 				sal_uInt16 nStart = 0, nIdx = 0;
817 
818 				nTextHeight = pPrinter->GetTextHeight();
819 				// break text into lines
820 				while(nIdx < aStr.Len())
821 				{
822 					sal_uInt16	nOld = nIdx;
823                     long nTextWidth;
824 					nIdx = aStr.Search(cDelim, nStart);
825 					nTextWidth = pPrinter->GetTextWidth(aStr, nStart, nIdx-nStart);
826 					while(nIdx != STRING_NOTFOUND &&
827 						  aOutPos.X() + nTextWidth <
828                           aPageSize.Width() - (long) nXIndent)
829 					{
830 						nOld = nIdx;
831 						nIdx = aStr.Search(cDelim, nIdx+1);
832 						nTextWidth = pPrinter->GetTextWidth(aStr, nStart, nIdx-nStart);
833 					}
834 					String aTmp(aStr, nStart, nIdx == STRING_NOTFOUND?
835 								STRING_LEN :
836 								nOld-nStart);
837 					if ( aTmp.Len() )
838 					{
839 						nStart = nOld+1;    // trailing space
840 					}
841 					else
842 					{
843 						sal_uInt16 nChar = 1;
844 						while(
845 							nStart + nChar < aStr.Len() &&
846 							aOutPos.X() + pPrinter->GetTextWidth(
847 								aStr, nStart, nChar) <
848 							aPageSize.Width() - nXIndent)
849 							++nChar;
850 						aTmp = String(aStr, nStart, nChar-1);
851 						nIdx = nStart + nChar;
852 						nStart = nIdx;
853 					}
854 					if ( aOutPos.Y() + nTextHeight*2 >
855 						aPageSize.Height() - nYIndent )
856 					{
857 						pAdaptor->EndPage();
858 						pAdaptor->StartPage();
859 						aOutPos.Y() = nYIndent;
860 					}
861 					pPrinter->DrawText(aOutPos, aTmp);
862 					aOutPos.Y() += pPrinter->GetTextHeight();
863 				}
864 				pStyle = pIter->Next();
865 			}
866 			pAdaptor->EndPage();
867 
868             Printer::PrintJob( pController, rPrt.GetJobSetup() );
869 
870 			delete pIter;
871 			break;
872 		}
873 	  default:
874 		  return sal_False;
875 	}
876 	return sal_True;
877 }
878 
879 //--------------------------------------------------------------------
880 
881 void SfxObjectShell::LoadStyles
882 (
883 	SfxObjectShell &rSource         /*  die Dokument-Vorlage, aus der
884 											die Styles geladen werden sollen */
885 )
886 
887 /*  [Beschreibung]
888 
889 	Diese Methode wird vom SFx gerufen, wenn aus einer Dokument-Vorlage
890 	Styles nachgeladen werden sollen. Bestehende Styles soll dabei
891 	"uberschrieben werden. Das Dokument mu"s daher neu formatiert werden.
892 	Daher werden die Applikationen in der Regel diese Methode "uberladen
893 	und in ihrer Implementierung die Implementierung der Basisklasse
894 	rufen.
895 */
896 
897 {
898 	struct Styles_Impl
899 	{
900 		SfxStyleSheetBase *pSource;
901 		SfxStyleSheetBase *pDest;
902 //      Styles_Impl () : pSource(0), pDest(0) {}
903 	};
904 
905 	SfxStyleSheetBasePool *pSourcePool = rSource.GetStyleSheetPool();
906 	DBG_ASSERT(pSourcePool, "Source-DocumentShell ohne StyleSheetPool");
907 	SfxStyleSheetBasePool *pMyPool = GetStyleSheetPool();
908 	DBG_ASSERT(pMyPool, "Dest-DocumentShell ohne StyleSheetPool");
909 	pSourcePool->SetSearchMask(SFX_STYLE_FAMILY_ALL, 0xffff);
910 	Styles_Impl *pFound = new Styles_Impl[pSourcePool->Count()];
911 	sal_uInt16 nFound = 0;
912 
913 	SfxStyleSheetBase *pSource = pSourcePool->First();
914 	while ( pSource )
915 	{
916 		SfxStyleSheetBase *pDest =
917 			pMyPool->Find( pSource->GetName(), pSource->GetFamily() );
918 		if ( !pDest )
919 		{
920 			pDest = &pMyPool->Make( pSource->GetName(),
921 					pSource->GetFamily(), pSource->GetMask());
922 			// Setzen des Parents, der Folgevorlage
923 		}
924 		pFound[nFound].pSource = pSource;
925 		pFound[nFound].pDest = pDest;
926 		++nFound;
927 		pSource = pSourcePool->Next();
928 	}
929 
930 	for ( sal_uInt16 i = 0; i < nFound; ++i )
931 	{
932 		pFound[i].pDest->GetItemSet().PutExtended(pFound[i].pSource->GetItemSet(), SFX_ITEM_DONTCARE, SFX_ITEM_DEFAULT);
933 //      pFound[i].pDest->SetHelpId(pFound[i].pSource->GetHelpId());
934 		if(pFound[i].pSource->HasParentSupport())
935 			pFound[i].pDest->SetParent(pFound[i].pSource->GetParent());
936 		if(pFound[i].pSource->HasFollowSupport())
937 			pFound[i].pDest->SetFollow(pFound[i].pSource->GetParent());
938 	}
939 	delete [] pFound;
940 }
941 
942 //--------------------------------------------------------------------
943 
944 void SfxObjectShell::UpdateFromTemplate_Impl(  )
945 
946 /*  [Beschreibung]
947 
948 	Diese interne Methode pr"uft, ob das Dokument aus einem Template
949 	erzeugt wurde, und ob dieses neuer ist als das Dokument. Ist dies
950 	der Fall, wird der Benutzer gefragt, ob die Vorlagen (StyleSheets)
951 	updated werden sollen. Wird dies positiv beantwortet, werden die
952 	StyleSheets updated.
953 */
954 
955 {
956 	// Storage-medium?
957 	SfxMedium *pFile = GetMedium();
958 	DBG_ASSERT( pFile, "cannot UpdateFromTemplate without medium" );
959 	if ( !pFile )
960 		return;
961 
962 	if ( !::utl::LocalFileHelper::IsLocalFile( pFile->GetName() ) )
963 		// update only for documents loaded from the local file system
964 		return;
965 
966     // only for own storage formats
967 	uno::Reference< embed::XStorage > xDocStor = pFile->GetStorage();
968     if ( !pFile->GetFilter() || !pFile->GetFilter()->IsOwnFormat() )
969 		return;
970 
971 	SFX_ITEMSET_ARG( pFile->GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False);
972 	sal_Int16 bCanUpdateFromTemplate = pUpdateDocItem ? pUpdateDocItem->GetValue() : document::UpdateDocMode::NO_UPDATE;
973 
974     // created from template?
975     uno::Reference<document::XDocumentProperties> xDocProps(getDocProperties());
976     ::rtl::OUString aTemplName( xDocProps->getTemplateName() );
977     ::rtl::OUString aTemplURL( xDocProps->getTemplateURL() );
978     String aFoundName;
979 
980     if ( aTemplName.getLength() || (aTemplURL.getLength() && !IsReadOnly()) )
981 	{
982         // try to locate template, first using filename
983         // this must be done because writer global document uses this "great" idea to manage the templates of all parts
984         // in the master document
985         // but it is NOT an error if the template filename points not to a valid file
986         SfxDocumentTemplates aTempl;
987         aTempl.Construct();
988         if ( aTemplURL.getLength() )
989         {
990             String aURL;
991             if( ::utl::LocalFileHelper::ConvertSystemPathToURL( aTemplURL, GetMedium()->GetName(), aURL ) )
992                 aFoundName = aURL;
993         }
994 
995         if( !aFoundName.Len() && aTemplName.getLength() )
996             // if the template filename did not lead to success, try to get a file name for the logical template name
997             aTempl.GetFull( String(), aTemplName, aFoundName );
998 	}
999 
1000     if ( aFoundName.Len() )
1001 	{
1002         // check existence of template storage
1003         aTemplURL = aFoundName;
1004 		sal_Bool bLoad = sal_False;
1005 
1006         // should the document checked against changes in the template ?
1007         if ( IsQueryLoadTemplate() )
1008 		{
1009             // load document info of template
1010             sal_Bool bOK = sal_False;
1011 			util::DateTime aTemplDate;
1012             try
1013             {
1014                 Reference < document::XStandaloneDocumentInfo > xDocInfo (
1015                     ::comphelper::getProcessServiceFactory()->createInstance(
1016                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
1017                             "com.sun.star.document.StandaloneDocumentInfo") ) ),
1018                     UNO_QUERY_THROW );
1019                 Reference < beans::XFastPropertySet > xSet( xDocInfo,
1020                     UNO_QUERY_THROW );
1021                 xDocInfo->loadFromURL( aTemplURL );
1022                 Any aAny = xSet->getFastPropertyValue( WID_DATE_MODIFIED );
1023                 ::com::sun::star::util::DateTime aTmp;
1024                 if ( aAny >>= aTemplDate )
1025                 {
1026                     // get modify date from document info
1027                     bOK = sal_True;
1028                 }
1029             }
1030             catch ( Exception& )
1031             {
1032             }
1033 
1034             // if modify date was read successfully
1035             if ( bOK )
1036 			{
1037                 // compare modify data of template with the last check date of the document
1038                 const util::DateTime aInfoDate( xDocProps->getTemplateDate() );
1039 				if ( aTemplDate > aInfoDate )
1040 				{
1041                     // ask user
1042                 	if( bCanUpdateFromTemplate == document::UpdateDocMode::QUIET_UPDATE
1043                 	|| bCanUpdateFromTemplate == document::UpdateDocMode::FULL_UPDATE )
1044 						bLoad = sal_True;
1045 					else if ( bCanUpdateFromTemplate == document::UpdateDocMode::ACCORDING_TO_CONFIG )
1046 					{
1047                         String sMessage( SfxResId( STR_QRYTEMPL_MESSAGE ) );
1048                         sMessage.SearchAndReplace( String::CreateFromAscii("$(ARG1)"), aTemplName );
1049                         sfx2::QueryTemplateBox aBox( GetDialogParent(), sMessage );
1050 						if ( RET_YES == aBox.Execute() )
1051 							bLoad = sal_True;
1052 					}
1053 
1054 					if( !bLoad )
1055 					{
1056                         // user refuses, so don't ask again for this document
1057 						SetQueryLoadTemplate(sal_False);
1058 						SetModified( sal_True );
1059 					}
1060 				}
1061 			}
1062 
1063 			if ( bLoad )
1064 			{
1065                 // styles should be updated, create document in organizer mode to read in the styles
1066                 //TODO: testen!
1067                 SfxObjectShellLock xTemplDoc = CreateObjectByFactoryName( GetFactory().GetFactoryName(), SFX_CREATE_MODE_ORGANIZER );
1068 				xTemplDoc->DoInitNew(0);
1069 
1070                 // TODO/MBA: do we need a BaseURL? Then LoadFrom must be extended!
1071                 //xTemplDoc->SetBaseURL( aFoundName );
1072 
1073                 // TODO/LATER: make sure that we don't use binary templates!
1074                 SfxMedium aMedium( aFoundName, STREAM_STD_READ );
1075                 if ( xTemplDoc->LoadFrom( aMedium ) )
1076 				{
1077                     // transfer styles from xTemplDoc to this document
1078                     // TODO/MBA: make sure that no BaseURL is needed in *this* document
1079 					LoadStyles(*xTemplDoc);
1080 
1081                     // remember date/time of check
1082                     xDocProps->setTemplateDate(aTemplDate);
1083                     // TODO/LATER: new functionality to store document info is required ( didn't work for SO7 XML format )
1084 //REPLACE					pInfo->Save(xDocStor);
1085 				}
1086 			}
1087 		}
1088 	}
1089 }
1090 
1091 sal_Bool SfxObjectShell::IsHelpDocument() const
1092 {
1093     const SfxFilter* pFilter = GetMedium()->GetFilter();
1094     return ( pFilter && pFilter->GetFilterName().CompareToAscii("writer_web_HTML_help") == COMPARE_EQUAL );
1095 }
1096 
1097 void SfxObjectShell::ResetFromTemplate( const String& rTemplateName, const String& rFileName )
1098 {
1099     // only care about reseting this data for openoffice formats otherwise
1100     if ( IsOwnStorageFormat_Impl( *GetMedium())  )
1101     {
1102         uno::Reference<document::XDocumentProperties> xDocProps(getDocProperties());
1103         xDocProps->setTemplateURL( ::rtl::OUString() );
1104         xDocProps->setTemplateName( ::rtl::OUString() );
1105         xDocProps->setTemplateDate( util::DateTime() );
1106         xDocProps->resetUserData( ::rtl::OUString() );
1107 
1108     	// TODO/REFACTOR:
1109     	// Title?
1110 
1111         if( ::utl::LocalFileHelper::IsLocalFile( rFileName ) )
1112     	{
1113             String aFoundName;
1114             if( SFX_APP()->Get_Impl()->GetDocumentTemplates()->GetFull( String(), rTemplateName, aFoundName ) )
1115             {
1116                 INetURLObject aObj( rFileName );
1117                 xDocProps->setTemplateURL( aObj.GetMainURL(INetURLObject::DECODE_TO_IURI) );
1118                 xDocProps->setTemplateName( rTemplateName );
1119 
1120                 ::DateTime now;
1121                 xDocProps->setTemplateDate( util::DateTime(
1122                     now.Get100Sec(), now.GetSec(), now.GetMin(),
1123                     now.GetHour(), now.GetDay(), now.GetMonth(),
1124                     now.GetYear() ) );
1125 
1126     			SetQueryLoadTemplate( sal_True );
1127             }
1128         }
1129     }
1130 }
1131 
1132 sal_Bool SfxObjectShell::IsQueryLoadTemplate() const
1133 {
1134 	return pImp->bQueryLoadTemplate;
1135 }
1136 
1137 sal_Bool SfxObjectShell::IsUseUserData() const
1138 {
1139 	return pImp->bUseUserData;
1140 }
1141 
1142 void SfxObjectShell::SetQueryLoadTemplate( sal_Bool bNew )
1143 {
1144 	if ( pImp->bQueryLoadTemplate != bNew )
1145 		SetModified( sal_True );
1146 	pImp->bQueryLoadTemplate = bNew;
1147 }
1148 
1149 void SfxObjectShell::SetUseUserData( sal_Bool bNew )
1150 {
1151 	if ( pImp->bUseUserData != bNew )
1152 		SetModified( sal_True );
1153 	pImp->bUseUserData = bNew;
1154 }
1155 
1156 sal_Bool SfxObjectShell::IsLoadReadonly() const
1157 {
1158 	return pImp->bLoadReadonly;
1159 }
1160 
1161 sal_Bool SfxObjectShell::IsSaveVersionOnClose() const
1162 {
1163 	return pImp->bSaveVersionOnClose;
1164 }
1165 
1166 void SfxObjectShell::SetLoadReadonly( sal_Bool bNew )
1167 {
1168 	if ( pImp->bLoadReadonly != bNew )
1169 		SetModified( sal_True );
1170 	pImp->bLoadReadonly = bNew;
1171 }
1172 
1173 void SfxObjectShell::SetSaveVersionOnClose( sal_Bool bNew )
1174 {
1175 	if ( pImp->bSaveVersionOnClose != bNew )
1176 		SetModified( sal_True );
1177 	pImp->bSaveVersionOnClose = bNew;
1178 }
1179 
1180 sal_uInt32 SfxObjectShell::GetModifyPasswordHash() const
1181 {
1182     return pImp->m_nModifyPasswordHash;
1183 }
1184 
1185 sal_Bool SfxObjectShell::SetModifyPasswordHash( sal_uInt32 nHash )
1186 {
1187     if ( ( !IsReadOnly() && !IsReadOnlyUI() )
1188       || !(pImp->nFlagsInProgress & SFX_LOADED_MAINDOCUMENT ) )
1189     {
1190         // the hash can be changed only in editable documents,
1191         // or during loading of document
1192         pImp->m_nModifyPasswordHash = nHash;
1193         return sal_True;
1194     }
1195 
1196     return sal_False;
1197 }
1198 
1199 uno::Sequence< beans::PropertyValue > SfxObjectShell::GetModifyPasswordInfo() const
1200 {
1201     return pImp->m_aModifyPasswordInfo;
1202 }
1203 
1204 sal_Bool SfxObjectShell::SetModifyPasswordInfo( const uno::Sequence< beans::PropertyValue >& aInfo )
1205 {
1206     if ( ( !IsReadOnly() && !IsReadOnlyUI() )
1207       || !(pImp->nFlagsInProgress & SFX_LOADED_MAINDOCUMENT ) )
1208     {
1209         // the hash can be changed only in editable documents,
1210         // or during loading of document
1211         pImp->m_aModifyPasswordInfo = aInfo;
1212         return sal_True;
1213     }
1214 
1215     return sal_False;
1216 }
1217 
1218 void SfxObjectShell::SetModifyPasswordEntered( sal_Bool bEntered )
1219 {
1220     pImp->m_bModifyPasswordEntered = bEntered;
1221 }
1222 
1223 sal_Bool SfxObjectShell::IsModifyPasswordEntered()
1224 {
1225     return pImp->m_bModifyPasswordEntered;
1226 }
1227 
1228